From 71b3963052104719e35bb84cee783ac25050724a Mon Sep 17 00:00:00 2001 From: Raknoche Date: Tue, 21 Jun 2016 17:07:49 -0400 Subject: [PATCH] LUXcode Dump Added code for LUX --- CodeForLUX/Matlab/ApplyCorrections.m | 363 ++ CodeForLUX/Matlab/KrypCal.m | 2580 ++++++++++++ CodeForLUX/Matlab/MyFunctions/EstimateField.m | 97 + CodeForLUX/Matlab/MyFunctions/GetGoldenCuts.m | 53 + CodeForLUX/Matlab/MyFunctions/GetS1aS1bCuts.m | 33 + .../MyFunctions/GetS1aS1bFiducialCuts.m | 46 + CodeForLUX/Matlab/MyFunctions/GetSECuts.m | 32 + CodeForLUX/Matlab/MyFunctions/KrypCal_S1_3D.m | 341 ++ .../MyFunctions/MeasurePulseAreaXYDep.m | 90 + .../Matlab/MyFunctions/MeasurePulseAreaZDep.m | 79 + .../Matlab/MyFunctions/MeasureS1aS1b3DDep.m | 95 + .../Matlab/MyFunctions/MeasureS1aS1bRvZDep.m | 94 + .../Matlab/MyFunctions/MeasureS1aS1bXYDep.m | 94 + .../Matlab/MyFunctions/MeasureS1aS1bZDep.m | 75 + .../MyFunctions/MeasureS2PulseWidthXYDep.m | 70 + .../MyFunctions/MeasureS2PulseWidthZDep.m | 69 + CodeForLUX/Matlab/MyFunctions/MeasureSESize.m | 60 + .../Matlab/MyFunctions/MeasureSEXYDep.m | 118 + .../MyFunctions/ProducePulseAreaXYNorms.m | 39 + .../RK_1DCubicInterp_LinearExtrap.m | 88 + .../MyFunctions/RemoveFieldDependence_1D.m | 42 + .../MyFunctions/RemoveFieldDependence_3D.m | 62 + .../Matlab/MyFunctions/polyfitweighted.m | 75 + CodeForLUX/Matlab/MyFunctions/rkploterr.m | 171 + .../MyScripts/DokePlot/Run03_DokePlot.m | 1758 ++++++++ .../Load_ALL_Kr50_G1G2_SatFixed_SECenter.m | 213 + .../Misc/MakeDDEnergySpectra_NoFieldCorr.m | 739 ++++ ...akeDDEnergySpectra_NoFieldCorr_FixedG1G2.m | 664 ++++ .../Misc/MakeERBand_NoFieldCorr.m | 1738 ++++++++ ...ctra_WithChosenParams_Slices_NoFieldCorr.m | 1592 ++++++++ .../Misc/Oct2015DD_Run04_DetectorParameters.m | 342 ++ .../Misc/S1b_v_TimeAndField.m | 266 ++ .../Misc/ZCenter_v_Radius.m | 210 + .../libNEST_CH3TModel/Compare_S1a_To_Kr2p18.m | 37 + .../EnergyChi2_S1aMethod_Iron56.m | 1868 +++++++++ .../PredictERBand_Feb2015.m | 224 ++ .../PredictERBand_Nov2014.m | 248 ++ .../PredictERBand_Sep2014.m | 225 ++ .../PredictERBand_Sep2015.m | 270 ++ .../ERBandPrediction/Feb2015_ER_Band.m | 1290 ++++++ .../ERBandPrediction/MakeS1aS1bMap_Feb2015.m | 324 ++ .../ERBandPrediction/MakeS1aS1bMap_Nov2014.m | 324 ++ .../ERBandPrediction/MakeS1aS1bMap_Sep2014.m | 323 ++ .../ERBandPrediction/MakeS1aS1bMap_Sep2015.m | 384 ++ .../ERBandPrediction/Nov2014_ER_Band.m | 1296 ++++++ .../ERBandPrediction/Sep2014_ER_Band.m | 1290 ++++++ .../Sep2015_ERBand_RelatedToS1aS1b_RZ.m | 1483 +++++++ .../Sep2015_ERBand_RelatedToS1aS1b_Z.m | 1487 +++++++ .../ERBandPrediction/Sep2015_ER_Band.m | 1294 ++++++ .../EnergySpectra/AverageWidthOfERBands.m | 56 + .../MakeDDEnergySpectra_WithChosenParams.m | 733 ++++ .../MakeERBand_WithChosenParams.m | 1735 ++++++++ ...akeEnergySpectra_WithChosenParams_Slices.m | 1691 ++++++++ .../S1FieldEffect_to_S1a_3D.m | 761 ++++ .../S1FieldEffect_to_S1a_3D_LucieMaps.m | 758 ++++ .../S1FieldEffect_to_S1a_3D_ScottMaps.m | 758 ++++ .../Make3DInterpMap_FromLucieMap_2015.m | 58 + .../Make3DInterpMap_FromLucieMap_2016.m | 58 + .../TritiumMethod/Run04_G1ZDep_Feb2016.m | 69 + .../TritiumMethod/Run04_G1ZDep_Sep2015.m | 65 + ...gyChi2_S1LineFloatPoly_S2Poly2015_Iron56.m | 1819 +++++++++ ...LineFloatPoly_S2Poly2015_Iron56_Improved.m | 1869 +++++++++ ...Poly_S2Poly2015_Iron56_Improved_With1D2D.m | 1870 +++++++++ ...Poly_S2Poly2015_Local_ImprovedHiResFINAL.m | 1869 +++++++++ .../libNEST_CH3TModel/EstimateField_Sep2014.m | 96 + .../libNEST_CH3TModel/EstimateField_Sep2015.m | 96 + .../libNEST_CH3TModel/FindG1EEStatError.m | 26 + .../KrypCal_FindFieldDependence_Kr2p21_2015.m | 1901 +++++++++ ...ergySpectra_WithChosenParams_SlicesSCRAP.m | 1632 ++++++++ .../MakeMappingParamStart_2014_cp17059.m | 423 ++ .../MakeMappingParamStart_2015.m | 423 ++ .../MakeMappingParamStart_Feb2016.m | 423 ++ .../libNEST_CH3TModel/landau_fit/calcnbins.m | 129 + .../libNEST_CH3TModel/landau_fit/hist_.m | 86 + .../landau_fit/histfitlandau.m | 77 + .../landau_fit/histfitlandau.m~ | 77 + .../libNEST_CH3TModel/landau_fit/landau.m | 15 + .../libNEST_CH3TModel/landau_fit/landau_.m | 66 + .../libNEST_CH3TModel/landau_fit/readme.m | 2 + .../libNEST_CH3TModel/landau_fit/readme.m~ | 2 + .../libNEST_CH3TModel/landau_fit/val.mat | Bin 0 -> 1691 bytes ...iscrimination_ZDependence_AverageLeakage.m | 3469 ++++++++++++++++ ...endence_AverageLeakage_NoFieldCorrection.m | 3540 +++++++++++++++++ ...imination_ZDependence_DataDrivenApproach.m | 3244 +++++++++++++++ ...ndence_DataDrivenApproach_ConstantDDBand.m | 2943 ++++++++++++++ .../MakeMappingParamStart_CH3T.m | 415 ++ .../Discrimination/MakeMappingParamStart_DD.m | 415 ++ .../MakeMappingParamStart_Feb2015.m | 416 ++ .../MakeMappingParamStart_Feb2016.m | 416 ++ .../MakeMappingParamStart_Nov2014.m | 416 ++ .../MakeMappingParamStart_Sep2014.m | 416 ++ .../MakeMappingParamStart_Sep2015.m | 416 ++ .../ERBand_Prediction/MakeS1aS1bMap_Feb2015.m | 431 ++ .../ERBand_Prediction/MakeS1aS1bMap_Feb2016.m | 431 ++ .../ERBand_Prediction/MakeS1aS1bMap_Nov2014.m | 430 ++ .../ERBand_Prediction/MakeS1aS1bMap_Sep2014.m | 429 ++ .../ERBand_Prediction/MakeS1aS1bMap_Sep2015.m | 427 ++ .../ERBand_Prediction/Nov2014_ER_Band.m | 829 ++++ .../ERBand_Prediction/PredictERBand_Feb2015.m | 224 ++ .../ERBand_Prediction/PredictERBand_Feb2016.m | 246 ++ .../ERBand_Prediction/PredictERBand_Nov2014.m | 245 ++ .../PredictERBand_Nov2014_fromSep2014.m | 245 ++ .../ERBand_Prediction/PredictERBand_Sep2014.m | 225 ++ .../ERBand_Prediction/PredictERBand_Sep2015.m | 270 ++ .../PredictERBand_Feb2015.m | 203 + .../PredictERBand_Feb2016.m | 203 + .../PredictERBand_Sep2015.m | 205 + .../SetUp_VoxPrediction_Feb2015.m | 1351 +++++++ .../SetUp_VoxPrediction_Feb2016.m | 1349 +++++++ .../SetUp_VoxPrediction_Sep2015.m | 1347 +++++++ .../Sep2014_ERBand_RelatedToS1aS1b_RZ.m | 1418 +++++++ .../ERBand_Prediction/Sep2014_ER_Band.m | 829 ++++ .../Sep2015_ERBand_RelatedToS1aS1b_RZ.m | 1418 +++++++ .../ERBand_Prediction/Sep2015_ER_Band.m | 829 ++++ .../ERBand_Z_Dependence/ERBandVoxelized.m | 830 ++++ .../ERBandVoxelized_libNEST.m | 140 + .../ERBand_Z_Dependence/ERBand_Z_Dependence.m | 1199 ++++++ .../ERBand_Z_Dependence_NoFieldCorr.m | 1199 ++++++ .../ERBand_Z_Dependence/OverlayAllBands.m | 74 + .../Chi2Info_NoFieldCorr.docx | Bin 0 -> 20109 bytes .../FindG1EEStatError_NoFieldCorrection.m | 1507 +++++++ .../ForWriteUp/MakeEnergySpectra_Chi2Result.m | 1582 ++++++++ .../MakeEnergySpectra_RecombResult.m | 1583 ++++++++ .../ForWriteUp/MakeEnergySpectra_S1aResult.m | 1583 ++++++++ .../MakeEnergySpectra.m | 1608 ++++++++ .../MakeEnergySpectra_NoFieldCorrection.m | 1583 ++++++++ .../MakeEnergySpectra_ZCorrOnly.m | 1583 ++++++++ .../EnergyResolution/DDEnergyResolution.m | 735 ++++ .../DDEnergyResolution_NoFieldCorrection.m | 736 ++++ .../EnergyResolution/KrEnergyResolution.m | 1600 ++++++++ .../KrEnergyResolution_NoFieldCorrection.m | 1575 ++++++++ .../MakeMappingParamStart_DDOct2015.m | 423 ++ .../LifetimeEstimates/Sep2015_Lifetime.m | 993 +++++ .../Sep2015_Lifetime_NoFieldCorr.m | 993 +++++ .../NRBand_Z_Dependence/NRBand_ZDependence.m | 1912 +++++++++ .../NRBand_ZDependence_NoFieldCorrection.m | 1911 +++++++++ .../QuestionsToAnswer.docx | Bin 0 -> 21412 bytes .../MyScripts/LUG_Queries/get_IQs_LUG_Run04.m | 297 ++ .../PMTxPMTMethod/KrypCal_S1_PMTxPMT.m | 405 ++ .../KrypCal_S1_PMTxPMT_MeanWeights.m | 357 ++ .../MyScripts/PMTxPMTMethod/SimulatedS1.m | 386 ++ .../MyScripts/RadonMLE/ExctractDataFromPlot.m | 14 + .../Matlab/MyScripts/RadonMLE/LoadAllRadon.m | 236 ++ .../MyScripts/RadonMLE/MakeRadonMLEPlots.m | 16 + .../MyScripts/RadonMLE/MakeRadonSelection.m | 19 + .../RadonMLE/QueryLugFor_DP2p0_Lifetimes.m | 35 + .../Run03_CH3T_Outliers/AugOutliers_spiky.m | 231 ++ .../Run03_CH3T_Outliers/DecemberOutliers.m | 226 ++ .../DecemberOutliers_spiky.m | 364 ++ .../Run03_CH3T_Outliers/SimulationData.m | 114 + .../MyScripts/Run03_CH3T_Outliers/WS_ERBand.m | 56 + .../Feb2015_Run04_DetectorParameters.m | 350 ++ .../Nov2014_Run04_DetectorParameters.m | 350 ++ .../Sep2014_Run04_DetectorParameters.m | 342 ++ .../Sep2015_Run04_DetectorParameters.m | 363 ++ .../Make3DInterpMap_FromLucieMap_2014.m | 54 + .../Make3DInterpMap_FromLucieMap_2015.m | 54 + .../S1aS1b_to_Field_2014.m | 297 ++ .../S1aS1b_to_Field_2015.m | 310 ++ .../SimComparisons/CompareToSimsData.m | 156 + .../SimComparisons/MakeWS_Spectrum.m | 43 + .../MyScripts/SimComparisons/Xe131Sims.m | 88 + CodeForLUX/Matlab/Submit_KrypCal_to_LUG.m | 176 + .../Feb2015_CH3T_G1G2_KrypCal2p22.ipynb | 1329 +++++++ .../Feb2016_CH3T_G1G2_KrypCal2p22.ipynb | 1421 +++++++ .../Nov2014_CH3T_G1G2_KrypCal2p22.ipynb | 1345 +++++++ .../Sep2014_CH3T_G1G2_KrypCal2p22.ipynb | 1331 +++++++ .../Sep2015_CH3T_G1G2_KrypCal2p22.ipynb | 1348 +++++++ .../CH3T_S1Threshold.ipynb | 839 ++++ .../Sep2015_CH3T_Spectrum_Sim.ipynb | 1141 ++++++ 170 files changed, 113530 insertions(+) create mode 100644 CodeForLUX/Matlab/ApplyCorrections.m create mode 100644 CodeForLUX/Matlab/KrypCal.m create mode 100644 CodeForLUX/Matlab/MyFunctions/EstimateField.m create mode 100644 CodeForLUX/Matlab/MyFunctions/GetGoldenCuts.m create mode 100644 CodeForLUX/Matlab/MyFunctions/GetS1aS1bCuts.m create mode 100644 CodeForLUX/Matlab/MyFunctions/GetS1aS1bFiducialCuts.m create mode 100644 CodeForLUX/Matlab/MyFunctions/GetSECuts.m create mode 100644 CodeForLUX/Matlab/MyFunctions/KrypCal_S1_3D.m create mode 100644 CodeForLUX/Matlab/MyFunctions/MeasurePulseAreaXYDep.m create mode 100644 CodeForLUX/Matlab/MyFunctions/MeasurePulseAreaZDep.m create mode 100644 CodeForLUX/Matlab/MyFunctions/MeasureS1aS1b3DDep.m create mode 100644 CodeForLUX/Matlab/MyFunctions/MeasureS1aS1bRvZDep.m create mode 100644 CodeForLUX/Matlab/MyFunctions/MeasureS1aS1bXYDep.m create mode 100644 CodeForLUX/Matlab/MyFunctions/MeasureS1aS1bZDep.m create mode 100644 CodeForLUX/Matlab/MyFunctions/MeasureS2PulseWidthXYDep.m create mode 100644 CodeForLUX/Matlab/MyFunctions/MeasureS2PulseWidthZDep.m create mode 100644 CodeForLUX/Matlab/MyFunctions/MeasureSESize.m create mode 100644 CodeForLUX/Matlab/MyFunctions/MeasureSEXYDep.m create mode 100644 CodeForLUX/Matlab/MyFunctions/ProducePulseAreaXYNorms.m create mode 100644 CodeForLUX/Matlab/MyFunctions/RK_1DCubicInterp_LinearExtrap.m create mode 100644 CodeForLUX/Matlab/MyFunctions/RemoveFieldDependence_1D.m create mode 100644 CodeForLUX/Matlab/MyFunctions/RemoveFieldDependence_3D.m create mode 100644 CodeForLUX/Matlab/MyFunctions/polyfitweighted.m create mode 100644 CodeForLUX/Matlab/MyFunctions/rkploterr.m create mode 100644 CodeForLUX/Matlab/MyScripts/DokePlot/Run03_DokePlot.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/Misc/Load_ALL_Kr50_G1G2_SatFixed_SECenter.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/Misc/MakeDDEnergySpectra_NoFieldCorr.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/Misc/MakeDDEnergySpectra_NoFieldCorr_FixedG1G2.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/Misc/MakeERBand_NoFieldCorr.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/Misc/MakeEnergySpectra_WithChosenParams_Slices_NoFieldCorr.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/Misc/Oct2015DD_Run04_DetectorParameters.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/Misc/S1b_v_TimeAndField.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/Misc/ZCenter_v_Radius.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/Compare_S1a_To_Kr2p18.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/EnergyChi2_S1aMethod_Iron56.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/BandPredictionCode/PredictERBand_Feb2015.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/BandPredictionCode/PredictERBand_Nov2014.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/BandPredictionCode/PredictERBand_Sep2014.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/BandPredictionCode/PredictERBand_Sep2015.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/Feb2015_ER_Band.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/MakeS1aS1bMap_Feb2015.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/MakeS1aS1bMap_Nov2014.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/MakeS1aS1bMap_Sep2014.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/MakeS1aS1bMap_Sep2015.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/Nov2014_ER_Band.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/Sep2014_ER_Band.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/Sep2015_ERBand_RelatedToS1aS1b_RZ.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/Sep2015_ERBand_RelatedToS1aS1b_Z.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/Sep2015_ER_Band.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/EnergySpectra/AverageWidthOfERBands.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/EnergySpectra/MakeDDEnergySpectra_WithChosenParams.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/EnergySpectra/MakeERBand_WithChosenParams.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/EnergySpectra/MakeEnergySpectra_WithChosenParams_Slices.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/S1FieldEffect_to_S1a_3D.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/S1FieldEffect_to_S1a_3D_LucieMaps.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/S1FieldEffect_to_S1a_3D_ScottMaps.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/Make3DInterpMap_FromLucieMap_2015.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/Make3DInterpMap_FromLucieMap_2016.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/Run04_G1ZDep_Feb2016.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/Run04_G1ZDep_Sep2015.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/EnergyChi2_S1LineFloatPoly_S2Poly2015_Iron56.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/EnergyChi2_S1LineFloatPoly_S2Poly2015_Iron56_Improved.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/EnergyChi2_S1LineFloatPoly_S2Poly2015_Iron56_Improved_With1D2D.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/EnergyChi2_S1LineFloatPoly_S2Poly2015_Local_ImprovedHiResFINAL.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/EstimateField_Sep2014.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/EstimateField_Sep2015.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/FindG1EEStatError.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/KrypCal_FindFieldDependence_Kr2p21_2015.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/MakeEnergySpectra_WithChosenParams_SlicesSCRAP.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/MakeMappingParamStart_2014_cp17059.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/MakeMappingParamStart_2015.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/MakeMappingParamStart_Feb2016.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/landau_fit/calcnbins.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/landau_fit/hist_.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/landau_fit/histfitlandau.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/landau_fit/histfitlandau.m~ create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/landau_fit/landau.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/landau_fit/landau_.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/landau_fit/readme.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/landau_fit/readme.m~ create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/landau_fit/val.mat create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/Discrimination/AverageLeakage/Discrimination_ZDependence_AverageLeakage.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/Discrimination/AverageLeakage/Discrimination_ZDependence_AverageLeakage_NoFieldCorrection.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/Discrimination/DataDrivenApproach/Discrimination_ZDependence_DataDrivenApproach.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/Discrimination/DataDrivenApproach_ConstantDDBand/Discrimination_ZDependence_DataDrivenApproach_ConstantDDBand.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/Discrimination/MakeMappingParamStart_CH3T.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/Discrimination/MakeMappingParamStart_DD.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/MakeMappingParamStart_Feb2015.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/MakeMappingParamStart_Feb2016.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/MakeMappingParamStart_Nov2014.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/MakeMappingParamStart_Sep2014.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/MakeMappingParamStart_Sep2015.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/MakeS1aS1bMap_Feb2015.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/MakeS1aS1bMap_Feb2016.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/MakeS1aS1bMap_Nov2014.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/MakeS1aS1bMap_Sep2014.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/MakeS1aS1bMap_Sep2015.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/Nov2014_ER_Band.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictERBand_Feb2015.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictERBand_Feb2016.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictERBand_Nov2014.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictERBand_Nov2014_fromSep2014.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictERBand_Sep2014.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictERBand_Sep2015.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictVoxelizedBands/PredictERBand_Feb2015.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictVoxelizedBands/PredictERBand_Feb2016.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictVoxelizedBands/PredictERBand_Sep2015.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictVoxelizedBands/SetUp_VoxPrediction_Feb2015.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictVoxelizedBands/SetUp_VoxPrediction_Feb2016.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictVoxelizedBands/SetUp_VoxPrediction_Sep2015.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/Sep2014_ERBand_RelatedToS1aS1b_RZ.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/Sep2014_ER_Band.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/Sep2015_ERBand_RelatedToS1aS1b_RZ.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/Sep2015_ER_Band.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Z_Dependence/ERBandVoxelized.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Z_Dependence/ERBandVoxelized_libNEST.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Z_Dependence/ERBand_Z_Dependence.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Z_Dependence/ERBand_Z_Dependence_NoFieldCorr.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Z_Dependence/OverlayAllBands.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/EnergyReconstructionAndG1EE/Chi2Info_NoFieldCorr.docx create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/EnergyReconstructionAndG1EE/FindG1EEStatError_NoFieldCorrection.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/EnergyReconstructionAndG1EE/ForWriteUp/MakeEnergySpectra_Chi2Result.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/EnergyReconstructionAndG1EE/ForWriteUp/MakeEnergySpectra_RecombResult.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/EnergyReconstructionAndG1EE/ForWriteUp/MakeEnergySpectra_S1aResult.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/EnergyReconstructionAndG1EE/MakeEnergySpectra.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/EnergyReconstructionAndG1EE/MakeEnergySpectra_NoFieldCorrection.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/EnergyReconstructionAndG1EE/MakeEnergySpectra_ZCorrOnly.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/EnergyResolution/DDEnergyResolution.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/EnergyResolution/DDEnergyResolution_NoFieldCorrection.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/EnergyResolution/KrEnergyResolution.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/EnergyResolution/KrEnergyResolution_NoFieldCorrection.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/EnergyResolution/MakeMappingParamStart_DDOct2015.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/LifetimeEstimates/Sep2015_Lifetime.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/LifetimeEstimates/Sep2015_Lifetime_NoFieldCorr.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/NRBand_Z_Dependence/NRBand_ZDependence.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/NRBand_Z_Dependence/NRBand_ZDependence_NoFieldCorrection.m create mode 100644 CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/QuestionsToAnswer.docx create mode 100644 CodeForLUX/Matlab/MyScripts/LUG_Queries/get_IQs_LUG_Run04.m create mode 100644 CodeForLUX/Matlab/MyScripts/PMTxPMTMethod/KrypCal_S1_PMTxPMT.m create mode 100644 CodeForLUX/Matlab/MyScripts/PMTxPMTMethod/KrypCal_S1_PMTxPMT_MeanWeights.m create mode 100644 CodeForLUX/Matlab/MyScripts/PMTxPMTMethod/SimulatedS1.m create mode 100644 CodeForLUX/Matlab/MyScripts/RadonMLE/ExctractDataFromPlot.m create mode 100644 CodeForLUX/Matlab/MyScripts/RadonMLE/LoadAllRadon.m create mode 100644 CodeForLUX/Matlab/MyScripts/RadonMLE/MakeRadonMLEPlots.m create mode 100644 CodeForLUX/Matlab/MyScripts/RadonMLE/MakeRadonSelection.m create mode 100644 CodeForLUX/Matlab/MyScripts/RadonMLE/QueryLugFor_DP2p0_Lifetimes.m create mode 100644 CodeForLUX/Matlab/MyScripts/Run03_CH3T_Outliers/AugOutliers_spiky.m create mode 100644 CodeForLUX/Matlab/MyScripts/Run03_CH3T_Outliers/DecemberOutliers.m create mode 100644 CodeForLUX/Matlab/MyScripts/Run03_CH3T_Outliers/DecemberOutliers_spiky.m create mode 100644 CodeForLUX/Matlab/MyScripts/Run03_CH3T_Outliers/SimulationData.m create mode 100644 CodeForLUX/Matlab/MyScripts/Run03_CH3T_Outliers/WS_ERBand.m create mode 100644 CodeForLUX/Matlab/MyScripts/Run04_libNEST_DetectorParameters/Feb2015_Run04_DetectorParameters.m create mode 100644 CodeForLUX/Matlab/MyScripts/Run04_libNEST_DetectorParameters/Nov2014_Run04_DetectorParameters.m create mode 100644 CodeForLUX/Matlab/MyScripts/Run04_libNEST_DetectorParameters/Sep2014_Run04_DetectorParameters.m create mode 100644 CodeForLUX/Matlab/MyScripts/Run04_libNEST_DetectorParameters/Sep2015_Run04_DetectorParameters.m create mode 100644 CodeForLUX/Matlab/MyScripts/S1aS1b_to_Field_Measurements/Make3DInterpMap_FromLucieMap_2014.m create mode 100644 CodeForLUX/Matlab/MyScripts/S1aS1b_to_Field_Measurements/Make3DInterpMap_FromLucieMap_2015.m create mode 100644 CodeForLUX/Matlab/MyScripts/S1aS1b_to_Field_Measurements/S1aS1b_to_Field_2014.m create mode 100644 CodeForLUX/Matlab/MyScripts/S1aS1b_to_Field_Measurements/S1aS1b_to_Field_2015.m create mode 100644 CodeForLUX/Matlab/MyScripts/SimComparisons/CompareToSimsData.m create mode 100644 CodeForLUX/Matlab/MyScripts/SimComparisons/MakeWS_Spectrum.m create mode 100644 CodeForLUX/Matlab/MyScripts/SimComparisons/Xe131Sims.m create mode 100644 CodeForLUX/Matlab/Submit_KrypCal_to_LUG.m create mode 100644 CodeForLUX/Python/Run04_CH3T_G1G2/Feb2015_CH3T_G1G2_KrypCal2p22.ipynb create mode 100644 CodeForLUX/Python/Run04_CH3T_G1G2/Feb2016_CH3T_G1G2_KrypCal2p22.ipynb create mode 100644 CodeForLUX/Python/Run04_CH3T_G1G2/Nov2014_CH3T_G1G2_KrypCal2p22.ipynb create mode 100644 CodeForLUX/Python/Run04_CH3T_G1G2/Sep2014_CH3T_G1G2_KrypCal2p22.ipynb create mode 100644 CodeForLUX/Python/Run04_CH3T_G1G2/Sep2015_CH3T_G1G2_KrypCal2p22.ipynb create mode 100644 CodeForLUX/Python/Run04_CH3T_NESTmodel/CH3T_S1Threshold.ipynb create mode 100644 CodeForLUX/Python/Run04_CH3T_NESTmodel/Sep2015_CH3T_Spectrum_Sim.ipynb diff --git a/CodeForLUX/Matlab/ApplyCorrections.m b/CodeForLUX/Matlab/ApplyCorrections.m new file mode 100644 index 0000000..ddd49cd --- /dev/null +++ b/CodeForLUX/Matlab/ApplyCorrections.m @@ -0,0 +1,363 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Purpose: +% This function queries the LUG to find and apply the appropriate XY, and Z corrections +% for the dataset being processed. This runs as part of the DP framework, and produces +% a number of correction RQs that are added to the dataset. +% +% Inputs: +% - filename_evt - String containing name of the current .evt dataset +% - data_path_evt - String containing path to evt file +% - filename_rq - String containing name of the current .rq dataset +% - data_path_rq - String containing path to the dataset +% - data_processing_xml_path - String containing path to DP xml +% - iq_xml_path - String containing path to IQ xml +% +% Outputs: +% - status - Flag indicating successful processing +% +% Example usage: status = ApplyCorrections_Basic(filename_evt,data_path_evt,filename_rq,data_path_rq,data_processing_xml_path,iq_xml_path) +% +% Author: +% - Attila Dobi, Richard Knoche +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function status = ApplyCorrections(filename_evt,data_path_evt,filename_rq,data_path_rq,data_processing_xml_path,iq_xml_path) %#ok<*INUSL> + +%% Load .rq file + +if strcmp(filename_rq(1),'.') % check for '.' infornt of the file name + filename_prefix = filename_rq(2:20); +else + filename_prefix = filename_rq(1:19); +end + +dp = LUXLoadRQ1s_framework(filename_rq, data_path_rq); + +settings.evt_settings = dp.admin.evt_settings; +settings.daq_settings = dp.admin.daq_settings; +settings.filename_prefix = dp.admin.filename_prefix; + +%% Bookkeeping + +myname = 'ApplyCorrections'; + +fprintf('\n\n *** Starting module %s\n',myname); +fprintf('\n Data processing xml file = %s\n',data_processing_xml_path); + +dp_settings_xml = XMLReader_framework(data_processing_xml_path); +lug_iqs_xml = XMLReader_framework(iq_xml_path); +module_names = {dp_settings_xml.data_processing_settings.module.module_name}; +index_temp = strfind(module_names,myname); +index_module = find(not(cellfun('isempty', index_temp))); +mymodule_settings = dp_settings_xml.data_processing_settings.module(index_module).parameters; %#ok<*FNDSB> +max_num_pulses = dp_settings_xml.data_processing_settings.global.max_num_pulses; + +%% Initialize variables + +pmt_chs = 1:122; % must take from daq settings +N = length(dp.event_number); +pulse_event_size = [max_num_pulses N]; +livetime = dp.admin.livetime; + +% Correcting issue with top_bottom_ratio +[a1 b1] = size(dp.pulse_area_phe); +[a2 b2] = size(dp.top_bottom_ratio); adif = a1-a2; + +blanks = []; +for i=1:b1 + blanks = [blanks 0]; +end + +if adif>0 + for i=1:adif + dp.top_bottom_ratio = vertcat(dp.top_bottom_ratio,blanks); + end +end + +% Initializing corrected values of area +dp.z_corrected_pulse_area_all_phe = dp.pulse_area_phe; +dp.xyz_corrected_pulse_area_all_phe = dp.pulse_area_phe; +dp.z_corrected_pulse_area_bot_phe = dp.pulse_area_phe./(1+dp.top_bottom_ratio); +dp.xyz_corrected_pulse_area_bot_phe = dp.pulse_area_phe./(1+dp.top_bottom_ratio); +dp.correction_s2_z_dependence = zeros(max_num_pulses,N, 'single'); +dp.correction_s1_z_dependence = zeros(max_num_pulses,N, 'single'); +dp.correction_s1_xyz_dependence = zeros(max_num_pulses,N, 'single'); +dp.correction_s2_xy_dependence = zeros(max_num_pulses,N, 'single'); + +% Initialize variable with negative value so that we're sure it goes through the code +dp.s1_correction_is_3d = zeros(1,N,'int8'); +dp.s1_correction_is_3d(:) = -99; + +%% Finding the S2 Z Correction IQ + +[a num_iqs] = size(lug_iqs_xml.iq); %#ok<*ASGLU> + +%Intializing variables +s2_norm_z_iqs = {}; +s2_norm_iqs = {}; +dataset_times = []; +filename_prefixs = {}; +cp_number = {}; + +for i=1:num_iqs + if isfield(lug_iqs_xml.iq(i).correction,'fit')==1 + if (isfield(lug_iqs_xml.iq(i).correction.fit,'s2_both_norm_z_index').*strncmp(lug_iqs_xml.iq(i).global.algorithm_name,'LUXkrypCal',10))==1 %#ok<*BDSCA> + s2_norm_z_iqs = [s2_norm_z_iqs lug_iqs_xml.iq(i).correction.fit.s2_both_norm_z_index]; %#ok<*AGROW> + s2_norm_iqs = [s2_norm_iqs lug_iqs_xml.iq(i).correction.fit.s2_both_norm_z]; + dataset_times = [dataset_times filename2epoch_framework(lug_iqs_xml.iq(i).global.filename_prefix) ]; + filename_prefixs = [filename_prefixs lug_iqs_xml.iq(i).global.filename_prefix]; + cp_number = [cp_number lug_iqs_xml.iq(i).global.cp_number]; + end + end +end + +current_data_set_time = filename2epoch_framework(filename_prefix ); %#ok<*NASGU> +[s2_norm_z s2_norm] = InterpS2IQ_Run04(filename_prefix, dataset_times, s2_norm_z_iqs, s2_norm_iqs); + +%% Finding the S1 Z-dep values + + +z_dep_both_values = zeros(0,3); +z_dep_bottom_values = zeros(0,3); +dataset_times = []; +filename_prefixs = {}; +cp_number = {}; + +for i=1:num_iqs + if isfield(lug_iqs_xml.iq(i).correction,'fit')==1 + if (isfield(lug_iqs_xml.iq(i).correction.fit,'s1_both_zdep_quad_fit').*strncmp(lug_iqs_xml.iq(i).global.algorithm_name,'LUXkrypCal',10))==1 + z_dep_both_values = vertcat(z_dep_both_values,lug_iqs_xml.iq(i).correction.fit.s1_both_zdep_quad_fit); + z_dep_bottom_values = vertcat(z_dep_bottom_values,lug_iqs_xml.iq(i).correction.fit.s1_bottom_zdep_quad_fit); + dataset_times = [dataset_times filename2epoch_framework(lug_iqs_xml.iq(i).global.filename_prefix )]; + filename_prefixs = [filename_prefixs lug_iqs_xml.iq(i).global.filename_prefix]; + cp_number = [cp_number lug_iqs_xml.iq(i).global.cp_number]; + + end + end +end + +[index iq_time_zDep] = NearestIQ(filename_prefix,dataset_times); +z_dep_par_all = z_dep_both_values(index,:); +z_dep_par_bot = z_dep_bottom_values(index,:); + +%% Finding the S2 xy correction map values + + +s2_xy_index = []; +dataset_times = []; +filename_prefixs = {}; +cp_number = {}; + +for i=1:num_iqs + if isfield(lug_iqs_xml.iq(i).correction,'fit')==1 + if (isfield(lug_iqs_xml.iq(i).correction.fit,'norm_s2_both').*strncmp(lug_iqs_xml.iq(i).global.algorithm_name,'LUXkrypCal',10))==1 + s2_xy_index = [s2_xy_index i]; + dataset_times = [dataset_times filename2epoch_framework(lug_iqs_xml.iq(i).global.filename_prefix ) ]; + filename_prefixs = [filename_prefixs lug_iqs_xml.iq(i).global.filename_prefix]; + cp_number = [cp_number lug_iqs_xml.iq(i).global.cp_number]; + end + end +end + + [index iq_time_s2xyDep] = NearestIQ(filename_prefix,dataset_times); + + s2_x_bins = lug_iqs_xml.iq(s2_xy_index(index)).correction.fit.x_bin_center; + s2_y_bins = lug_iqs_xml.iq(s2_xy_index(index)).correction.fit.y_bin_center; + s2_map_all = lug_iqs_xml.iq(s2_xy_index(index)).correction.fit.norm_s2_both; + s2_map_bottom = lug_iqs_xml.iq(s2_xy_index(index)).correction.fit.norm_s2_bottom; + +%% Finding the S1 xy correction map values + +s1_xy_index = []; +dataset_times = []; +filename_prefixs = {}; +cp_number = {}; + +for i=1:num_iqs + if isfield(lug_iqs_xml.iq(i).correction,'fit')==1 + if (isfield(lug_iqs_xml.iq(i).correction.fit,'norm_s1_both').*strncmp(lug_iqs_xml.iq(i).global.algorithm_name,'LUXkrypCal',10))==1 + s1_xy_index = [s1_xy_index i]; + dataset_times = [dataset_times filename2epoch_framework(lug_iqs_xml.iq(i).global.filename_prefix ) ]; + filename_prefixs = [filename_prefixs lug_iqs_xml.iq(i).global.filename_prefix]; + cp_number = [cp_number lug_iqs_xml.iq(i).global.cp_number]; + end + end +end + +[index iq_time] = NearestIQ(filename_prefix,dataset_times); +s1_x_bins = lug_iqs_xml.iq(s1_xy_index(index)).correction.fit.x_bin_center; +s1_y_bins = lug_iqs_xml.iq(s1_xy_index(index)).correction.fit.y_bin_center; +s1_map_all = lug_iqs_xml.iq(s1_xy_index(index)).correction.fit.norm_s1_both; +s1_map_bottom = lug_iqs_xml.iq(s1_xy_index(index)).correction.fit.norm_s1_bottom; + +%% Finding the S1 xyz correction map values + +s1_xyz_index = []; +dataset_times = []; +filename_prefixs = {}; +cp_number = {}; + +for i=1:num_iqs + if isfield(lug_iqs_xml.iq(i).correction,'fit')==1 + if (isfield(lug_iqs_xml.iq(i).correction.fit,'norm_s1_both_xyz').*strncmp(lug_iqs_xml.iq(i).global.algorithm_name,'LUXkrypCal',10))==1 + s1_xyz_index = [s1_xyz_index i]; + dataset_times = [dataset_times filename2epoch_framework(lug_iqs_xml.iq(i).global.filename_prefix )]; + filename_prefixs = [filename_prefixs lug_iqs_xml.iq(i).global.filename_prefix]; + cp_number = [cp_number lug_iqs_xml.iq(i).global.cp_number]; + end + end +end + +[index iq_time_s1xyzDep] = NearestIQ(filename_prefix,dataset_times); +s1_xyz_x_bins = lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.x_bin_center; +s1_xyz_y_bins = lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.y_bin_center; +s1_xyz_z_bins = lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.z_bin_center; +xx = size(s1_xyz_x_bins); +yy = size(s1_xyz_y_bins); +zz = size(s1_xyz_z_bins); +s1_xyz_map_all = lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +s1_xyz_map_bottom = lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); + +%% Finding the detector center according to KrypCal + +det_center_index = []; +dataset_times = []; +filename_prefixs = {}; +cp_number = {}; + +for i=1:num_iqs + if isfield(lug_iqs_xml.iq(i).correction,'fit')==1 + if (isfield(lug_iqs_xml.iq(i).correction.fit,'x_center').*strncmp(lug_iqs_xml.iq(i).global.algorithm_name,'LUXkrypCal',10))==1 + det_center_index = [det_center_index i]; + dataset_times = [dataset_times filename2epoch_framework(lug_iqs_xml.iq(i).global.filename_prefix )]; + filename_prefixs = [filename_prefixs lug_iqs_xml.iq(i).global.filename_prefix]; + cp_number = [cp_number lug_iqs_xml.iq(i).global.cp_number]; + end + end +end + +[index iq_time_det_center] = NearestIQ(filename_prefix,dataset_times); +det_x_center = lug_iqs_xml.iq(det_center_index(index)).correction.fit.x_center; +det_y_center = lug_iqs_xml.iq(det_center_index(index)).correction.fit.y_center; +det_z_center = lug_iqs_xml.iq(det_center_index(index)).correction.fit.z_center; +s1_ref_z_ns = det_z_center.*1000; %conver uSec to ns + +%% Finding the drift time, x and y associated with S1 from the largest S2 pulse in the pairing + +[a b] = size(dp.z_drift_samples); % b is number of events in file +drift = dp.z_drift_samples; +drift(find(isnan(drift))) = 0.0; +s1_drift_ns = +(dp.pulse_classification==1); +s1_x_cm = +(dp.pulse_classification==1); +s1_y_cm = +(dp.pulse_classification==1); +s2_phe = dp.pulse_area_phe.*(dp.pulse_classification==2); +s2_phe(find(isnan(s2_phe))) = 0.0; +s1s = (sum(dp.s1s2_pairing==1)>1); % tells you if its an event with at least one s1 and one s2. + +for i=1:length(s1s) % for each event in the file + if s1s(i)>0 % if the event had an S1 + if s1s(i)==1 + [v r] = max(s2_phe(:,i));% value and index (r for row) of Max S2 + [c1 r1 v1] = find(dp.pulse_classification(:,i)==1,1,'first'); + s1_drift_ns(c1,i) = 10.*drift(r,i); %row c1,r and column i + s1_x_cm(c1,i) = dp.x_cm(r,i); + s1_y_cm(c1,i) = dp.y_cm(r,i); + else + s1_drift_ns(:,i) = 0; + s1_x_cm(:,i) = 0; + s1_y_cm(:,i) = 0; + end + end +end + + +fprintf('Done finding S1 depths :) \n'); +s1_drift_ns(find((s1_drift_ns==0))) = nan; +s1_x_cm(find((s1_x_cm==0))) = nan; +s1_y_cm(find((s1_y_cm==0))) = nan; + +%% Calculate Z corrections + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; +s1_z_correction_bot = polyval(z_dep_par_bot,s1_ref_z_ns./1000)./polyval(z_dep_par_bot,s1_drift_ns./1000); +s1_z_correction_bot(find(isnan(s1_z_correction_bot))) = 1.0; +s1_z_correction(dp.pulse_classification~=1) = 1.0; + +% Calculate electron lifetime correction (S2 Z-correction) +% Reading the values of electron lifetime from the LUG and interpolating +% between the two either side +s2_z_correction = interp1(s2_norm_z,s2_norm, double(dp.z_drift_samples)/100,'cubic'); +s2_z_correction(find(isnan(s2_z_correction))) = 1.0; +s2_z_correction(dp.pulse_classification~=2) = 1.0; + +%% Calculate XY corrections + +%Calculate S1 XY-only corrections +s2x = dp.x_cm.*(+(dp.pulse_classification==2)); +s2x(find(s2x==0)) = nan; +s2y = dp.y_cm.*(+(dp.pulse_classification==2)); +s2y(find(s2y==0)) = nan; + +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction = s1xy_correction.*(+dp.pulse_classification==1); +s1xy_correction(find(s1xy_correction==0)) = 1.0; +s1xy_correction(find(isnan(s1xy_correction))) = 1.0; + +s1xy_correction_bot = interp2(s1_x_bins,s1_y_bins,s1_map_bottom,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction_bot = s1xy_correction_bot.*(+dp.pulse_classification==1); +s1xy_correction_bot(find(s1xy_correction_bot==0)) = 1.0; +s1xy_correction_bot(find(isnan(s1xy_correction_bot))) = 1.0; + +%Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,dp.x_cm,dp.y_cm,'cubic'); +s2xy_correction = s2xy_correction.*(+dp.pulse_classification==2); +s2xy_correction(find(s2xy_correction==0)) = 1.0; +s2xy_correction(find(isnan(s2xy_correction))) = 1.0; + +s2xy_correction_bot = interp2(s2_x_bins,s2_y_bins,s2_map_bottom,dp.x_cm,dp.y_cm,'cubic'); +s2xy_correction_bot = s2xy_correction_bot.*(+dp.pulse_classification==2); +s2xy_correction_bot(find(s2xy_correction_bot==0)) = 1.0; +s2xy_correction_bot(find(isnan(s2xy_correction_bot))) = 1.0; + +%% Calculate XYZ corrections + +% ALWAYS DOING 1D+2D NOW. (3/21/2016) +s1xyz_correction = s1xy_correction.*s1_z_correction; +s1xyz_correction_bot = s1xy_correction_bot.*s1_z_correction_bot; +dp.s1_correction_is_3d(:) = 0; + +%% add RQs of correction factors + +dp.correction_s2_z_dependence = single(s2_z_correction); +dp.correction_s1_z_dependence = single(s1_z_correction); +dp.correction_s1_z_dependence_bot = single(s1_z_correction_bot); +dp.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +dp.correction_s1_xyz_dependence_bot = single(s1xyz_correction_bot); %this is either 3D or 1D+2D +dp.correction_s1_xy_dependence = single(s1xy_correction); +dp.correction_s1_xy_dependence_bot = single(s1xy_correction_bot); +dp.correction_s2_xy_dependence = single(s2xy_correction); +dp.correction_s2_xy_dependence_bot = single(s2xy_correction_bot); +dp.admin.corrections.s1_z_dependence.iq_time = iq_time_zDep; +dp.admin.corrections.s1_z_dependence.all = z_dep_par_all; +dp.admin.corrections.s1_z_dependence.bottom = z_dep_par_bot; +dp.admin.corrections.s1_xy_dependence.iq_time = iq_time; +dp.admin.corrections.s2_xy_dependence.iq_time = iq_time_s2xyDep; + +%% Applying corrections + +%Apply Z corrections +dp.z_corrected_pulse_area_all_phe = dp.z_corrected_pulse_area_all_phe.*s2_z_correction.*s1_z_correction; +dp.z_corrected_pulse_area_bot_phe = dp.z_corrected_pulse_area_bot_phe.*s2_z_correction.*s1_z_correction_bot; + + +%Apply XYZ corrections +dp.xyz_corrected_pulse_area_all_phe = dp.xyz_corrected_pulse_area_all_phe.*s2_z_correction.*s2xy_correction.*s1xyz_correction; +dp.xyz_corrected_pulse_area_bot_phe = dp.xyz_corrected_pulse_area_bot_phe.*s2_z_correction.*s2xy_correction_bot.*s1xyz_correction_bot; + +%% Write Output File +status = LUXBinaryRQWriter_framework(settings, dp, filename_rq, data_path_rq, dp.event_number, livetime); % Should add livetime input at the end, remove event_number as settings field + diff --git a/CodeForLUX/Matlab/KrypCal.m b/CodeForLUX/Matlab/KrypCal.m new file mode 100644 index 0000000..a9a3968 --- /dev/null +++ b/CodeForLUX/Matlab/KrypCal.m @@ -0,0 +1,2580 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% ____ ____ _____ _____ _____ _____ _____ ____ ____ +%| | | | ___|\ \ |\ \ / /| ___|\ \ ___|\ \ ____|\ \ | | +%| | | | | |\ \ | \ \ / / || |\ \ / /\ \ / /\ \ | | +%| | / // | | | || \____\/ / /| | | || | | || | | || | +%| |/ _ _// | |/____/ \ | / / / | |/____/|| | |____|| |__| || | ____ +%| |\ \' | |\ \ \|___/ / / | || ||| | ____ | .--. || | | | +%| | \ \ | | | | / / / | ||____|/| | | || | | || | | | +%|____| \____\ |____| |____| /____/ / |____| |\ ___\/ /||____| |____||____|/____/| +%| | | || | | | |` | / | | | | /____/ || | | || | || +%|____| |____||____| |____| |_____|/ |____| \|___| | /|____| |____||____|_____|/ +% \( )/ \( )/ )/ \( \( |____|/ \( )/ \( )/ +% +% +% +% function [ lug_val ] = LUXkrypCal(d,user_name,dp_version,algorithm_name, submit,inpaint_on) +% +% This function will process Kr83m data, extract light response maps (in XYZ) and IQs, and output them to the LUG. +% +% +% Inputs +% - d - the data structure to be analysed. +% - user_name - string identify user on the LUG +% - dp_version - sting corresponding to the DP version. Ex. '2.22' +% - submit - 1 or 0 to submit to LUG or not. By default a 0 +% - inpaint_on - Option to inpaint empty matrix elements in correction maps. +% (default is 0) +% +% Author: +% - Richard Knoche +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +function [lug_val] = KrypCal(d,user_name,dp_version,algorithm_name, submit) + +%% Checking the input arguments, and filling in defaults + +if (nargin <= 4) + submit = 0; + +elseif(nargin <= 3) + algorithm_name = 'test_KrypCal'; + submit = 0; + +elseif (nargin <= 2) + dp_version = '9.99'; %9.99 is dp number assigned to tests + algorithm_name = 'test_KrypCal'; + submit = 0; + +elseif (nargin <= 1) + user_name = 'RichardKnoche'; + dp_version = '9.99'; %9.99 is dp number assigned to tests + algorithm_name = 'test_KrypCal'; + submit = 0; + +end + +%Check that the data struct isn't empty +if ~exist('d','var') || isempty(d) + error('No valid data set provided'); +end + +%Calibrations was originally a user input to specify which calibrations to do +%The feature was never used, so now it is hard coded to do all calibrations +calibrations=ones(6,1); + + +%% Defining constant variables to be used later in the code + +%Extract relevant file name and cp information +file = char(d.files_loaded(1)); +file_id = file(1:19); +cp_start = strfind(file,'cp')+2; %find location of 'cp' in string +cp = file(cp_start:cp_start+4); %cp number has four digits +file_id_cp = [file_id '_cp' cp]; + +%Query the LUG to get gs number for the dataset +query_str = ['select * from lug_complete_process_record where cp="' cp '" ;' ]; +data2 = MySQLQuery_UMD(query_str,'read'); +if str2double(cp) == data2.cp + gs = data2.gs; +else + error('CP number not found on the LUG'); +end + +%Make a folder to save the plots +mkdir(strcat('LUX_corrections/',file_id_cp)) + +%Define correction map limits +%Hard coded since these don't change +grid_size = 3; %cm - This is a default, and isn't used if there are enough events +rcut_min = 0; %cm +rcut_max = 25; %cm +s1area_bound_min = 50; %phe +s1area_bound_max = 650; %phe +s2area_bound_min = 1000; %phe +s2area_bound_max = 70000; %phe + + +%Edges of the S1, S2, and SE maps +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + +%Edges of the drift time maps +det_edge = 330; %Edge of the drift time histogram (found by eye) +zcut_min = 10; %Extraction field starts at 4 uSec +zcut_max = 0.95*det_edge; %Do not want to calculate maps with data near the Cathode + + +%% Event selection with golden cuts + +[s1_single_cut, s2_single_cut] = GetGoldenCuts(d, s1area_bound_min, s1area_bound_max, s2area_bound_min, s2area_bound_max); + + +%% Extracting pulse information + +%Cleaning up the data struct +d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; %get rid of NaN in RQ +d.phe_bottom = d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + +%Pulse area quantities +s1_phe_both = d.pulse_area_phe(s1_single_cut); +s1_phe_bottom = d.phe_bottom(s1_single_cut); +s2_phe_both = d.pulse_area_phe(s2_single_cut); +s2_phe_bottom = d.phe_bottom(s2_single_cut); + +%Position Reconstruction +drift_time = d.z_drift_samples(s2_single_cut)/100; % Converts samples (in units of 10 nS) to uSeconds +s2x = d.x_cm(s2_single_cut); +s2y = d.y_cm(s2_single_cut); +s2radius = (s2x.^2+s2y.^2).^(0.5); + +%Event timing +d.livetime_sec = sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + +%Pulse width information +s2_width = (d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples +s1_width = d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + +%Number of events +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events = length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%Center of the detector in uncorrected coordinates +x_center = mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center = mean(s2y(drift_time>4)); +z_center = mean(drift_time(drift_time>4)); + + +%% Calculate XY binning for correction maps + +%If there are enough events we use variable bin sizes +minimum_events_for_binning = 30000; +if Kr_events < minimum_events_for_binning + S1xybinsize = grid_size; + S2xybinsize = grid_size; +else + S1xybinsize = sqrt((50*50)/(Kr_events/600));%Note: Due to the radial field, bins near the edge won't actually have 600 events in them + S2xybinsize = sqrt((50*50)/(Kr_events/600));%cm +end + +%Set up XY binning for pulse area maps +s2xbins = (S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins = (S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); +s1xbins = (S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins = (S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + + +%% Calculate Raw S1 and S2 means - used to track variation over time on LUG + +% Raw S1 at center +s1_fit_bins = (0:10:2000); +s1_fit_cut = inrange(drift_time,[z_center-5, z_center+5]) & inrange(s1_phe_both,[0 2000]); +s1_phe_both_raw_gauss_fit = fit(s1_fit_bins.',hist(s1_phe_both(s1_fit_cut),s1_fit_bins).','gauss1'); +s1_phe_both_raw_gauss_fit_mean = s1_phe_both_raw_gauss_fit.b1; +s1_phe_both_raw_gauss_fit_sigma = s1_phe_both_raw_gauss_fit.c1/sqrt(2); +s1_phe_both_raw_gauss_fit_confint = confint(s1_phe_both_raw_gauss_fit,0.68); +s1_phe_both_raw_gauss_fit_mean_error = abs(s1_phe_both_raw_gauss_fit_confint(1,2)-s1_phe_both_raw_gauss_fit_mean); +s1_phe_both_raw_gauss_fit_sigma_error = abs(s1_phe_both_raw_gauss_fit_confint(1,3)/sqrt(2)-s1_phe_both_raw_gauss_fit_sigma); + +% Raw S2 at top +s2_fit_bins = (0:100:70000); +s2_fit_cut = inrange(drift_time,[5, 15]) & inrange(s2_phe_both,[0 70000]); +s2_phe_both_raw_gauss_fit = fit(s2_fit_bins.',hist(s2_phe_both(s2_fit_cut),s2_fit_bins).','gauss1'); +s2_phe_both_raw_gauss_fit_mean = s2_phe_both_raw_gauss_fit.b1; +s2_phe_both_raw_gauss_fit_sigma = s2_phe_both_raw_gauss_fit.c1/sqrt(2); +s2_phe_both_raw_gauss_fit_confint = confint(s2_phe_both_raw_gauss_fit,0.68); +s2_phe_both_raw_gauss_fit_mean_error = abs(s2_phe_both_raw_gauss_fit_confint(1,2)-s2_phe_both_raw_gauss_fit_mean); +s2_phe_both_raw_gauss_fit_sigma_error = abs(s2_phe_both_raw_gauss_fit_confint(1,3)/sqrt(2)-s2_phe_both_raw_gauss_fit_sigma); + + +%% Calculate S1a/S1b Z map + +%Set up cuts +[ s1ab_cut ] = GetS1aS1bCuts(d, s1_single_cut, s2_single_cut); + +%Get S1a and S1b quantities +s1ab_x = d.x_cm(s2_single_cut & repmat(s1ab_cut,10,1)); +s1ab_y = d.y_cm(s2_single_cut & repmat(s1ab_cut,10,1)); +s1ab_z = d.z_drift_samples(s2_single_cut & repmat(s1ab_cut,10,1))/100; +s1ab_radius = sqrt(s1ab_x.^2+s1ab_y.^2); +s1a_phe_both = d.Kr83fit_s1a_area_phe(s1ab_cut); +s1b_phe_both = d.Kr83fit_s1b_area_phe(s1ab_cut); + +%Get additional fiducial cuts for S1a/S1b maps +[ s1ab_z_cut, s1ab_r_cut, s1ab_z_cut_upper ] = GetS1aS1bFiducialCuts(s1ab_z, s1ab_radius); + +%Measure S1a/S1b Z dependence +[s1ab_bincenters, s1a_z_means, s1a_z_means_err, s1b_z_means, s1b_z_means_err, s1ab_z_means, ... + s1ab_z_means_err, s1a_P, s1a_S, s1b_P, s1b_S, s1ab_P, s1ab_S] = MeasureS1aS1bZDep(det_edge, s1ab_z, s1a_phe_both, s1b_phe_both, s1ab_r_cut, s1ab_z_cut_upper); + +%Make and save S1a/S1b Z dependence plot +s1az_plot_bins = (10:1:320); + +s1az_plot = figure; +hold on; +errorbar(s1ab_bincenters,s1a_z_means,s1a_z_means_err,'.k') +xlabel('Drift Time (uSec)'); +ylabel('S1a Mean (phe)'); +title('S1a Z Dependence'); +myfigview(16); +plot(s1az_plot_bins,polyval(s1a_P,s1az_plot_bins),'-r','LineWidth',2) +saveas(s1az_plot,strcat('LUX_corrections/',file_id_cp,'/s1a_mean_z',file_id_cp),'fig'); +saveas(s1az_plot,strcat('LUX_corrections/',file_id_cp,'/s1a_mean_z',file_id_cp),'jpg'); + +s1bz_plot = figure; +hold on; +errorbar(s1ab_bincenters,s1b_z_means,s1b_z_means_err,'.k') +xlabel('Drift Time (uSec)'); +ylabel('S1b Mean (phe)'); +title('S1b Z Dependence'); +myfigview(16); +plot(s1az_plot_bins,polyval(s1b_P,s1az_plot_bins),'-r','LineWidth',2) +saveas(s1bz_plot,strcat('LUX_corrections/',file_id_cp,'/s1b_mean_z',file_id_cp),'fig'); +saveas(s1bz_plot,strcat('LUX_corrections/',file_id_cp,'/s1b_mean_z',file_id_cp),'jpg'); + +s1a_over_bz_plot=figure; +hold on; +errorbar(s1ab_bincenters,s1ab_z_means,s1ab_z_means_err,'.k') +xlabel('Drift Time (uSec)'); +ylabel('S1a/b'); +title('S1 a/b Z Dependence'); +myfigview(16); +plot(s1az_plot_bins,polyval(s1ab_P,s1az_plot_bins),'-r','LineWidth',2) +saveas(s1a_over_bz_plot,strcat('LUX_corrections/',file_id_cp,'/s1ab_ratio_z',file_id_cp),'fig'); +saveas(s1a_over_bz_plot,strcat('LUX_corrections/',file_id_cp,'/s1ab_ratio_z',file_id_cp),'jpg'); + + +%% Calculate S1a/S1b XY map (after z correction) + +%Correcting z dependence to get XY dependence +s1a_phe_both_z=s1a_phe_both.'.*polyval(s1a_P,z_center)./polyval(s1a_P,s1ab_z); +s1b_phe_both_z=s1b_phe_both.'.*polyval(s1b_P,z_center)./polyval(s1b_P,s1ab_z); + +%Measure S1a/S1b XY map +[s1ab_xbins, s1ab_ybins, s1a_xy_mean, s1a_xy_mean_err, s1b_xy_mean, s1b_xy_mean_err, s1ab_xy_mean, s1ab_xy_mean_err] = MeasureS1aS1bXYDep(s1ab_x, s1ab_y, s1ab_z, s1a_phe_both_z, s1b_phe_both_z, s1ab_z_cut); + +%Make and Save Plots of S1a XY means +s1a_xy_fig = figure; +color_range_max=max(max(s1a_xy_mean)); +color_range_min=min(min(s1a_xy_mean(s1a_xy_mean>0))); +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; +contourf(s1ab_xbins,s1ab_ybins,s1a_xy_mean,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. S1a Mean vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'S1a Mean (phe)','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); +saveas(s1a_xy_fig,strcat('LUX_corrections/',file_id_cp,'/s1a_xy',file_id_cp),'fig'); +saveas(s1a_xy_fig,strcat('LUX_corrections/',file_id_cp,'/s1a_xy',file_id_cp),'jpg'); + +%Plot s1a XY means +s1b_xy_fig = figure; +color_range_max=max(max(s1b_xy_mean)); +color_range_min=min(min(s1b_xy_mean(s1b_xy_mean>0))); +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; +contourf(s1ab_xbins,s1ab_ybins,s1b_xy_mean,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. S1b Mean vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'S1b Mean (phe)','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); +saveas(s1b_xy_fig,strcat('LUX_corrections/',file_id_cp,'/s1b_xy',file_id_cp),'fig'); +saveas(s1b_xy_fig,strcat('LUX_corrections/',file_id_cp,'/s1b_xy',file_id_cp),'jpg'); + +%s1a/b XY Ratio +s1ab_xy_fig = figure; +color_range_max=max(max(s1ab_xy_mean)); +color_range_min=min(min(s1ab_xy_mean(s1ab_xy_mean>0))); +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; +contourf(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. S1a/b Ratio vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'S1a/b Ratio','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); +saveas(s1ab_xy_fig,strcat('LUX_corrections/',file_id_cp,'/s1ab_ratio_xy',file_id_cp),'fig'); +saveas(s1ab_xy_fig,strcat('LUX_corrections/',file_id_cp,'/s1ab_ratio_xy',file_id_cp),'jpg'); + + +%% Calculate S1a/S1b 3D map + + +if length(s1ab_z)>100000; + [s1ab_xyz_xbins, s1ab_xyz_ybins, s1ab_xyz_zbins, s1a_xyz_mean, s1a_xyz_mean_err, ... + s1b_xyz_mean, s1b_xyz_mean_err, s1ab_xyz_mean, s1ab_xyz_mean_err] = ... + MeasureS1aS1b3DDep(s1ab_x, s1ab_y, s1ab_z, det_edge, s1a_phe_both, s1b_phe_both); +end + + +%% Calculate S1a/S1b 3D map R^2 v Z map + +[s1ab_r2bins, s1ab_zbins, s1a_r2z_mean, s1a_r2z_mean_err, s1b_r2z_mean, s1b_r2z_mean_err, ... + s1ab_r2z_mean, s1ab_r2z_mean_err] = MeasureS1aS1bRvZDep(s1ab_radius, s1ab_z, s1a_phe_both, s1b_phe_both); + +%%Make and Save Plots of S1a R^2 v Z maps +s1a_r2z_fig = figure; +color_range_max=max(max(s1a_r2z_mean)); +color_range_min=min(min(s1a_r2z_mean(s1a_r2z_mean>0))); +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; +contourf(s1ab_r2bins,s1ab_zbins,s1a_r2z_mean,vc,'LineColor','none'); +xlabel('R^2 (cm^2)','fontsize', 18); +ylabel('Z (uSec)','fontsize', 18); +title(strcat(file_id_cp, '. S1a Mean vs. R^2 v Z.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'S1a Mean (phe)','FontSize',16) +set(g,'FontSize',18) +hold on +axis([0 625 0 330]) +myfigview(16); +set(gca,'Ydir','reverse') +saveas(s1a_r2z_fig,strcat('LUX_corrections/',file_id_cp,'/s1a_r2z_fig',file_id_cp),'fig'); +saveas(s1a_r2z_fig,strcat('LUX_corrections/',file_id_cp,'/s1a_r2z_fig',file_id_cp),'jpg'); + +%Plot s1a R2Z means +s1b_r2z_fig = figure; +color_range_max=max(max(s1b_r2z_mean)); +color_range_min=min(min(s1b_r2z_mean(s1b_r2z_mean>0))); +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; +contourf(s1ab_r2bins,s1ab_zbins,s1b_r2z_mean,vc,'LineColor','none'); +xlabel('R^2 (cm^2)','fontsize', 18); +ylabel('Z (uSec)','fontsize', 18); +title(strcat(file_id_cp, '. S1b Mean vs. R^2 v Z.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'S1b Mean (phe)','FontSize',16) +set(g,'FontSize',18) +hold on +axis([0 625 0 330]) +myfigview(16); +set(gca,'Ydir','reverse') +saveas(s1b_r2z_fig,strcat('LUX_corrections/',file_id_cp,'/s1b_r2z_fig',file_id_cp),'fig'); +saveas(s1b_r2z_fig,strcat('LUX_corrections/',file_id_cp,'/s1b_r2z_fig',file_id_cp),'jpg'); + +%s1a/b R2Z Ratio +s1ab_r2z_fig = figure; +color_range_max=max(max(s1ab_r2z_mean)); +color_range_min=min(min(s1ab_r2z_mean(s1ab_r2z_mean>0))); +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; +contourf(s1ab_r2bins,s1ab_zbins,s1ab_r2z_mean,vc,'LineColor','none'); +xlabel('R^2 (cm^2)','fontsize', 18); +ylabel('Z (uSec)','fontsize', 18); +title(strcat(file_id_cp, '. S1a/S1b Mean vs. R^2 v Z.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'S1a/b Ratio','FontSize',16) +set(g,'FontSize',18) +hold on +axis([0 625 0 330]) +myfigview(16); +set(gca,'Ydir','reverse') +saveas(s1ab_r2z_fig,strcat('LUX_corrections/',file_id_cp,'/s1ab_r2z_fig',file_id_cp),'fig'); +saveas(s1ab_r2z_fig,strcat('LUX_corrections/',file_id_cp,'/s1ab_r2z_fig',file_id_cp),'jpg'); + + +%% Convert S1a/S1b R^2 v Z to field measurement based on Scott's Chi by Eye + +load('2015_Field_to_S1aS1b.mat'); +[field_map_2015, field_map_2015_staterr]=polyval(S1aS1b_fit_2015,s1ab_r2z_mean,S1aS1b_fit_2015_error); + +load('2014_Field_to_S1aS1b.mat'); +[field_map_2014, field_map_2014_staterr]=polyval(S1aS1b_fit_2014,s1ab_r2z_mean,S1aS1b_fit_2014_error); + +field_map_syserr=((field_map_2015-(field_map_2014+field_map_2015)/2).^2 + (field_map_2014-(field_map_2014+field_map_2015)/2).^2).^(1/2); +mean_field_map=(field_map_2014+field_map_2015)/2; +mean_field_map_totalerr=sqrt(field_map_syserr.^2+((field_map_2014_staterr+field_map_2015_staterr)/2).^2); + + +%Mean R^2vZ Field Map +field_r2z_fig = figure; +color_range_max=max(max(mean_field_map)); +color_range_min=min(min(mean_field_map(mean_field_map>0))); +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; +contourf(s1ab_r2bins,s1ab_zbins,mean_field_map,vc,'LineColor','none'); +xlabel('R^2 (cm^2)','fontsize', 18); +ylabel('Z (uSec)','fontsize', 18); +title(strcat(file_id_cp, '. Electric Field vs. R^2 v Z.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'Electric Field (V/cm)','FontSize',16) +set(g,'FontSize',18) +hold on +axis([0 625 0 330]) +myfigview(16); +set(gca,'Ydir','reverse') +saveas(field_r2z_fig,strcat('LUX_corrections/',file_id_cp,'/field_r2z_fig',file_id_cp),'fig'); +saveas(field_r2z_fig,strcat('LUX_corrections/',file_id_cp,'/field_r2z_fig',file_id_cp),'jpg'); + +%Mean R^2vZ Field Map Error +field_error_r2z_fig = figure; +color_range_max=max(max(mean_field_map_totalerr)); +color_range_min=min(min(mean_field_map_totalerr(mean_field_map_totalerr>0))); +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; +contourf(s1ab_r2bins,s1ab_zbins,mean_field_map_totalerr,vc,'LineColor','none'); +xlabel('R^2 (cm^2)','fontsize', 18); +ylabel('Z (uSec)','fontsize', 18); +title(strcat(file_id_cp, '. Electric Field Error vs. R^2 v Z.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'Electric Field Error (V/cm)','FontSize',16) +set(g,'FontSize',18) +hold on +axis([0 625 0 330]) +myfigview(16); +set(gca,'Ydir','reverse') +saveas(field_error_r2z_fig,strcat('LUX_corrections/',file_id_cp,'/field_error_r2z_fig',file_id_cp),'fig'); +saveas(field_error_r2z_fig,strcat('LUX_corrections/',file_id_cp,'/field_error_r2z_fig',file_id_cp),'jpg'); + +%Mean R^2vZ Field Map Fractional Error +field_frac_error_r2z_fig = figure; +color_range_max=max(max(mean_field_map_totalerr./mean_field_map)); +color_range_min=min(min(mean_field_map_totalerr(mean_field_map_totalerr./mean_field_map>0)./mean_field_map(mean_field_map_totalerr./mean_field_map>0))); +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; +contourf(s1ab_r2bins,s1ab_zbins,mean_field_map_totalerr./mean_field_map,vc,'LineColor','none'); +xlabel('R^2 (cm^2)','fontsize', 18); +ylabel('Z (uSec)','fontsize', 18); +title(strcat(file_id_cp, '. Electric Field Fractional Error vs. R^2 v Z.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'Electric Field Fractional Error','FontSize',16) +set(g,'FontSize',18) +hold on +axis([0 625 0 330]) +myfigview(16); +set(gca,'Ydir','reverse') +saveas(field_frac_error_r2z_fig,strcat('LUX_corrections/',file_id_cp,'/field_frac_error_r2z_fig',file_id_cp),'fig'); +saveas(field_frac_error_r2z_fig,strcat('LUX_corrections/',file_id_cp,'/field_frac_error_r2z_fig',file_id_cp),'jpg'); + +%2015 R^2vZ Field Map +field_r2z_2015_fig = figure; +color_range_max=max(max(field_map_2015)); +color_range_min=min(min(field_map_2015(field_map_2015>0))); +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; +contourf(s1ab_r2bins,s1ab_zbins,field_map_2015,vc,'LineColor','none'); +xlabel('R^2 (cm^2)','fontsize', 18); +ylabel('Z (uSec)','fontsize', 18); +title(strcat(file_id_cp, '. Electric Field (Based on 2015) vs. R^2 v Z.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'2015 Based Field Value (V/cm)','FontSize',16) +set(g,'FontSize',18) +hold on +axis([0 625 0 330]) +myfigview(16); +set(gca,'Ydir','reverse') +saveas(field_r2z_2015_fig,strcat('LUX_corrections/',file_id_cp,'/field_r2z_2015_fig',file_id_cp),'fig'); +saveas(field_r2z_2015_fig,strcat('LUX_corrections/',file_id_cp,'/field_r2z_2015_fig',file_id_cp),'jpg'); + +%2014 R^2vZ Field Map +field_r2z_2014_fig = figure; +color_range_max=max(max(field_map_2014)); +color_range_min=min(min(field_map_2014(field_map_2014>0))); +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; +contourf(s1ab_r2bins,s1ab_zbins,mean_field_map,vc,'LineColor','none'); +xlabel('R^2 (cm^2)','fontsize', 18); +ylabel('Z (uSec)','fontsize', 18); +title(strcat(file_id_cp, '. Electric Field (Based on 2014) vs. R^2 v Z.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'2014 Based Field Value (V/cm)','FontSize',16) +set(g,'FontSize',18) +hold on +axis([0 625 0 330]) +myfigview(16); +set(gca,'Ydir','reverse') +saveas(field_r2z_2014_fig,strcat('LUX_corrections/',file_id_cp,'/field_r2z_2014_fig',file_id_cp),'fig'); +saveas(field_r2z_2014_fig,strcat('LUX_corrections/',file_id_cp,'/field_r2z_2014_fig',file_id_cp),'jpg'); + + +%% Removing field dependence from S1 and S2 data + +%Using the value of s1a/s1b for each event, apply the field map to remove recombination fluctuations from the drift field +%Note: s1as1b field map is normalized such that field normalization equals one at the center of the detector AT THE TIME THE MAP WAS MADE! + +%Remove 3D dependence of field if there are enough events +%Fall back to removing Z dependence only if there aren't enough events +if length(s1ab_z)>100000; + [s1_fieldremoval, s2_fieldremoval, s1as1b_at_center] = RemoveFieldDependence_3D(s1ab_xyz_xbins, s1ab_xyz_ybins, s1ab_xyz_zbins, s1ab_xyz_mean, s1ab_P, s2x, s2y, drift_time); + +else + [s1_fieldremoval, s2_fieldremoval] = RemoveFieldDependence_1D(s1ab_P, drift_time); + +end + +s2_phe_bottom=s2_phe_bottom./(s2_fieldremoval); +s2_phe_both=s2_phe_both./(s2_fieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_fieldremoval); +s1_phe_both=s1_phe_both./(s1_fieldremoval); + + +%% Select SE events + +%Produce cut for single electron selection +[ SE_good_cut ] = GetSECuts( d, s1_single_cut, s2_single_cut); + +%Define pulse quantities +SE_phe_both = d.pulse_area_phe(SE_good_cut); +SE_phe_bottom = d.phe_bottom(SE_good_cut); +SE_phe_top = SE_phe_both-SE_phe_bottom; +SE_x = d.x_cm(SE_good_cut); +SE_y = d.y_cm(SE_good_cut); +SE_radius = (SE_x.^2+SE_y.^2).^(1/2); +SE_max_radius = 17; %#ok<*NASGU> %Used for the maps in the next blocks of code +num_SE_events = length(SE_phe_both); + + +%% Calculate average single electron size from Kr events, using both PMT arrays + +%Fit SE Size using both PMT arrays +SE_both_hist_binning = (0:0.2:60); +[ SE_mu_both, SE_sig_mu_both, SE_sig_both, SE_sig_sig_both, skew_both, SE_cut, xfit, yfit_both ] = MeasureSESize( SE_both_hist_binning, SE_phe_both, SE_radius); + +%Make plot of the result +both_SE_fig=figure; +hold on; +step(SE_cut,SE_both_hist_binning,'k'); +h_fit=plot(xfit,yfit_both,'-r','linewidth',2); +box on; +myfigview(18); +xlabel('Pulse Area Phe (Phe) '); ylabel('Count/Phe '); +legend([h_fit],strcat('\mu = ',num2str(SE_mu_both,'%2.2f'),'\newline \sigma= ',num2str(SE_sig_both,'%2.2f'),'\newline skew=', num2str(skew_both,'%2.2f') ), 'location','northeast'); %#ok +saveas(both_SE_fig,strcat('LUX_corrections/',file_id_cp,'/both_SE_',file_id_cp),'jpg'); +saveas(both_SE_fig,strcat('LUX_corrections/',file_id_cp,'/both_SE_',file_id_cp),'fig'); + + +%% Calculate XY map of single electron size from Kr events, using both PMT arrays + +[se_xbins, se_ybins, mean_SE_both_xy, skew_SE_both_xy, sigma_SE_both_xy, ... + kurt_SE_both_xy, mean_err_SE_both_xy,sigma_err_SE_both_xy] = MeasureSEXYDep(SE_phe_both, SE_x, SE_y, SE_both_hist_binning); + + +%Calculate corrections matrix and 1 sigma corrections matrix for SE_both +SE_both_mu_center = interp2(se_xbins,se_ybins,mean_SE_both_xy,x_center,y_center,'cubic');%Normalize to the center +norm_SE_both_mu = SE_both_mu_center./mean_SE_both_xy; +norm_SE_both_mu(isinf(norm_SE_both_mu)) = 1; +norm_SE_both_mu(isnan(norm_SE_both_mu)) = 1; + +%Calculate error on SE center +error_SE_both_mu_center = interp2(se_xbins,se_ybins,mean_err_SE_both_xy,x_center,y_center,'cubic');%Normalize to the center +error_SE_both_mu_norm = sqrt((error_SE_both_mu_center./mean_SE_both_xy).^2+(mean_err_SE_both_xy.*SE_both_mu_center./mean_SE_both_xy.^2).^2); +error_SE_both_mu_norm(isinf(error_SE_both_mu_norm)) = 1; +error_SE_both_mu_norm(isnan(error_SE_both_mu_norm)) = 1; + +%Calculate kurt,sigma, and skew at center +SE_both_kurt_center = interp2(se_xbins,se_ybins,kurt_SE_both_xy,x_center,y_center,'cubic'); +SE_both_skew_center = interp2(se_xbins,se_ybins,skew_SE_both_xy,x_center,y_center,'cubic'); +SE_both_sigma_center = interp2(se_xbins,se_ybins,sigma_SE_both_xy,x_center,y_center,'cubic'); + +%Plot the mean SE_XY both +SE_xy_both_fig = figure; +color_range_max=max(max(mean_SE_both_xy)); +color_range_min=min(min(mean_SE_both_xy(mean_SE_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; +contourf(se_xbins,se_ybins,mean_SE_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. SE Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); +saveas(SE_xy_both_fig,strcat('LUX_corrections/',file_id_cp,'/SE_XY_both_',file_id_cp),'jpg'); +saveas(SE_xy_both_fig,strcat('LUX_corrections/',file_id_cp,'/SE_XY_both_',file_id_cp),'fig'); + +%Plot the 1 sigma of the mean +sigma_SE_xy_both_fig = figure; +color_range_max=max(max(mean_err_SE_both_xy)); +color_range_min=min(min(mean_err_SE_both_xy(mean_err_SE_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; +contourf(se_xbins,se_ybins,mean_err_SE_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. 1-Sigma SE Mean(Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); +saveas(sigma_SE_xy_both_fig,strcat('LUX_corrections/',file_id_cp,'/Sigma_SE_XY_both_',file_id_cp),'jpg'); +saveas(sigma_SE_xy_both_fig,strcat('LUX_corrections/',file_id_cp,'/Sigma_SE_XY_both_',file_id_cp),'fig'); + + +%% Calculate average single electrons size from Kr events, using bottom PMT array + +%Fit SE Size using bottom PMT arrays +SE_bot_hist_binning = (0:0.2:30); +[ SE_mu_bot, SE_sig_mu_bot, SE_sig_bot, SE_sig_sig_bot, skew_bot, SE_cut_bot, xfit, yfit_bot ] = MeasureSESize( SE_bot_hist_binning, SE_phe_bottom, SE_radius); + +bottom_SE_fig=figure; +hold on; +step(SE_cut_bot,SE_bot_hist_binning,'k'); +h_fit=plot(xfit,yfit_bot,'-r','linewidth',2); +box on; +myfigview(18); +xlabel('Pulse Area Phe (Phe) '); ylabel('Count/Phe '); +legend([h_fit],strcat('\mu = ',num2str(SE_mu_bot,'%2.2f'),'\newline \sigma= ',num2str(SE_sig_bot,'%2.2f'),'\newline skew=', num2str(skew_bot,'%2.2f') ), 'location','northeast'); %#ok +saveas(bottom_SE_fig,strcat('LUX_corrections/',file_id_cp,'/bottom_SE_',file_id_cp),'jpg'); +saveas(bottom_SE_fig,strcat('LUX_corrections/',file_id_cp,'/bottom_SE_',file_id_cp),'fig'); + + +%% Calculate XY map of single electron size from Kr events, using bottom PMT arrays + +[se_xbins, se_ybins, mean_SE_bot_xy, skew_SE_bot_xy, sigma_SE_bot_xy, ... + kurt_SE_bot_xy, mean_err_SE_bot_xy,sigma_err_SE_bot_xy] = MeasureSEXYDep(SE_phe_bottom, SE_x, SE_y, SE_bot_hist_binning); + + +%Calculate corrections matrix and 1 sigma corrections matrix for SE_bot +SE_bot_mu_center = interp2(se_xbins,se_ybins,mean_SE_bot_xy,x_center,y_center,'cubic');%Normalize to the center +norm_SE_bot_mu = SE_bot_mu_center./mean_SE_bot_xy; +norm_SE_bot_mu(isinf(norm_SE_bot_mu)) = 1; +norm_SE_bot_mu(isnan(norm_SE_bot_mu)) = 1; + +%Calculate error on SE center +error_SE_bot_mu_center = interp2(se_xbins,se_ybins,mean_err_SE_bot_xy,x_center,y_center,'cubic');%Normalize to the center +error_SE_bot_mu_norm = sqrt((error_SE_bot_mu_center./mean_SE_bot_xy).^2+(mean_err_SE_bot_xy.*SE_bot_mu_center./mean_SE_bot_xy.^2).^2); +error_SE_bot_mu_norm(isinf(error_SE_bot_mu_norm)) = 1; +error_SE_bot_mu_norm(isnan(error_SE_bot_mu_norm)) = 1; + +%Calculate kurt,sigma, and skew at center +SE_bot_kurt_center = interp2(se_xbins,se_ybins,kurt_SE_bot_xy,x_center,y_center,'cubic'); +SE_bot_skew_center = interp2(se_xbins,se_ybins,skew_SE_bot_xy,x_center,y_center,'cubic'); +SE_bot_sigma_center = interp2(se_xbins,se_ybins,sigma_SE_bot_xy,x_center,y_center,'cubic'); + +%%Plot the mean SE_XY bot %%%%%%%%%%%%%%%% +SE_xy_bot_fig = figure; +color_range_max=max(max(mean_SE_bot_xy)); +color_range_min=min(min(mean_SE_bot_xy(mean_SE_bot_xy>0))); +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; +contourf(se_xbins,se_ybins,mean_SE_bot_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. SE Mean (Bot PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); +saveas(SE_xy_bot_fig,strcat('LUX_corrections/',file_id_cp,'/SE_XY_bot_',file_id_cp),'jpg'); +saveas(SE_xy_bot_fig,strcat('LUX_corrections/',file_id_cp,'/SE_XY_bot_',file_id_cp),'fig'); + +%%Plot the 1 sigma of the mean +sigma_SE_xy_bot_fig = figure; +color_range_max=max(max(mean_err_SE_bot_xy)); +color_range_min=min(min(mean_err_SE_bot_xy(mean_err_SE_bot_xy>0))); +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; +contourf(se_xbins,se_ybins,mean_err_SE_bot_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. 1-Sigma SE Mean(Bot PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); +saveas(sigma_SE_xy_bot_fig,strcat('LUX_corrections/',file_id_cp,'/Sigma_SE_XY_bot_',file_id_cp),'jpg'); +saveas(sigma_SE_xy_bot_fig,strcat('LUX_corrections/',file_id_cp,'/Sigma_SE_XY_bot_',file_id_cp),'fig'); + + +%% Calculate average single electrons size from Kr events, using top PMT array + +%Fit SE Size using top PMT arrays +SE_top_hist_binning = (0:0.2:30); +[ SE_mu_top, SE_sig_mu_top, SE_sig_top, SE_sig_sig_top, skew_top, SE_cut_top, xfit, yfit_top ] = MeasureSESize( SE_top_hist_binning, SE_phe_top, SE_radius); + +top_SE_fig=figure; +hold on; +step(SE_cut_top,SE_top_hist_binning,'k'); +h_fit=plot(xfit,yfit_top,'-r','linewidth',2); +box on; +myfigview(18); +xlabel('Pulse Area Phe (Phe) '); ylabel('Count/Phe '); +legend([h_fit],strcat('\mu = ',num2str(SE_mu_top,'%2.2f'),'\newline \sigma= ',num2str(SE_sig_top,'%2.2f'),'\newline skew=', num2str(skew_top,'%2.2f') ), 'location','northeast'); %#ok +saveas(top_SE_fig,strcat('LUX_corrections/',file_id_cp,'/top_SE_',file_id_cp),'jpg'); +saveas(top_SE_fig,strcat('LUX_corrections/',file_id_cp,'/top_SE_',file_id_cp),'fig'); + + +%% Calculate XY map of single electron size from KR events, using top PMT array + +[se_xbins, se_ybins, mean_SE_top_xy, skew_SE_top_xy, sigma_SE_top_xy, ... + kurt_SE_top_xy, mean_err_SE_top_xy,sigma_err_SE_top_xy] = MeasureSEXYDep(SE_phe_top, SE_x, SE_y, SE_top_hist_binning); + + +%Calculate corrections matrix and 1 sigma corrections matrix for SE_top +SE_top_mu_center = interp2(se_xbins,se_ybins,mean_SE_top_xy,x_center,y_center,'cubic');%Normalize to the center +norm_SE_top_mu = SE_top_mu_center./mean_SE_top_xy; +norm_SE_top_mu(isinf(norm_SE_top_mu)) = 1; +norm_SE_top_mu(isnan(norm_SE_top_mu)) = 1; + +%Calculate error on SE center +error_SE_top_mu_center = interp2(se_xbins,se_ybins,mean_err_SE_top_xy,x_center,y_center,'cubic');%Normalize to the center +error_SE_top_mu_norm = sqrt((error_SE_top_mu_center./mean_SE_top_xy).^2+(mean_err_SE_top_xy.*SE_top_mu_center./mean_SE_top_xy.^2).^2); +error_SE_top_mu_norm(isinf(error_SE_top_mu_norm)) = 1; +error_SE_top_mu_norm(isnan(error_SE_top_mu_norm)) = 1; + +%Calculate kurt,sigma, and skew at center +SE_top_kurt_center = interp2(se_xbins,se_ybins,kurt_SE_top_xy,x_center,y_center,'cubic'); +SE_top_skew_center = interp2(se_xbins,se_ybins,skew_SE_top_xy,x_center,y_center,'cubic'); +SE_top_sigma_center = interp2(se_xbins,se_ybins,sigma_SE_top_xy,x_center,y_center,'cubic'); + +%%Plot the mean SE_XY top %%%%%%%%%%%%%%%% +SE_xy_top_fig = figure; +color_range_max=max(max(mean_SE_top_xy)); +color_range_min=min(min(mean_SE_top_xy(mean_SE_top_xy>0))); +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; +contourf(se_xbins,se_ybins,mean_SE_top_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. SE Mean (top PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); +saveas(SE_xy_top_fig,strcat('LUX_corrections/',file_id_cp,'/SE_XY_top_',file_id_cp),'jpg'); +saveas(SE_xy_top_fig,strcat('LUX_corrections/',file_id_cp,'/SE_XY_top_',file_id_cp),'fig'); + +%%Plot the 1 sigma of the mean +sigma_SE_xy_top_fig = figure; +color_range_max=max(max(mean_err_SE_top_xy)); +color_range_min=min(min(mean_err_SE_top_xy(mean_err_SE_top_xy>0))); +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; +contourf(se_xbins,se_ybins,mean_err_SE_top_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. 1-Sigma SE Mean(top PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); +saveas(sigma_SE_xy_top_fig,strcat('LUX_corrections/',file_id_cp,'/Sigma_SE_XY_top_',file_id_cp),'jpg'); +saveas(sigma_SE_xy_top_fig,strcat('LUX_corrections/',file_id_cp,'/Sigma_SE_XY_top_',file_id_cp),'fig'); + + +%% Make Density plot of R^2 v Z distribution of events + +%densityplot is computationally expensive, cut sample size down to 40k + +s2radius_d=s2radius(s2radius<25); +drift_time_d=drift_time(s2radius<25); + +if length(s2radius_d) > 40000; + index_perm= randperm(length(s2radius_d)); % randomly redistrubute the event numbers + s2radius_d=s2radius_d(index_perm(1:40000),:); %cut out 60k events + drift_time_d=drift_time_d(index_perm(1:40000),:); %cut out 60k events +end + +MAP=colormap; +MAP(1,1:3)=1; % turn 0 from dark blue to white. + +radial_field_fig=figure; +densityplot(s2radius_d.^2,drift_time_d,'rectangle',[15,15],'lin'); +set(gca,'YDir','reverse'); +colormap(MAP); box on; +c_h=colorbar; +xlabel('Radius^2 [cm^2] '); ylabel('Drift Time [\mus] '); +title(strcat(file_id_cp,'.83mKr. dT vs R^2'), 'FontSize', 16,'Interpreter','none'); +myfigview(18); +ylabel(c_h,'Count/(\mus\times cm^2)','FontSize',16); +xlim([0 650]); +saveas(radial_field_fig,strcat('LUX_corrections/',file_id_cp,'/RadialField_',file_id_cp),'jpg'); +saveas(radial_field_fig,strcat('LUX_corrections/',file_id_cp,'/RadialField_',file_id_cp),'fig'); + + +%% Calculating the S1 Z-dependence, using both PMT arrays + +%edges of histogram binning for fit +s1_bin_min = 100; +s1_bin_max = 500; +s1_bin_size = 8; + +%cut to clean up the S1 +cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%Do the fit +[means,means_error,mean_index,Fit_s1_both, bins, x, hist_s1_both] = MeasurePulseAreaZDep(s1_bin_min, s1_bin_max, s1_bin_size, s1_phe_both, drift_time, det_edge, cut); + +%Fit to the Z depedence +dT_range = inrange( mean_index,[zcut_min, zcut_max] ); +dT_fit = 0:1:det_edge; +[P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); +sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; +s1_both_means = means; +s1_both_means_sigma = means_error; +s1_both_means_bin = mean_index; + +%Correct Z dependenece of S1 pulse areas +s1_z_correction = polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); +s1_phe_both_z = s1_phe_both.*s1_z_correction; + + +%Fit a Gaussian to the z-corrected data for tracking over time in the LUG +s1_phe_both_z_fit_binning = (0:10:1000); +s1_phe_both_z_fit_cut = inrange(s1_phe_both_z,[min(s1_phe_both_z_fit_binning) max(s1_phe_both_z_fit_binning)]); +s1_phe_both_z_gauss_fit = fit(s1_phe_both_z_fit_binning.',hist(s1_phe_both_z(s1_phe_both_z_fit_cut),s1_phe_both_z_fit_binning).','gauss1'); +s1_phe_both_z_gauss_fit_mean = s1_phe_both_z_gauss_fit.b1; +s1_phe_both_z_gauss_fit_sigma = s1_phe_both_z_gauss_fit.c1/sqrt(2); +s1_phe_both_z_gauss_fit_confint = confint(s1_phe_both_z_gauss_fit,0.68); +s1_phe_both_z_gauss_fit_mean_error = abs(s1_phe_both_z_gauss_fit_confint(1,2)-s1_phe_both_z_gauss_fit_mean); +s1_phe_both_z_gauss_fit_sigma_error = abs(s1_phe_both_z_gauss_fit_confint(1,3)/sqrt(2) - s1_phe_both_z_gauss_fit_sigma); + +%Plot the S1 z dependence +light_correction_fig = figure; +errorbar(mean_index,means,means_error,'.k'); +hold on +[yplot_s1_both] = polyval(P_s1_both,dT_fit); +[center_s1_both, center_s1_both_err] = polyval(P_s1_both,z_center, S); %160[us]*1.51[\mus/us] +plot(dT_fit,yplot_s1_both,'-r','LineWidth',1); +xlabel('Depth (\mus)', 'FontSize',16); ylabel('Mean (Pulse Area Phe)', 'FontSize', 16); +title(strcat(file_id_cp,'.Kr83m. S1 Mean vs. Z'), 'FontSize', 16,'Interpreter','none'); +line([0 det_edge],[center_s1_both center_s1_both],'linestyle','--'); +line([z_center; z_center;],[min(means) max(means)],'linestyle','--'); +legend('S1\_both Mean', strcat('y=', num2str(P_s1_both(1),'%10.2e'), '*Z^2 + ', num2str(P_s1_both(2),'%10.2e')... +, '*Z + ', num2str(P_s1_both(3),4)),strcat('Det center = ',num2str(center_s1_both,4), ' [Phe]'),'location','northwest') +box on; +myfigview(16); +xlim([0 det_edge]); +ylim([0.8*min(means) 1.15*max(means)]); +saveas(light_correction_fig,strcat('LUX_corrections/',file_id_cp,'/S1_both_LC_',file_id_cp),'jpg'); +saveas(light_correction_fig,strcat('LUX_corrections/',file_id_cp,'/S1_both_LC_',file_id_cp),'fig'); + +%Plot 7 of the Gaussian histograms +hist_fig = figure; +hold on +plot_step = floor ((bins-1)/7); +j=1; +t = {num2str(zeros(7,1))}; +for i=2:plot_step:bins %first bin contains anode... skip it. start at i=2. + if j<= 7 + xfit=100:2:500; + yfit=Fit_s1_both{i}.a1.*exp(-((xfit-Fit_s1_both{i}.b1)./Fit_s1_both{i}.c1).^2); + + if j==1 + mark = '+'; color = 'k'; t{j}=num2str(mean_index(i),4); + elseif j==2 + mark = '.'; color = 'b'; t{j}=num2str(mean_index(i),4); + elseif j==3 + mark = '*'; color = 'r'; t{j}=num2str(mean_index(i),4); + elseif j==4 + mark = 'x'; color = 'g'; t{j}=num2str(mean_index(i),4); + elseif j==5 + mark = '+'; color = 'm'; t{j}=num2str(mean_index(i),4); + elseif j==6 + mark = '.'; color = 'c'; t{j}=num2str(mean_index(i),4); + elseif j==7 + mark = '*'; color = 'y'; t{j}=num2str(mean_index(i),4); + end + + plot(x,hist_s1_both(:,i),strcat(mark,color)); + plot(xfit,yfit,color); + end + +j=j+1; +end +title(strcat(file_id_cp,'.Kr83m. S1_both Hist Data'), 'FontSize', 16,'Interpreter','none'); +legend(strcat(t{1},' \mus'),strcat(t{1},' \mus Fit'),strcat(t{2},' \mus'),strcat(t{2},' \mus Fit')... + ,strcat(t{3},' \mus'),strcat(t{3},' \mus Fit'),strcat(t{4},' \mus'),strcat(t{4},' \mus Fit')... + ,strcat(t{5},' \mus'),strcat(t{5},' \mus Fit'),strcat(t{6},' \mus'),strcat(t{6},' \mus Fit')... + ,strcat(t{7},' \mus'),strcat(t{7},' \mus Fit') ); +xlabel('Pulse Area Phe','FontSize',16); ylabel('Counts/Pulse-Area-Phe','FontSize',16); +myfigview(16); +xlim([s1_bin_min-100 s1_bin_max+100]); +box on; +saveas(hist_fig,strcat('LUX_corrections/',file_id_cp,'/S1_both_hist_',file_id_cp),'jpg'); +saveas(hist_fig,strcat('LUX_corrections/',file_id_cp,'/S1_both_hist_',file_id_cp),'fig'); + + +%% Calculating the S1 Z-dependence, using bottom PMT array + +%edges of histogram binning for fit +s1_bin_min = 50; +s1_bin_max = 400; +s1_bin_size = 8; + +%cut to clean up the S1 +cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_bottom,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%Do the fit +[means, means_error, mean_index, Fit_s1_bottom, bins, x, hist_s1_bottom] = MeasurePulseAreaZDep(s1_bin_min, s1_bin_max, s1_bin_size, s1_phe_bottom, drift_time, det_edge, cut); + +%Fit to the Z depedence +dT_range = inrange( mean_index,[zcut_min, zcut_max] ); +dT_fit = 0:1:det_edge; +[P_s1_bottom S] = polyfit(mean_index(dT_range),means(dT_range),2); +sigma_P_s1_bottom = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; +s1_bottom_means = means; +s1_bottom_means_sigma = means_error; +s1_bottom_means_bin = mean_index; + +%Correct Z dependenece of S1 pulse areas +s1_z_correction = polyval(P_s1_bottom,z_center)./polyval(P_s1_bottom,drift_time); +s1_phe_bottom_z = s1_phe_bottom.*s1_z_correction; + + +%Plots the S1 z dependence +light_correction_fig_bottom = figure; +errorbar(mean_index,means,means_error,'.k'); +hold on +[yplot_s1_bottom] = polyval(P_s1_bottom,dT_fit); +[center_s1_bottom, center_s1_bottom_err] = polyval(P_s1_bottom,z_center,S); %160[us]*1.51[\mus/us] +plot(dT_fit,yplot_s1_bottom,'-r','LineWidth',1); +xlabel('Depth (\mus)', 'FontSize',16); ylabel('Mean (Pulse Area Phe)', 'FontSize', 16); +title(strcat(file_id_cp,'.Kr83m. S1_bottom Mean vs. Z'), 'FontSize', 16,'Interpreter','none'); +line([0 det_edge],[center_s1_bottom center_s1_bottom],'linestyle','--'); +line([z_center; z_center;],[min(means) max(means)],'linestyle','--'); +legend('S1\_bottom Mean', strcat('y=', num2str(P_s1_bottom(1),'%10.2e'), '*Z^2 + ', num2str(P_s1_bottom(2),'%10.2e')... + , '*Z + ', num2str(P_s1_bottom(3),4)),strcat('Det center = ',num2str(center_s1_bottom,4), ' [Phe]'),'location','northwest') +box on; +myfigview(16); +xlim([0 det_edge]); +ylim([0.8*min(means) 1.15*max(means)]); +saveas(light_correction_fig_bottom,strcat('LUX_corrections/',file_id_cp,'/S1_bottom_LC_',file_id_cp),'jpg'); +saveas(light_correction_fig_bottom,strcat('LUX_corrections/',file_id_cp,'/S1_bottom_LC_',file_id_cp),'fig'); + +%Plot 7 of the histograms +hist_s1_bottom_fig = figure; +hold on +plot_step = floor((bins-1)/7); +j=1; +t = {num2str(zeros(7,1))}; +for i=2:plot_step:bins %first bin contains anode... skip it. start at i=2. + if j<=7 + xfit=50:2:500; + yfit=Fit_s1_bottom{i}.a1.*exp(-((xfit-Fit_s1_bottom{i}.b1)./Fit_s1_bottom{i}.c1).^2); + if j==1 + mark = '+'; color = 'k'; t{j}=num2str(mean_index(i),4); + elseif j==2 + mark = '.'; color = 'b'; t{j}=num2str(mean_index(i),4); + elseif j==3 + mark = '*'; color = 'r'; t{j}=num2str(mean_index(i),4); + elseif j==4 + mark = 'x'; color = 'g'; t{j}=num2str(mean_index(i),4); + elseif j==5 + mark = '+'; color = 'm'; t{j}=num2str(mean_index(i),4); + elseif j==6 + mark = '.'; color = 'c'; t{j}=num2str(mean_index(i),4); + elseif j==7 + mark = '*'; color = 'y'; t{j}=num2str(mean_index(i),4); + end + plot(x,hist_s1_bottom(:,i),strcat(mark,color)); + plot(xfit,yfit,color); + end + j=j+1; +end +title(strcat(file_id_cp,'.Kr83m. S1_bottom Hist Data'), 'FontSize', 16,'Interpreter','none'); +legend(strcat(t{1},' \mus'),strcat(t{1},' \mus Fit'),strcat(t{2},' \mus'),strcat(t{2},' \mus Fit')... + ,strcat(t{3},' \mus'),strcat(t{3},' \mus Fit'),strcat(t{4},' \mus'),strcat(t{4},' \mus Fit')... + ,strcat(t{5},' \mus'),strcat(t{5},' \mus Fit'),strcat(t{6},' \mus'),strcat(t{6},' \mus Fit')... + ,strcat(t{7},' \mus'),strcat(t{7},' \mus Fit') ); +xlabel('Pulse Area Phe','FontSize',16); ylabel('Counts/Pulse-Area-Phe','FontSize',16); +myfigview(16); +xlim([s1_bin_min-50 s1_bin_max+50]); +box on; +saveas(hist_s1_bottom_fig,strcat('LUX_corrections/',file_id_cp,'/S1_bottom_hist_',file_id_cp),'jpg'); +saveas(hist_s1_bottom_fig,strcat('LUX_corrections/',file_id_cp,'/S1_bottom_hist_',file_id_cp),'fig'); + + +%% Calculating the S1 Z-dependence, using top PMT array + +dT_range = inrange( mean_index,[zcut_min, zcut_max] ); +[P_s1_top S] = polyfit(s1_both_means_bin(dT_range),s1_both_means(dT_range)-s1_bottom_means(dT_range),2); +sigma_P_s1_top = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; +[center_s1_top, center_s1_top_err] = polyval(P_s1_top,z_center,S); %160[us]*1.51[\mus/us] + + +%% Calculating the S2 Z-dependence, using both PMT arrays + +%edges of histogram binning for fit +s2_bin_min = 1000; +s2_bin_max = 40000; +s2_bin_size = 500; + +%cut to clean up the S2 pulses +cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%Do the fit +[means,means_error,mean_index,Fit_s2_both, bins, x2, hist_s2_both] = MeasurePulseAreaZDep(s2_bin_min, s2_bin_max, s2_bin_size, s2_phe_both, drift_time, det_edge, cut); + +%Fit to the Z depedence +dT_range = inrange( mean_index,[5+mean_index(end)-mean_index(end-1),500] );%from 50 to 300us for the fit +s2_both_norm_z_index = mean_index(dT_range); +s2_both_norm_z_means = means(dT_range); +s2_at_top_both = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate +s2_both_norm_z = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; +s2_both_means = means; +s2_both_means_sigma = means_error; +s2_both_means_bin = mean_index; + +%%Tracker for pseudo-lifetime +s2_at_bottom_both = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); +pseudo_lifetime_both = -320/log(s2_at_bottom_both/s2_at_top_both); +dT_fit = 0:1:det_edge; +Fit_EL = fit(mean_index(dT_range),means(dT_range),'exp1'); +yfitEL = Fit_EL.a.*exp(Fit_EL.b.*dT_fit); +e_lifetime_both = -1/Fit_EL.b; +s2_z0_both = Fit_EL.a; +b = confint(Fit_EL, 0.683);%1 sigma matrix +sigma_e_lifetime_both =(1/b(1,2)-1/b(2,2))/2; +sigma_s2_z0_both =(b(2,1)-b(1,1))/2; + +%Make plot of Z dependence +lifetime_fig_both = figure; +errorbar(mean_index(2:end),means(2:end),means_error(2:end),'.k'); %first bin is anode, skip it +hold on +plot(dT_fit,yfitEL,'-r','LineWidth',1); +xlabel('Time (\mus)', 'FontSize',16); ylabel('Mean S2 (Pulse Area Phe)', 'FontSize', 16); +title(strcat(file_id_cp,'.Kr83m. S2_both Electron Lifetime'), 'FontSize', 16,'Interpreter','none'); +legend('S2\_both Mean', strcat( '\lambda= ', num2str(e_lifetime_both,4), ' \pm ', num2str(sigma_e_lifetime_both,2), ' \mus' )... + ,'location','northeast'); +myfigview(16); +xlim([0 det_edge]); +saveas(lifetime_fig_both,strcat('LUX_corrections/',file_id_cp,'/S2_both_lifetime_',file_id_cp),'jpg'); +saveas(lifetime_fig_both,strcat('LUX_corrections/',file_id_cp,'/S2_both_lifetime_',file_id_cp),'fig'); + +%Plot 7 of the Gaussian fit histograms +hist_s2_both_fig = figure; +hold on +plot_step = floor((bins-1)/7); +j=1; +t = {num2str(zeros(7,1))}; +for i=2:plot_step:bins %first bin contains anode... skip it. start at i=2. + if j<=7 + xfit=s2_bin_min:s2_bin_size:s2_bin_max; + yfit=Fit_s2_both{i}.a1.*exp(-((xfit-Fit_s2_both{i}.b1)./Fit_s2_both{i}.c1).^2); + + if j==1 + mark = '+'; color = 'k'; t{j}=num2str(mean_index(i),4); + elseif j==2 + mark = '.'; color = 'b'; t{j}=num2str(mean_index(i),4); + elseif j==3 + mark = '*'; color = 'r'; t{j}=num2str(mean_index(i),4); + elseif j==4 + mark = 'x'; color = 'g'; t{j}=num2str(mean_index(i),4); + elseif j==5 + mark = '+'; color = 'm'; t{j}=num2str(mean_index(i),4); + elseif j==6 + mark = '.'; color = 'c'; t{j}=num2str(mean_index(i),4); + elseif j==7 + mark = '*'; color = 'y'; t{j}=num2str(mean_index(i),4); + end + + plot(x2,hist_s2_both(:,i)./d.livetime_sec,strcat(mark,color)); + plot(xfit,yfit./d.livetime_sec,color); + end + j=j+1; +end + title(strcat(file_id_cp,'.Kr83m. S2_both'), 'FontSize', 16,'Interpreter','none'); + legend(strcat(t{1},' \mus'),strcat(t{1},' \mus Fit'),strcat(t{2},' \mus'),strcat(t{2},' \mus Fit')... + ,strcat(t{3},' \mus'),strcat(t{3},' \mus Fit'),strcat(t{4},' \mus'),strcat(t{4},' \mus Fit')... + ,strcat(t{5},' \mus'),strcat(t{5},' \mus Fit'),strcat(t{6},' \mus'),strcat(t{6},' \mus Fit')... + ,strcat(t{7},' \mus'),strcat(t{7},' \mus Fit') ); + xlabel('Pulse Area Phe','FontSize',16); ylabel('Counts/Phe/sec','FontSize',16); +myfigview(16); +xlim([s2_bin_min-50 s2_bin_max+500]); +saveas(hist_s2_both_fig,strcat('LUX_corrections/',file_id_cp,'/S2_both_hist_EL_',file_id_cp),'jpg'); +saveas(hist_s2_both_fig,strcat('LUX_corrections/',file_id_cp,'/S2_both_hist_EL_',file_id_cp),'fig'); + +%Correct Z dependenece of S1 pulse areas +s2_phe_both_z = s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%Fit a Gaussian to the z-corrected data for tracking over time in the LUG +Fit_s2_both_z = fit(x2,hist(s2_phe_both_z(inrange(s2_phe_both,[s2_bin_min,s2_bin_max])),x2)'/s2_bin_size,'gauss1');%remove bin edges +s2_both_center_z = Fit_s2_both_z.b1; +temp_conf = confint(Fit_s2_both_z,0.68); +s2_both_center_error_z = abs(s2_both_center_z-temp_conf(1,2)); + +s2_phe_both_z_gauss_fit_mean = Fit_s2_both_z.b1; +s2_phe_both_z_gauss_fit_sigma = Fit_s2_both_z.c1/sqrt(2); +s2_phe_both_z_gauss_fit_mean_error = abs(temp_conf(1,2)-s2_phe_both_z_gauss_fit_mean); +s2_phe_both_z_gauss_fit_sigma_error = abs(temp_conf(1,3)/sqrt(2)-s2_phe_both_z_gauss_fit_sigma); + + +%% Calculating the S2 Z-dependence, using bottom PMT arrays + +%edges of histogram binning for fit +s2_bin_min = 50; +s2_bin_max = 10000; +s2_bin_size = 300; + +%cut to clean up the S2 pulses +cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_bottom,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + +%Do the fit +[means,means_error,mean_index,Fit_s2_bottom, bins, x2, hist_s2_bottom] = MeasurePulseAreaZDep(s2_bin_min, s2_bin_max, s2_bin_size, s2_phe_bottom, drift_time, det_edge, cut); + +%Fit to the Z depedence +dT_range = inrange( mean_index,[5+mean_index(end)-mean_index(end-1),500] );%from 50 to 300us for the fit +s2_bottom_norm_z_index = mean_index(dT_range); +s2_bottom_norm_z_means = means(dT_range); +s2_at_top_bottom = RK_1DCubicInterp_LinearExtrap(s2_bottom_norm_z_index,s2_bottom_norm_z_means,4); %normalize to right below the gate +s2_bottom_norm_z = RK_1DCubicInterp_LinearExtrap(s2_bottom_norm_z_index,s2_bottom_norm_z_means,4)./s2_bottom_norm_z_means; +s2_bottom_means = means; +s2_bottom_means_sigma = means_error; +s2_bottom_means_bin = mean_index; + +%Tracker for pseudo-lifetime IQ +s2_at_bottom_bottom = RK_1DCubicInterp_LinearExtrap(s2_bottom_norm_z_index,s2_bottom_norm_z_means,320); +pseudo_lifetime_bottom = -320/log(s2_at_bottom_bottom/s2_at_top_bottom); +dT_fit = 0:1:det_edge; +Fit_EL = fit(mean_index(dT_range),means(dT_range),'exp1'); +yfitEL = Fit_EL.a.*exp(Fit_EL.b.*dT_fit); +e_lifetime = -1/Fit_EL.b; +s2_z0_bottom = Fit_EL.a; +b = confint(Fit_EL, 0.683);%1 sigma matrix +sigma_e_lifetime = (1/b(1,2)-1/b(2,2))/2; +sigma_s2_z0_bottom = (b(2,1)-b(1,1))/2; + + +%Make plot of Z dependence +lifetime_fig_bottom = figure; +errorbar(mean_index(2:end),means(2:end),means_error(2:end),'.k'); %first bin is anode, skip it +hold on +plot(dT_fit,yfitEL,'-r','LineWidth',1); +xlabel('Depth (\mus)', 'FontSize',16); ylabel('Mean S2 (Pulse Area Phe)', 'FontSize', 16); +title(strcat(file_id_cp,'.Kr83m. S2_bottom Electron Lifetime'), 'FontSize', 16,'Interpreter','none'); +legend('S2\_bottom Mean', strcat( '\lambda= ', num2str(e_lifetime,4), ' \pm ', num2str(sigma_e_lifetime,2), ' \mus' )... + ,'location','northeast'); +myfigview(16); +xlim([0 det_edge]); +saveas(lifetime_fig_bottom,strcat('LUX_corrections/',file_id_cp,'/S2_bottom_lifetime_',file_id_cp),'jpg'); +saveas(lifetime_fig_bottom,strcat('LUX_corrections/',file_id_cp,'/S2_bottom_lifetime_',file_id_cp),'fig'); + +%Plot 7 of the Gaussian fit histograms +hist_s2_bottom_fig = figure; +hold on +plot_step = floor((bins-1)/7); +j=1; +t = {num2str(zeros(7,1))}; +for i=2:plot_step:bins %first bin contains anode... skip it. start at i=2. + if j<=7 + xfit=100:50:10000; + yfit=Fit_s2_bottom{i}.a1.*exp(-((xfit-Fit_s2_bottom{i}.b1)./Fit_s2_bottom{i}.c1).^2); + + if j==1 + mark = '+'; color = 'k'; t{j}=num2str(mean_index(i),4); + elseif j==2 + mark = '.'; color = 'b'; t{j}=num2str(mean_index(i),4); + elseif j==3 + mark = '*'; color = 'r'; t{j}=num2str(mean_index(i),4); + elseif j==4 + mark = 'x'; color = 'g'; t{j}=num2str(mean_index(i),4); + elseif j==5 + mark = '+'; color = 'm'; t{j}=num2str(mean_index(i),4); + elseif j==6 + mark = '.'; color = 'c'; t{j}=num2str(mean_index(i),4); + elseif j==7 + mark = '*'; color = 'y'; t{j}=num2str(mean_index(i),4); + end + + plot(x2,hist_s2_bottom(:,i)./d.livetime_sec,strcat(mark,color)); + plot(xfit,yfit/d.livetime_sec,color); + end + j=j+1; +end +title(strcat(file_id_cp,'.Kr83m.S2_Bottom'), 'FontSize', 16,'Interpreter','none'); +legend(strcat(t{1},' \mus'),strcat(t{1},' \mus Fit'),strcat(t{2},' \mus'),strcat(t{2},' \mus Fit')... + ,strcat(t{3},' \mus'),strcat(t{3},' \mus Fit'),strcat(t{4},' \mus'),strcat(t{4},' \mus Fit')... + ,strcat(t{5},' \mus'),strcat(t{5},' \mus Fit'),strcat(t{6},' \mus'),strcat(t{6},' \mus Fit')... + ,strcat(t{7},' \mus'),strcat(t{7},' \mus Fit')); +xlabel('Pulse Area Phe','FontSize',16); ylabel('Counts/Phe/sec','FontSize',16); +myfigview(16); +xlim([s2_bin_min-50 s2_bin_max+500]); +saveas(hist_s2_bottom_fig,strcat('LUX_corrections/',file_id_cp,'/S2_bottom_hist_EL_',file_id_cp),'jpg'); +saveas(hist_s2_bottom_fig,strcat('LUX_corrections/',file_id_cp,'/S2_bottom_hist_EL_',file_id_cp),'fig'); + +%Corrected Z dependence in the data +s2_phe_bottom_z = s2_phe_bottom.*RK_1DCubicInterp_LinearExtrap(s2_bottom_norm_z_index,s2_bottom_norm_z, drift_time); + + +%Fit a Gaussian for tracking in the LUG +Fit_s2_bot_z = fit(x2,hist(s2_phe_bottom_z,x2)'/s2_bin_size,'gauss1');%remove bin edges +s2_bot_center_z = Fit_s2_bot_z.b1; +temp_conf = confint(Fit_s2_bot_z); +s2_bot_center_error_z = abs(s2_bot_center_z-temp_conf(1,2)); + + +%% Calculating the S2 XY-dependence, using both PMT arrays + +%Define variables for making the XY map +s2_bin_min = 1000; +s2_bin_max = 40000; +s2_bin_size = 500; + +cleanup_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1area_bound_min,s1area_bound_max]) & ... + inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) & ... + inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); +%Make the XY map +[mean_S2_both_xy, Sigma_S2_both] = MeasurePulseAreaXYDep(s2_bin_min, s2_bin_max, s2_bin_size, S2_xbin_min,... + S2_xbin_max, S2_ybin_min, S2_ybin_max, S2xybinsize, s2_phe_both_z, s2x, s2y, cleanup_cut); + +%Calculate corrections matrix +[center, sigma_center, norm_S2_all, sigma_norm_S2_all] = ProducePulseAreaXYNorms(s2xbins, s2ybins, mean_S2_both_xy, Sigma_S2_both, x_center, y_center); + +%Define variables for tracking mean at center over time in the LUG +s2_both_center_xyz = center; +s2_both_center_xyz_error = sigma_center; + +%Correct the Z corrected data in XY +s2xy_correction = interp2(s2xbins,s2ybins,norm_S2_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0)) = 1.0; %#ok +s2xy_correction(find(isnan(s2xy_correction))) = 1.0; %#ok +s2_phe_both_xyz = s2_phe_both_z.*s2xy_correction; + +%Fit a Gaussian tothe corrected data for tracking in the LUG +s2_phe_both_xyz_fit_bins = (0:100:70000); +s2_phe_both_xyz_fit_cut = inrange(s2_phe_both_xyz,[min(s2_phe_both_xyz_fit_bins) max(s2_phe_both_xyz_fit_bins)]); +s2_phe_both_xyz_gauss_fit = fit(s2_phe_both_xyz_fit_bins.',hist(s2_phe_both_xyz(s2_phe_both_xyz_fit_cut),s2_phe_both_xyz_fit_bins).','gauss1'); +s2_phe_both_xyz_gauss_fit_mean = s2_phe_both_xyz_gauss_fit.b1; +s2_phe_both_xyz_gauss_fit_sigma = s2_phe_both_xyz_gauss_fit.c1/sqrt(2); +s2_phe_both_xyz_gauss_fit_confint = confint(s2_phe_both_xyz_gauss_fit,0.68); +s2_phe_both_xyz_gauss_fit_mean_error = abs(s2_phe_both_xyz_gauss_fit_confint(1,2)-s2_phe_both_xyz_gauss_fit_mean); +s2_phe_both_xyz_gauss_fit_sigma_error = abs(s2_phe_both_xyz_gauss_fit_confint(1,3)/sqrt(2)-s2_phe_both_xyz_gauss_fit_sigma); + +%Plot the mean S2_XY both +s2_xy_both_fig = figure; +color_range_max=max(max(mean_S2_both_xy)); +color_range_min=min(min(mean_S2_both_xy(mean_S2_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; +contourf(s2xbins,s2ybins,mean_S2_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. S2 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); +saveas(s2_xy_both_fig,strcat('LUX_corrections/',file_id_cp,'/S2_XY_both_',file_id_cp),'jpg'); +saveas(s2_xy_both_fig,strcat('LUX_corrections/',file_id_cp,'/S2_XY_both_',file_id_cp),'fig'); + +%Plot the 1 sigma error of the mean +sigma_s2_xy_both_fig = figure; +color_range_max=max(max(Sigma_S2_both)); +color_range_min=min(min(Sigma_S2_both(Sigma_S2_both>0))); +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; +contourf(s2xbins,s2ybins,Sigma_S2_both,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. 1-Sigma S2 Mean(Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); +saveas(sigma_s2_xy_both_fig,strcat('LUX_corrections/',file_id_cp,'/Sigma_S2_XY_both_',file_id_cp),'jpg'); +saveas(sigma_s2_xy_both_fig,strcat('LUX_corrections/',file_id_cp,'/Sigma_S2_XY_both_',file_id_cp),'fig'); + + +%% Calculating the S2 XY-dependence, using bottom PMT array + +%Define variables for making the XY map +s2_bin_min = 50; +s2_bin_max = 10000; +s2_bin_size = 300; + +cleanup_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & ... + inrange(s2_phe_bottom_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) & ... + inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%Make the XY map +[mean_S2_bottom_xy, Sigma_S2_bottom, Count_S2_bottom] = MeasurePulseAreaXYDep(s2_bin_min, s2_bin_max, s2_bin_size, S2_xbin_min,... + S2_xbin_max, S2_ybin_min, S2_ybin_max, S2xybinsize, s2_phe_bottom_z, s2x, s2y, cleanup_cut); + +%Calculate corrections matrix +[center, sigma_center, norm_S2_bot, sigma_norm_S2_bot] = ProducePulseAreaXYNorms(s2xbins, s2ybins, mean_S2_bottom_xy, Sigma_S2_bottom, x_center, y_center); + +%Define variables for tracking mean at center over time in the LUG +s2_bot_center_xyz = center; +s2_bot_center_xyz_error = sigma_center; + + +%Plot the mean S2_XY bottom +s2_xy_bottom_fig = figure; +color_range_max= max(max(mean_S2_bottom_xy)) ; +color_range_min= min(min(mean_S2_bottom_xy(mean_S2_bottom_xy>0))) ; +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; +contourf(s2xbins,s2ybins,mean_S2_bottom_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp,'. S2 Mean (Bottom PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); +saveas(s2_xy_bottom_fig,strcat('LUX_corrections/',file_id_cp,'/S2_XY_bottom_',file_id_cp),'jpg'); +saveas(s2_xy_bottom_fig,strcat('LUX_corrections/',file_id_cp,'/S2_XY_bottom_',file_id_cp),'fig'); + + +%Plot the 1 sigma error of the mean +sigma_s2_xy_bottom_fig = figure; +color_range_max=max(max(Sigma_S2_bottom)); +color_range_min=min(min(Sigma_S2_bottom(Sigma_S2_bottom>0))); +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; +contourf(s2xbins,s2ybins,Sigma_S2_bottom,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. 1-Sigma S2 Mean (Bottom PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); +saveas(sigma_s2_xy_bottom_fig,strcat('LUX_corrections/',file_id_cp,'/Sigma_S2_XY_bottom_',file_id_cp),'jpg'); +saveas(sigma_s2_xy_bottom_fig,strcat('LUX_corrections/',file_id_cp,'/Sigma_S2_XY_bottom_',file_id_cp),'fig'); + + +%% Calculating the S1 XY-dependence, using both PMT arrays + +%Define variables for making the XY map +s1_bin_min = 100; +s1_bin_max = 500; +s1_bin_size = 8; + +cleanup_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & ... + inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) & ... + inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + +%Make the XY map +[mean_S1_both_xy, Sigma_S1_both, Count_S1_both] = MeasurePulseAreaXYDep(s1_bin_min, s1_bin_max, s1_bin_size, S1_xbin_min,... + S1_xbin_max, S1_ybin_min, S1_ybin_max, S1xybinsize, s1_phe_both_z, s2x, s2y, cleanup_cut); + +%Calculate corrections matrix +[center, sigma_center, norm_S1_all, sigma_norm_S1_all] = ProducePulseAreaXYNorms(s1xbins, s1ybins, mean_S1_both_xy, Sigma_S1_both, x_center, y_center); + +%Define variables for tracking mean at center over time in the LUG +s1_both_center_xyz = center; +s1_both_center_xyz_error = sigma_center; + +%Correct the Z corrected data in XY +s1xy_correction = interp2(s1xbins,s1ybins,norm_S1_all,s2x,s2y,'cubic'); +s1xy_correction(find(s1xy_correction==0)) = 1.0; %#ok +s1xy_correction(find(isnan(s1xy_correction))) = 1.0; %#ok +s1_phe_both_xyz = s1_phe_both_z.*s1xy_correction; + +%Fit a Gaussian to the corrected data for tracking in the LUG +s1_phe_both_xyz_fit_binning = (0:10:1000); +s1_phe_both_xyz_fit_cut = inrange(s1_phe_both_xyz,[min(s1_phe_both_xyz_fit_binning) max(s1_phe_both_xyz_fit_binning)]); +s1_phe_both_xyz_gauss_fit = fit(s1_phe_both_xyz_fit_binning.',hist(s1_phe_both_xyz(s1_phe_both_xyz_fit_cut),s1_phe_both_xyz_fit_binning).','gauss1'); +s1_phe_both_xyz_gauss_fit_mean = s1_phe_both_xyz_gauss_fit.b1; +s1_phe_both_xyz_gauss_fit_sigma = s1_phe_both_xyz_gauss_fit.c1/sqrt(2); +s1_phe_both_xyz_gauss_fit_confint = confint(s1_phe_both_xyz_gauss_fit,0.68); +s1_phe_both_xyz_gauss_fit_mean_error = abs(s1_phe_both_xyz_gauss_fit_confint(1,2)-s1_phe_both_xyz_gauss_fit_mean); +s1_phe_both_xyz_gauss_fit_sigma_error = abs(s1_phe_both_xyz_gauss_fit_confint(1,3)/sqrt(2)-s1_phe_both_xyz_gauss_fit_sigma); + +%Plot the mean S1_XY both +s1_xy_both_fig = figure; +color_range_max=max(max(mean_S1_both_xy)); +color_range_min=min(min(mean_S1_both_xy(mean_S1_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; +contourf(s1xbins,s1ybins,mean_S1_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp,'. S1 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); +saveas(s1_xy_both_fig,strcat('LUX_corrections/',file_id_cp,'/S1_XY_both_',file_id_cp),'jpg'); +saveas(s1_xy_both_fig,strcat('LUX_corrections/',file_id_cp,'/S1_XY_both_',file_id_cp),'fig'); + +%Plot the 1 sigma error of the mean +sigma_s1_xy_both_fig = figure; +color_range_max=max(max(Sigma_S1_both)); +color_range_min=min(min(Sigma_S1_both(Sigma_S1_both>0))); +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; +contourf(s1xbins,s1ybins,Sigma_S1_both,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. 1-Sigma S1 Mean(Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); +saveas(sigma_s1_xy_both_fig,strcat('LUX_corrections/',file_id_cp,'/Sigma_S1_XY_both_',file_id_cp),'jpg'); +saveas(sigma_s1_xy_both_fig,strcat('LUX_corrections/',file_id_cp,'/Sigma_S1_XY_both_',file_id_cp),'fig'); + +%Plot Number of events vs. XY +s1_xy_both_count_fig = figure; +color_range_max=max(max(Count_S1_both)); +color_range_min=min(min(Count_S1_both(Count_S1_both>0))); +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; +contourf(s1xbins,s1ybins,Count_S1_both,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp,'. Count vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'Count','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16) +saveas(s1_xy_both_count_fig,strcat('LUX_corrections/',file_id_cp,'/S1_Count_XY_both_',file_id_cp),'jpg'); +saveas(s1_xy_both_count_fig,strcat('LUX_corrections/',file_id_cp,'/S1_Count_XY_both_',file_id_cp),'fig'); + + +%% Calculating the S1 XY-dependence, using bottom PMT arrays + +%Define variables for making the XY map +s1_bin_min = 50; +s1_bin_max = 400; +s1_bin_size = 8; + +cleanup_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & ... + inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) & ... + inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + +%Make the XY map +[mean_S1_bottom_xy, Sigma_S1_bottom] = MeasurePulseAreaXYDep(s1_bin_min, s1_bin_max, s1_bin_size, S1_xbin_min,... + S1_xbin_max, S1_ybin_min, S1_ybin_max, S1xybinsize, s1_phe_bottom_z, s2x, s2y, cleanup_cut); + +%Calculate corrections matrix +[center, sigma_center, norm_S1_bot, sigma_norm_S1_bot] = ProducePulseAreaXYNorms(s1xbins, s1ybins, mean_S1_bottom_xy, Sigma_S1_bottom, x_center, y_center); + +%Define variables for tracking mean at center over time in the LUG +s1_bot_center_xyz = center; +s1_bot_center_xyz_error = sigma_center; + + +%Plot the mean S1_XY bottom +s1_xy_bottom_fig = figure; +color_range_max=max(max(mean_S1_bottom_xy)); +color_range_min=min(min(mean_S1_bottom_xy(mean_S1_bottom_xy>0))); +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; +contourf(s1xbins,s1ybins,mean_S1_bottom_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp,'. S1 Mean (Bottom PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); +saveas(s1_xy_bottom_fig,strcat('LUX_corrections/',file_id_cp,'/S1_XY_bottom_',file_id_cp),'jpg'); +saveas(s1_xy_bottom_fig,strcat('LUX_corrections/',file_id_cp,'/S1_XY_bottom_',file_id_cp),'fig'); + +%Plot the 1 sigma error of the mean +sigma_s1_xy_bottom_fig = figure; +color_range_max=max(max(Sigma_S1_bottom)); +color_range_min=min(min(Sigma_S1_bottom(Sigma_S1_bottom>0))); +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; +contourf(s1xbins,s1ybins,Sigma_S1_bottom,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. 1-Sigma S1 Mean(Bottom PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); +saveas(sigma_s1_xy_bottom_fig,strcat('LUX_corrections/',file_id_cp,'/Sigma_S1_XY_bottom_',file_id_cp),'jpg'); +saveas(sigma_s1_xy_bottom_fig,strcat('LUX_corrections/',file_id_cp,'/Sigma_S1_XY_bottom_',file_id_cp),'fig'); + + +%% Calculating the S1 XY-dependence, using top PMT array + +%Set up top array quantities +mean_S1_top_xy = mean_S1_both_xy-mean_S1_bottom_xy; +Sigma_S1_top = sqrt(Sigma_S1_both.^2+Sigma_S1_bottom.^2); + +%Make the correction maps +[center, sigma_center, norm_S1_top, sigma_norm_S1_top] = ProducePulseAreaXYNorms(s1xbins, s1ybins, mean_S1_top_xy, Sigma_S1_top, x_center, y_center); + +%Create variables for tracking over time in LUG +s1_top_center_xyz = center; +s1_top_center_xyz_error = sigma_center; + + +%% Mapping S1 in XYZ (Only if there are enough statistics) + +if Kr_events>100000 + KrypCal_S1_3D(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_time,x_center,y_center,z_center,det_edge,user_name,file_id_cp,dp_version, algorithm_name, submit); +end + + +%% Calculate S2 Pulse Width Z Dependence (Pulse_End_Samples -Pulse_Start_Samples) + +%Redefine s2_width as pulse_end_samples - pulse_start_samples +s2_width = d.pulse_end_samples(s2_single_cut)-d.pulse_start_samples(s2_single_cut); + +%Make cut to clean up data and fit for the Z dependence +cleanup_cut = inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[450 1200]) & inrange(s1_width,[30 400]); + +[mean_index_s2_z_width_full, means_s2_z_width_full, means_error_s2_z_width_full, P_s2_width_full, sigma_P_s2_width_full, dT_fit] = ... + MeasureS2PulseWidthZDep(s2_width, drift_time, det_edge, cleanup_cut); %#ok + +%apply Z dep S2 width correction +norm_s2_width = RK_1DCubicInterp_LinearExtrap(mean_index_s2_z_width_full,means_s2_z_width_full,4); %normalize to 0 us, top +s2_width_z = s2_width.*norm_s2_width./RK_1DCubicInterp_LinearExtrap(mean_index_s2_z_width_full,means_s2_z_width_full,drift_time); + +%Make plot of Z dependence +s2_z_width_full_fig = figure; +errorbar( mean_index_s2_z_width_full(2:end),means_s2_z_width_full(2:end),means_error_s2_z_width_full(2:end),'.k'); %first bin is anode, skip it +hold on +[yplot_s2_width] = polyval(P_s2_width_full,dT_fit); +plot(dT_fit,yplot_s2_width,'-r','LineWidth',1); +xlabel('Depth (\mus)', 'FontSize',16); ylabel('S2 Width (End-Start Samples)', 'FontSize', 16); +title(strcat(file_id_cp,'.Kr83m. S2 width vs. Z'), 'FontSize', 16,'Interpreter','none'); +legend('S2 Width Mean', strcat('y=', num2str(P_s2_width_full(1),'%10.2e'), '*Z^3 + ', num2str(P_s2_width_full(2),'%10.2e')... + , '*Z^2 + ', num2str(P_s2_width_full(3),'%10.2e'), '*Z + ',num2str(P_s2_width_full(4),4)),'location','northwest') +myfigview(16); +xlim([0 det_edge]); +saveas(s2_z_width_full_fig,strcat('LUX_corrections/',file_id_cp,'/S2_z_width_end_',file_id_cp),'jpg'); +saveas(s2_z_width_full_fig,strcat('LUX_corrections/',file_id_cp,'/S2_z_width_end_',file_id_cp),'fig'); + + +%% Calculate XY dependence of S2 Pulse Width (Pulse_End_Samples -Pulse_Start_Samples) + +%Make cut to clean up data and fit for the Z dependence +cleanup_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s2_width_z,[200 1400])& inrange(s2radius,[rcut_min,rcut_max]) & ... + inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[0 24]) ; + +[s2_xbins, s2_ybins, means_s2_xy_width_full, sigma_s2_xy_width_full ] = MeasureS2PulseWidthXYDep(s2x, s2y, s2_width_z, S2_xbin_min, S2_xbin_max, S2_ybin_min, S2_ybin_max, S2xybinsize, cleanup_cut); %#ok + +%Make plot of XY dependence +s2_width_xy_end_fig = figure; +color_range_max=max(max(means_s2_xy_width_full)); +color_range_min=min(min(means_s2_xy_width_full(means_s2_xy_width_full>0))); +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; +contourf(s2xbins,s2ybins,means_s2_xy_width_full,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. S2 Width vs. XY (end-start).'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'S2 width Samples. Normalized to z=0 \mus ','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); +saveas(s2_width_xy_end_fig,strcat('LUX_corrections/',file_id_cp,'/S2_Width_xy_end',file_id_cp),'fig'); +saveas(s2_width_xy_end_fig,strcat('LUX_corrections/',file_id_cp,'/S2_Width_xy_end',file_id_cp),'jpg'); + + +%% Calculate S2 Pulse Width Z Dependence (AFT_t1 - AFT_t0)x2 +%Redefine s2_width as aft_t1 - aft_t0 x2 +s2_width = (d.aft_t1_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut))*2; + +%Make cut to clean up data and fit for the Z dependence +cleanup_cut = inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + +[mean_index_s2_z_width_aft1, means_s2_z_width_aft1, means_error_s2_z_width_aft1, P_s2_width_aft1, sigma_P_s2_width_aft1, dT_fit] = ... + MeasureS2PulseWidthZDep(s2_width, drift_time, det_edge, cleanup_cut); %#ok + +%apply Z dep S2 width correction +norm_s2_width = RK_1DCubicInterp_LinearExtrap(mean_index_s2_z_width_aft1,means_s2_z_width_aft1,4); %normalize to 0 us (the top) +s2_width_z = s2_width.*norm_s2_width./RK_1DCubicInterp_LinearExtrap(mean_index_s2_z_width_aft1,means_s2_z_width_aft1,drift_time); + +%Make plot of Z dependence + +s2_z_width_aft1_fig = figure; +errorbar( mean_index_s2_z_width_aft1(2:end),means_s2_z_width_aft1(2:end),means_error_s2_z_width_aft1(2:end),'.k'); %first bin is anode, skip it +hold on +[yplot_s2_width] = polyval(P_s2_width_aft1,dT_fit); +plot(dT_fit,yplot_s2_width,'-r','LineWidth',1); +xlabel('Depth (\mus)', 'FontSize',16); ylabel('S2 Width (AFT1-AFT0)x2 (Samples)', 'FontSize', 16); +title(strcat(file_id_cp,'.Kr83m. S2 width vs. Z'), 'FontSize', 16,'Interpreter','none'); +legend('S2 Width Mean', strcat('y=', num2str(P_s2_width_aft1(1),'%10.2e'), '*Z^3 + ', num2str(P_s2_width_aft1(2),'%10.2e')... + , '*Z^2 + ', num2str(P_s2_width_aft1(3),'%10.2e'), '*Z + ',num2str(P_s2_width_aft1(4),4)),'location','northwest') +myfigview(16); +xlim([0 det_edge]); +saveas(s2_z_width_aft1_fig,strcat('LUX_corrections/',file_id_cp,'/S2_z_width_aft1_',file_id_cp),'jpg'); +saveas(s2_z_width_aft1_fig,strcat('LUX_corrections/',file_id_cp,'/S2_z_width_aft1_',file_id_cp),'fig'); + + +%% Calculate XY dependence of S2 Pulse Width (AFT_t1 - AFT_t0)x2 + +%Make cut to clean up data and fit for the Z dependence +cleanup_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s2_width_z,[50 700])& inrange(s2radius,[rcut_min,rcut_max]) & ... + inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[0 24]) ; + +[s2_xbins, s2_ybins, means_s2_xy_width_aft1, sigma_s2_xy_width_aft1 ] = MeasureS2PulseWidthXYDep(s2x, s2y, s2_width_z, S2_xbin_min, S2_xbin_max, S2_ybin_min, S2_ybin_max, S2xybinsize, cleanup_cut); %#ok + +%Make plot of XY dependence +s2_width_xy_aft_fig = figure; +color_range_max=max(max(means_s2_xy_width_aft1)); +color_range_min=min(min(means_s2_xy_width_aft1(means_s2_xy_width_aft1>0))); +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; +contourf(s2xbins,s2ybins,means_s2_xy_width_aft1,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. S2 Width vs. XY (AFT1-AFT0)x2.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'S2 width Samples. Normalized to z=0 \mus ','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); +saveas(s2_width_xy_aft_fig,strcat('LUX_corrections/',file_id_cp,'/S2_Width_xy_aft1',file_id_cp),'fig'); +saveas(s2_width_xy_aft_fig,strcat('LUX_corrections/',file_id_cp,'/S2_Width_xy_aft1',file_id_cp),'jpg'); + + +%% Save the data locally + +save(strcat('LUX_corrections/',file_id_cp,'/',file_id_cp,'_IQs'),'e_lifetime','sigma_e_lifetime','Kr_events','P_s1_both','P_s1_bottom','sigma_P_s1_both','sigma_P_s1_bottom'... + , 's1_both_means','s1_both_means_sigma','s1_both_means_bin','s1_bottom_means','s1_bottom_means_sigma','s1_bottom_means_bin'... + , 's2_bottom_means','s2_bottom_means_sigma','s2_bottom_means_bin', 's2xbins','s2ybins','norm_S2_all','norm_S2_bot'... + , 'mean_S2_both_xy','Sigma_S2_both','mean_S2_bottom_xy','Sigma_S2_bottom','Count_S2_bottom', 's1xbins','s1ybins'... + ,'norm_S1_all','norm_S1_bot', 'mean_S1_both_xy','Sigma_S1_both','mean_S1_bottom_xy','Sigma_S1_bottom','Count_S1_both'... + ,'sigma_norm_S1_all','sigma_norm_S1_bot','sigma_norm_S2_all','sigma_norm_S2_bot','file_id','file_id_cp','cp','s2_z0_both'... + ,'sigma_s2_z0_both','e_lifetime_both','sigma_e_lifetime_both','s2_z0_bottom','sigma_s2_z0_bottom','s2_both_means','s2_both_means_bin'... + ,'s2_both_means_sigma','mean_index_s2_z_width_full','means_s2_z_width_full','means_error_s2_z_width_full','mean_index_s2_z_width_aft1','means_s2_z_width_aft1'... + ,'means_error_s2_z_width_aft1','means_s2_xy_width_full','sigma_s2_xy_width_full','means_s2_xy_width_aft1','sigma_s2_xy_width_aft1'... + ,'P_s1_top','sigma_P_s1_top','norm_S1_top', 'sigma_norm_S1_top','P_s2_width_full','sigma_P_s2_width_full','P_s2_width_aft1','sigma_P_s2_width_aft1','det_edge'... + ,'SE_mu_both','SE_sig_mu_both','SE_sig_both','SE_sig_sig_both','skew_both','SE_mu_bot','SE_sig_mu_bot','SE_sig_bot','SE_sig_sig_bot','skew_bot','SE_mu_top'... + ,'SE_sig_mu_top','SE_sig_top','SE_sig_sig_top','skew_top','SE_both_mu_center','error_SE_both_mu_center','SE_both_kurt_center','SE_both_skew_center','SE_both_sigma_center'... + ,'SE_bot_mu_center','error_SE_bot_mu_center','SE_bot_kurt_center','SE_bot_skew_center','SE_bot_sigma_center','SE_top_mu_center','error_SE_top_mu_center'... + ,'SE_top_kurt_center','SE_top_skew_center','SE_top_sigma_center','se_xbins','se_ybins'... + ,'mean_SE_both_xy','skew_SE_both_xy','sigma_SE_both_xy','kurt_SE_both_xy','mean_err_SE_both_xy','sigma_err_SE_both_xy','norm_SE_both_mu','error_SE_both_mu_norm'... + ,'mean_SE_bot_xy','skew_SE_bot_xy','sigma_SE_bot_xy','kurt_SE_bot_xy','mean_err_SE_bot_xy','sigma_err_SE_bot_xy','norm_SE_bot_mu','error_SE_bot_mu_norm'... + ,'mean_SE_top_xy','skew_SE_top_xy','sigma_SE_top_xy','kurt_SE_top_xy','mean_err_SE_top_xy','sigma_err_SE_top_xy','norm_SE_top_mu','error_SE_top_mu_norm'... + ,'s1a_z_means','s1a_z_means_err','s1b_z_means','s1b_z_means_err','s1ab_bincenters','s1a_P','s1a_S','s1b_P','s1b_S','s1ab_P','s1ab_S'... + ,'s1a_xy_mean','s1a_xy_mean_err','s1b_xy_mean','s1b_xy_mean_err','s1ab_xy_mean','s1ab_xy_mean_err','s1ab_xbins','s1ab_ybins'... + ,'x_center','y_center','z_center'... + ,'s2_bottom_norm_z_index','s2_bottom_norm_z_means','s2_at_top_bottom','s2_at_bottom_bottom','s2_bottom_norm_z','pseudo_lifetime_bottom'... + ,'s2_both_norm_z_index','s2_both_norm_z_means','s2_at_top_both','s2_at_bottom_both','s2_both_norm_z','pseudo_lifetime_both'... + ,'s1_phe_both_z_gauss_fit_mean','s1_phe_both_z_gauss_fit_sigma','s1_phe_both_z_gauss_fit_mean_error','s1_phe_both_z_gauss_fit_sigma_error'... + ,'s2_phe_both_z_gauss_fit_mean','s2_phe_both_z_gauss_fit_sigma','s2_phe_both_z_gauss_fit_mean_error','s2_phe_both_z_gauss_fit_sigma_error'... + ,'s1_phe_both_xyz_gauss_fit_mean','s1_phe_both_xyz_gauss_fit_sigma','s1_phe_both_xyz_gauss_fit_mean_error','s1_phe_both_xyz_gauss_fit_sigma_error'... + ,'s2_phe_both_xyz_gauss_fit_mean','s2_phe_both_xyz_gauss_fit_sigma','s2_phe_both_xyz_gauss_fit_mean_error','s2_phe_both_xyz_gauss_fit_sigma_error'... + ,'s1ab_r2bins','s1ab_zbins','s1a_r2z_mean','s1a_r2z_mean_err','s1b_r2z_mean','s1b_r2z_mean_err','s1ab_r2z_mean','s1ab_r2z_mean_err'... + ,'field_map_2015','field_map_2015_staterr','field_map_2014','field_map_2014_staterr','mean_field_map','field_map_syserr','mean_field_map_totalerr'); + + if length(s1ab_z)>100000; + save(strcat('LUX_corrections/',file_id_cp,'/',file_id_cp,'_S1ab3DIQs'),'s1a_xyz_mean','s1a_xyz_mean_err','s1b_xyz_mean','s1b_xyz_mean_err','s1ab_xyz_mean','s1ab_xyz_mean_err'... + ,'s1ab_xyz_xbins','s1ab_xyz_ybins','s1ab_xyz_zbins','s1as1b_at_center'); + else + save(strcat('LUX_corrections/',file_id_cp,'/',file_id_cp,'_S1ab1D2DIQs'),'s1as1b_z_at_center','s1as1b_xy_at_center'); + end + + +%% Submitting the results to the LUG + +user = user_name; +source = 'Kr-83'; +version = dp_version; +clear lug_val Image_paths xmlinput + +if submit == 1; +%% S2 Z Dependence + if calibrations(1)==1; + lug_val(1) = {file_id}; + lug_val(2) = {cp}; %Proccessing version number + lug_val(3) = {gs}; %Proccessing gs number + lug_val(4) = {user}; + lug_val(5) = {algorithm_name}; + lug_val(6) = {version}; + lug_val(7) = {e_lifetime}; % Electron lifetime (in us) + lug_val(8) = {sigma_e_lifetime}; % Electron lifetime - 1 sigma plus (in us) + lug_val(9) = {s2_z0_bottom}; %S2_bottom intercept + lug_val(10) = {sigma_s2_z0_bottom}; %S2_bottom intercept 1 sigma + lug_val(11) = {e_lifetime_both}; %electron lifetime from Both PMT + lug_val(12) = {sigma_e_lifetime_both}; %1 sigma electron lifetime from Both PMT + lug_val(13) = {s2_z0_both}; %S2_both intercept + lug_val(14) = {sigma_s2_z0_both}; %S2_both intercept 1 sigma + lug_val(19) = {Kr_events}; %Number of Kr events + lug_val(20) = {s2_bottom_means_bin};% the bin center + lug_val(21) = {s2_bottom_means}; % the mean of the gaussian fit + lug_val(22) = {s2_bottom_means_sigma};% one sigma of the mean + lug_val(23) = {s2_both_means_bin}; % the bin center + lug_val(24) = {s2_both_means}; % the mean of the gaussian fit + lug_val(25) = {s2_both_means_sigma};% one sigma of the mean + lug_val(29) = {det_edge}; + lug_val(30) = {s2_both_center_z}; %Not actually center... it's the value at the top + lug_val(31) = {s2_both_center_error_z}; + lug_val(32) = {s2_bot_center_z}; + lug_val(33) = {s2_bot_center_error_z}; + lug_val(34) = {s2_bottom_norm_z_index}; + lug_val(35) = {s2_bottom_norm_z_means}; + lug_val(36) = {s2_bottom_norm_z}; + lug_val(37) = {s2_at_top_bottom}; + lug_val(38) = {s2_at_bottom_bottom}; + lug_val(39) = {pseudo_lifetime_bottom}; + lug_val(40) = {s2_both_norm_z_index}; + lug_val(41) = {s2_both_norm_z_means}; + lug_val(42) = {s2_both_norm_z}; + lug_val(43) = {s2_at_top_both}; + lug_val(44) = {s2_at_bottom_both}; + lug_val(45) = {pseudo_lifetime_both}; + lug_val(46) = {s2_phe_both_z_gauss_fit_mean}; + lug_val(47) = {s2_phe_both_z_gauss_fit_sigma}; + lug_val(48) = {s2_phe_both_z_gauss_fit_mean_error}; + lug_val(49) = {s2_phe_both_z_gauss_fit_sigma_error}; + lug_val(50) = {s2_phe_both_raw_gauss_fit_mean}; + lug_val(51) = {s2_phe_both_raw_gauss_fit_sigma}; + lug_val(52) = {s2_phe_both_raw_gauss_fit_mean_error}; + lug_val(53) = {s2_phe_both_raw_gauss_fit_sigma_error}; + + Image_paths = {strcat('LUX_corrections/',file_id_cp,'/S2_bottom_lifetime_',file_id_cp,'.jpg'),strcat('LUX_corrections/',file_id_cp,'/S2_bottom_hist_EL_',file_id_cp,'.jpg'),... + strcat('LUX_corrections/',file_id_cp,'/S2_both_lifetime_',file_id_cp,'.jpg'),strcat('LUX_corrections/',file_id_cp,'/S2_both_hist_EL_',file_id_cp,'.jpg')}; + + xmlinput.iq.global.filename_prefix = lug_val(1); + xmlinput.iq.global.cp_number = lug_val(2); + xmlinput.iq.global.gs_number = lug_val(3); + xmlinput.iq.global.computed_by = lug_val(4); + xmlinput.iq.global.computed_date = datestr(now,'yyyymmddTHHMM'); + xmlinput.iq.global.source = source; + xmlinput.iq.global.source_id = 'unknown'; + xmlinput.iq.global.notes = ' '; + xmlinput.iq.global.algorithm_name = lug_val(5); + xmlinput.iq.global.algorithm_version = lug_val(6); + xmlinput.iq.correction.fit.electron_attenuation_us = lug_val(7); + xmlinput.iq.correction.fit.sigma_electron_attenuation_us = lug_val(8); + xmlinput.iq.correction.fit.s2_bottom_z0_phe = lug_val(9); + xmlinput.iq.correction.fit.sigma_s2_bottom_z0_phe = lug_val(10); + xmlinput.iq.correction.fit.electron_attenuation_us_both = lug_val(11); + xmlinput.iq.correction.fit.sigma_electron_attenuation_us_both = lug_val(12); + xmlinput.iq.correction.fit.s2_both_z0_phe = lug_val(13); + xmlinput.iq.correction.fit.sigma_s2_both_z0_phe = lug_val(14); + xmlinput.iq.correction.fit.number_of_kr_events = lug_val(19); + xmlinput.iq.correction.fit.bin_means_s2_bottom = lug_val(20); + xmlinput.iq.correction.fit.means_s2_bottom = lug_val(21); + xmlinput.iq.correction.fit.sigma_means_s2_bottom = lug_val(22); + xmlinput.iq.correction.fit.bin_means_s2_both = lug_val(23); + xmlinput.iq.correction.fit.means_s2_both = lug_val(24); + xmlinput.iq.correction.fit.sigma_means_s2_both = lug_val(25); + xmlinput.iq.correction.fit.detector_edge = lug_val(29); + xmlinput.iq.correction.fit.s2_both_mean_at_top_z = lug_val(30); + xmlinput.iq.correction.fit.s2_both_mean_at_top_err_z = lug_val(31); + xmlinput.iq.correction.fit.s2_bot_mean_at_top_z = lug_val(32); + xmlinput.iq.correction.fit.s2_bot_mean_at_top_err_z = lug_val(33); + xmlinput.iq.correction.fit.s2_bottom_norm_z_index = lug_val(34); + xmlinput.iq.correction.fit.s2_bottom_norm_z_means = lug_val(35); + xmlinput.iq.correction.fit.s2_bottom_norm_z = lug_val(36); + xmlinput.iq.correction.fit.s2_at_top_bottom = lug_val(37); + xmlinput.iq.correction.fit.s2_at_bottom_bottom = lug_val(38); + xmlinput.iq.correction.fit.pseudo_lifetime_bottom = lug_val(39); + xmlinput.iq.correction.fit.s2_both_norm_z_index = lug_val(40); + xmlinput.iq.correction.fit.s2_both_norm_z_means = lug_val(41); + xmlinput.iq.correction.fit.s2_both_norm_z = lug_val(42); + xmlinput.iq.correction.fit.s2_at_top_both = lug_val(43); + xmlinput.iq.correction.fit.s2_at_bottom_both = lug_val(44); + xmlinput.iq.correction.fit.pseudo_lifetime_both = lug_val(45); + xmlinput.iq.correction.fit.s2_phe_both_z_gauss_fit_mean = lug_val(46); + xmlinput.iq.correction.fit.s2_phe_both_z_gauss_fit_sigma = lug_val(47); + xmlinput.iq.correction.fit.s2_phe_both_z_gauss_fit_mean_error = lug_val(48); + xmlinput.iq.correction.fit.s2_phe_both_z_gauss_fit_sigma_error = lug_val(49); + xmlinput.iq.correction.fit.s2_phe_both_raw_gauss_fit_mean = lug_val(50); + xmlinput.iq.correction.fit.s2_phe_both_raw_gauss_fit_sigma = lug_val(51); + xmlinput.iq.correction.fit.s2_phe_both_raw_gauss_fit_mean_error = lug_val(52); + xmlinput.iq.correction.fit.s2_phe_both_raw_gauss_fit_sigma_error = lug_val(53); + + LUXSubmitIQ(user,'electron_lifetime',algorithm_name,version,file_id,cp,xmlinput,'Kr83 Calibration','',Image_paths); + + end + + clear lug_val Image_paths xmlinput + +%% S1 Z Dependence + if calibrations(2)==1; + + lug_val(1) = {file_id}; + lug_val(2) = {cp}; %Proccessing version number + lug_val(3) = {gs}; + lug_val(4) = {user}; + lug_val(5) = {algorithm_name}; + lug_val(6) = {version}; + lug_val(7) = {P_s1_both}; % Poly paramaters for S1 vs. dT + lug_val(8) = {sigma_P_s1_both}; % Sigma Poly paramaters for S1 vs. dT + lug_val(9) = {P_s1_bottom}; % Poly paramaters for S1 vs. dT + lug_val(10) = {sigma_P_s1_bottom}; % Sigma Poly paramaters for S1 vs. dT + lug_val(11) = {P_s1_top}; % Poly paramaters for S1 vs. dT + lug_val(12) = {sigma_P_s1_top}; % Sigma Poly paramaters for S1 vs. dT + lug_val(13) = {Kr_events}; + lug_val(14) = {s1_both_means_bin};% the bin center + lug_val(15) = {s1_both_means}; % the mean of the gaussian fit + lug_val(16) = {s1_both_means_sigma};% one sigma + lug_val(17) = {s1_bottom_means_bin};% the bin center + lug_val(18) = {s1_bottom_means}; % the mean of the gaussian fit + lug_val(19) = {s1_bottom_means_sigma};% one sigma + lug_val(20) = {center_s1_both}; + lug_val(21) = {center_s1_both_err}; + lug_val(22) = {center_s1_bottom}; + lug_val(23) = {center_s1_bottom_err}; + lug_val(24) = {center_s1_top}; + lug_val(25) = {center_s1_top_err}; + lug_val(26) = {s1_phe_both_z_gauss_fit_mean}; + lug_val(27) = {s1_phe_both_z_gauss_fit_sigma}; + lug_val(28) = {s1_phe_both_z_gauss_fit_mean_error}; + lug_val(29) = {s1_phe_both_z_gauss_fit_sigma_error}; + lug_val(30) = {s1_phe_both_raw_gauss_fit_mean}; + lug_val(31) = {s1_phe_both_raw_gauss_fit_sigma}; + lug_val(32) = {s1_phe_both_raw_gauss_fit_mean_error}; + lug_val(33) = {s1_phe_both_raw_gauss_fit_sigma_error}; + + Image_paths = {strcat('LUX_corrections/',file_id_cp,'/S1_both_LC_',file_id_cp,'.jpg'),strcat('LUX_corrections/',file_id_cp,'/S1_both_hist_',file_id_cp,'.jpg'),... + strcat('LUX_corrections/',file_id_cp,'/S1_bottom_LC_',file_id_cp,'.jpg'),strcat('LUX_corrections/',file_id_cp,'/S1_bottom_hist_',file_id_cp,'.jpg') }; + + xmlinput.iq.global.filename_prefix = lug_val(1); + xmlinput.iq.global.cp_number = lug_val(2); + xmlinput.iq.global.gs_number = lug_val(3); + xmlinput.iq.global.computed_by = lug_val(4); + xmlinput.iq.global.computed_date = datestr(now,'yyyymmddTHHMM'); + xmlinput.iq.global.source = source; + xmlinput.iq.global.source_id = 'unknown'; + xmlinput.iq.global.notes = ' '; + xmlinput.iq.global.algorithm_name = lug_val(5); + xmlinput.iq.global.algorithm_version = lug_val(6); + xmlinput.iq.correction.fit.s1_both_zdep_quad_fit = lug_val(7); + xmlinput.iq.correction.fit.s1_both_sigma_zdep_quad_fit = lug_val(8); + xmlinput.iq.correction.fit.s1_bottom_zdep_quad_fit = lug_val(9); + xmlinput.iq.correction.fit.s1_bottom_sigma_zdep_quad_fit = lug_val(10); + xmlinput.iq.correction.fit.s1_top_zdep_quad_fit = lug_val(11); + xmlinput.iq.correction.fit.s1_top_sigma_zdep_quad_fit = lug_val(12); + xmlinput.iq.correction.fit.number_of_kr_events = lug_val(13); + xmlinput.iq.correction.fit.bin_means_s1_both = lug_val(14); + xmlinput.iq.correction.fit.means_s1_both = lug_val(15); + xmlinput.iq.correction.fit.sigma_means_s1_both = lug_val(16); + xmlinput.iq.correction.fit.bin_means_s1_bottom = lug_val(17); + xmlinput.iq.correction.fit.means_s1_bottom = lug_val(18); + xmlinput.iq.correction.fit.sigma_means_s1_bottom = lug_val(19); + xmlinput.iq.correction.fit.center_s1_both_z = lug_val(20); + xmlinput.iq.correction.fit.center_s1_both_err_z = lug_val(21); + xmlinput.iq.correction.fit.center_s1_bot_z = lug_val(22); + xmlinput.iq.correction.fit.center_s1_bot_err_z = lug_val(23); + xmlinput.iq.correction.fit.center_s1_top_z = lug_val(24); + xmlinput.iq.correction.fit.center_s1_top_err_z = lug_val(25); + xmlinput.iq.correction.fit.s1_phe_both_z_gauss_fit_mean = lug_val(26); + xmlinput.iq.correction.fit.s1_phe_both_z_gauss_fit_sigma = lug_val(27); + xmlinput.iq.correction.fit.s1_phe_both_z_gauss_fit_mean_error = lug_val(28); + xmlinput.iq.correction.fit.s1_phe_both_z_gauss_fit_sigma_error = lug_val(29); + xmlinput.iq.correction.fit.s1_phe_both_raw_gauss_fit_mean = lug_val(30); + xmlinput.iq.correction.fit.s1_phe_both_raw_gauss_fit_sigma = lug_val(31); + xmlinput.iq.correction.fit.s1_phe_both_raw_gauss_fit_mean_error = lug_val(32); + xmlinput.iq.correction.fit.s1_phe_both_raw_gauss_fit_sigma_error = lug_val(33); + + + LUXSubmitIQ(user,'z_dep_s1_correction',algorithm_name,version,file_id,cp,xmlinput,'Kr83 Calibration','',Image_paths); + + end + + clear lug_val Image_paths xmlinput + +%% S2 XY Correction + if calibrations(3)==1; + + lug_val(1) = {file_id}; + lug_val(2) = {user}; + lug_val(3) = {algorithm_name}; + lug_val(4) = {version}; + lug_val(5) = {s2xbins}; + lug_val(6) = {s2ybins}; + lug_val(7) = {norm_S2_all}; + lug_val(8) = {sigma_norm_S2_all}; + lug_val(9) = {norm_S2_bot}; + lug_val(10) = {sigma_norm_S2_bot}; + lug_val(11) = {mean_S2_both_xy}; + lug_val(12) = {Sigma_S2_both}; + lug_val(13) = {mean_S2_bottom_xy}; + lug_val(14) = {Sigma_S2_bottom}; + lug_val(15) = {Count_S2_bottom}; + lug_val(16) = {cp}; %Proccessing version number + lug_val(17) = {gs}; %Proccessing gs number + lug_val(18) = {Kr_events}; + lug_val(20) = {s2_both_center_xyz}; %Not actually "center"... it's the value at the top + lug_val(21) = {s2_both_center_xyz_error}; + lug_val(22) = {s2_bot_center_xyz}; + lug_val(23) = {s2_bot_center_xyz_error}; + lug_val(24) = {s2_phe_both_xyz_gauss_fit_mean}; + lug_val(25) = {s2_phe_both_xyz_gauss_fit_sigma}; + lug_val(26) = {s2_phe_both_xyz_gauss_fit_mean_error}; + lug_val(27) = {s2_phe_both_xyz_gauss_fit_sigma_error}; + + Image_paths = {strcat('LUX_corrections/',file_id_cp,'/S2_XY_both_',file_id_cp,'.jpg'), strcat('LUX_corrections/',file_id_cp,'/Sigma_S2_XY_both_',file_id_cp,'.jpg'),... + strcat('LUX_corrections/',file_id_cp,'/S2_XY_bottom_',file_id_cp,'.jpg'), strcat('LUX_corrections/',file_id_cp,'/Sigma_S2_XY_bottom_',file_id_cp,'.jpg') }; + + xmlinput.iq.global.filename_prefix = lug_val(1); + xmlinput.iq.global.cp_number = lug_val(16); + xmlinput.iq.global.gs_number = lug_val(17); + xmlinput.iq.global.computed_by = lug_val(2); + xmlinput.iq.global.computed_date = datestr(now,'yyyymmddTHHMM'); + xmlinput.iq.global.source = source; + xmlinput.iq.global.source_id = 'unknown'; + xmlinput.iq.global.notes = ' '; + xmlinput.iq.global.algorithm_name = lug_val(3); + xmlinput.iq.global.algorithm_version = lug_val(4); + xmlinput.iq.correction.fit.number_of_kr_events = lug_val(18); + xmlinput.iq.correction.fit.x_bin_center = lug_val(5); + xmlinput.iq.correction.fit.y_bin_center = lug_val(6); + xmlinput.iq.correction.fit.norm_s2_both = lug_val(7); + xmlinput.iq.correction.fit.sigma_norm_s2_both = lug_val(8); + xmlinput.iq.correction.fit.norm_s2_bottom = lug_val(9); + xmlinput.iq.correction.fit.sigma_norm_s2_bottom = lug_val(10); + xmlinput.iq.correction.fit.mean_s2_both = lug_val(11); + xmlinput.iq.correction.fit.sigma_s2_both = lug_val(12); + xmlinput.iq.correction.fit.mean_s2_bottom = lug_val(13); + xmlinput.iq.correction.fit.sigma_s2_bottom = lug_val(14); + xmlinput.iq.correction.fit.count_s2 = lug_val(15); + xmlinput.iq.correction.fit.s2_both_mean_at_top_xyz = lug_val(20); + xmlinput.iq.correction.fit.s2_both_mean_at_top_err_xyz = lug_val(21); + xmlinput.iq.correction.fit.s2_bot_mean_at_top_xyz = lug_val(22); + xmlinput.iq.correction.fit.s2_bot_mean_at_top_err_xyz = lug_val(23); + xmlinput.iq.correction.fit.s2_phe_both_xyz_gauss_fit_mean = lug_val(24); + xmlinput.iq.correction.fit.s2_phe_both_xyz_gauss_fit_sigma = lug_val(25); + xmlinput.iq.correction.fit.s2_phe_both_xyz_gauss_fit_mean_error = lug_val(26); + xmlinput.iq.correction.fit.s2_phe_both_xyz_gauss_fit_sigma_error = lug_val(27); + + LUXSubmitIQ(user,'s2_xy_correction',algorithm_name,version,file_id,cp,xmlinput,'Kr83 Calibration','',Image_paths); + end + + clear lug_val Image_paths xmlinput + +%% S1 XY Correction + if calibrations(4)==1; + lug_val(1) = {file_id}; + lug_val(2) = {cp}; %Proccessing version number + lug_val(3) = {gs}; + lug_val(4) = {user}; + lug_val(5) = {algorithm_name}; + lug_val(6) = {version}; + lug_val(7) = {Kr_events}; + lug_val(8) = {s1xbins}; + lug_val(9) = {s1ybins}; + lug_val(10) = {norm_S1_all}; + lug_val(11) = {sigma_norm_S1_all}; + lug_val(12) = {norm_S1_bot}; + lug_val(13) = {sigma_norm_S1_bot}; + lug_val(14) = {norm_S1_top}; + lug_val(15) = {sigma_norm_S1_top}; + lug_val(16) = {mean_S1_both_xy}; + lug_val(17) = {Sigma_S1_both}; + lug_val(18) = {mean_S1_bottom_xy}; + lug_val(19) = {Sigma_S1_bottom}; + lug_val(20) = {Count_S1_both}; + lug_val(21) = {s1_both_center_xyz}; + lug_val(22) = {s1_both_center_xyz_error}; + lug_val(23) = {s1_bot_center_xyz}; + lug_val(24) = {s1_bot_center_xyz_error}; + lug_val(25) = {s1_top_center_xyz}; + lug_val(26) = {s1_top_center_xyz_error}; + lug_val(27) = {s1_phe_both_xyz_gauss_fit_mean}; + lug_val(28) = {s1_phe_both_xyz_gauss_fit_sigma}; + lug_val(29) = {s1_phe_both_xyz_gauss_fit_mean_error}; + lug_val(30) = {s1_phe_both_xyz_gauss_fit_sigma_error}; + + Image_paths = {strcat('LUX_corrections/',file_id_cp,'/S1_XY_both_',file_id_cp,'.jpg'), strcat('LUX_corrections/',file_id_cp,'/Sigma_S1_XY_both_',file_id_cp,'.jpg')... + ,strcat('LUX_corrections/',file_id_cp,'/S1_XY_bottom_',file_id_cp,'.jpg'), strcat('LUX_corrections/',file_id_cp,'/Sigma_S1_XY_bottom_',file_id_cp,'.jpg')... + ,strcat('LUX_corrections/',file_id_cp,'/S1_Count_XY_both_',file_id_cp,'.jpg') }; + + + xmlinput.iq.global.filename_prefix = lug_val(1); + xmlinput.iq.global.cp_number = lug_val(2); + xmlinput.iq.global.gs_number = lug_val(3); + xmlinput.iq.global.computed_by = lug_val(4); + xmlinput.iq.global.computed_date = datestr(now,'yyyymmddTHHMM'); + xmlinput.iq.global.source = source; + xmlinput.iq.global.source_id = 'unknown'; + xmlinput.iq.global.notes = ' '; + xmlinput.iq.global.algorithm_name = lug_val(5); + xmlinput.iq.global.algorithm_version = lug_val(6); + xmlinput.iq.correction.fit.number_of_kr_events = lug_val(7); + xmlinput.iq.correction.fit.x_bin_center = lug_val(8); + xmlinput.iq.correction.fit.y_bin_center = lug_val(9); + xmlinput.iq.correction.fit.norm_s1_both = lug_val(10); + xmlinput.iq.correction.fit.sigma_norm_s1_both = lug_val(11); + xmlinput.iq.correction.fit.norm_s1_bottom = lug_val(12); + xmlinput.iq.correction.fit.sigma_norm_s1_bottom = lug_val(13); + xmlinput.iq.correction.fit.norm_s1_top = lug_val(14); + xmlinput.iq.correction.fit.sigma_norm_s1_top = lug_val(15); + xmlinput.iq.correction.fit.mean_s1_both = lug_val(16); + xmlinput.iq.correction.fit.sigma_s1_both = lug_val(17); + xmlinput.iq.correction.fit.mean_s1_bottom = lug_val(18); + xmlinput.iq.correction.fit.sigma_s1_bottom = lug_val(19); + xmlinput.iq.correction.fit.count_s1 = lug_val(20); + xmlinput.iq.correction.fit.center_s1_both_z = lug_val(21); + xmlinput.iq.correction.fit.center_s1_both_err_z = lug_val(22); + xmlinput.iq.correction.fit.center_s1_bot_z = lug_val(23); + xmlinput.iq.correction.fit.center_s1_bot_err_z = lug_val(24); + xmlinput.iq.correction.fit.center_s1_top_z = lug_val(25); + xmlinput.iq.correction.fit.center_s1_top_err_z = lug_val(26); + xmlinput.iq.correction.fit.s1_phe_both_xyz_gauss_fit_mean = lug_val(27); + xmlinput.iq.correction.fit.s1_phe_both_xyz_gauss_fit_sigma = lug_val(28); + xmlinput.iq.correction.fit.s1_phe_both_xyz_gauss_fit_mean_error = lug_val(29); + xmlinput.iq.correction.fit.s1_phe_both_xyz_gauss_fit_sigma_error = lug_val(30); + + LUXSubmitIQ(user,'s1_xy_correction',algorithm_name,version,file_id,cp,xmlinput,'Kr83 Calibration','',Image_paths); + end + + clear lug_val Image_paths xmlinput + +%% S2 Width + if calibrations(6)==1; + + lug_val(1) = {file_id}; + lug_val(2) = {user}; + lug_val(3) = {algorithm_name}; + lug_val(4) = {version}; + lug_val(5) = {cp}; %Proccessing version number + lug_val(6) = {gs}; %Proccessing gs number + lug_val(7) = {Kr_events}; + lug_val(8) = {mean_index_s2_z_width_full}; + lug_val(9) = {means_s2_z_width_full}; + lug_val(10) = {means_error_s2_z_width_full}; + lug_val(11) = {mean_index_s2_z_width_aft1}; + lug_val(12) = {means_s2_z_width_aft1}; + lug_val(13) = {means_error_s2_z_width_aft1}; + lug_val(14) = {s2xbins}; + lug_val(15) = {s2ybins}; + lug_val(16) = {means_s2_xy_width_full}; + lug_val(17) = {sigma_s2_xy_width_full}; + lug_val(18) = {means_s2_xy_width_aft1}; + lug_val(19) = {sigma_s2_xy_width_aft1}; + + Image_paths = {strcat('LUX_corrections/',file_id_cp,'/S2_z_width_end_',file_id_cp,'.jpg'), strcat('LUX_corrections/',file_id_cp,'/S2_Width_xy_end',file_id_cp,'.jpg')... + ,strcat('LUX_corrections/',file_id_cp,'/S2_z_width_aft1_',file_id_cp,'.jpg'), strcat('LUX_corrections/',file_id_cp,'/S2_Width_xy_aft1',file_id_cp,'.jpg')... + ,strcat('LUX_corrections/',file_id_cp,'/RadialField_',file_id_cp,'.jpg') }; + + xmlinput.iq.global.filename_prefix = lug_val(1); + xmlinput.iq.global.computed_by = lug_val(2); + xmlinput.iq.global.computed_date = datestr(now,'yyyymmddTHHMM'); + xmlinput.iq.global.source = source; + xmlinput.iq.global.source_id = 'unknown'; + xmlinput.iq.global.notes = ' '; + xmlinput.iq.global.algorithm_name = lug_val(3); + xmlinput.iq.global.algorithm_version = lug_val(4); + xmlinput.iq.global.cp_number = lug_val(5); + xmlinput.iq.global.gs_number = lug_val(6); + xmlinput.iq.correction.fit.number_of_kr_events = lug_val(7); + xmlinput.iq.correction.fit.bin_means_s2_z_width_full = lug_val(8); + xmlinput.iq.correction.fit.means_s2_z_width_full = lug_val(9); + xmlinput.iq.correction.fit.sigma_means_s2_z_width_full = lug_val(10); + xmlinput.iq.correction.fit.bin_means_s2_z_width_aft1 = lug_val(11); + xmlinput.iq.correction.fit.means_s2_z_width_aft1 = lug_val(12); + xmlinput.iq.correction.fit.sigma_means_s2_z_width_aft1 = lug_val(13); + xmlinput.iq.correction.fit.x_bin_center = lug_val(14); + xmlinput.iq.correction.fit.y_bin_center = lug_val(15); + xmlinput.iq.correction.fit.means_s2_xy_width_full = lug_val(16); + xmlinput.iq.correction.fit.sigma_s2_xy_width_full = lug_val(17); + xmlinput.iq.correction.fit.means_s2_xy_width_aft1 = lug_val(18); + xmlinput.iq.correction.fit.sigma_s2_xy_width_aft1 = lug_val(19); + + LUXSubmitIQ(user,'s2_width_kr',algorithm_name,version,file_id,cp,xmlinput,'Kr83 Calibration','',Image_paths); + + end + clear lug_val Image_paths xmlinput + +%% Single electron size + if calibrations(6)==1; + + lug_val(1) = {file_id}; + lug_val(2) = {user}; + lug_val(3) = {algorithm_name}; + lug_val(4) = {version}; + lug_val(5) = {cp}; %Proccessing version number + lug_val(6) = {gs}; %Proccessing gs number + lug_val(7) = {Kr_events}; + lug_val(8) = {SE_mu_both}; + lug_val(9) = {SE_sig_mu_both}; + lug_val(10) = {SE_sig_both}; + lug_val(11) = {SE_sig_sig_both}; + lug_val(12) = {skew_both}; + lug_val(13) = {SE_mu_bot}; + lug_val(14) = {SE_sig_mu_bot}; + lug_val(15) = {SE_sig_bot}; + lug_val(16) = {SE_sig_sig_bot}; + lug_val(17) = {skew_bot}; + lug_val(18) = {SE_mu_top}; + lug_val(19) = {SE_sig_mu_top}; + lug_val(20) = {SE_sig_top}; + lug_val(21) = {SE_sig_sig_top}; + lug_val(22) = {skew_top}; + lug_val(23) = {num_SE_events}; + + Image_paths = {strcat('LUX_corrections/',file_id_cp,'/both_SE_',file_id_cp,'.jpg'), strcat('LUX_corrections/',file_id_cp,'/bottom_SE_',file_id_cp,'.jpg')... + ,strcat('LUX_corrections/',file_id_cp,'/top_SE_',file_id_cp,'.jpg') }; + + xmlinput.iq.global.filename_prefix = lug_val(1); + xmlinput.iq.global.computed_by = lug_val(2); + xmlinput.iq.global.computed_date = datestr(now,'yyyymmddTHHMM'); + xmlinput.iq.global.source = source; + xmlinput.iq.global.source_id = 'unknown'; + xmlinput.iq.global.notes = ' '; + xmlinput.iq.global.algorithm_name = lug_val(3); + xmlinput.iq.global.algorithm_version = lug_val(4); + xmlinput.iq.global.cp_number = lug_val(5); + xmlinput.iq.global.gs_number = lug_val(6); + xmlinput.iq.correction.fit.number_of_kr_events = lug_val(7); + xmlinput.iq.correction.fit.e_mean_both = lug_val(8); + xmlinput.iq.correction.fit.e_mean_err_both = lug_val(9); + xmlinput.iq.correction.fit.e_sig_both = lug_val(10); + xmlinput.iq.correction.fit.e_sig_err_both = lug_val(11); + xmlinput.iq.correction.fit.e_fit_skew_both = lug_val(12); + xmlinput.iq.correction.fit.e_mean_bottom = lug_val(13); + xmlinput.iq.correction.fit.e_mean_err_bottom = lug_val(14); + xmlinput.iq.correction.fit.e_sig_bottom = lug_val(15); + xmlinput.iq.correction.fit.e_sig_err_bottom = lug_val(16); + xmlinput.iq.correction.fit.e_fit_skew_bottom = lug_val(17); + xmlinput.iq.correction.fit.e_mean_top = lug_val(18); + xmlinput.iq.correction.fit.e_mean_err_top = lug_val(19); + xmlinput.iq.correction.fit.e_sig_top = lug_val(20); + xmlinput.iq.correction.fit.e_sig_err_top = lug_val(21); + xmlinput.iq.correction.fit.e_fit_skew_top = lug_val(22); + xmlinput.iq.correction.fit.number_SE_events = lug_val(23); + + LUXSubmitIQ(user,'single_e_kr',algorithm_name,version,file_id,cp,xmlinput,'Kr83 Calibration','',Image_paths); + clear lug_val Image_paths xmlinput + + %% SE XY Maps + lug_val(1) = {file_id}; + lug_val(2) = {user}; + lug_val(3) = {algorithm_name}; + lug_val(4) = {version}; + lug_val(5) = {cp}; %Proccessing version number + lug_val(6) = {gs}; %Proccessing gs number + lug_val(7) = {Kr_events}; + lug_val(8) = {SE_both_mu_center}; + lug_val(9) = {error_SE_both_mu_center}; + lug_val(10) = {SE_both_kurt_center}; + lug_val(11) = {SE_both_skew_center}; + lug_val(12) = {SE_both_sigma_center}; + lug_val(13) = {SE_bot_mu_center}; + lug_val(14) = {error_SE_bot_mu_center}; + lug_val(15) = {SE_bot_kurt_center}; + lug_val(16) = {SE_bot_skew_center}; + lug_val(17) = {SE_bot_sigma_center}; + lug_val(18) = {SE_top_mu_center}; + lug_val(19) = {error_SE_top_mu_center}; + lug_val(20) = {SE_top_kurt_center}; + lug_val(21) = {SE_top_skew_center}; + lug_val(22) = {SE_top_sigma_center}; + lug_val(23) = {se_xbins}; + lug_val(24) = {se_ybins}; + lug_val(25) = {mean_SE_both_xy}; + lug_val(26) = {skew_SE_both_xy}; + lug_val(27) = {sigma_SE_both_xy}; + lug_val(28) = {kurt_SE_both_xy}; + lug_val(29) = {mean_err_SE_both_xy}; + lug_val(30) = {sigma_err_SE_both_xy}; + lug_val(31) = {norm_SE_both_mu}; + lug_val(32) = {error_SE_both_mu_norm}; + lug_val(33) = {mean_SE_bot_xy}; + lug_val(34) = {skew_SE_bot_xy}; + lug_val(35) = {sigma_SE_bot_xy}; + lug_val(36) = {kurt_SE_bot_xy}; + lug_val(37) = {mean_err_SE_bot_xy}; + lug_val(38) = {sigma_err_SE_bot_xy}; + lug_val(39) = {norm_SE_bot_mu}; + lug_val(40) = {error_SE_bot_mu_norm}; + lug_val(41) = {mean_SE_top_xy}; + lug_val(42) = {skew_SE_top_xy}; + lug_val(43) = {sigma_SE_top_xy}; + lug_val(44) = {kurt_SE_top_xy}; + lug_val(45) = {mean_err_SE_top_xy}; + lug_val(46) = {sigma_err_SE_top_xy}; + lug_val(47) = {norm_SE_top_mu}; + lug_val(48) = {error_SE_top_mu_norm}; + + Image_paths = {strcat('LUX_corrections/',file_id_cp,'/SE_XY_both_',file_id_cp,'.jpg')... + ,strcat('LUX_corrections/',file_id_cp,'/SE_XY_bot_',file_id_cp,'.jpg')... + ,strcat('LUX_corrections/',file_id_cp,'/SE_XY_top_',file_id_cp,'.jpg')}; + + xmlinput.iq.global.filename_prefix = lug_val(1); + xmlinput.iq.global.computed_by = lug_val(2); + xmlinput.iq.global.computed_date = datestr(now,'yyyymmddTHHMM'); + xmlinput.iq.global.source = source; + xmlinput.iq.global.source_id = 'unknown'; + xmlinput.iq.global.notes = ' '; + xmlinput.iq.global.algorithm_name = lug_val(3); + xmlinput.iq.global.algorithm_version = lug_val(4); + xmlinput.iq.global.cp_number = lug_val(5); + xmlinput.iq.global.gs_number = lug_val(6); + xmlinput.iq.correction.fit.number_of_kr_events = lug_val(7); + xmlinput.iq.correction.fit.SE_both_mu_center = lug_val(8); + xmlinput.iq.correction.fit.SE_both_mu_center_error = lug_val(9); + xmlinput.iq.correction.fit.SE_both_kurt_center = lug_val(10); + xmlinput.iq.correction.fit.SE_both_skew_center = lug_val(11); + xmlinput.iq.correction.fit.SE_both_sigma_center = lug_val(12); + xmlinput.iq.correction.fit.SE_bot_mu_center = lug_val(13); + xmlinput.iq.correction.fit.SE_bot_mu_center_error = lug_val(14); + xmlinput.iq.correction.fit.SE_bot_kurt_center = lug_val(15); + xmlinput.iq.correction.fit.SE_bot_skew_center = lug_val(16); + xmlinput.iq.correction.fit.SE_bot_sigma_center = lug_val(17); + xmlinput.iq.correction.fit.SE_top_mu_center = lug_val(18); + xmlinput.iq.correction.fit.SE_top_mu_center_error = lug_val(19); + xmlinput.iq.correction.fit.SE_top_kurt_center = lug_val(20); + xmlinput.iq.correction.fit.SE_top_skew_center = lug_val(21); + xmlinput.iq.correction.fit.SE_top_sigma_center = lug_val(22); + xmlinput.iq.correction.fit.SE_xbin_centers = lug_val(23); + xmlinput.iq.correction.fit.SE_ybin_centers = lug_val(24); + xmlinput.iq.correction.fit.SE_both_mean_xy = lug_val(25); + xmlinput.iq.correction.fit.SE_both_skew_xy = lug_val(26); + xmlinput.iq.correction.fit.SE_both_sigma_xy = lug_val(27); + xmlinput.iq.correction.fit.SE_both_kurt_xy = lug_val(28); + xmlinput.iq.correction.fit.SE_both_mean_err_xy = lug_val(29); + xmlinput.iq.correction.fit.SE_both_sigma_err_xy = lug_val(30); + xmlinput.iq.correction.fit.SE_both_mean_xy_norm = lug_val(31); + xmlinput.iq.correction.fit.SE_both_mean_err_xy_norm = lug_val(32); + xmlinput.iq.correction.fit.SE_bot_mean_xy = lug_val(33); + xmlinput.iq.correction.fit.SE_bot_skew_xy = lug_val(34); + xmlinput.iq.correction.fit.SE_bot_sigma_xy = lug_val(35); + xmlinput.iq.correction.fit.SE_bot_kurt_xy = lug_val(36); + xmlinput.iq.correction.fit.SE_bot_mean_err_xy = lug_val(37); + xmlinput.iq.correction.fit.SE_bot_sigma_err_xy = lug_val(38); + xmlinput.iq.correction.fit.SE_bot_mean_xy_norm = lug_val(39); + xmlinput.iq.correction.fit.SE_bot_mean_err_xy_norm = lug_val(40); + xmlinput.iq.correction.fit.SE_top_mean_xy = lug_val(41); + xmlinput.iq.correction.fit.SE_top_skew_xy = lug_val(42); + xmlinput.iq.correction.fit.SE_top_sigma_xy = lug_val(43); + xmlinput.iq.correction.fit.SE_top_kurt_xy = lug_val(44); + xmlinput.iq.correction.fit.SE_top_mean_err_xy = lug_val(45); + xmlinput.iq.correction.fit.SE_top_sigma_err_xy = lug_val(46); + xmlinput.iq.correction.fit.SE_top_mean_xy_norm = lug_val(47); + xmlinput.iq.correction.fit.SE_top_mean_err_xy_norm = lug_val(48); + + LUXSubmitIQ(user,'single_e_xy_kr',algorithm_name,version,file_id,cp,xmlinput,'Kr83 Calibration','',Image_paths); + + end + clear lug_val Image_paths xmlinput + +%% Kr s1a/s1b Z maps + + %Added after submit == 1 was hard coded, so this doesn't check for that condition + lug_val(1) = {file_id}; + lug_val(2) = {user}; + lug_val(3) = {algorithm_name}; + lug_val(4) = {version}; + lug_val(5) = {cp}; %Proccessing version number + lug_val(6) = {gs}; %Proccessing gs number + lug_val(7) = {Kr_events}; + lug_val(8) = {s1a_z_means}; + lug_val(9) = {s1a_z_means_err}; + lug_val(10) = {s1b_z_means}; + lug_val(11) = {s1b_z_means_err}; + lug_val(12) = {s1ab_z_means}; + lug_val(13) = {s1ab_z_means_err}; + lug_val(14) = {s1ab_bincenters}; + lug_val(15) = {s1a_P}; + lug_val(16) = {s1a_S.R}; + lug_val(17) = {s1a_S.df}; + lug_val(18) = {s1a_S.normr}; + lug_val(19) = {s1b_P}; + lug_val(20) = {s1b_S.R}; + lug_val(21) = {s1b_S.df}; + lug_val(22) = {s1b_S.normr}; + lug_val(23) = {s1ab_P}; + lug_val(24) = {s1ab_S.R}; + lug_val(25) = {s1ab_S.df}; + lug_val(26) = {s1ab_S.normr}; + + Image_paths = {strcat('LUX_corrections/',file_id_cp,'/s1a_mean_z',file_id_cp,'.jpg'), strcat('LUX_corrections/',file_id_cp,'/s1b_mean_z',file_id_cp,'.jpg')... + ,strcat('LUX_corrections/',file_id_cp,'/s1ab_ratio_z',file_id_cp,'.jpg')}; + + xmlinput.iq.global.filename_prefix = lug_val(1); + xmlinput.iq.global.computed_by = lug_val(2); + xmlinput.iq.global.computed_date = datestr(now,'yyyymmddTHHMM'); + xmlinput.iq.global.source = source; + xmlinput.iq.global.source_id = 'unknown'; + xmlinput.iq.global.notes = ' '; + xmlinput.iq.global.algorithm_name = lug_val(3); + xmlinput.iq.global.algorithm_version = lug_val(4); + xmlinput.iq.global.cp_number = lug_val(5); + xmlinput.iq.global.gs_number = lug_val(6); + xmlinput.iq.correction.fit.number_of_kr_events = lug_val(7); + xmlinput.iq.correction.fit.s1a_zmeans = lug_val(8); + xmlinput.iq.correction.fit.s1a_zmeans_err = lug_val(9); + xmlinput.iq.correction.fit.s1b_zmeans = lug_val(10); + xmlinput.iq.correction.fit.s1b_zmeans_err = lug_val(11); + xmlinput.iq.correction.fit.s1ab_zratios = lug_val(12); + xmlinput.iq.correction.fit.s1ab_zratios_err = lug_val(13); + xmlinput.iq.correction.fit.s1ab_zbincenters = lug_val(14); + xmlinput.iq.correction.fit.s1a_P = lug_val(15); + xmlinput.iq.correction.fit.s1a_S.R = lug_val(16); + xmlinput.iq.correction.fit.s1a_S.df = lug_val(17); + xmlinput.iq.correction.fit.s1a_S.normr = lug_val(18); + xmlinput.iq.correction.fit.s1b_P = lug_val(19); + xmlinput.iq.correction.fit.s1b_S.R = lug_val(20); + xmlinput.iq.correction.fit.s1b_S.df = lug_val(21); + xmlinput.iq.correction.fit.s1b_S.normr = lug_val(22); + xmlinput.iq.correction.fit.s1ab_P = lug_val(23); + xmlinput.iq.correction.fit.s1ab_S.R = lug_val(24); + xmlinput.iq.correction.fit.s1ab_S.df = lug_val(25); + xmlinput.iq.correction.fit.s1ab_S.normr = lug_val(26); + + LUXSubmitIQ(user,'s1ab_z',algorithm_name,version,file_id,cp,xmlinput,'Kr83 Calibration','',Image_paths); + clear lug_val Image_paths xmlinput + +%% Kr s1a/s1b XY maps + + %Added after submit == 1 was hard coded, so this doesn't check for that condition + lug_val(1) = {file_id}; + lug_val(2) = {user}; + lug_val(3) = {algorithm_name}; + lug_val(4) = {version}; + lug_val(5) = {cp}; %Proccessing version number + lug_val(6) = {gs}; %Proccessing gs number + lug_val(7) = {Kr_events}; + lug_val(8) = {s1a_xy_mean}; + lug_val(9) = {s1a_xy_mean_err}; + lug_val(10) = {s1b_xy_mean}; + lug_val(11) = {s1b_xy_mean_err}; + lug_val(12) = {s1ab_xy_mean}; + lug_val(13) = {s1ab_xy_mean_err}; + lug_val(14) = {s1ab_xbins}; + lug_val(15) = {s1ab_ybins}; + lug_val(16) = {x_center}; + lug_val(17) = {y_center}; + lug_val(18) = {z_center}; + + Image_paths = {strcat('LUX_corrections/',file_id_cp,'/s1a_xy',file_id_cp,'.jpg'), strcat('LUX_corrections/',file_id_cp,'/s1b_xy',file_id_cp,'.jpg')... + ,strcat('LUX_corrections/',file_id_cp,'/s1ab_ratio_xy',file_id_cp,'.jpg')}; + + xmlinput.iq.global.filename_prefix = lug_val(1); + xmlinput.iq.global.computed_by = lug_val(2); + xmlinput.iq.global.computed_date = datestr(now,'yyyymmddTHHMM'); + xmlinput.iq.global.source = source; + xmlinput.iq.global.source_id = 'unknown'; + xmlinput.iq.global.notes = ' '; + xmlinput.iq.global.algorithm_name = lug_val(3); + xmlinput.iq.global.algorithm_version = lug_val(4); + xmlinput.iq.global.cp_number = lug_val(5); + xmlinput.iq.global.gs_number = lug_val(6); + xmlinput.iq.correction.fit.number_of_kr_events = lug_val(7); + xmlinput.iq.correction.fit.s1a_xymeans = lug_val(8); + xmlinput.iq.correction.fit.s1a_xymeans_err = lug_val(9); + xmlinput.iq.correction.fit.s1b_xymeans = lug_val(10); + xmlinput.iq.correction.fit.s1b_xymeans_err = lug_val(11); + xmlinput.iq.correction.fit.s1ab_xyratios = lug_val(12); + xmlinput.iq.correction.fit.s1ab_xyratios_err = lug_val(13); + xmlinput.iq.correction.fit.s1ab_xbincenters = lug_val(14); + xmlinput.iq.correction.fit.s1ab_ybincenters = lug_val(15); + xmlinput.iq.correction.fit.x_center = lug_val(16); + xmlinput.iq.correction.fit.y_center = lug_val(17); + xmlinput.iq.correction.fit.z_center = lug_val(18); + + LUXSubmitIQ(user,'s1ab_xy',algorithm_name,version,file_id,cp,xmlinput,'Kr83 Calibration','',Image_paths); + + clear lug_val Image_paths xmlinput + + %% Kr s1a/s1b XYZ maps + + %Added after submit == 1 was hard coded, so this doesn't check for that condition + if length(s1ab_z)>100000; %require 100,000 events to do 3D binning + lug_val(1) = {file_id}; + lug_val(2) = {user}; + lug_val(3) = {algorithm_name}; + lug_val(4) = {version}; + lug_val(5) = {cp}; %Proccessing version number + lug_val(6) = {gs}; %Proccessing gs number + lug_val(7) = {Kr_events}; + lug_val(8) = {s1a_xyz_mean}; + lug_val(9) = {s1a_xyz_mean_err}; + lug_val(10) = {s1b_xyz_mean}; + lug_val(11) = {s1b_xyz_mean_err}; + lug_val(12) = {s1ab_xyz_mean}; + lug_val(13) = {s1ab_xyz_mean_err}; + lug_val(14) = {s1ab_xyz_xbins}; + lug_val(15) = {s1ab_xyz_ybins}; + lug_val(16) = {s1ab_xyz_zbins}; + lug_val(17) = {x_center}; + lug_val(18) = {y_center}; + lug_val(19) = {z_center}; + lug_val(20) = {s1as1b_at_center}; + + xmlinput.iq.global.filename_prefix = lug_val(1); + xmlinput.iq.global.computed_by = lug_val(2); + xmlinput.iq.global.computed_date = datestr(now,'yyyymmddTHHMM'); + xmlinput.iq.global.source = source; + xmlinput.iq.global.source_id = 'unknown'; + xmlinput.iq.global.notes = ' '; + xmlinput.iq.global.algorithm_name = lug_val(3); + xmlinput.iq.global.algorithm_version = lug_val(4); + xmlinput.iq.global.cp_number = lug_val(5); + xmlinput.iq.global.gs_number = lug_val(6); + xmlinput.iq.correction.fit.number_of_kr_events = lug_val(7); + xmlinput.iq.correction.fit.s1a_xyzmeans = lug_val(8); + xmlinput.iq.correction.fit.s1a_xyzmeans_err = lug_val(9); + xmlinput.iq.correction.fit.s1b_xyzmeans = lug_val(10); + xmlinput.iq.correction.fit.s1b_xyzmeans_err = lug_val(11); + xmlinput.iq.correction.fit.s1ab_xyzratios = lug_val(12); + xmlinput.iq.correction.fit.s1ab_xyzratios_err = lug_val(13); + xmlinput.iq.correction.fit.s1ab_xbincenters = lug_val(14); + xmlinput.iq.correction.fit.s1ab_ybincenters = lug_val(15); + xmlinput.iq.correction.fit.s1ab_zbincenters = lug_val(16); + xmlinput.iq.correction.fit.x_center = lug_val(17); + xmlinput.iq.correction.fit.y_center = lug_val(18); + xmlinput.iq.correction.fit.z_center = lug_val(19); + xmlinput.iq.correction.fit.s1as1b_at_center = lug_val(20); + + LUXSubmitIQ(user,'s1ab_3D',algorithm_name,version,file_id,cp,xmlinput,'Kr83 Calibration','',''); + + end + clear lug_val Image_paths xmlinput + +%% S1a/S1b R^2vZ and Field Maps + + %Added after submit == 1 was hard coded, so this doesn't check for that condition + lug_val(1) = {file_id}; + lug_val(2) = {user}; + lug_val(3) = {algorithm_name}; + lug_val(4) = {version}; + lug_val(5) = {cp}; %Proccessing version number + lug_val(6) = {gs}; %Proccessing gs number + lug_val(7) = {Kr_events}; + lug_val(8) = {s1ab_r2bins}; + lug_val(9) = {s1ab_zbins}; + lug_val(10) = {s1a_r2z_mean}; + lug_val(11) = {s1a_r2z_mean_err}; + lug_val(12) = {s1b_r2z_mean}; + lug_val(13) = {s1b_r2z_mean_err}; + lug_val(14) = {s1ab_r2z_mean}; + lug_val(15) = {s1ab_r2z_mean_err}; + lug_val(16) = {field_map_2015}; + lug_val(17) = {field_map_2015_staterr}; + lug_val(18) = {field_map_2014}; + lug_val(19) = {field_map_2014_staterr}; + lug_val(20) = {mean_field_map}; + lug_val(21) = {field_map_syserr}; + lug_val(22) = {mean_field_map_totalerr}; + + Image_paths = {strcat('LUX_corrections/',file_id_cp,'/s1a_r2z_fig',file_id_cp,'.jpg'), strcat('LUX_corrections/',file_id_cp,'/s1b_r2z_fig',file_id_cp,'.jpg')... + ,strcat('LUX_corrections/',file_id_cp,'/s1ab_r2z_fig',file_id_cp,'.jpg'),strcat('LUX_corrections/',file_id_cp,'/field_r2z_fig',file_id_cp,'.jpg')... + ,strcat('LUX_corrections/',file_id_cp,'/field_frac_error_r2z_fig',file_id_cp,'.jpg')}; + + xmlinput.iq.global.filename_prefix = lug_val(1); + xmlinput.iq.global.computed_by = lug_val(2); + xmlinput.iq.global.computed_date = datestr(now,'yyyymmddTHHMM'); + xmlinput.iq.global.source = source; + xmlinput.iq.global.source_id = 'unknown'; + xmlinput.iq.global.notes = ' '; + xmlinput.iq.global.algorithm_name = lug_val(3); + xmlinput.iq.global.algorithm_version = lug_val(4); + xmlinput.iq.global.cp_number = lug_val(5); + xmlinput.iq.global.gs_number = lug_val(6); + xmlinput.iq.correction.fit.number_of_kr_events = lug_val(7); + xmlinput.iq.correction.fit.s1ab_r2bins = lug_val(8); + xmlinput.iq.correction.fit.s1ab_zbins = lug_val(9); + xmlinput.iq.correction.fit.s1a_r2z_mean = lug_val(10); + xmlinput.iq.correction.fit.s1a_r2z_mean_err = lug_val(11); + xmlinput.iq.correction.fit.s1b_r2z_mean = lug_val(12); + xmlinput.iq.correction.fit.s1b_r2z_mean_err = lug_val(13); + xmlinput.iq.correction.fit.s1ab_r2z_mean = lug_val(14); + xmlinput.iq.correction.fit.s1ab_r2z_mean_err = lug_val(15); + xmlinput.iq.correction.fit.field_map_2015 = lug_val(16); + xmlinput.iq.correction.fit.field_map_2015_staterr = lug_val(17); + xmlinput.iq.correction.fit.field_map_2014 = lug_val(18); + xmlinput.iq.correction.fit.field_map_2014_staterr = lug_val(19); + xmlinput.iq.correction.fit.mean_field_map = lug_val(20); + xmlinput.iq.correction.fit.field_map_syserr = lug_val(21); + xmlinput.iq.correction.fit.mean_field_map_totalerr = lug_val(22); + + + LUXSubmitIQ(user,'S1ab_Field',algorithm_name,version,file_id,cp,xmlinput,'Kr83 Calibration','',Image_paths); + + clear lug_val Image_paths xmlinput + +end + +clear; + +fprintf('KrypCal Finished \n'); + +end + diff --git a/CodeForLUX/Matlab/MyFunctions/EstimateField.m b/CodeForLUX/Matlab/MyFunctions/EstimateField.m new file mode 100644 index 0000000..4994b22 --- /dev/null +++ b/CodeForLUX/Matlab/MyFunctions/EstimateField.m @@ -0,0 +1,97 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Purpose: +% This function takes s2radius and s2drift inputs in the form of 1D vectors. It +% uses Scott Hertel's field simulation to determine the field at the location of each data point. +% The output of this function is a 1D vector of the same length of the original data which +% has corresponding field values for each data point in the units of V/cm. +% +% We use a cubic interpolation of Scott's map within the bounds of his simulated data +% and use a nearest neighbor interpolation outside of the bounds. The bounds are defined by +% fitting a spline to a rvZ scatterplot in the simulated data, with the additional constraint +% that any simulated data with drift_time<20 uSec is thrown out since the simualtion seems +% inaccurate in that region. Additionally, any real data that has radius < 1 cm is +% considered to be outside of the simulation bounds, since a cubic interpolation fails in that region +% despite the data being within the simulation bounds. +% +% Inputs: +% - s2radius - 1xN Event radii after golden selection +% - s2drift - 1xN Event drift times after golden selection +% - year - A string defining which of Scott's simulations to use. ('2014' or '2015) +% +% Outputs: +% - FieldValues - 1xN Estimated field values in the vicinity of each event +% +% Author: +% - Richard Knoche +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function [ FieldValues ] = EstimateField( s2radius, s2drift, year ) + +%% Load simualted field data from Scott + +switch(year) + case '2014' + load('C:\Program Files\MATLAB\R2012a\bin\Run04_ERBand\Kr2p22\sep2014_field_map.mat'); + case '2015' + load('C:\Program Files\MATLAB\R2012a\bin\Run04_ERBand\Kr2p22\sep2015_field_map.mat') +end + + +%% Clean up simulated field data + +%reshape the data +sim_radius = reshape(sep2014_field_map.r_end_cm,1,size(sep2014_field_map.r_end_cm,1)*size(sep2014_field_map.r_end_cm,2)); +sim_drift = reshape(sep2014_field_map.t_end_us,1,size(sep2014_field_map.t_end_us,1)*size(sep2014_field_map.t_end_us,2)); +sim_field = reshape(sep2014_field_map.E_start_Vcm,1,size(sep2014_field_map.E_start_Vcm,1)*size(sep2014_field_map.E_start_Vcm,2)); + +% Remove NaN from simulated field data +nan_cut = (~isnan(sim_radius) & ~isnan(sim_drift) & ~isnan(sim_field)); +sim_radius = sim_radius(nan_cut); +sim_drift = sim_drift(nan_cut); +sim_field = sim_field(nan_cut); + +%% Make a 2D map of the field, with radius_bin and drift_bin vectors + +% Can use griddata to interpolate the Field Map, but it doesn't work well for points outside the boundary +% Instead, we first find the boundary, use nearest neighbor interp outside of it, and cubic interp inside of it + +%Finds the boundary of the radius, drift_time scatter plot +clear r_center max_z +i = 1; +r_step = 0.5; + +for r_max=[0.45:r_step:25]; + r_center(i) = mean(sim_radius(inrange(sim_radius,[r_max-r_step,r_max]))); %#ok + max_z(i) = max(sim_drift(inrange(sim_radius,[r_max-r_step,r_max]))); %#ok + i=i+1; +end + +%Construct the boundary from a spline fit to the maximum values found above +boundary_spline = csapi(r_center,max_z); + +%Evaluates if data is inside or outside the boundary +data_boundary = fnval(boundary_spline, s2radius); + +%A cut that is one in inside, zero if outside. Has extra specifications to avoid bad simulation data at low drift and radius +data_inside_bound = (s2drift<=data_boundary & s2drift>=20 & s2radius>=1); + +%To get field value for the data, first split into inside/outside bound data vectors +data_inbound_radius = s2radius(data_inside_bound); +data_inbound_drift = s2drift(data_inside_bound); +data_outbound_radius = s2radius(~data_inside_bound); +data_outbound_drift = s2drift(~data_inside_bound); + +%Interpolate: outside bound use nearest neighbor, inside bound use cubic +field_inbound_value = griddata(sim_drift,sim_radius,sim_field,data_inbound_drift,data_inbound_radius,'cubic'); + +%only uses nearest for sim_drift>=20 uSec to avoid problem at low drift in sim +field_outbound_value = griddata(sim_drift(sim_drift>=20),sim_radius(sim_drift>=20),sim_field(sim_drift>=20),data_outbound_drift,data_outbound_radius,'nearest'); + +%Patch inbound and outbound field values together +FieldValues = zeros(length(field_inbound_value)+length(field_outbound_value),1); +FieldValues(data_inside_bound) = field_inbound_value; +FieldValues(~data_inside_bound) = field_outbound_value; + +end diff --git a/CodeForLUX/Matlab/MyFunctions/GetGoldenCuts.m b/CodeForLUX/Matlab/MyFunctions/GetGoldenCuts.m new file mode 100644 index 0000000..23fe148 --- /dev/null +++ b/CodeForLUX/Matlab/MyFunctions/GetGoldenCuts.m @@ -0,0 +1,53 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Purpose: +% This function produces golden event selection cuts between S1 and S2 area bounds +% +% Inputs: +% - d - the data structure to be analysed. +% - s1area_bound_min - Minimum S1 size +% - s1area_bound_max - Maximum S1 size +% - s2area_bound_min - Minimum S2 size +% - s2area_bound_max - Maximum S2 size +% +% Outputs: +% - s1_single_cut -Golden event cut for S1 pulses +% - s2_single_cut - Golden event cut for S2 pulses +% +% Author: +% - Richard Knoche +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function [ s1_single_cut, s2_single_cut ] = GetGoldenCuts( d, s1area_bound_min, s1area_bound_max, s2area_bound_min, s2area_bound_max ) + +%Pulse area cuts +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); + +%Pulse classification cuts (S2 cut is defined above 100 phe, and paired with an s1) +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts + +%Golden cut defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe +%Note there can be multiple S1s in the golden event +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event + +%Combine area cuts and golden cuts +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds + +%Require that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; + +%Final event selection cuts +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + +end + diff --git a/CodeForLUX/Matlab/MyFunctions/GetS1aS1bCuts.m b/CodeForLUX/Matlab/MyFunctions/GetS1aS1bCuts.m new file mode 100644 index 0000000..811bff3 --- /dev/null +++ b/CodeForLUX/Matlab/MyFunctions/GetS1aS1bCuts.m @@ -0,0 +1,33 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Purpose: +% This function produces golden event selection cuts for Kr S1a and S1b pulses +% +% Inputs: +% - d - the data structure to be analysed. +% - s1_single_cut - Golden event cut for merged Kr S1 pulses +% - s2_single_cut - Golden event cut for merged Kr S2 pulses +% +% Outputs: +% - s1ab_cut - Golden event cut for S1a and S1b pulses +% +% Author: +% - Richard Knoche +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function [ s1ab_cut ] = GetS1aS1bCuts(d, s1_single_cut, s2_single_cut) + +%Make timing variables +s1ab_timing = d.Kr83fit_dt_samples; + +%Set up cuts +s1ab_golden_cut = logical(sum(s1_single_cut(:,:),1)); +s1ab_pulsearea_cut = d.Kr83fit_s1b_area_phe > 30; +s1ab_timing_cut = s1ab_timing > 13; +s1ab_radius_cut_temp = (sqrt(d.x_cm.^2 + d.y_cm.^2) < 25) & s2_single_cut; +s1ab_radius_cut = logical(sum(s1ab_radius_cut_temp(:,:),1)); +s1ab_cut = s1ab_golden_cut & s1ab_timing_cut & s1ab_pulsearea_cut & s1ab_radius_cut; + +end + diff --git a/CodeForLUX/Matlab/MyFunctions/GetS1aS1bFiducialCuts.m b/CodeForLUX/Matlab/MyFunctions/GetS1aS1bFiducialCuts.m new file mode 100644 index 0000000..24a836d --- /dev/null +++ b/CodeForLUX/Matlab/MyFunctions/GetS1aS1bFiducialCuts.m @@ -0,0 +1,46 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Purpose: +% This function produces fiducial volume cuts for Kr S1a and S1b pulses +% +% Inputs: +% - s1ab_z - S1a/S1b z coordinates after golden cut is applied +% - s2radius - S1a/S1b radius coordinates after golden cut is applied +% +% Outputs: +% - s1ab_z_cut - Fidiucal cut for making XY dependence maps with S1a/S1b +% - s1ab_r_cut - Fidiucal cut for making Z dependence maps with S1a/S1b +% - s1ab_z_cut_upper - Upper limit on S1a/S1b drift time histogram +% +% Author: +% - Richard Knoche +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function [ s1ab_z_cut, s1ab_r_cut, s1ab_z_cut_upper ] = GetS1aS1bFiducialCuts(s1ab_z, s1ab_radius) + +%Additional Z cut for s1ab_xy measurement +s1ab_z_hist_binning = (0:1:400); %Drift time range +s1ab_z_hist_cut = inrange(s1ab_z,[0,400]); +[s1ab_z_hist s1ab_z_hist_bins] = hist(s1ab_z(s1ab_z_hist_cut),s1ab_z_hist_binning); +frac_hist = cumsum(s1ab_z_hist)./sum(s1ab_z_hist); +s1ab_z_cut_lower = min(s1ab_z_hist_bins(frac_hist>.10)); +s1ab_z_cut_upper = max(s1ab_z_hist_bins(frac_hist<.90)); +s1ab_z_cut = inrange(s1ab_z,[s1ab_z_cut_lower,s1ab_z_cut_upper]); + +%Additional radius cut for s1ab_Z measurement +s1ab_r_hist_binning = (0:1:26); +s1ab_r_upperhist_cut = (s1ab_z>s1ab_z_cut_upper & s1ab_radius<=26); +s1ab_r_lowerhist_cut = (s1ab_z 100*10; %Cut is based on timing after S1 + + %Final cut must be between the Kr S1 and S2, and meet the cuts above + SE_good_cut =logical( cut_se_s1_z & s4_class & ( cumsum(s1_single_cut)-cumsum(s2_single_cut) ) ); + +end + diff --git a/CodeForLUX/Matlab/MyFunctions/KrypCal_S1_3D.m b/CodeForLUX/Matlab/MyFunctions/KrypCal_S1_3D.m new file mode 100644 index 0000000..da6380f --- /dev/null +++ b/CodeForLUX/Matlab/MyFunctions/KrypCal_S1_3D.m @@ -0,0 +1,341 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Purpose: +% This function produces XYZ dependence maps of the S1 signal and directly submits +% the result to the LUG. +% +% Inputs: +% - s1_phe_both - S1 pulse areas (with both arrays) after golden selection +% - s1_phe_bottom - S1 pulse areas (with bottom arrays) after golden selection +% - s2_phe_both - S2 pulse areas (with both arrays) after golden selection +% - s2x - X coordinate of the pulses +% - s2y - Y coordinate of the pulses +% - drift_time - Z coordinate of the pulses +% - x_center - X coordinate of the detector center +% - y_center - Y coordinate of the detector center +% - z_center - Z coordinate of the detector center +% - det_edge - Edge of the drift time histogram +% - user_name - User name for the LUG submission +% - file_id_cp - Dateset name with cp number +% - dp_version - Version of KrypCal for LUG submission +% - algorithm_name - Algorithm name from KrypCal +% - submit - Option to submit to LUG (1 to submit, 0 not to) +% +% Outputs: +% - lug_val - Cell with information for LUG entries +% +% Author: +% - Attila Dobi, cleaned up by Richard Knoche +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +function [lug_val] = KrypCal_S1_3D(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_time,... + x_center,y_center,z_center,det_edge, user_name,file_id_cp,dp_version, algorithm_name, submit) + + %Set Up Variables + s2_cut = inrange(s2_phe_both,[200 70000]); %cut on appropriate S2 size + s1 = s1_phe_both(s2_cut); %No Corrections. Use Bottom, Top or Both PMT. + s1_bottom = s1_phe_bottom(s2_cut); + xc = s2x(s2_cut); + yc = s2y(s2_cut); + dT = drift_time(s2_cut); + Kr_events = length(s1); + bin = 5; + x = 40:bin:500; %Set up S1 energy bins + x = x'; + cut_fit = x>50 & x<490; %remove bin edges + xy_step = 3; % 3 cm bins + r_max = 25; % max radius + z_step = ceil( (0.95*det_edge-10)/15 ); %xy_step size about = 30 mm, to create 16 z bins + s1zbins = floor(10):z_step:floor(10)+z_step*15; %20 us + + %Preallocate memory + Count_S1_3D = zeros(16,16,16); + Count_S1_3D_bottom = zeros(16,16,16); + Mean_S1_3D_both = zeros(16,16,16); + Mean_S1_3D_bottom = zeros(16,16,16); + Sigma_S1_3D_both = zeros(16,16,16); + Sigma_S1_3D_bottom = zeros(16,16,16); + + %% Calculate the 3D map for both and bottom PMT arrays + for k = s1zbins; % out to 485 mm % start at about 20 mm bin center. xy_steps of 30 mm + tic; + for i = (-r_max+xy_step):xy_step:r_max %map to rows going down (y_cm) + for j = (-r_max+xy_step):xy_step:r_max %map columns across (x_cm) + + % Calculate map for Both PMT arrays + + %Matrix indicies + l = int8(i/xy_step+(r_max)/xy_step); %real y + m = int8(j/xy_step+(r_max)/xy_step); % real x + n =(k-floor(10))/z_step + 1; + + %Select events within the voxel + q = xc(j-xy_step) & yc(i-xy_step) & inrange(dT,[(k-z_step/2) , (k+z_step/2)]); %no 0th element! + + %Histogram of data in the voxel + hist_q = hist(s1(q) ,x)'/bin; + hist_q_bottom = hist(s1_bottom(q) ,x)'/bin; + + %memory clean up. Improve speed by cutting down the size of S1 + s1 = s1(~q); + s1_bottom = s1_bottom(~q); + xc = xc(~q); + yc = yc(~q); + dT = dT(~q); + clear 'q'; + + %Count the number of events per bin + Count_S1_3D(l,m,n) = sum(hist_q)*bin; + Count_S1_3D_bottom(l,m,n) = sum(hist_q_bottom)*bin; + + %If there are enough events, fill in the map entry for the voxel + %Note, X,Y indicies intentionally swapped due to how interp3D works + if (Count_S1_3D(l,m,n) >= 50) % at least 50 counts before fitting. + + yqfit = hist_q; + amp_start = max(yqfit(cut_fit)); + mean_start = sum(yqfit(cut_fit).*x(cut_fit))/sum(yqfit(cut_fit)); + sigma_start = std(yqfit(cut_fit).*x(cut_fit)); + Fit_q = fit(x(cut_fit),yqfit(cut_fit),'gauss1','start',[amp_start mean_start sigma_start]); + + %Peak location (mean) + Mean_S1_3D_both(l,m,n) = Fit_q.b1; + + %1-sigma of peak position + Sig_b = Fit_q.c1/sqrt(2)/sqrt(Count_S1_3D(l,m,n)); + + + %error checking + if(strcmp(num2str(Sig_b),'NaN')) + Mean_S1_3D_both(l,m,n) = 0; + Sig_b = 0; + end + + %uncertainty in mean + Sigma_S1_3D_both(l,m,n) = Sig_b; + + else %not enough stats to do the fit + Mean_S1_3D_both(l,m,n) = 0; + Sigma_S1_3D_both(l,m,n) = 0; + end + + %% Calculate map for bottom PMT array + + clear yqfit Sig_b + + if (Count_S1_3D_bottom(l,m,n) >= 50) % at least 10 counts before fitting. + + yqfit_bottom = hist_q_bottom; + amp_start = max(yqfit_bottom(cut_fit)); + mean_start = sum( yqfit_bottom(cut_fit).*x(cut_fit))/sum( yqfit_bottom(cut_fit)); + sigma_start = std( yqfit_bottom(cut_fit).*x(cut_fit)); + Fit_q_bottom = fit(x(cut_fit),yqfit_bottom(cut_fit),'gauss1','start',[amp_start mean_start sigma_start]); + + %Peak location (mean) + Mean_S1_3D_bottom(l,m,n) = Fit_q_bottom.b1; + + %1-sigma of peak position + Sig_b = Fit_q_bottom.c1/sqrt(2)/sqrt(Count_S1_3D_bottom(l,m,n)); + + + %error checking + if(strcmp(num2str(Sig_b),'NaN')) + Mean_S1_3D_bottom(l,m,n)= 0; + Sig_b = 0; + end + + %uncertainty in mean + Sigma_S1_3D_bottom(l,m,n)= Sig_b; + + else %not enough stats to do the fit + Mean_S1_3D_bottom(l,m,n) = 0; + Sigma_S1_3D_bottom(l,m,n)= 0; + + end + + end + end + toc; + k %#ok + end + + s1xbins = -r_max+xy_step/2:xy_step:r_max-xy_step/2; + s1ybins = -r_max+xy_step/2:xy_step:r_max-xy_step/2; + + %get the correction for the top PMT array by taking Both-Bottom + Mean_S1_3D_top = Mean_S1_3D_both-Mean_S1_3D_bottom; + Sigma_S1_3D_top = sqrt(Sigma_S1_3D_both.^2+Sigma_S1_3D_bottom.^2); + + %% S1 3D correction. Both PMT + center_phe_both_xyz = interp3(s1xbins,s1ybins,s1zbins,Mean_S1_3D_both,x_center,y_center,z_center,'cubic');%Normalize to the center + norm_s1_both_xyz = center_phe_both_xyz./Mean_S1_3D_both; %Normalize to center + norm_s1_both_xyz(isinf(norm_s1_both_xyz)) = 1; + norm_s1_both_xyz(isnan(norm_s1_both_xyz)) = 1; + + %Get 1 sigma of the corrections matrix. + sigma_center_phe_both_xyz = interp3(s1xbins,s1ybins,s1zbins,Sigma_S1_3D_both,x_center,y_center,z_center,'cubic');%Normalize to the center + sigma_norm_s1_both_xyz = sqrt((sigma_center_phe_both_xyz./Mean_S1_3D_both).^2+(Sigma_S1_3D_both.*center_phe_both_xyz./Mean_S1_3D_both.^2).^2); + sigma_norm_s1_both_xyz(isinf(sigma_norm_s1_both_xyz)) = 1;%no infinity. Set Sigma=1, which is 100% uncertainty + sigma_norm_s1_both_xyz(isnan(sigma_norm_s1_both_xyz)) = 1; + + mean_center_3D_both = interp3(s1xbins,s1ybins,s1zbins,Mean_S1_3D_both,x_center,y_center,z_center,'cubic'); + sigma_mean_center_3D_both = interp3(s1xbins,s1ybins,s1zbins,Sigma_S1_3D_both,x_center,y_center,z_center,'cubic'); + + %to Apply the correction use the following. + %s1_phe_both_xyz=s1_phe_both.*interp3(xx,yy,zz,norm_s1_both_xyz,s2x,s2y,drift_time,'cubic'); + + %% S1 3D correction. Bottom PMT + center_phe_bottom_xyz = interp3(s1xbins,s1ybins,s1zbins,Mean_S1_3D_bottom,x_center,y_center,z_center,'cubic');%Normalize to the center + norm_s1_bottom_xyz = center_phe_bottom_xyz./Mean_S1_3D_bottom; %Normalize to center + norm_s1_bottom_xyz(isinf(norm_s1_bottom_xyz)) = 1; + norm_s1_bottom_xyz(isnan(norm_s1_bottom_xyz)) = 1; + + %Get 1 sigma of the corrections matrix. + sigma_center_phe_bottom_xyz = interp3(s1xbins,s1ybins,s1zbins,Sigma_S1_3D_bottom,x_center,y_center,z_center,'cubic');%Normalize to the center + sigma_norm_s1_bottom_xyz = sqrt((sigma_center_phe_bottom_xyz./Mean_S1_3D_bottom).^2+(Sigma_S1_3D_bottom.*center_phe_bottom_xyz./Mean_S1_3D_bottom.^2).^2); + sigma_norm_s1_bottom_xyz(isinf(sigma_norm_s1_bottom_xyz)) = 1;%no infinity. Set Sigma=1, which is 100% uncertainty + sigma_norm_s1_bottom_xyz(isnan(sigma_norm_s1_bottom_xyz)) = 1; + + mean_center_3D_bottom = interp3(s1xbins,s1ybins,s1zbins,Mean_S1_3D_bottom,x_center,y_center,z_center,'cubic'); + sigma_mean_center_3D_bottom = interp3(s1xbins,s1ybins,s1zbins,Sigma_S1_3D_bottom,x_center,y_center,z_center,'cubic'); + + %to Apply the correction use the following. + %s1_phe_bottom_xyz=s1_phe_bottom.*interp3(xx,yy,zz,norm_s1_bottom_xyz,s2x,s2y,drift_time,'cubic'); + + %% S1 3D correction. Top PMT + center_phe_top_xyz = interp3(s1xbins,s1ybins,s1zbins,Mean_S1_3D_top,x_center,y_center,z_center,'cubic');%Normalize to the center + norm_s1_top_xyz = center_phe_top_xyz./Mean_S1_3D_top; %Normalize to center + norm_s1_top_xyz(isinf(norm_s1_top_xyz)) = 1; + norm_s1_top_xyz(isnan(norm_s1_top_xyz)) = 1; + + %Get 1 sigma of the corrections matrix. + sigma_center_phe_top_xyz = interp3(s1xbins,s1ybins,s1zbins,Sigma_S1_3D_top,x_center,y_center,z_center,'cubic');%Normalize to the center + sigma_norm_s1_top_xyz = sqrt((sigma_center_phe_top_xyz./Mean_S1_3D_top).^2+(Sigma_S1_3D_top.*center_phe_top_xyz./Mean_S1_3D_top.^2).^2); + sigma_norm_s1_top_xyz(isinf(sigma_norm_s1_top_xyz)) = 1;%no infinity. Set Sigma=1, which is 100% uncertainty + sigma_norm_s1_top_xyz(isnan(sigma_norm_s1_top_xyz)) = 1; + + mean_center_3D_top = interp3(s1xbins,s1ybins,s1zbins,Mean_S1_3D_top,x_center,y_center,z_center,'cubic'); + sigma_mean_center_3D_top = interp3(s1xbins,s1ybins,s1zbins,Sigma_S1_3D_top,x_center,y_center,z_center,'cubic'); + + %to Apply the correction use the following. + %s1_phe_top_xyz=s1_phe_top.*interp3(xx,yy,zz,norm_s1_top_xyz,s2x,s2y,drift_time,'cubic'); + + %% s1 3d xyz gauss fit + + s1_phe_both_xyz = s1_phe_both.*interp3(s1xbins,s1ybins,s1zbins,norm_s1_both_xyz,s2x,s2y,drift_time,'cubic',1); + s1_phe_both_xyz3D_gauss_fit_binning = (0:10:1000); + s1_phe_both_xyz3D_gauss_fit_cut = inrange(s1_phe_both_xyz,[0 1000]); + s1_phe_both_xyz3D_gauss_fit = fit(s1_phe_both_xyz3D_gauss_fit_binning.',hist(s1_phe_both_xyz(s1_phe_both_xyz3D_gauss_fit_cut),s1_phe_both_xyz3D_gauss_fit_binning).','gauss1'); + s1_phe_both_xyz3D_gauss_fit_mean = s1_phe_both_xyz3D_gauss_fit.b1; + s1_phe_both_xyz3D_gauss_fit_sigma = s1_phe_both_xyz3D_gauss_fit.c1/sqrt(2); + s1_phe_both_xyz3D_gauss_fit_confint = confint(s1_phe_both_xyz3D_gauss_fit,0.68); + s1_phe_both_xyz3D_gauss_fit_mean_error = abs(s1_phe_both_xyz3D_gauss_fit_confint(1,2)-s1_phe_both_xyz3D_gauss_fit_mean); + s1_phe_both_xyz3D_gauss_fit_sigma_error = abs(s1_phe_both_xyz3D_gauss_fit_confint(1,3)/sqrt(2) - s1_phe_both_xyz3D_gauss_fit_sigma); + + %% Save The data + save(strcat('LUX_corrections/',file_id_cp,'/',file_id_cp,'_3D_IQs'),'norm_s1_both_xyz','norm_s1_bottom_xyz','norm_s1_top_xyz', 'sigma_norm_s1_both_xyz'... + ,'sigma_norm_s1_bottom_xyz','sigma_norm_s1_top_xyz','s1xbins','s1ybins','s1zbins'... + ,'Count_S1_3D', 'Count_S1_3D_bottom', 'Mean_S1_3D_both', 'Mean_S1_3D_bottom', 'Mean_S1_3D_top', 'Sigma_S1_3D_both', 'Sigma_S1_3D_bottom', 'Sigma_S1_3D_top'... + ,'mean_center_3D_both','sigma_mean_center_3D_both','mean_center_3D_bottom','sigma_mean_center_3D_bottom','mean_center_3D_top','sigma_mean_center_3D_top','det_edge'... + ,'s1_phe_both_xyz3D_gauss_fit_mean','s1_phe_both_xyz3D_gauss_fit_sigma','s1_phe_both_xyz3D_gauss_fit_mean_error','s1_phe_both_xyz3D_gauss_fit_sigma_error'); + + %% Submit IQ to LUG + + if submit == 1 + + user = user_name; + source = 'Kr-83'; + file_id = file_id_cp(1:19); + cp = file_id_cp(23:27); + + + % Querying the CP uning the cp numbers from the IQ entries to get the gs numbers and so see if the alternate Chain is being used + query_str = ['select * from lug_complete_process_record where cp="' cp '" ;' ]; + data2 = MySQLQuery_UMD(query_str,'read'); + if str2num(cp) == data2.cp %#ok + gs = data2.gs; + end + + + version=dp_version; + clear lug_val Image_paths xmlinput + + lug_val(1) = {file_id}; + lug_val(2) = {cp}; %Proccessing version number + lug_val(3) = {gs}; + lug_val(4) = {user}; + lug_val(5) = {algorithm_name}; + lug_val(6) = {version}; + lug_val(7) = {Kr_events}; %total count + lug_val(8) = {s1xbins}; + lug_val(9) = {s1ybins}; + lug_val(10) = {s1zbins}; + lug_val(11) = {norm_s1_both_xyz}; %Normalization Matrix + lug_val(12) = {sigma_norm_s1_both_xyz}; %1 sigma normalization matric + lug_val(13) = {norm_s1_bottom_xyz}; %Normalization Matrix + lug_val(14) = {sigma_norm_s1_bottom_xyz};%1 sigma of the normalization matrix + lug_val(15) = {norm_s1_top_xyz}; %Normalization Matrix + lug_val(16) = {sigma_norm_s1_top_xyz}; %1 sigma of the normalization matrix + lug_val(17) = {mean_center_3D_both}; %Phe Mean matrix + lug_val(18) = {sigma_mean_center_3D_both}; + lug_val(19) = {mean_center_3D_bottom}; + lug_val(20) = {sigma_mean_center_3D_bottom}; + lug_val(21) = {mean_center_3D_top}; + lug_val(22) = {sigma_mean_center_3D_top}; + lug_val(23) = {Count_S1_3D}; %Count in each bin + lug_val(24) = {det_edge}; + lug_val(25) = {x_center}; + lug_val(26) = {y_center}; + lug_val(27) = {z_center}; + lug_val(28) = {s1_phe_both_xyz3D_gauss_fit_mean}; + lug_val(29) = {s1_phe_both_xyz3D_gauss_fit_sigma}; + lug_val(30) = {s1_phe_both_xyz3D_gauss_fit_mean_error}; + lug_val(31) = {s1_phe_both_xyz3D_gauss_fit_sigma_error}; + + xmlinput.iq.global.filename_prefix = lug_val(1); + xmlinput.iq.global.cp_number = lug_val(2); + xmlinput.iq.global.gs_number = lug_val(3); + xmlinput.iq.global.computed_by = lug_val(4); + xmlinput.iq.global.computed_date = datestr(now,'yyyymmddTHHMM'); + xmlinput.iq.global.source = source; + xmlinput.iq.global.source_id = 'unknown'; + xmlinput.iq.global.notes = ' '; + xmlinput.iq.global.algorithm_name = lug_val(5); + xmlinput.iq.global.algorithm_version = lug_val(6); + xmlinput.iq.correction.fit.number_of_kr_events= lug_val(7); + xmlinput.iq.correction.fit.x_bin_center = lug_val(8); + xmlinput.iq.correction.fit.y_bin_center = lug_val(9); + xmlinput.iq.correction.fit.z_bin_center = lug_val(10); + xmlinput.iq.correction.fit.norm_s1_both_xyz = lug_val(11); + xmlinput.iq.correction.fit.sigma_norm_s1_both_xyz = lug_val(12); + xmlinput.iq.correction.fit.norm_s1_bottom_xyz = lug_val(13); + xmlinput.iq.correction.fit.sigma_norm_s1_bottom_xyz = lug_val(14); + xmlinput.iq.correction.fit.norm_s1_top_xyz = lug_val(15); + xmlinput.iq.correction.fit.sigma_norm_s1_top_xyz = lug_val(16); + xmlinput.iq.correction.fit.mean_center_both_xyz = lug_val(17); + xmlinput.iq.correction.fit.sigma_mean_center_both_xyz = lug_val(18); + xmlinput.iq.correction.fit.mean_center_bottom_xyz = lug_val(19); + xmlinput.iq.correction.fit.sigma_mean_center_bottom_xyz = lug_val(20); + xmlinput.iq.correction.fit.mean_center_top_xyz = lug_val(21); + xmlinput.iq.correction.fit.sigma_mean_center_top_xyz = lug_val(22); + xmlinput.iq.correction.fit.count_s1_both_xyz = lug_val(23); + xmlinput.iq.correction.fit.detector_edge = lug_val(24); + xmlinput.iq.correction.fit.x_center = lug_val(25); + xmlinput.iq.correction.fit.y_center = lug_val(26); + xmlinput.iq.correction.fit.z_center = lug_val(27); + xmlinput.iq.correction.fit.s1_phe_both_xyz3D_gauss_fit_mean = lug_val(28); + xmlinput.iq.correction.fit.s1_phe_both_xyz3D_gauss_fit_sigma = lug_val(29); + xmlinput.iq.correction.fit.s1_phe_both_xyz3D_gauss_fit_mean_error = lug_val(30); + xmlinput.iq.correction.fit.s1_phe_both_xyz3D_gauss_fit_sigma_error = lug_val(31); + + LUXSubmitIQ(user,'s1_xyz_correction',algorithm_name,version,file_id,cp,xmlinput,'Kr83 Calibration','',''); + + clear lug_val Image_paths xmlinput + + end + + fprintf('KrypCal XYZ Finished \n'); + +end \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyFunctions/MeasurePulseAreaXYDep.m b/CodeForLUX/Matlab/MyFunctions/MeasurePulseAreaXYDep.m new file mode 100644 index 0000000..3d33119 --- /dev/null +++ b/CodeForLUX/Matlab/MyFunctions/MeasurePulseAreaXYDep.m @@ -0,0 +1,90 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Purpose: +% This function produces XY dependence maps of the given pulse area +% +% Inputs: +% - bin_min - Minimum range of the Gaussian fit histograms +% - bin_max - Maximum range of the Gaussian fit histograms +% - bin_size - Bin size of the Gaussian fit histograms +% - xbin_min - minimum value of the xbins +% - xbin_max - maximum value of the xbins +% - xbin_min - minimum value of the ybins +% - xbin_max - maximum value of the ybins +% - xy_bin_size - bin size of the xbins and ybins +% - pulse_area - Pulse area after golden event selection +% - s2x - X positions after golden event selection +% - s2y - Y position after golden event selection +% - cut - Optional cut to clean up the pulse areas (defaults to all ones if not provided) +% +% Outputs: +% - mean_both_xy - MxN matrix of pulse area means +% - Sigma_both - MxN matrix of one-sigma error on the means (NOT gaussian width) +% - Count_both - Number of events in each bin +% +% Author: +% - Richard Knoche +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function [mean_both_xy, Sigma_both, Count_both] = ... + MeasurePulseAreaXYDep(bin_min, bin_max, bin_size, xbin_min, xbin_max, ybin_min, ybin_max, xy_bin_size, pulse_area, s2x, s2y, cut) + + %Assign default cut if it is not provided by user + if (nargin < 12) + cut = logical(zeros(1,length(pulse_area)) + 1).'; + end + + %set up energy histgoram bins + x2 = bin_min:bin_size:bin_max; + x2 = x2'; + + %Preallocating Memory + mean_both_xy = zeros(floor((ybin_max-ybin_min)./xy_bin_size),floor((xbin_max-xbin_min)./xy_bin_size)); + Sigma_both = zeros(floor((ybin_max-ybin_min)./xy_bin_size),floor((xbin_max-xbin_min)./xy_bin_size)); + Count_both = zeros(floor((ybin_max-ybin_min)./xy_bin_size),floor((xbin_max-xbin_min)./xy_bin_size)); + + %Make the XY Map + for x_bin=xbin_min:xy_bin_size:(xbin_max-xy_bin_size); + for y_bin=ybin_min:xy_bin_size:(ybin_max-xy_bin_size); + x_min = x_bin; x_max = x_bin+xy_bin_size; + y_min = y_bin; y_max = y_bin+xy_bin_size; + + %Indicies for the matrix + x_count=int32(1+x_bin/xy_bin_size+xbin_max/xy_bin_size); + y_count=int32(1+y_bin/xy_bin_size+ybin_max/xy_bin_size); + + %Select events in the XY bin + bin_cut = inrange(s2x,[x_min,x_max]) & inrange(s2y,[y_min,y_max]) & cut; + + hist_bin = hist(pulse_area(bin_cut) ,x2)'/bin_size; + Count_both(y_count,x_count)=sum(hist_bin)*bin_size; % X and Y flip ... because MATLAB + + %If there are enough events, make the map entry. Otherwise fill the map with zero + %X and Y indicies swapped intentionally, due to how interp2D works + if Count_both(y_count,x_count)>350; + + %Fit a Gaussian to the data + Fit_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); + mean_both_xy(y_count,x_count)=Fit_both_xy.b1; + Sig_b=Fit_both_xy.c1/sqrt(2)/sqrt(Count_both(y_count,x_count)); + + %Fit error checking + if(isnan(Sig_b)) + mean_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_both(y_count,x_count)=Sig_b; + + end + end + end + + + mean_both_xy(isnan(mean_both_xy)) = 0; + + +end + diff --git a/CodeForLUX/Matlab/MyFunctions/MeasurePulseAreaZDep.m b/CodeForLUX/Matlab/MyFunctions/MeasurePulseAreaZDep.m new file mode 100644 index 0000000..bbf8855 --- /dev/null +++ b/CodeForLUX/Matlab/MyFunctions/MeasurePulseAreaZDep.m @@ -0,0 +1,79 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Purpose: +% This function measures the Z dependence of a pulse area RQ +% +% Inputs: +% - bin_min - Minimum of the histograms used during Gaussian fitting +% - bin_max - Maximum of the histograms used during Gaussian fitting +% - bin_size - Bin width of the histograms used during Gaussian fitting +% - pulse_area - Pulse areas to be fit +% - drift_time - Drift time of the pulse areas +% - cut - Optional cut to clean up the data (defaults to every event passing if not specified) +% +% Outputs: +% - means - 1xM vector of mean pulse areas in each drift time +% - means_error - 1xM vector of error on the mean pulse areas in each drift time +% - mean_index - 1xM vector of containing center of each drift time bin +% - Fit_both - 1xM cell containing Gaussian fits to each of the drift time bins +% - bins - total number of drift time bins +% - x - pulse area binning of the histogram used for each Gaussian fit +% - hist_both - histogram data for each of the drift time bins. +% (First index is the count in the pulse area bins, second index is the corresponding drift time bin) +% +% Author: +% - Richard Knoche +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function [means,means_error,mean_index,Fit_both, bins, x, hist_both] = MeasurePulseAreaZDep(bin_min, bin_max, bin_size, pulse_area, drift_time, det_edge, cut) + + %Assign default cut if it is not provided by user + if (nargin < 7) + cut = logical(zeros(1,length(pulse_area)) + 1).'; + end + + %set up energy bins for the gaussian fit + x = bin_min:bin_size:bin_max; + x = x'; + + %sort, incase 1xn or nx1 vector is defined. + A = sort(size(pulse_area(cut))); + + %get the number of points, adjust binning if stats are low. + evts_per_bin = 300; + max_num_bins = 65; + bins = ceil(A(2)./evts_per_bin); + if bins>max_num_bins + bins = max_num_bins; + end + bin_size = (floor(det_edge/bins*4)/4);%span up to the det_edge + + %Preallocate memory + hist_both = zeros(length(x),bins); + Fit_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + %Calculate the z-dependence of the data + for bin=1:bins + + %Select data in the bin + binStart = ((bin-1).*bin_size); + binEnd = (bin.*bin_size); + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + %Do a Gaussian fit to the bin + hist_both(:,bin) = hist(pulse_area(time_cut),x)'/bin_size; + temp_hist = hist_both(:,bin); + Fit_both{bin} = fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + %Fill in the map + means(bin) = Fit_both{bin}.b1; + means_error(bin) = Fit_both{bin}.c1/sqrt(2)/sqrt(sum(hist_both(:,bin))*bin_size); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + end + +end + diff --git a/CodeForLUX/Matlab/MyFunctions/MeasureS1aS1b3DDep.m b/CodeForLUX/Matlab/MyFunctions/MeasureS1aS1b3DDep.m new file mode 100644 index 0000000..0f28ffe --- /dev/null +++ b/CodeForLUX/Matlab/MyFunctions/MeasureS1aS1b3DDep.m @@ -0,0 +1,95 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Purpose: +% This function produces three dimensional maps of the S1a, S1b, and S1a/S1b means +% +% Inputs: +% - s1ab_x - S1a/S1b x position after golden selection +% - s1ab_y - S1a/S1b y position after golden selection +% - s1ab_z - S1a/S1b z position after golden selection +% - det_edge - Edge of the drift time histogram +% - s1a_phe_both - S1a pulse areas after golden selection +% - s1b_phe_both - S1b pulse areas after golden selection +% +% Outputs: +% - s1ab_xyz_xbins - 1xN vector defining x binning in XYZ map +% - s1ab_xyz_ybins - 1xM vector defining y binning in XYZ map +% - s1ab_xyz_zbins - 1xM vector defining z binning in XYZ map +% - s1a_xyz_mean - MxNxS matrix of S1a means +% - s1a_xyz_mean_err - MxNxS matrix of S1a mean errors +% - s1b_xyz_mean - MxNxS matrix of S1b means +% - s1b_xyz_mean_err - MxNxS matrix of S1b mean errors +% - s1ab_xyz_mean - MxNxS matrix of S1a/S1b means +% - s1ab_xyz_mean_err - MxNxS matrix of S1a/S1b mean errors +% +% Author: +% - Richard Knoche +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function [s1ab_xyz_xbins, s1ab_xyz_ybins, s1ab_xyz_zbins, s1a_xyz_mean, s1a_xyz_mean_err, s1b_xyz_mean, s1b_xyz_mean_err, s1ab_xyz_mean, s1ab_xyz_mean_err] = MeasureS1aS1b3DDep(s1ab_x, s1ab_y, s1ab_z, det_edge, s1a_phe_both, s1b_phe_both) + +%Define bin sizes +s1ab_xyz_numbins = floor((length(s1ab_z)/200)^(1/3)); %number of bins in one direction to get ~200 events per bin +s1ab_xyz_zstep = det_edge/s1ab_xyz_numbins; +s1ab_xyz_xstep = 50/s1ab_xyz_numbins; +s1ab_xyz_ystep = 50/s1ab_xyz_numbins; +s1ab_xyz_xmax = 25; +r_max = 25; + +%Define bins +s1ab_xyz_zbins = 10+s1ab_xyz_zstep/2:s1ab_xyz_zstep:10+s1ab_xyz_zstep/2+s1ab_xyz_zstep*s1ab_xyz_numbins; %20 us +s1ab_xyz_xbins = (-r_max+s1ab_xyz_xstep/2):s1ab_xyz_xstep:r_max; +s1ab_xyz_ybins = (-r_max+s1ab_xyz_ystep/2):s1ab_xyz_ystep:r_max; + +%Preallocate memory +s1a_xyz_mean = zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_xyz_mean_err = zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean = zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean_err = zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +Count_S1ab_3D = zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + %Indicies for the map (x,y swapped due to matrix x-row, y-column definition) + l = int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m = int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n = int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %Make a cut to select events in the bin + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + + %Count the number of events per bin + Count_S1ab_3D(l,m,n) = length(s1a_phe_both(q)); + + %Calculate the map entry if there are 100 events in the bin, otherwise set to zero + if (Count_S1ab_3D(l,m,n) >= 100) + s1a_z_hist_bins = (0:2:400); + s1a_z_hist_cut = (q.' & inrange(s1a_phe_both,[0 400])); + s1a_z_fit = fit(s1a_z_hist_bins.',hist(s1a_phe_both(s1a_z_hist_cut),s1a_z_hist_bins).','gauss1'); + s1a_xyz_mean(l,m,n) = s1a_z_fit.b1; + s1a_xyz_mean_err(l,m,n) = s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(s1a_z_hist_cut)); + + s1b_z_hist_bin = (0:2:300); + s1b_z_hist_cut = (q.' & inrange(s1b_phe_both,[0 300]) ); + s1b_z_fit = fit(s1b_z_hist_bin.',hist(s1b_phe_both(s1b_z_hist_cut),s1b_z_hist_bin).','gauss1'); + s1b_xyz_mean(l,m,n) = s1b_z_fit.b1; + s1b_xyz_mean_err(l,m,n) = s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(s1b_z_hist_cut)); + else + s1a_xyz_mean(l,m,n) = 0; + s1a_xyz_mean_err(l,m,n) = 0; + s1b_xyz_mean(l,m,n) = 0; + s1b_xyz_mean_err(l,m,n) = 0; + end + + end + end +k %#ok +end + + s1ab_xyz_mean = s1a_xyz_mean./s1b_xyz_mean; + s1ab_xyz_mean_err = sqrt( (s1b_xyz_mean_err.*s1a_xyz_mean./(s1b_xyz_mean.^2)).^2 + (s1a_xyz_mean_err./s1b_xyz_mean).^2); + +end diff --git a/CodeForLUX/Matlab/MyFunctions/MeasureS1aS1bRvZDep.m b/CodeForLUX/Matlab/MyFunctions/MeasureS1aS1bRvZDep.m new file mode 100644 index 0000000..313743d --- /dev/null +++ b/CodeForLUX/Matlab/MyFunctions/MeasureS1aS1bRvZDep.m @@ -0,0 +1,94 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Purpose: +% This function produces two dimensional R^2 v Z maps of the S1a, S1b, and S1a/S1b means +% +% Inputs: +% - s1ab_radius - S1a/S1b radius after golden selection +% - s1ab_z - S1a/S1b drift time after golden selection +% - s1a_phe_both - S1a pulse areas after golden selection +% - s1b_phe_both - S1b pulse areas after golden selection +% +% Outputs: +% - s1ab_r2bins - 1xN vector defining r^2 binning of the R^2 v Z map +% - s1ab_zbins - 1xN vector defining z binning of the R^2 v Z map +% - s1a_r2z_mean - MxN matrix of the S1a means +% - s1a_r2z_mean_err - MxN matrix of the S1a mean errors +% - s1b_r2z_mean - MxN matrix of the S1b means +% - s1b_r2z_mean_err - MxN matrix of the S1a mean errors +% - s1ab_r2z_mean - MxN matrix of the S1a/S1b means +% - s1ab_r2z_mean_err - MxN matrix of the S1a/S1b mean errors +% +% Author: +% - Richard Knoche +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function [s1ab_r2bins, s1ab_zbins, s1a_r2z_mean, s1a_r2z_mean_err, s1b_r2z_mean, s1b_r2z_mean_err, s1ab_r2z_mean, s1ab_r2z_mean_err] = MeasureS1aS1bRvZDep(s1ab_radius, s1ab_z, s1a_phe_both, s1b_phe_both) + +%Define bin edges +s1ab_r2bin_min = 0; +s1ab_r2bin_max = 25*25; +s1ab_zbin_min = 10; +s1ab_zbin_max = 330; + +%Define bin sizes (Aiming for ~300 events per bin) +s1ab_r2z_binnum = (length(s1ab_z))/300; +s1ab_r2_binnum = floor(sqrt(s1ab_r2z_binnum))-1; +s1ab_z_binnum = floor(sqrt(s1ab_r2z_binnum)); +s1ab_r2_binsize = (s1ab_r2bin_max-s1ab_r2bin_min)/s1ab_r2_binnum; +s1ab_z_binsize = (s1ab_zbin_max-s1ab_zbin_min)/s1ab_z_binnum; + +%Define bins +s1ab_r2bins = s1ab_r2bin_min+s1ab_r2_binsize/2:s1ab_r2_binsize:s1ab_r2bin_max; +s1ab_zbins = s1ab_zbin_min+s1ab_z_binsize/2:s1ab_z_binsize:s1ab_zbin_max; + +%Preallocate memory +s1a_r2z_mean = zeros(length(s1ab_zbins),length(s1ab_r2bins)); +s1b_r2z_mean = zeros(length(s1ab_zbins),length(s1ab_r2bins)); +s1a_r2z_mean_err = zeros(length(s1ab_zbins),length(s1ab_r2bins)); +s1b_r2z_mean_err = zeros(length(s1ab_zbins),length(s1ab_r2bins)); + +%Calculate the R^2vZ map +r2_counter=1; + for r2_bin_max=s1ab_r2bin_min+s1ab_r2_binsize:s1ab_r2_binsize:s1ab_r2bin_max; + z_counter=1; + for z_bin_max=s1ab_zbin_min+s1ab_z_binsize:s1ab_z_binsize:s1ab_zbin_max; + + %Cut to select events within the bin + bin_cut = s1a_phe_both>0 & s1b_phe_both>0 & inrange(s1ab_radius.^2,[r2_bin_max-s1ab_r2_binsize,r2_bin_max]).' & inrange(s1ab_z,[z_bin_max-s1ab_z_binsize,z_bin_max]).'; + + %If there are enough events, calculate the S1a and S1b means + if length(s1a_phe_both(bin_cut))>100; + clear s1a_confint s1b_confint + s1a_hist_max = 400; + s1a_r2z_hist_bins = (0:2:s1a_hist_max); + s1a_r2z_hist_cut = bin_cut & inrange(s1a_phe_both,[0 s1a_hist_max]); + s1a_r2z_fit = fit(s1a_r2z_hist_bins.',hist(s1a_phe_both(s1a_r2z_hist_cut),s1a_r2z_hist_bins).','gauss1'); + s1a_r2z_mean(z_counter,r2_counter) = s1a_r2z_fit.b1; + s1a_confint = confint(s1a_r2z_fit,0.68); + s1a_r2z_mean_err(z_counter,r2_counter) = abs(s1a_confint(1,2)-s1a_r2z_fit.b1); + + s1b_hist_max = 300; + s1b_r2z_hist_bins = (0:2:s1b_hist_max); + s1b_r2z_hist_cut = bin_cut & inrange(s1b_phe_both,[0 s1b_hist_max]); + s1b_r2z_fit = fit(s1b_r2z_hist_bins.',hist(s1b_phe_both(s1b_r2z_hist_cut),s1b_r2z_hist_bins).','gauss1'); + s1b_r2z_mean(z_counter,r2_counter) = s1b_r2z_fit.b1; + s1b_confint = confint(s1b_r2z_fit,0.68); + s1b_r2z_mean_err(z_counter,r2_counter) = abs(s1b_confint(1,2)-s1b_r2z_fit.b1); + else + s1a_r2z_mean(z_counter,r2_counter) = 0; + s1a_r2z_mean_err(z_counter,r2_counter) = 0; + s1b_r2z_mean(z_counter,r2_counter) = 0; + s1b_r2z_mean_err(z_counter,r2_counter) = 0; + end + + z_counter=z_counter+1; + end + + r2_counter=r2_counter+1; + end + s1ab_r2z_mean = s1a_r2z_mean./s1b_r2z_mean; + s1ab_r2z_mean_err = sqrt( (s1b_r2z_mean_err.*s1a_r2z_mean./(s1b_r2z_mean.^2)).^2 + (s1a_r2z_mean_err./s1b_r2z_mean).^2); + +end diff --git a/CodeForLUX/Matlab/MyFunctions/MeasureS1aS1bXYDep.m b/CodeForLUX/Matlab/MyFunctions/MeasureS1aS1bXYDep.m new file mode 100644 index 0000000..36314e0 --- /dev/null +++ b/CodeForLUX/Matlab/MyFunctions/MeasureS1aS1bXYDep.m @@ -0,0 +1,94 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Purpose: +% This function produces XY dependence maps of the S1a, S1b, and S1a/S1b means +% +% Inputs: +% - s1ab_x - S1a/S1b X coordinates after golden selection +% - s1ab_y - S1a/S1b Y coordinates after golden selection +% - s1ab_z - S1a/S1b drift time after golden selection +% - s1a_phe_both_z - Z corrected S1a pulse area after golden selection +% - s1b_phe_both_z - Z corrected S1b pulse area after golden selection +% - s1ab_z_cut - S1a/S1b drift time cut from GetS1aS1bFiducialCuts +% +% Outputs: +% - s1ab_xbins - 1xN vector defining x binning in XY map +% - s1ab_ybins - 1xM vector defining y binning in XY map +% - s1a_xy_mean - MxN matrix of S1a means +% - s1a_xy_mean_err - MxN matrix of S1a mean errors +% - s1b_xy_mean - MxN matrix of S1b means +% - s1b_xy_mean_err - MxN matrix of S1b mean errors +% - s1ab_xy_mean - MxN matrix of S1a/S1ab means +% - s1ab_xy_mean_err - MxN matrix of S1a/S1b mean errors +% +% Author: +% - Richard Knoche +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function [s1ab_xbins, s1ab_ybins, s1a_xy_mean, s1a_xy_mean_err, s1b_xy_mean, s1b_xy_mean_err, s1ab_xy_mean, s1ab_xy_mean_err] = MeasureS1aS1bXYDep(s1ab_x, s1ab_y, s1ab_z, s1a_phe_both_z, s1b_phe_both_z, s1ab_z_cut) + +%Define bounds of map +s1ab_xbin_min = -25; +s1ab_ybin_min = -25; +s1ab_xbin_max = 25; +s1ab_ybin_max = 25; +s1ab_xybinsize = sqrt((50*50)/(length(s1ab_z)/300)); +s1a_hist_bins = (0:2:400); +s1b_hist_bins = (0:2:300); + +%Set up XY bins for map +s1ab_xbins = s1ab_xbin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_xbin_max; +s1ab_ybins = s1ab_ybin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_ybin_max; + +%Preallocate memory +s1a_xy_mean = zeros(length(s1ab_xbins),length(s1ab_ybins)); +s1b_xy_mean = zeros(length(s1ab_xbins),length(s1ab_ybins)); +s1a_xy_mean_err = zeros(length(s1ab_xbins),length(s1ab_ybins)); +s1b_xy_mean_err = zeros(length(s1ab_xbins),length(s1ab_ybins)); + +%Measure S1a/S1b XY Dependence +for x_bin=s1ab_xbin_min:s1ab_xybinsize:(s1ab_xbin_max-s1ab_xybinsize/2); + for y_bin=s1ab_ybin_min:s1ab_xybinsize:(s1ab_ybin_max-s1ab_xybinsize/2); + x_min = x_bin; x_max = x_bin+s1ab_xybinsize; + y_min = y_bin; y_max = y_bin+s1ab_xybinsize; + + %Indicies for the map + x_count=int32(1+x_bin/s1ab_xybinsize+s1ab_xbin_max/s1ab_xybinsize); + y_count=int32(1+y_bin/s1ab_xybinsize+s1ab_ybin_max/s1ab_xybinsize); + + %Cut to select events in the XY bin + bin_cut = s1ab_z_cut & ... + inrange(s1ab_z,[10 330]) & ... + s1a_phe_both_z>0 & ... + s1b_phe_both_z>0 & ... + inrange(s1ab_x,[x_min,x_max]) & ... + inrange(s1ab_y,[y_min,y_max]); + + %If there are enough events, calculate the S1a and S1b mean for the bin + if length(s1a_phe_both_z(bin_cut))>100; + s1a_hist_cut = bin_cut & inrange(s1a_phe_both_z,[0 400]); + s1a_z_fit = fit(s1a_hist_bins.',hist(s1a_phe_both_z(s1a_hist_cut),s1a_hist_bins).','gauss1'); + s1a_xy_mean(y_count,x_count) = s1a_z_fit.b1; + s1a_xy_mean_err(y_count,x_count) = s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both_z(s1a_hist_cut)); + + s1b_hist_cut = bin_cut & inrange(s1b_phe_both_z,[0 300]); + s1b_z_fit = fit(s1b_hist_bins.',hist(s1b_phe_both_z(s1b_hist_cut),s1b_hist_bins).','gauss1'); + s1b_xy_mean(y_count,x_count) = s1b_z_fit.b1; + s1b_xy_mean_err(y_count,x_count) = s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both_z(s1b_hist_cut)); + else + s1a_xy_mean(y_count,x_count) = 0; + s1a_xy_mean_err(y_count,x_count) = 0; + s1b_xy_mean(y_count,x_count) = 0; + s1b_xy_mean_err(y_count,x_count) = 0; + end + + end +end + + %Calculate S1a/S1b maps from S1a and S1b maps + s1ab_xy_mean = s1a_xy_mean./s1b_xy_mean; + s1ab_xy_mean_err = sqrt( (s1b_xy_mean_err.*s1a_xy_mean./(s1b_xy_mean.^2)).^2 + (s1a_xy_mean_err./s1b_xy_mean).^2); + +end + diff --git a/CodeForLUX/Matlab/MyFunctions/MeasureS1aS1bZDep.m b/CodeForLUX/Matlab/MyFunctions/MeasureS1aS1bZDep.m new file mode 100644 index 0000000..f84ff13 --- /dev/null +++ b/CodeForLUX/Matlab/MyFunctions/MeasureS1aS1bZDep.m @@ -0,0 +1,75 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Purpose: +% This function produces Z dependence maps and polynomial fits for the S1a, S1b, and S1a/S1b means +% +% Inputs: +% - det_edge - Edge of the drift time histogram (typically 330 uSec in Run04) +% - s1ab_z - S1a/S1b drift time after golden selection +% - s1a_phe_both - S1a pulse area after golden selection +% - s1b_phe_both - S1b pulse area after golden selection +% - s1ab_r_cut - S1a/S1b radial cut from GetS1aS1bFiducialCuts +% - s1ab_z_cut_upper - Upper limit on S1a/S1b drift time histogram from GetS1aS1bFiducialCuts +% +% Outputs: +% - s1ab_bincenters - 1xN matrix of z-slice bin centers +% - s1a_z_means - 1xN matrix of S1a means +% - s1a_z_means_err - 1xN matrix of S1a mean errors +% - s1b_z_means - 1xN matrix of S1b means +% - s1b_z_means_err - 1xN matrix of S1b mean errors +% - s1ab_z_means - 1xN matrix of S1a/S1b means +% - s1ab_z_means_err - 1xN matrix of S1a/S1b mean errors +% - s1a_P - Polynomial fit to S1a z dependence +% - s1a_S - Errors of Polynomial fit to S1a z dependence +% - s1b_P - Polynomial fit to S1b z dependence +% - s1b_S - Errors of Polynomial fit to S1b z dependence +% - s1ab_P - Polynomial fit to S1a/S1b z dependence +% - s1ab_S - Errors of Polynomial fit to S1a/S1b z dependence +% +% Author: +% - Richard Knoche +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function [s1ab_bincenters, s1a_z_means, s1a_z_means_err, s1b_z_means, s1b_z_means_err, s1ab_z_means, s1ab_z_means_err, s1a_P, s1a_S, s1b_P, s1b_S, s1ab_P, s1ab_S] = MeasureS1aS1bZDep(det_edge, s1ab_z, s1a_phe_both, s1b_phe_both, s1ab_r_cut, s1ab_z_cut_upper) + +%Set up bin size for Z dependence +dT_step = det_edge/(length(s1ab_z)/300); %300 events per z bin + +%Set up variables for fitting +s1a_fit_bins = (0:2:400); +s1b_fit_bins = (0:2:300); + +%Preallocate memory +map_size = length(10+dT_step:dT_step:s1ab_z_cut_upper); +s1a_z_means = zeros(1,map_size); +s1a_z_means_err = zeros(1,map_size); +s1b_z_means = zeros(1,map_size); +s1b_z_means_err = zeros(1,map_size); +s1ab_bincenters = zeros(1,map_size); + +%Measure Z Dependence of S1a/S1b +i=1; +for z_max=10+dT_step:dT_step:s1ab_z_cut_upper; + s1a_fit_cut = (s1ab_r_cut.' & s1a_phe_both>0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'); + s1b_fit_cut = (s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'); + s1a_fit = fit(s1a_fit_bins.',hist(s1a_phe_both(s1a_fit_cut),s1a_fit_bins).','gauss1'); + s1b_fit = fit(s1b_fit_bins.',hist(s1b_phe_both(s1b_fit_cut),s1b_fit_bins).','gauss1'); + s1a_z_means(i) = s1a_fit.b1; + s1a_z_means_err(i) = s1a_fit.c1/sqrt(2)/sqrt(length(s1a_phe_both(s1a_fit_cut))); + s1b_z_means(i) = s1b_fit.b1; + s1b_z_means_err(i) = s1b_fit.c1/sqrt(2)/sqrt(length(s1b_phe_both(s1b_fit_cut))); + s1ab_bincenters(i) = z_max-dT_step/2; + i=i+1; +end + +s1ab_z_means = s1a_z_means./s1b_z_means; +s1ab_z_means_err = sqrt( (s1b_z_means_err.*s1a_z_means./(s1b_z_means.^2)).^2 + (s1a_z_means_err./s1b_z_means).^2); + +%fit polynomial to s1az and s1bz, to remove z dependence later in xy fit +[s1a_P, s1a_S] = polyfit(s1ab_bincenters,s1a_z_means,3); +[s1b_P, s1b_S] = polyfit(s1ab_bincenters,s1b_z_means,3); +[s1ab_P, s1ab_S] = polyfit(s1ab_bincenters,s1ab_z_means,2); + +end + diff --git a/CodeForLUX/Matlab/MyFunctions/MeasureS2PulseWidthXYDep.m b/CodeForLUX/Matlab/MyFunctions/MeasureS2PulseWidthXYDep.m new file mode 100644 index 0000000..1d9f7c0 --- /dev/null +++ b/CodeForLUX/Matlab/MyFunctions/MeasureS2PulseWidthXYDep.m @@ -0,0 +1,70 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Purpose: +% This function produces XY dependence maps of the S2 Pulse width +% +% Inputs: +% - s2x - X position of events after golden selection +% - s2y - Y position of events after golden selection +% - s2_width - S2 pulse width after golden selection +% - xbin_min - minimum value of the xbins +% - xbin_max - maximum value of the xbins +% - xbin_min - minimum value of the ybins +% - xbin_max - maximum value of the ybins +% - xy_bin_size - bin size of the xbins and ybins +% - cut - Optional cut to clean up the pulse areas (defaults to all ones if not provided) +% +% Outputs: +% - s2_xbins - 1xN vector defining x binning in XY map +% - s2_ybins - 1xM vector defining y binning in XY map +% - means_s2_xy_width - MxN matrix of pulse width means +% - sigma_s2_xy_width - MxN matrix of error on the pulse width means +% +% Author: +% - Richard Knoche +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function [s2_xbins, s2_ybins, means_s2_xy_width, sigma_s2_xy_width ] = MeasureS2PulseWidthXYDep(s2x, s2y, s2_width, xbin_min, xbin_max, ybin_min, ybin_max, xy_bin_size, cut) + + %Assign default cut if it is not provided by user + if (nargin < 9) + cut = logical(zeros(1,length(s2_width)) + 1).'; + end + + %Set up bins + s2_xbins = (xbin_max-xbin_min)./xy_bin_size; + s2_ybins = (ybin_max-ybin_min)./xy_bin_size; + + %Preallocate memory + means_s2_xy_width = zeros(floor(s2_ybins),floor(s2_xbins)); + sigma_s2_xy_width = zeros(floor(s2_ybins),floor(s2_xbins)); + + %Measure the XY map + for x_bin=xbin_min:xy_bin_size:(xbin_max-xy_bin_size); + for y_bin=ybin_min:xy_bin_size:(ybin_max-xy_bin_size); + x_min = x_bin; + x_max = x_bin+xy_bin_size; + y_min = y_bin; + y_max = y_bin+xy_bin_size; + + %Matrix indices + x_count = int32(1+x_bin/xy_bin_size+xbin_max/xy_bin_size); + y_count = int32(1+y_bin/xy_bin_size+ybin_max/xy_bin_size); + + %Select events in the XY bin + bin_cut = inrange(s2x,[x_min,x_max]) & inrange(s2y,[y_min,y_max]) & cut; + + %Fill in the map. Shape is non Gaussian, so just use mean. + %X and Y indices swapped intentionally due to how interp2D works + means_s2_xy_width(y_count,x_count) = mean(s2_width(bin_cut)); + sigma_s2_xy_width(y_count,x_count) = std(s2_width(bin_cut)); + end + end + + %set = 0 if NaN is returned for mean. + means_s2_xy_width(isnan(means_s2_xy_width))=0; + sigma_s2_xy_width(isnan(sigma_s2_xy_width))=0; + +end + diff --git a/CodeForLUX/Matlab/MyFunctions/MeasureS2PulseWidthZDep.m b/CodeForLUX/Matlab/MyFunctions/MeasureS2PulseWidthZDep.m new file mode 100644 index 0000000..d7dce3c --- /dev/null +++ b/CodeForLUX/Matlab/MyFunctions/MeasureS2PulseWidthZDep.m @@ -0,0 +1,69 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Purpose: +% This function produces Z dependence maps of the S2 pulse width +% +% Inputs: +% - s2_width - S2 Width RQ after golden selection +% - drift_time - Drift time after golden selection +% - det_edge - Edge of the drift time histogram +% - cut - cut to clean up events before fitting. Defaults to all events passing +% +% Outputs: +% - mean_index_s2_z_width - 1xN matrix of z-slice bin centers +% - means_s2_z_width - 1xN matrix of S2_width means +% - means_error_s2_z_width - 1xN matrix of S2_width mean errors +% - P_s2_width - Polynomial fit to S2 Width z dependence +% - sigma_P_s2_width - Errors of Polynomial fit to S2 Width z dependence +% - dT_fit - Drift time bins used in the polynomial fit +% +% Author: +% - Richard Knoche +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function [mean_index_s2_z_width, means_s2_z_width, means_error_s2_z_width, P_s2_width, sigma_P_s2_width, dT_fit] = ... + MeasureS2PulseWidthZDep(s2_width, drift_time, det_edge, cut) + + %Assign default cut if it is not provided by user + if (nargin < 4) + cut = logical(zeros(1,length(s2_width)) + 1).'; + end + + + %Sort events so they match expected input + A = sort(size(s2_width(cut))); + + %Set bin size + min_evts_per_bin = 300; + max_num_bins = 65; + bins = ceil(A(2)./min_evts_per_bin); + if bins>max_num_bins + bins = max_num_bins; + end + bin_size = (floor(det_edge/bins*4)/4); + + %Preallocate Memory + means_s2_z_width = zeros(bins,1); + means_error_s2_z_width = zeros(bins,1); + mean_index_s2_z_width = zeros(bins,1); + + %Calculate Z Dependence map + for bin=1:bins + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + %distribution vs. depth in non Gaussian, so just use the mean + means_s2_z_width(bin) = mean(s2_width(time_cut)); + means_error_s2_z_width(bin) = std(s2_width(time_cut))/sqrt(length(s2_width(time_cut))-1); % sigma/sqrt(N-1) + mean_index_s2_z_width(bin) = (binStart+binEnd)/2; + end + + %Fit polynomial to Z dependence + dT_range = inrange( mean_index_s2_z_width,[0, det_edge] ); + dT_fit = 0:1:det_edge; + [P_s2_width S] = polyfit(mean_index_s2_z_width(dT_range),means_s2_z_width(dT_range),3); + sigma_P_s2_width = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + +end + diff --git a/CodeForLUX/Matlab/MyFunctions/MeasureSESize.m b/CodeForLUX/Matlab/MyFunctions/MeasureSESize.m new file mode 100644 index 0000000..a52d3c3 --- /dev/null +++ b/CodeForLUX/Matlab/MyFunctions/MeasureSESize.m @@ -0,0 +1,60 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Purpose: +% This function fits a skew Gaussian to a single electron pulse area histogram +% +% Inputs: +% - SE_hist_binning - Binning to use in the histogram +% - SE_pulse_area - Single electron pulse areas after golden event selection +% - SE_radius - Single electron radius after golden event selection +% +% Outputs: +% - SE_mu - Single electron mean +% - SE_sig_mu - Error on single electron mean +% - SE_sig - Single electron 1-sigma width +% - SE_sig_sig - Error on 1-sigma width +% - skew - Signle electron skew +% - SE_cut - SE pulse areas after applying radial cut +% - xfit - X data for skew gaussian fit +% - yfit - Y data for skew gaussian fit +% +% Author: +% - Richard Knoche +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function [ SE_mu, SE_sig_mu, SE_sig, SE_sig_sig, skew, SE_cut, xfit, yfit ] = MeasureSESize( SE_hist_binning, SE_pulse_area, SE_radius) + + %Intial fit with Gaussian distribution + SE_max_radius = 17; %Radial cut from study on SE size change v radius + SE_fit_cut = SE_radius0) & inrange(SE_x,[x_min,x_max]) & inrange(SE_y,[y_min,y_max]); + + %If there are >60 events, calculate the map entry. Otherwise fill in with zero + if length(SE_pulse_area(bin_cut)) > 60; + + %Initial fit with a Guassian distribution + clear temp_SE + temp_SE = SE_pulse_area(bin_cut); + SE_fit_cut = inrange(temp_SE,[min(SE_hist_binning) max(SE_hist_binning)]); + SE_fit_xy = fit(SE_hist_binning',hist(temp_SE(SE_fit_cut),SE_hist_binning)','gauss1'); + SE_Size_xy = SE_fit_xy.b1; + SE_sig_xy = SE_fit_xy.c1/sqrt(2); + SE_conf_xy = confint(SE_fit_xy,0.683); + SE_sig_mu_xy = abs(SE_Size_xy-SE_conf_xy(1,2)); % one sigma + SE_sig_sig_xy = abs(SE_sig_xy-SE_conf_xy(1,3)/sqrt(2)); % one sigma + + %Refit with a skew Gaussian distribution + n_sig_fit = 2; + fit_start = SE_Size_xy-n_sig_fit*SE_sig_xy; + fit_end = SE_Size_xy+n_sig_fit*SE_sig_xy; + xfit = fit_start:0.1:fit_end; + [xxo, yyo, xo, no] = step(temp_SE(inrange(temp_SE,[fit_start fit_end])),SE_hist_binning); %#ok + s = fitoptions('Method','NonlinearLeastSquares','Robust','On','Algorithm','Trust-Region','Lower',... + [-5,0,0,0],'Upper',[5,Inf,Inf,Inf],'Startpoint',[1,max(no),10,5]); + skewGauss1 = fittype('a1/c1*exp(-((x-b1)/c1)^2)*(1+erf(a*(x-b1)/c1))','options',s); + [f_xy,g_xy] = fit(xo',no',skewGauss1); %#ok + delta_xy = f_xy.a/sqrt(1+f_xy.a^2); + SE_mu_xy = f_xy.b1 + f_xy.c1/sqrt(2)*delta_xy*sqrt(2/pi); + SE_sig_xy = sqrt((f_xy.c1/sqrt(2))^2 * (1 - 2 * (delta_xy)^2/pi)); + skew_xy = (4-pi)/2 * (delta_xy * sqrt(2/pi))^3 / (1 - 2 * delta_xy^2/pi)^(3/2); + kurt_xy = 2*(pi-3) * (delta_xy * sqrt(2/pi))^3 / (1 - 2 * delta_xy^2/pi)^2; + + %Fill in map (xy indicies swapped intentional due to how interp2D works) + mean_SE_xy(y_count,x_count) = SE_mu_xy; + skew_SE_xy(y_count,x_count) = skew_xy; + sigma_SE_xy(y_count,x_count) = SE_sig_xy; + kurt_SE_xy(y_count,x_count) = kurt_xy; + mean_err_SE_xy(y_count,x_count) = SE_sig_mu_xy; + sigma_err_SE_xy(y_count,x_count) = SE_sig_sig_xy; + + + else + + mean_SE_xy(y_count,x_count) = 0; + skew_SE_xy(y_count,x_count) = 0; + sigma_SE_xy(y_count,x_count) = 0; + kurt_SE_xy(y_count,x_count) = 0; + mean_err_SE_xy(y_count,x_count) = 0; + sigma_err_SE_xy(y_count,x_count) = 0; + + end + end + end + + +end + diff --git a/CodeForLUX/Matlab/MyFunctions/ProducePulseAreaXYNorms.m b/CodeForLUX/Matlab/MyFunctions/ProducePulseAreaXYNorms.m new file mode 100644 index 0000000..8e188fe --- /dev/null +++ b/CodeForLUX/Matlab/MyFunctions/ProducePulseAreaXYNorms.m @@ -0,0 +1,39 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Purpose: +% This function produces XY normalization maps from XY pulse area mean maps +% +% Inputs: +% - xbins - 1xN vector defining x binning of XY means map +% - ybins - 1xM vector defining y binning of XY means map +% - xymap - MxN map of pulse area means +% - xymap_sigma - MxN map of 1-sigma error on pulse area means +% - x_center - X coordinate to normalize the XY map to +% - y_center - Y coordinate to normalize the XY map to +% +% Outputs: +% - center - Value of the XY mean map at (x_center,y_center) +% - sigma_center - One sigma error on the value at the XY mean map at (x_center, y_center) +% - norm - MxN matrix of normalization factors +% - sigma_norm - MxN matrix of errors on the normalization factors +% +% Author: +% - Richard Knoche +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function [center, sigma_center, norm, sigma_norm] = ProducePulseAreaXYNorms(xbins, ybins, xymap, xymap_sigma, x_center, y_center) + +center = interp2(xbins,ybins,xymap,x_center,y_center,'cubic');%Normalize to the center +norm = center./xymap; +norm(isinf(norm)) = 1; +norm(isnan(norm)) = 1; + +sigma_center = interp2(xbins,ybins,xymap_sigma,x_center,y_center,'cubic');%Normalize to the center +sigma_norm = sqrt((sigma_center./xymap).^2+(xymap_sigma.*center./xymap.^2).^2); +sigma_norm(isinf(sigma_norm)) = 1; +sigma_norm(isnan(sigma_norm)) = 1; + + +end + diff --git a/CodeForLUX/Matlab/MyFunctions/RK_1DCubicInterp_LinearExtrap.m b/CodeForLUX/Matlab/MyFunctions/RK_1DCubicInterp_LinearExtrap.m new file mode 100644 index 0000000..f70ce98 --- /dev/null +++ b/CodeForLUX/Matlab/MyFunctions/RK_1DCubicInterp_LinearExtrap.m @@ -0,0 +1,88 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Purpose: +% This function does 1D cubic interpolation within the bounds of the map, +% and linear extrapolation based on the first/last 20% of the map +% +% Inputs: +% - X - X bins of the map +% - Y - Y bins of the map +% - X0 - Value to interpolate/extrapolate at from the map +% Can be a vector specifying multiple locations +% +% Outputs: +% - first_interp - The result of the interpolation/extrapolation at X0 +% +% Author: +% - Richard Knoche +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function [ first_interp ] = RK_1DCubicInterp_LinearExtrap( X, Y, X0) + +%Deal with multiple +if length(X0)>1 + first_interp = interp1(X,Y,X0,'v5cubic'); + + %find the working value of X0 closest to the NaN value of X0 + badX0 = X0(isnan(first_interp)); %#ok + goodX0 = X0(~isnan(first_interp)); + goodY0 = first_interp(~isnan(first_interp)); + + %sort to find the first and last 20% cubic values + [sorted_goodX0, sorted_index] = sort(goodX0); + sorted_goodY0 = goodY0(sorted_index); + first20_fit = polyfit(sorted_goodX0(1:floor(length(sorted_goodX0)*0.2)),sorted_goodY0(1:floor(length(sorted_goodX0)*0.2)),1); + last20_fit = polyfit(sorted_goodX0(ceil(length(sorted_goodX0)*0.8):end),sorted_goodY0(ceil(length(sorted_goodX0)*0.8):end),1); + + %Doing linear extrapolation for events on the edges + first_interp(isnan(first_interp) & X0<=sorted_goodX0(1)) = polyval(first20_fit,X0(isnan(first_interp) & X0<=sorted_goodX0(1))); + first_interp(isnan(first_interp) & X0>=sorted_goodX0(end))= polyval(last20_fit,X0(isnan(first_interp) & X0>=sorted_goodX0(end))); + + %clean up for anything that is NaN in the middle of the interpolation + %find the working value of X0 closest to the NaN value of X0 + badX0=X0(isnan(first_interp)); + if length(badX0)>= 1; + goodX0 = X0(~isnan(first_interp)); + goodY0 = first_interp(~isnan(first_interp)); + + for i=1:length(badX0); + temp = abs(badX0(i)-goodX0); + [minx idx] = min(temp); %#ok + FixedX0(i) = goodX0(idx); %#ok + FixedX0Index(i) = idx; %#ok + end + + first_interp(isnan(first_interp))=goodY0(FixedX0Index); + end + + +else %Deal with the case of single X0 value + + first_interp = interp1(X,Y,X0,'v5cubic'); %normalize to right below the gate + + if isnan(first_interp) + + first_interp = interp1(X,Y,X,'v5cubic'); %normalize to right below the gate + + %find the working value of X0 closest to the NaN value of X0 + badX = X(isnan(first_interp)); %#ok + goodX = X(~isnan(first_interp)); + goodY = first_interp(~isnan(first_interp)); + + %sort to find the first and last 20% cubic values + [sorted_goodX, sorted_index] = sort(goodX); + sorted_goodY = goodY(sorted_index); + first20_fit = polyfit(sorted_goodX(1:floor(length(sorted_goodX)*0.2)),sorted_goodY(1:floor(length(sorted_goodX)*0.2)),1); + last20_fit = polyfit(sorted_goodX(ceil(length(sorted_goodX)*0.8):end),sorted_goodY(ceil(length(sorted_goodX)*0.8):end),1); + + if X0 <= sorted_goodX(1) + first_interp = polyval(first20_fit,X0); + elseif X0 >= sorted_goodX(end) + first_interp = polyval(last20_fit,X0); + else + first_interp = interp1(X,Y,X0,'nearest'); + end + end +end + diff --git a/CodeForLUX/Matlab/MyFunctions/RemoveFieldDependence_1D.m b/CodeForLUX/Matlab/MyFunctions/RemoveFieldDependence_1D.m new file mode 100644 index 0000000..7854120 --- /dev/null +++ b/CodeForLUX/Matlab/MyFunctions/RemoveFieldDependence_1D.m @@ -0,0 +1,42 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Purpose: +% This function produces field removal (Z dependence only) matrices for Kr83m S1 and S2 data. +% Note this will ONLY work for Kr83m, and not for other sources +% +% Inputs: +% - s1ab_P - Polynomial fit to S1a/S1b z dependence +% - drift_time - Drift time after golden event selection +% +% Outputs: +% - s1_fieldremoval - 1xN matrix of S1 field removal (apply by S1./s1_field_removal) +% - s2_fieldremoval - 1xN matrix of S2 field removal (apply by S2./s2_field_removal) +% +% Author: +% - Richard Knoche +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function [s1_fieldremoval, s2_fieldremoval] = RemoveFieldDependence_1D(s1ab_P, drift_time) + +%Hardcoded numbers from Energy Chi2 Fit +s1ab_s2_xyz_fit_map.p1 = -0.4988; +s1ab_s2_xyz_fit_map.p2 = 1.484; +s1ab_s2_xyz_fit_map.p3 = 1-s1ab_s2_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s2_xyz_fit_map.p2; + +s1ab_s1_xyz_fit_map.p1 = 0.065; +s1ab_s1_xyz_fit_map.p2 = 0.02; +s1ab_s1_xyz_fit_map.p3 = 1-s1ab_s1_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s1_xyz_fit_map.p2; + +%Getting field removal using Z dependence polynomials +s1as1b_zvalues = polyval(s1ab_P,drift_time); +s2_fieldremoval = (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); +s1_fieldremoval = (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with (Z dependence should never be NaN anyway) +s2_fieldremoval(isnan(s2_fieldremoval))=1; +s1_fieldremoval(isnan(s1_fieldremoval))=1; + + +end + diff --git a/CodeForLUX/Matlab/MyFunctions/RemoveFieldDependence_3D.m b/CodeForLUX/Matlab/MyFunctions/RemoveFieldDependence_3D.m new file mode 100644 index 0000000..ac501c5 --- /dev/null +++ b/CodeForLUX/Matlab/MyFunctions/RemoveFieldDependence_3D.m @@ -0,0 +1,62 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Purpose: +% This function produces field removal (3D dependence) matrices for Kr83m S1 and S2 data. +% Note this will ONLY work for Kr83m, and not for other sources +% +% Inputs: +% - s1ab_xyz_xbins - 1xN matrix for X binning for 3D matrix of S1a/S1b means +% - s1ab_xyz_ybins - 1xN matrix for Y binning for 3D matrix of S1a/S1b means +% - s1ab_xyz_ybins - 1xN matrix for Z binning for 3D matrix of S1a/S1b means +% - s1ab_xyz_mean - 3D matrix of S1a/S1b means +% - s1ab_P - Polynomial fit to S1a/S1b z dependence +% - s2x - X position after golden event selection +% - s2y - Y position after golden event selection +% - drift_time - Drift time after golden event selection +% +% Outputs: +% - s1_fieldremoval - 1xN matrix of S1 field removal (apply by S1./s1_field_removal) +% - s2_fieldremoval - 1xN matrix of S2 field removal (apply by S2./s2_field_removal) +% - s1as1b_at_center - value of S1a/S1b at the center of the detector +% +% Author: +% - Richard Knoche +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function [s1_fieldremoval, s2_fieldremoval, s1as1b_at_center] = RemoveFieldDependence_3D(s1ab_xyz_xbins, s1ab_xyz_ybins, s1ab_xyz_zbins, s1ab_xyz_mean, s1ab_P, s2x, s2y, drift_time) + +%Hardcoded numbers from Energy Chi2 Fit +s1ab_s2_xyz_fit_map.p1 = -0.4988; +s1ab_s2_xyz_fit_map.p2 = 1.484; +s1ab_s2_xyz_fit_map.p3 = 1-s1ab_s2_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s2_xyz_fit_map.p2; + +s1ab_s1_xyz_fit_map.p1 = 0.065; +s1ab_s1_xyz_fit_map.p2 = 0.02; +s1ab_s1_xyz_fit_map.p3 = 1-s1ab_s1_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s1_xyz_fit_map.p2; + +%Removing zeros from map with nearest neighbor method - needed for interpolation purposes +s1ab_xyz_mean_old = s1ab_xyz_mean; +temp_map = s1ab_xyz_mean; +q = ~isnan(temp_map); +r = nearestpoint(find(~q),find(q)); +s1ab_xyz_mean = temp_map; +temp_mapQ = temp_map(q); +s1ab_xyz_mean(~q) = temp_mapQ(r); +s1ab_xyz_mean = reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic method so that we get NaN when extrapolating +s1as1b_values = interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); +s1as1b_at_center = interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); +s2_fieldremoval = (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); +s1_fieldremoval = (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial +s1as1b_zvalues = polyval(s1ab_P,drift_time); +s2_zfieldremoval = (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); +s1_zfieldremoval = (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); +s2_fieldremoval(isnan(s2_fieldremoval)) = s2_zfieldremoval(isnan(s2_fieldremoval)); +s1_fieldremoval(isnan(s1_fieldremoval)) = s1_zfieldremoval(isnan(s1_fieldremoval)); + +end + diff --git a/CodeForLUX/Matlab/MyFunctions/polyfitweighted.m b/CodeForLUX/Matlab/MyFunctions/polyfitweighted.m new file mode 100644 index 0000000..67b1900 --- /dev/null +++ b/CodeForLUX/Matlab/MyFunctions/polyfitweighted.m @@ -0,0 +1,75 @@ +function p = polyfitweighted(x,y,n,w) +% polyfitweighted.m +% ----------------- +% +% Find a least-squares fit of 1D data y(x) with an nth order +% polynomial, weighted by w(x). +% +% By S.S. Rogers (2006), based on polyfit.m by The MathWorks, Inc. - see doc +% polyfit for more details. +% +% Usage +% ----- +% +% P = polyfitweighted(X,Y,N,W) finds the coefficients of a polynomial +% P(X) of degree N that fits the data Y best in a least-squares sense. P +% is a row vector of length N+1 containing the polynomial coefficients in +% descending powers, P(1)*X^N + P(2)*X^(N-1) +...+ P(N)*X + P(N+1). W is +% a vector of weights. +% +% Vectors X,Y,W must be the same length. +% +% Class support for inputs X,Y,W: +% float: double, single +% + +% The regression problem is formulated in matrix format as: +% +% yw = V*p or +% +% 3 2 +% yw = [x w x w xw w] [p3 +% p2 +% p1 +% p0] +% +% where the vector p contains the coefficients to be found. For a +% 7th order polynomial, matrix V would be: +% +% V = [w.*x.^7 w.*x.^6 w.*x.^5 w.*x.^4 w.*x.^3 w.*x.^2 w.*x w]; + +if ~isequal(size(x),size(y),size(w)) + error('X and Y vectors must be the same size.') +end + +x = x(:); +y = y(:); +w = w(:); + + +% Construct weighted Vandermonde matrix. +%V(:,n+1) = ones(length(x),1,class(x)); +V(:,n+1) = w; +for j = n:-1:1 + V(:,j) = x.*V(:,j+1); +end + +% Solve least squares problem. +[Q,R] = qr(V,0); +ws = warning('off','all'); +p = R\(Q'*(w.*y)); % Same as p = V\(w.*y); +warning(ws); +if size(R,2) > size(R,1) + warning('polyfitweighted:PolyNotUnique', ... + 'Polynomial is not unique; degree >= number of data points.') +elseif condest(R) > 1.0e10 + if nargout > 2 + warning('polyfitweighted:RepeatedPoints', ... + 'Polynomial is badly conditioned. Remove repeated data points.') + else + warning('polyfitweighted:RepeatedPointsOrRescale', ... + ['Polynomial is badly conditioned. Remove repeated data points\n' ... + ' or try centering and scaling as described in HELP POLYFIT.']) + end +end +p = p.'; % Polynomial coefficients are row vectors by convention. diff --git a/CodeForLUX/Matlab/MyFunctions/rkploterr.m b/CodeForLUX/Matlab/MyFunctions/rkploterr.m new file mode 100644 index 0000000..f0856af --- /dev/null +++ b/CodeForLUX/Matlab/MyFunctions/rkploterr.m @@ -0,0 +1,171 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Purpose: +% This function edits the standard ploterr code so that it is easier to plot. Errorbars +% no longer have horizontal lines, horizontal error bars are now an option, and each point +% is considered part of the same data for the legend. +% +% Inputs: +% - x - X data +% - y - Y data +% - xerr - X data error (optional, skip with []) +% - yerr - Y data error (optional, skip with []) +% - linecolor - Line color in vector [R G B] (optional) +% - symbol - String symbol to use for the data such as, '+' (optional) +% - msize - Size of the marker +% - lsize - Width of the errorbars +% +% Outputs: +% - None (makes a plot) +% +% Author: +% - Richard Knoche, and whoever wrote the original ploterr function +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function rkploterr = rkploterr(x, y, xerr, yerr, linecolor, symbol, msize, lsize) %#ok<*STOUT> + +if nargin<5 + linecolor=[0 0 0]; + symbol = '.'; + msize = 10; + lsize = 1; +elseif nargin<6 + if isempty(linecolor); linecolor = [0 0 0];end; + symbol = '.'; + msize = 10; + lsize = 1; +elseif nargin<7 + if isempty(linecolor); linecolor = [0 0 0];end; + if isempty(symbol); symbol='.'; end; + msize = 10; + lsize = 1; +elseif nargin<8 + if isempty(linecolor); linecolor = [0 0 0];end; + if isempty(symbol); symbol='.'; end; + if isempty(msize); msize=10; end; + lsize = 1; +elseif nargin==8 + if isempty(linecolor); linecolor = [0 0 0];end; + if isempty(symbol); symbol='.'; end; + if isempty(msize); msize=10; end; + if isempty(lsize); lsize=1; end; +end + + + + +uselog=0; +ndim=length(size(x)); + +onedim_length=size(x,1); +if ndim>1 + for dim=2:ndim + onedim_length=onedim_length*size(x,dim); + end +end + +xx=reshape(x,[onedim_length 1]); +yy=reshape(y,[onedim_length 1]); +if ~isempty(xerr) +xxerr=reshape(xerr,[onedim_length 1]); +xl = xx-xxerr; +xr = xx+xxerr; +else +xl = []; +xr = []; +end; +if ~isempty(yerr) +yyerr=reshape(yerr,[onedim_length 1]); +yl = yy-yyerr; +yu = yy+yyerr; +else +yl=[]; +yu=[]; +end; +npt = size(xx,1); %#ok<*NASGU> + + +hhx=0;hhy=hhx; +[ls,col,mark,msg] = colstyle(symbol); +symbol = [ls mark col]; % Use marker only on data part +esymbol = ['-' col]; % Make sure bars are solid +plotfct=@plot; + +cax=newplot([]); +if ~isempty(xl) +[bary,barx]=barline(yy,xl,xr,uselog,hhx); +h = plot(barx,bary,esymbol,'Color',linecolor,'LineWidth',lsize,'parent',cax); hold on +hAnnotation = get(h,'Annotation'); +hLegendEntry = get(hAnnotation','LegendInformation'); +set(hLegendEntry,'IconDisplayStyle','off') +end +if ~isempty(yl) +[barx,bary]=barline(xx,yl,yu,uselog,hhy); +h = [plot(barx,bary,esymbol,'Color',linecolor,'LineWidth',lsize,'parent',cax)]; hold on %#ok<*NBRAK> +hAnnotation = get(h,'Annotation'); +hLegendEntry = get(hAnnotation','LegendInformation'); +set(hLegendEntry,'IconDisplayStyle','off') +end +scatter(xx,yy,msize,symbol,'MarkerFaceColor',linecolor,'MarkerEdgeColor',linecolor,'LineWidth',lsize,'parent',cax); +end + +%% helper functions + +function [perp,para] = barline(v,l,h,uselog,handleheight) +% v: value "perpendicular" +% l: lower bound "parallel" +% h: upper bound "parallel" + + [npt,n]=size(l); + + % calculate height of errorbar delimiters + + % set basic operations for linear spacing + dist=@minus; + invdist=@plus; + scale=@times; + + if uselog + % overwrite basic operations for logarithmic spacing + dist=@rdivide; + invdist=@times; + scale=@power; + end + + if handleheight>0 % means handleheight was passed as a relative value + % set width of ends of bars to handleheight times mean distance of the bars. + % If number of points is under 15, space as if 15 points were there. + if dist(max(v(:)),min(v(:)))==0 + dv = scale(abs(v),1/40) + (abs(v)==0); + else + dv = scale(dist(max(v(:)),min(v(:))),1/max(15,npt-1)*handleheight/2); + end + else % handleheight<=0 means handleheight was passed as an absolute value + dv=handleheight/2; + if uselog, dv=10^dv; end + end + + vh = invdist(v,dv); + vl = dist(v,dv); + + wings=0; % Set to 1 if you want to plot the wings + %Remove wings from Error bars + if (wings == 0) + vh=0; + vl=0; + end + + + % build up nan-separated vector for bars + para = zeros(npt*3,n); + para(1:3:end,:) = h; + para(2:3:end,:) = l; + para(3:3:end,:) = NaN; + + perp = zeros(npt*3,n); + perp(1:3:end,:) = v; + perp(2:3:end,:) = v; + perp(3:3:end,:) = NaN; + +end diff --git a/CodeForLUX/Matlab/MyScripts/DokePlot/Run03_DokePlot.m b/CodeForLUX/Matlab/MyScripts/DokePlot/Run03_DokePlot.m new file mode 100644 index 0000000..fea9fc6 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/DokePlot/Run03_DokePlot.m @@ -0,0 +1,1758 @@ +% SatFixed_AllSys_SEDQCenter_Cov_RPlot_Kr50TimeCut_NewCorr + +%NOTE: WHEN PRESENTED TO AWG, THIS HAD A BUG IN THE 50 V/cm S2 XY +%CORRECTIONS -- IT WAS USING S1 XY CORRECTIONS INSTEAD. THIS MADE G1 = +%0.12 and EE =0.432 instead of G1=0.117 and EE =0.445 (this is a 1 sigma +%diff EE) + +%Fixes the s2 error = sigma/sqrt(num s1) bug +%Fixes the Energy to 203 instead of 208 bug +%Fixes the hour of high field in 50 V/cm data bug +%Changes 50 V/cm det_middle from (463-4.23)/2= 229.4 to 184.5 based on counting events +%Changes 100 V/cm det_middle from (351-4.23)/2= 173.4 to 171.5 based on counting events +%Fixes 50 V/cm and 100 V/cm corrections to be based on uncorrected xy + +%Does NOT fix the fact that r<18 cm cut is different for 50 and 100 V/cm data at different depths + +%% Find g1 and g2 by fiting to multiple mono energetic peaks + + + %% Kr83m at 42.6 keV and 170 V/cm + + clear radius s2x_c s2y_c drift_time s1_phe_both_xyz s2_phe_bottom_xyz S2_numelectrons_VUV +load('C:\Program Files\MATLAB\R2012a\bin\DokeWithDQSE\Run03Kr_170Vcm_DQ_SE.mat'); %Load Patched Kr Data + +n_sig=3; + radius=(s2x_c.^2+s2y_c.^2).^(1/2); + + + %REDO ALL OF THIS WITH SAT FIXED AND S2 BOTH + s1_phe_both_xyz_kr170=s1_phe_both_xyz_VUV(inrange(drift_time,[30 300]) & inrange(radius,[0 18]) & inrange(s2_phe_both_xyz_VUV_SatFixed,[1585,20000]) & inrange(s1_phe_both_xyz_VUV,[150,400])); + s2_phe_bottom_xyz_kr170=S2_numelectrons_VUV_SatFixed(inrange(drift_time,[30 300]) & inrange(radius,[0 18]) & inrange(s2_phe_both_xyz_VUV_SatFixed,[1585,20000]) & inrange(s1_phe_both_xyz_VUV,[150,400])); + s2_phe_bottom_xyz_kr170_phe=s2_phe_both_xyz_VUV_SatFixed(inrange(drift_time,[30 300]) & inrange(radius,[0 18]) & inrange(s2_phe_both_xyz_VUV_SatFixed,[1585,20000]) & inrange(s1_phe_both_xyz_VUV,[150,400])); + s1_phe_both_xyz_kr170_phe=s1_phe_both_xyz_VUV(inrange(drift_time,[30 300]) & inrange(radius,[0 18]) & inrange(s2_phe_both_xyz_VUV_SatFixed,[1585,20000]) & inrange(s1_phe_both_xyz_VUV,[150,400])); + + + clear Fit_kr_E cut_kr_sig_E Fit_kr_E Fit_kr_s1 Fit_kr_s2 cut_kr_sig_s1 cut_kr_sig_s2 + Fit_kr_s1=fit([0:1:600]',hist(s1_phe_both_xyz_kr170,[0:1:600])','gauss1'); + Fit_kr_s2=fit([0:2:1000]',hist(s2_phe_bottom_xyz_kr170,[0:2:1000])','gauss1'); + Fit_kr_s1_sig = Fit_kr_s1.c1/sqrt(2); + Fit_kr_s2_sig = Fit_kr_s2.c1/sqrt(2); + Fit_kr_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_xyz_kr170)); % == sigma/sqrt(N); + Fit_kr_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_bottom_xyz_kr170)); % == sigma/sqrt(N); + %cut and fit around 3 sigma of the mean, after the first guess + cut_kr_sig_s1= inrange(s1_phe_both_xyz_kr170,[Fit_kr_s1.b1-n_sig*Fit_kr_s1_sig Fit_kr_s1.b1+n_sig*Fit_kr_s1_sig]); + Fit_kr_s1=fit([0:1:600]',hist(s1_phe_both_xyz_kr170(cut_kr_sig_s1),[0:1:600])','gauss1'); + cut_kr_sig_s2= inrange(s2_phe_bottom_xyz_kr170,[Fit_kr_s2.b1-n_sig*Fit_kr_s2_sig Fit_kr_s2.b1+n_sig*Fit_kr_s2_sig]); + Fit_kr_s2=fit([0:2:1000]',hist(s2_phe_bottom_xyz_kr170(cut_kr_sig_s2),[0:2:1000])','gauss1'); + Fit_kr_s1_sig = Fit_kr_s1.c1/sqrt(2); + Fit_kr_s2_sig = Fit_kr_s2.c1/sqrt(2); + Kr_170_S1Mu=Fit_kr_s1.b1; + Kr_170_S1Sig=Fit_kr_s1_sig; + Kr_170_S2Mu=Fit_kr_s2.b1; + Kr_170_S2Sig=Fit_kr_s2_sig; + Kr_170_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_xyz_kr170(cut_kr_sig_s1))); % == sigma/sqrt(N); + Kr_170_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_bottom_xyz_kr170(cut_kr_sig_s2))); % == sigma/sqrt(N); + + Kr_170_SE=mean(SE_Size_VUV); + + %% Kr83m at 42.6 keV and 100 V/cm -- NEEDS ITS OWN XYZ Corrections (LOAD DATA GIVES NO XYZ CORRECTION) + clear radius s2x_c s2y_c drift_time s1_phe_both_xyz s2_phe_bottom_xyz S2_numelectrons_VUV +load('C:\Program Files\MATLAB\R2012a\bin\DokeWithDQSE\Run03Kr_100Vcm_DQ_SE.mat'); %Load Patched Kr Data + +n_sig=3; + radius_c=(s2x_c.^2+s2y_c.^2).^(1/2); + radius=(s2x.^2+s2y.^2).^(1/2); +% Getting s1 z correction + +dT_step=15; +dT_max=30+dT_step; +i=1; +% det_edge=351; + +for dT_max=30+dT_step:dT_step:310-dT_step; +s1z_mean_fit=fit([0:3:500]',hist(s1_phe_both_xyz_VUV(inrange(drift_time,[dT_max-dT_step dT_max])),[0:3:500])','gauss1'); +s1z_mean(i)=s1z_mean_fit.b1; +s1z_dT_loc(i)=dT_max-dT_step/2; +i=i+1; +end +mean_fit_s1z=polyfit(s1z_dT_loc,s1z_mean,2); + +s1_phe_both_xyz_z=s1_phe_both_xyz_VUV.*polyval(mean_fit_s1z,171.5)./polyval(mean_fit_s1z,drift_time); %171.5 found from counting events + + +%Getting s1 xy correction + +clear x2 hist_bin + +xx_step=2; +yy_step=2; +s1_both_xymeans = zeros(floor(50/yy_step),floor(50/xx_step)); +i=1; + for x_bin=-25+xx_step/2:xx_step:25-xx_step/2 + j=1; + for y_bin=-25+yy_step/2:yy_step:25-yy_step/2 + if length(s1_phe_both_xyz_z(inrange(s2x,[x_bin-xx_step x_bin+xx_step]) & inrange(s2y,[y_bin-yy_step y_bin+yy_step]))) > 100; + s1_both_xymeans_fit=fit([0:3:500]',hist(s1_phe_both_xyz_z(inrange(s2x,[x_bin-xx_step x_bin+xx_step]) & inrange(s2y,[y_bin-yy_step y_bin+yy_step])),[0:3:500])','gauss1'); + s1_both_xymeans(j,i)=s1_both_xymeans_fit.b1; + else + + s1_both_xymeans(j,i)=0; + + end + j=j+1; + end + i=i+1; + end + +s1_both_xymeans(isnan(s1_both_xymeans)) = 0; + +s2x_bins=-25+xx_step/2:xx_step:25-xx_step/2; +s2y_bins=-25+yy_step/2:yy_step:25-yy_step/2; + + %Calculate corrections matrix and 1 sigma corrections matrix +center=interp2(s2x_bins,s2y_bins,s1_both_xymeans,0,0,'spline',1);%Normalize to the center (x=y=0) +norm_S1_both=center./s1_both_xymeans; +norm_S1_both(isinf(norm_S1_both))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_both(isnan(norm_S1_both))=1; + +s1_phe_both_xyz_VUV_old=s1_phe_both_xyz_VUV; +clear s1_phe_both_xyz_VUV +s1_phe_both_xyz_VUV=s1_phe_both_xyz_z.*interp2(s2x_bins,s2y_bins,norm_S1_both,s2x,s2y,'spline'); + + +%Getting s2 z correction + +dT_step=15; +dT_max=30+dT_step; +i=1; +% det_edge=351; + +for dT_max=30+dT_step:dT_step:310-dT_step; +s2z_mean_fit=fit([0:100:15000]',hist(s2_phe_both_xyz_VUV_SatFixed(inrange(drift_time,[dT_max-dT_step dT_max])),[0:100:15000])','gauss1'); +s2z_mean(i)=s2z_mean_fit.b1; +s2z_dT_loc(i)=dT_max-dT_step/2; +i=i+1; +end + +s2z_mean_fit=fit(s2z_dT_loc.',s2z_mean.','exp1'); +electron_lifetime=-1/s2z_mean_fit.b; +s2_phe_both_z=s2_phe_both_xyz_VUV_SatFixed.*exp(drift_time./electron_lifetime); + +%Getting s2 xy correction + +clear x2 hist_bin + +xx_step=2; +yy_step=2; +s2_bot_xymeans = zeros(floor(50/yy_step),floor(50/xx_step)); +i=1; + for x_bin=-25+xx_step/2:xx_step:25-xx_step/2 + j=1; + for y_bin=-25+yy_step/2:yy_step:25-yy_step/2 + if length(s2_phe_both_z(inrange(s2x,[x_bin-xx_step x_bin+xx_step]) & inrange(s2y,[y_bin-yy_step y_bin+yy_step]))) > 300; + s2_bot_xymeans_fit=fit([0:200:20000]',hist(s2_phe_both_z(inrange(s2x,[x_bin-xx_step x_bin+xx_step]) & inrange(s2y,[y_bin-yy_step y_bin+yy_step])),[0:200:20000])','gauss1'); + s2_bot_xymeans(j,i)=s2_bot_xymeans_fit.b1; + else + + s2_bot_xymeans(j,i)=0; + + end + j=j+1; + end + i=i+1; + end + +s2_bot_xymeans(isnan(s2_bot_xymeans)) = 0; + +s2x_bins=-25+xx_step/2:xx_step:25-xx_step/2; +s2y_bins=-25+yy_step/2:yy_step:25-yy_step/2; + + %Calculate corrections matrix and 1 sigma corrections matrix +center=interp2(s2x_bins,s2y_bins,s2_bot_xymeans,0,0,'spline',1);%Normalize to the center (x=y=0) +norm_S2_bot=center./s2_bot_xymeans; +norm_S2_bot(isinf(norm_S2_bot))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_bot(isnan(norm_S2_bot))=1; + +s2_phe_both_xyz_VUV_SatFixed_old=s2_phe_both_xyz_VUV_SatFixed; +clear s2_phe_both_xyz_VUV_SatFixed +s2_phe_both_xyz_VUV_SatFixed=s2_phe_both_z.*interp2(s2x_bins,s2y_bins,norm_S2_bot,s2x,s2y,'spline'); + + +%%%%%% + S2_numelectrons_VUV=s2_phe_both_xyz_VUV_SatFixed./SE_Size_VUV; + s2_phe_both_xyz_kr100_phe=s2_phe_both_xyz_VUV_SatFixed(inrange(drift_time,[30 300]) & inrange(radius_c,[0 18]) & inrange(s2_phe_both_xyz_VUV_SatFixed,[1585,20000]) & inrange(s1_phe_both_xyz_VUV,[150,400])); + s1_phe_both_xyz_kr100_phe=s1_phe_both_xyz_VUV(inrange(drift_time,[30 300]) & inrange(radius_c,[0 18]) & inrange(s2_phe_both_xyz_VUV_SatFixed,[1585,20000]) & inrange(s1_phe_both_xyz_VUV,[150,400])); + + s1_phe_both_xyz_kr100=s1_phe_both_xyz_VUV(inrange(drift_time,[30 300]) & inrange(radius_c,[0 18]) & s2_phe_both_xyz_VUV_SatFixed > 1585); + s2_phe_both_xyz_kr100=S2_numelectrons_VUV(inrange(drift_time,[30 300]) & inrange(radius_c,[0 18]) & s2_phe_both_xyz_VUV_SatFixed > 1585); + + + + clear Fit_kr_E cut_kr_sig_E Fit_kr_E Fit_kr_s1 Fit_kr_s2 cut_kr_sig_s1 cut_kr_sig_s2 + Fit_kr_s1=fit([0:1:600]',hist(s1_phe_both_xyz_kr100(s1_phe_both_xyz_kr100<600),[0:1:600])','gauss1'); + Fit_kr_s2=fit([0:2:1000]',hist(s2_phe_both_xyz_kr100(s2_phe_both_xyz_kr100<1000),[0:2:1000])','gauss1'); + Fit_kr_s1_sig = Fit_kr_s1.c1/sqrt(2); + Fit_kr_s2_sig = Fit_kr_s2.c1/sqrt(2); + Fit_kr_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_xyz_kr100)); % == sigma/sqrt(N); + Fit_kr_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_both_xyz_kr100)); % == sigma/sqrt(N); + %cut and fit around 3 sigma of the mean, after the first guess + cut_kr_sig_s1= inrange(s1_phe_both_xyz_kr100,[Fit_kr_s1.b1-n_sig*Fit_kr_s1_sig Fit_kr_s1.b1+n_sig*Fit_kr_s1_sig]); + Fit_kr_s1=fit([0:1:600]',hist(s1_phe_both_xyz_kr100(cut_kr_sig_s1),[0:1:600])','gauss1'); + cut_kr_sig_s2= inrange(s2_phe_both_xyz_kr100,[Fit_kr_s2.b1-n_sig*Fit_kr_s2_sig Fit_kr_s2.b1+n_sig*Fit_kr_s2_sig]); + Fit_kr_s2=fit([0:2:1000]',hist(s2_phe_both_xyz_kr100(cut_kr_sig_s2),[0:2:1000])','gauss1'); + Fit_kr_s1_sig = Fit_kr_s1.c1/sqrt(2); + Fit_kr_s2_sig = Fit_kr_s2.c1/sqrt(2); + Kr_100_S1Mu=Fit_kr_s1.b1; + Kr_100_S1Sig=Fit_kr_s1_sig; + Kr_100_S2Mu=Fit_kr_s2.b1; + Kr_100_S2Sig=Fit_kr_s2_sig; + Kr_100_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_xyz_kr100(cut_kr_sig_s1))); % == sigma/sqrt(N); + Kr_100_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_both_xyz_kr100(cut_kr_sig_s2))); % == sigma/sqrt(N); + + Kr_100_SE=mean(SE_Size_VUV); +%% Load Kr 50 V/cm + clear radius radius_c s2x_c s2y_c drift_time s1_phe_both_xyz s2_phe_bottom_xyz S2_numelectrons_VUV +load('C:\Program Files\MATLAB\R2012a\bin\DokeWithDQSE\Run03Kr_50Vcm_DQ_SE.mat'); %Load Patched Kr Data + +n_sig=3; + radius=(s2x_c.^2+s2y_c.^2).^(1/2); + +% Getting s1 z correction + +dT_step=15; +dT_max=30+dT_step; +i=1; +% det_edge=463; + +for dT_max=30+dT_step:dT_step:310-dT_step; +s1z_mean_fit=fit([0:3:500]',hist(s1_phe_both_xyz_VUV(inrange(drift_time,[dT_max-dT_step dT_max])),[0:3:500])','gauss1'); +s1z_mean(i)=s1z_mean_fit.b1; +s1z_dT_loc(i)=dT_max-dT_step/2; +i=i+1; +end +mean_fit_s1z=polyfit(s1z_dT_loc,s1z_mean,2); + +s1_phe_both_xyz_z=s1_phe_both_xyz_VUV.*polyval(mean_fit_s1z,184.5)./polyval(mean_fit_s1z,drift_time); + + +%Getting s1 xy correction + +clear x2 hist_bin + +xx_step=2; +yy_step=2; +s1_both_xymeans = zeros(floor(50/yy_step),floor(50/xx_step)); +i=1; + for x_bin=-25+xx_step/2:xx_step:25-xx_step/2 + j=1; + for y_bin=-25+yy_step/2:yy_step:25-yy_step/2 + if length(s1_phe_both_xyz_z(s1_phe_both_xyz_z<500 & inrange(s2x,[x_bin-xx_step x_bin+xx_step]) & inrange(s2y,[y_bin-yy_step y_bin+yy_step]))) > 100; + s1_both_xymeans_fit=fit([0:3:500]',hist(s1_phe_both_xyz_z(s1_phe_both_xyz_z<500 & inrange(s2x,[x_bin-xx_step x_bin+xx_step]) & inrange(s2y,[y_bin-yy_step y_bin+yy_step])),[0:3:500])','gauss1'); + s1_both_xymeans(j,i)=s1_both_xymeans_fit.b1; + else + + s1_both_xymeans(j,i)=0; + + end + j=j+1; + end + i=i+1; + end + +s1_both_xymeans(isnan(s1_both_xymeans)) = 0; + +s2x_bins=-25+xx_step/2:xx_step:25-xx_step/2; +s2y_bins=-25+yy_step/2:yy_step:25-yy_step/2; + + %Calculate corrections matrix and 1 sigma corrections matrix +center=interp2(s2x_bins,s2y_bins,s1_both_xymeans,0,0,'spline',1);%Normalize to the center (x=y=0) +norm_S1_both=center./s1_both_xymeans; +norm_S1_both(isinf(norm_S1_both))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_both(isnan(norm_S1_both))=1; + +s1_phe_both_xyz_VUV_old=s1_phe_both_xyz_VUV; +clear s1_phe_both_xyz_VUV +s1_phe_both_xyz_VUV=s1_phe_both_xyz_z.*interp2(s2x_bins,s2y_bins,norm_S1_both,s2x,s2y,'spline'); + + +%Getting s2 z correction + +dT_step=15; +dT_max=30+dT_step; +i=1; +% det_edge=463; + +for dT_max=30+dT_step:dT_step:310-dT_step; +s2z_mean_fit=fit([0:200:20000]',hist(s2_phe_both_xyz_VUV_SatFixed(inrange(drift_time,[dT_max-dT_step dT_max])),[0:200:20000])','gauss1'); +s2z_mean(i)=s2z_mean_fit.b1; +s2z_dT_loc(i)=dT_max-dT_step/2; +i=i+1; +end + +s2z_mean_fit=fit(s2z_dT_loc.',s2z_mean.','exp1'); +electron_lifetime=-1/s2z_mean_fit.b; +s2_phe_both_z=s2_phe_both_xyz_VUV_SatFixed.*exp(drift_time./electron_lifetime); + +%Getting s2 xy correction + +clear x2 hist_bin + +xx_step=2; +yy_step=2; +s2_bot_xymeans = zeros(floor(50/yy_step),floor(50/xx_step)); +i=1; + for x_bin=-25+xx_step/2:xx_step:25-xx_step/2 + j=1; + for y_bin=-25+yy_step/2:yy_step:25-yy_step/2 + if length(s2_phe_both_z(s2_phe_both_z<20000 & inrange(s2x,[x_bin-xx_step x_bin+xx_step]) & inrange(s2y,[y_bin-yy_step y_bin+yy_step]))) > 100; + s2_bot_xymeans_fit=fit([0:200:20000]',hist(s2_phe_both_z(s2_phe_both_z<20000 & inrange(s2x,[x_bin-xx_step x_bin+xx_step]) & inrange(s2y,[y_bin-yy_step y_bin+yy_step])),[0:200:20000])','gauss1'); + s2_bot_xymeans(j,i)=s2_bot_xymeans_fit.b1; + else + + s2_bot_xymeans(j,i)=0; + + end + j=j+1; + end + i=i+1; + end + +s2_bot_xymeans(isnan(s2_bot_xymeans)) = 0; + +s2x_bins=-25+xx_step/2:xx_step:25-xx_step/2; +s2y_bins=-25+yy_step/2:yy_step:25-yy_step/2; + + %Calculate corrections matrix and 1 sigma corrections matrix +center=interp2(s2x_bins,s2y_bins,s2_bot_xymeans,0,0,'spline',1);%Normalize to the center (x=y=0) +norm_S2_bot=center./s2_bot_xymeans; +norm_S2_bot(isinf(norm_S2_bot))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_bot(isnan(norm_S2_bot))=1; + +s2_phe_both_xyz_VUV_SatFixed_old=s2_phe_both_xyz_VUV_SatFixed; +clear s2_phe_both_xyz_VUV_SatFixed +s2_phe_both_xyz_VUV_SatFixed=s2_phe_both_z.*interp2(s2x_bins,s2y_bins,norm_S2_bot,s2x,s2y,'spline'); + + +%%%%%% + S2_numelectrons_VUV=s2_phe_both_xyz_VUV_SatFixed./SE_Size_VUV; + + + s1_phe_both_xyz_kr50=s1_phe_both_xyz_VUV(inrange(drift_time,[30 400]) & inrange(radius,[0 18]) & s2_phe_both_xyz_VUV_SatFixed > 1585); + s2_phe_bottom_xyz_kr50=S2_numelectrons_VUV(inrange(drift_time,[30 400]) & inrange(radius,[0 18]) & s2_phe_both_xyz_VUV_SatFixed > 1585); %really this is S2 both, just never renamed it + + + + clear Fit_kr_E cut_kr_sig_E Fit_kr_E Fit_kr_s1 Fit_kr_s2 cut_kr_sig_s1 cut_kr_sig_s2 + Fit_kr_s1=fit([0:1:600]',hist(s1_phe_both_xyz_kr50(s1_phe_both_xyz_kr50<600),[0:1:600])','gauss1'); + Fit_kr_s2=fit([0:2:1000]',hist(s2_phe_bottom_xyz_kr50(s2_phe_bottom_xyz_kr50<1000),[0:2:1000])','gauss1'); + Fit_kr_s1_sig = Fit_kr_s1.c1/sqrt(2); + Fit_kr_s2_sig = Fit_kr_s2.c1/sqrt(2); + Fit_kr_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_xyz_kr50)); % == sigma/sqrt(N); + Fit_kr_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_bottom_xyz_kr50)); % == sigma/sqrt(N); + %cut and fit around 3 sigma of the mean, after the first guess + cut_kr_sig_s1= inrange(s1_phe_both_xyz_kr50,[Fit_kr_s1.b1-n_sig*Fit_kr_s1_sig Fit_kr_s1.b1+n_sig*Fit_kr_s1_sig]); + Fit_kr_s1=fit([0:1:600]',hist(s1_phe_both_xyz_kr50(cut_kr_sig_s1),[0:1:600])','gauss1'); + cut_kr_sig_s2= inrange(s2_phe_bottom_xyz_kr50,[Fit_kr_s2.b1-n_sig*Fit_kr_s2_sig Fit_kr_s2.b1+n_sig*Fit_kr_s2_sig]); + Fit_kr_s2=fit([0:2:1000]',hist(s2_phe_bottom_xyz_kr50(cut_kr_sig_s2),[0:2:1000])','gauss1'); + Fit_kr_s1_sig = Fit_kr_s1.c1/sqrt(2); + Fit_kr_s2_sig = Fit_kr_s2.c1/sqrt(2); + Kr_50_S1Mu=Fit_kr_s1.b1; + Kr_50_S1Sig=Fit_kr_s1_sig; + Kr_50_S2Mu=Fit_kr_s2.b1; + Kr_50_S2Sig=Fit_kr_s2_sig; + Kr_50_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_xyz_kr50(cut_kr_sig_s1))); % == sigma/sqrt(N); + Kr_50_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_bottom_xyz_kr50(cut_kr_sig_s2))); % == sigma/sqrt(N); + + Kr_50_SE=mean(SE_Size_VUV); + + + %% Cesium + + clear radius s2x_c s2y_c drift_time s1_phe_both_xyz s2_phe_bottom_xyz S2_numelectrons_VUV +load('C:\Program Files\MATLAB\R2012a\bin\DokeWithDQSE\Run03_Cs_DQ_SE.mat'); + +n_sig=2; + radius=(s2x_c.^2+s2y_c.^2).^(1/2); + S2_numelectrons_VUV_SatFixed=(25.13/24.78).*S2_numelectrons_VUV_SatFixed; %converting S2/SE to be SE from Kr instead of Cs + + s1_phe_both_xyz_cs=s1_phe_both_xyz_VUV(inrange(drift_time,[30 300]) & inrange(radius,[0 18])); + s2_phe_both_xyz_cs=s2_phe_both_xyz_VUV_SatFixed(inrange(drift_time,[30 300]) & inrange(radius,[0 18])); + s2_phe_both_xyz_cs_e=S2_numelectrons_VUV_SatFixed(inrange(drift_time,[30 300]) & inrange(radius,[0 18])); + s2_phe_both_xyz_cs_e_bot=S2_numelectrons_bot_VUV(inrange(drift_time,[30 300]) & inrange(radius,[0 18])); + + + s1_phe_both_cut_cs=s1_phe_both_xyz_cs( ((log10(s1_phe_both_xyz_cs)+1.*log10(s2_phe_both_xyz_cs)) < 9.1) & ((log10(s1_phe_both_xyz_cs)+1.*log10(s2_phe_both_xyz_cs)) > 8.83)); + s2_phe_both_cut_cs=s2_phe_both_xyz_cs_e( ((log10(s1_phe_both_xyz_cs)+1.*log10(s2_phe_both_xyz_cs)) < 9.1) & ((log10(s1_phe_both_xyz_cs)+1.*log10(s2_phe_both_xyz_cs)) > 8.83)); + + s2_phe_both_cut_cs_bot=s2_phe_both_xyz_cs_e_bot( ((log10(s1_phe_both_xyz_cs)+1.*log10(s2_phe_both_xyz_cs)) < 9.1) & ((log10(s1_phe_both_xyz_cs)+1.*log10(s2_phe_both_xyz_cs)) > 8.83)); + + + clear Fit_kr_E cut_kr_sig_E Fit_kr_E Fit_kr_s1 Fit_kr_s2 cut_kr_sig_s1 cut_kr_sig_s2 + Fit_kr_s1=fit([0:50:6000]',hist(s1_phe_both_cut_cs,[0:50:6000])','gauss1'); + Fit_kr_s2=fit([0:300:30000]',hist(s2_phe_both_cut_cs,[0:300:30000])','gauss1'); + Fit_kr_s1_sig = Fit_kr_s1.c1/sqrt(2); + Fit_kr_s2_sig = Fit_kr_s2.c1/sqrt(2); + Fit_kr_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_cut_cs)); % == sigma/sqrt(N); + Fit_kr_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_both_cut_cs)); % == sigma/sqrt(N); + %cut and fit around 3 sigma of the mean, after the first guess + cut_kr_sig_s1= inrange(s1_phe_both_cut_cs,[Fit_kr_s1.b1-n_sig*Fit_kr_s1_sig Fit_kr_s1.b1+n_sig*Fit_kr_s1_sig]); + Fit_kr_s1=fit([0:50:6000]',hist(s1_phe_both_cut_cs(cut_kr_sig_s1),[0:50:6000])','gauss1'); + cut_kr_sig_s2= inrange(s2_phe_both_cut_cs,[Fit_kr_s2.b1-n_sig*Fit_kr_s2_sig Fit_kr_s2.b1+n_sig*Fit_kr_s2_sig]); + Fit_kr_s2=fit([0:300:30000]',hist(s2_phe_both_cut_cs(cut_kr_sig_s2),[0:300:30000])','gauss1'); + Fit_kr_s1_sig = Fit_kr_s1.c1/sqrt(2); + Fit_kr_s2_sig = Fit_kr_s2.c1/sqrt(2); + Cs_S1Mu=Fit_kr_s1.b1; + Cs_S1Sig=Fit_kr_s1_sig; + Cs_S2Mu=Fit_kr_s2.b1; + Cs_S2Sig=Fit_kr_s2_sig; + Cs_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_cut_cs(cut_kr_sig_s1))); % == sigma/sqrt(N); + Cs_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_both_cut_cs(cut_kr_sig_s2))); % == sigma/sqrt(N); + + Cs_SE=mean(SE_Size_VUV); + + %Get Old Cesium point v New cesium point CHANGE THE HISTO RANGE + %HERE!!!! + clear Fit_kr_E cut_kr_sig_E Fit_kr_E Fit_kr_s1 Fit_kr_s2 cut_kr_sig_s1 cut_kr_sig_s2 + Fit_kr_s1=fit([0:50:6000]',hist(s1_phe_both_cut_cs,[0:50:6000])','gauss1'); + Fit_kr_s2=fit([0:300:30000]',hist(s2_phe_both_cut_cs_bot,[0:300:30000])','gauss1'); + Fit_kr_s1_sig = Fit_kr_s1.c1/sqrt(2); + Fit_kr_s2_sig = Fit_kr_s2.c1/sqrt(2); + Fit_kr_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_cut_cs)); % == sigma/sqrt(N); + Fit_kr_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_both_cut_cs_bot)); % == sigma/sqrt(N); + %cut and fit around 3 sigma of the mean, after the first guess + cut_kr_sig_s1= inrange(s1_phe_both_cut_cs,[Fit_kr_s1.b1-n_sig*Fit_kr_s1_sig Fit_kr_s1.b1+n_sig*Fit_kr_s1_sig]); + Fit_kr_s1=fit([0:50:6000]',hist(s1_phe_both_cut_cs(cut_kr_sig_s1),[0:50:6000])','gauss1'); + cut_kr_sig_s2= inrange(s2_phe_both_cut_cs_bot,[Fit_kr_s2.b1-n_sig*Fit_kr_s2_sig Fit_kr_s2.b1+n_sig*Fit_kr_s2_sig]); + Fit_kr_s2=fit([0:300:30000]',hist(s2_phe_both_cut_cs_bot(cut_kr_sig_s2),[0:300:30000])','gauss1'); + Fit_kr_s1_sig = Fit_kr_s1.c1/sqrt(2); + Fit_kr_s2_sig = Fit_kr_s2.c1/sqrt(2); + Cs_S1Mu_bot=Fit_kr_s1.b1; + Cs_S1Sig_bot=Fit_kr_s1_sig; + Cs_S2Mu_bot=Fit_kr_s2.b1; + Cs_S2Sig_bot=Fit_kr_s2_sig; + Cs_s1_meanerr_bot = Fit_kr_s1_sig/sqrt(length(s1_phe_both_cut_cs(cut_kr_sig_s1))); % == sigma/sqrt(N); + Cs_s2_meanerr_bot = Fit_kr_s2_sig/sqrt(length(s2_phe_both_cut_cs(cut_kr_sig_s2))); % == sigma/sqrt(N); + + %Extra error from total - bot difference +% Cs_extra_err=abs(Cs_S2Mu-Cs_S2Mu_bot); + + + %% Xe Activation Lines + clear radius s2x_c s2y_c drift_time s1_phe_both_xyz s2_phe_bottom_xyz S2_numelectrons_VUV +load('C:\Program Files\MATLAB\R2012a\bin\DokeWithDQSE\Run03_XeAct_DQ_SE.mat'); %Load Patched Kr Data + +%Converting to SE from Kr +S2_numelectrons_VUV_SatFixed=(25.81/24.66).*S2_numelectrons_VUV_SatFixed; + +n_sig=3; + radius=(s2x_c.^2+s2y_c.^2).^(1/2); + + s1_phe_both_xyz_act=s1_phe_both_xyz_VUV(inrange(drift_time,[30 300]) & inrange(radius,[0 18])); + s2_phe_bottom_xyz_act=s2_phe_both_xyz_VUV_SatFixed(inrange(drift_time,[30 300]) & inrange(radius,[0 18])); + s2_phe_bottom_xyz_act_e=S2_numelectrons_VUV_SatFixed(inrange(drift_time,[30 300]) & inrange(radius,[0 18])); %this is really s2 both, just wasnt renamed + + + clear Fit_kr_E cut_kr_sig_E Fit_kr_E Fit_kr_s1 Fit_kr_s2 cut_kr_sig_s1 cut_kr_sig_s2 + %Xe131m at 163.9 keV DONE +% + s1_phe_both_131=s1_phe_both_xyz_act( ((log10(s1_phe_both_xyz_act)+0.6*log10(s2_phe_bottom_xyz_act)) < 5.85) & ((log10(s1_phe_both_xyz_act)+1.6.*log10(s2_phe_bottom_xyz_act)) > 5.65) & s2_phe_bottom_xyz_act > 10000); + s2_phe_bottom_131=s2_phe_bottom_xyz_act_e( ((log10(s1_phe_both_xyz_act)+0.6*log10(s2_phe_bottom_xyz_act)) < 5.85) & ((log10(s1_phe_both_xyz_act)+1.6.*log10(s2_phe_bottom_xyz_act)) > 5.65) & s2_phe_bottom_xyz_act > 10000); + Fit_kr_s1=fit([500:5:1500]',hist(s1_phe_both_131(inrange(s1_phe_both_131,[500 1500])),[500:5:1500])','gauss1'); + Fit_kr_s2=fit([500:30:4000]',hist(s2_phe_bottom_131(inrange(s2_phe_bottom_131,[500 4000])),[500:30:4000])','gauss1'); + Fit_kr_s1_sig = Fit_kr_s1.c1/sqrt(2); + Fit_kr_s2_sig = Fit_kr_s2.c1/sqrt(2); + Fit_kr_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_131(inrange(s1_phe_both_131,[500 1500])))); % == sigma/sqrt(N); + Fit_kr_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_bottom_131(inrange(s2_phe_bottom_131,[500 4000])))); % == sigma/sqrt(N); + %cut and fit around 3 sigma of the mean, after the first guess + cut_kr_sig_s1= inrange(s1_phe_both_131,[Fit_kr_s1.b1-n_sig*Fit_kr_s1_sig Fit_kr_s1.b1+n_sig*Fit_kr_s1_sig]); + Fit_kr_s1=fit([500:5:1500]',hist(s1_phe_both_131(cut_kr_sig_s1),[500:5:1500])','gauss1'); + cut_kr_sig_s2= inrange(s2_phe_bottom_131,[Fit_kr_s2.b1-n_sig*Fit_kr_s2_sig Fit_kr_s2.b1+n_sig*Fit_kr_s2_sig]); + Fit_kr_s2=fit([500:30:4000]',hist(s2_phe_bottom_131(cut_kr_sig_s2),[500:30:4000])','gauss1'); + Fit_kr_s1_sig = Fit_kr_s1.c1/sqrt(2); + Fit_kr_s2_sig = Fit_kr_s2.c1/sqrt(2); + Xe131_S1Mu=Fit_kr_s1.b1; + Xe131_S1Sig=Fit_kr_s1_sig; + Xe131_S2Mu=Fit_kr_s2.b1; + Xe131_S2Sig=Fit_kr_s2_sig; + Xe131_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_131(cut_kr_sig_s1))); % == sigma/sqrt(N); + Xe131_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_bottom_131(cut_kr_sig_s2))); % == sigma/sqrt(N); + + clear Fit_kr_E cut_kr_sig_E Fit_kr_E Fit_kr_s1 Fit_kr_s2 cut_kr_sig_s1 cut_kr_sig_s2 + % Xe127 at 207.3 keV Very shitty stats DONE + s1_phe_both_127=s1_phe_both_xyz_act( ((log10(s1_phe_both_xyz_act)+0.6.*log10(s2_phe_bottom_xyz_act)) < 5.96) & ((log10(s1_phe_both_xyz_act)+0.6.*log10(s2_phe_bottom_xyz_act)) > 5.85) & s2_phe_bottom_xyz_act > 10000); + s2_phe_bottom_127=s2_phe_bottom_xyz_act_e( ((log10(s1_phe_both_xyz_act)+0.6.*log10(s2_phe_bottom_xyz_act)) < 5.96) & ((log10(s1_phe_both_xyz_act)+0.6.*log10(s2_phe_bottom_xyz_act)) > 5.85) & s2_phe_bottom_xyz_act > 10000); + Fit_kr_s1=fit([600:10:1800]',hist(s1_phe_both_127(inrange(s1_phe_both_127,[600 1800])),[600:10:1800])','gauss1'); + Fit_kr_s2=fit([500:40:5500]',hist(s2_phe_bottom_127(inrange(s2_phe_bottom_127,[500 5500])),[500:40:5500])','gauss1'); + Fit_kr_s1_sig = Fit_kr_s1.c1/sqrt(2); + Fit_kr_s2_sig = Fit_kr_s2.c1/sqrt(2); + Fit_kr_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_127(inrange(s1_phe_both_127,[600 1800])))); % == sigma/sqrt(N); + Fit_kr_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_bottom_127(inrange(s2_phe_bottom_127,[500 5500])))); % == sigma/sqrt(N); + %cut and fit around 3 sigma of the mean, after the first guess + cut_kr_sig_s1= inrange(s1_phe_both_127,[Fit_kr_s1.b1-n_sig*Fit_kr_s1_sig Fit_kr_s1.b1+n_sig*Fit_kr_s1_sig]); + Fit_kr_s1=fit([600:10:1800]',hist(s1_phe_both_127(cut_kr_sig_s1),[600:10:1800])','gauss1'); + cut_kr_sig_s2= inrange(s2_phe_bottom_127,[Fit_kr_s2.b1-n_sig*Fit_kr_s2_sig Fit_kr_s2.b1+n_sig*Fit_kr_s2_sig]); + Fit_kr_s2=fit([500:40:5500]',hist(s2_phe_bottom_127(cut_kr_sig_s2),[500:40:5500])','gauss1'); + Fit_kr_s1_sig = Fit_kr_s1.c1/sqrt(2); + Fit_kr_s2_sig = Fit_kr_s2.c1/sqrt(2); + Xe127_S1Mu=Fit_kr_s1.b1; + Xe127_S1Sig=Fit_kr_s1_sig; + Xe127_S2Mu=Fit_kr_s2.b1; + Xe127_S2Sig=Fit_kr_s2_sig; + Xe127_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_127(cut_kr_sig_s1))); % == sigma/sqrt(N); + Xe127_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_bottom_127(cut_kr_sig_s2))); % == sigma/sqrt(N); + + clear Fit_kr_E cut_kr_sig_E Fit_kr_E Fit_kr_s1 Fit_kr_s2 cut_kr_sig_s1 cut_kr_sig_s2 + % Xe129m at 236.1 keV DONE + s1_phe_both_129=s1_phe_both_xyz_act( ((log10(s1_phe_both_xyz_act)+0.6.*log10(s2_phe_bottom_xyz_act)) < 6.12) & ((log10(s1_phe_both_xyz_act)+0.6.*log10(s2_phe_bottom_xyz_act)) > 5.96) & s2_phe_bottom_xyz_act > 10000 ); + s2_phe_bottom_129=s2_phe_bottom_xyz_act_e( ((log10(s1_phe_both_xyz_act)+0.6.*log10(s2_phe_bottom_xyz_act)) < 6.12) & ((log10(s1_phe_both_xyz_act)+0.6.*log10(s2_phe_bottom_xyz_act)) > 5.96) & s2_phe_bottom_xyz_act > 10000 ); + Fit_kr_s1=fit([600:10:2000]',hist(s1_phe_both_129(inrange(s1_phe_both_129,[600 2000])),[600:10:2000])','gauss1'); + Fit_kr_s2=fit([500:30:6000]',hist(s2_phe_bottom_129(inrange(s2_phe_bottom_129,[500 6000])),[500:30:6000])','gauss1'); + Fit_kr_s1_sig = Fit_kr_s1.c1/sqrt(2); + Fit_kr_s2_sig = Fit_kr_s2.c1/sqrt(2); + Fit_kr_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_129(inrange(s1_phe_both_129,[600 2000])))); % == sigma/sqrt(N); + Fit_kr_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_bottom_129(inrange(s2_phe_bottom_129,[500 6000])))); % == sigma/sqrt(N); + %cut and fit around 3 sigma of the mean, after the first guess + cut_kr_sig_s1= inrange(s1_phe_both_129,[Fit_kr_s1.b1-n_sig*Fit_kr_s1_sig Fit_kr_s1.b1+n_sig*Fit_kr_s1_sig]); + Fit_kr_s1=fit([600:10:2000]',hist(s1_phe_both_129(cut_kr_sig_s1),[600:10:2000])','gauss1'); + cut_kr_sig_s2= inrange(s2_phe_bottom_129,[Fit_kr_s2.b1-n_sig*Fit_kr_s2_sig Fit_kr_s2.b1+n_sig*Fit_kr_s2_sig]); + Fit_kr_s2=fit([500:30:6000]',hist(s2_phe_bottom_129(cut_kr_sig_s2),[500:30:6000])','gauss1'); + Fit_kr_s1_sig = Fit_kr_s1.c1/sqrt(2); + Fit_kr_s2_sig = Fit_kr_s2.c1/sqrt(2); + Xe129_S1Mu=Fit_kr_s1.b1; + Xe129_S1Sig=Fit_kr_s1_sig; + Xe129_S2Mu=Fit_kr_s2.b1; + Xe129_S2Sig=Fit_kr_s2_sig; + Xe129_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_129(cut_kr_sig_s1))); % == sigma/sqrt(N); + Xe129_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_bottom_129(cut_kr_sig_s2))); % == sigma/sqrt(N); + + + + clear Fit_kr_E cut_kr_sig_E Fit_kr_E Fit_kr_s1 Fit_kr_s2 cut_kr_sig_s1 cut_kr_sig_s2 + % Xe127 at 410 keV DONE + s1_phe_both_127_2=s1_phe_both_xyz_act( ((log10(s1_phe_both_xyz_act)+0.6.*log10(s2_phe_bottom_xyz_act)) < 6.5) & ((log10(s1_phe_both_xyz_act)+0.6.*log10(s2_phe_bottom_xyz_act)) > 6.3) & s2_phe_bottom_xyz_act > 10000 ); + s2_phe_bottom_127_2=s2_phe_bottom_xyz_act_e( ((log10(s1_phe_both_xyz_act)+0.6.*log10(s2_phe_bottom_xyz_act)) < 6.5) & ((log10(s1_phe_both_xyz_act)+0.6.*log10(s2_phe_bottom_xyz_act)) > 6.3) & s2_phe_bottom_xyz_act > 10000 ); + Fit_kr_s1=fit([600:20:3500]',hist(s1_phe_both_127_2(inrange(s1_phe_both_127_2,[600 3500])),[600:20:3500])','gauss1'); + Fit_kr_s2=fit([1000:50:15000]',hist(s2_phe_bottom_127_2(inrange(s2_phe_bottom_127_2,[1000 15000])),[1000:50:15000])','gauss1'); + Fit_kr_s1_sig = Fit_kr_s1.c1/sqrt(2); + Fit_kr_s2_sig = Fit_kr_s2.c1/sqrt(2); + Fit_kr_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_127_2(inrange(s1_phe_both_127_2,[600 3500])))); % == sigma/sqrt(N); + Fit_kr_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_bottom_127_2(inrange(s2_phe_bottom_127_2,[1000 15000])))); % == sigma/sqrt(N); + %cut and fit around 3 sigma of the mean, after the first guess + cut_kr_sig_s1= inrange(s1_phe_both_127_2,[Fit_kr_s1.b1-n_sig*Fit_kr_s1_sig Fit_kr_s1.b1+n_sig*Fit_kr_s1_sig]); + Fit_kr_s1=fit([600:20:3500]',hist(s1_phe_both_127_2(cut_kr_sig_s1),[600:20:3500])','gauss1'); + cut_kr_sig_s2= inrange(s2_phe_bottom_127_2,[Fit_kr_s2.b1-n_sig*Fit_kr_s2_sig Fit_kr_s2.b1+n_sig*Fit_kr_s2_sig]); + Fit_kr_s2=fit([1000:50:15000]',hist(s2_phe_bottom_127_2(cut_kr_sig_s2),[1000:50:15000])','gauss1'); + Fit_kr_s1_sig = Fit_kr_s1.c1/sqrt(2); + Fit_kr_s2_sig = Fit_kr_s2.c1/sqrt(2); + Xe127_2_S1Mu=Fit_kr_s1.b1; + Xe127_2_S1Sig=Fit_kr_s1_sig; + Xe127_2_S2Mu=Fit_kr_s2.b1; + Xe127_2_S2Sig=Fit_kr_s2_sig; + Xe127_2_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_127_2(cut_kr_sig_s1))); % == sigma/sqrt(N); + Xe127_2_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_bottom_127_2(cut_kr_sig_s2))); % == sigma/sqrt(N); + +% Bi-214 at 607 keV (shitty stats) DONE + s1_phe_both_214=s1_phe_both_xyz_act( ((log10(s1_phe_both_xyz_act)+0.8.*log10(s2_phe_bottom_xyz_act)) < 7.85) & ((log10(s1_phe_both_xyz_act)+0.8.*log10(s2_phe_bottom_xyz_act)) > 7.65) & s2_phe_bottom_xyz_act > 10000 ); + s2_phe_bottom_214=s2_phe_bottom_xyz_act_e( ((log10(s1_phe_both_xyz_act)+0.8.*log10(s2_phe_bottom_xyz_act)) < 7.85) & ((log10(s1_phe_both_xyz_act)+0.8.*log10(s2_phe_bottom_xyz_act)) > 7.65) & s2_phe_bottom_xyz_act > 10000 ); + Fit_kr_s1=fit([0:50:5000]',hist(s1_phe_both_214(inrange(s1_phe_both_214,[0 5000])),[0:50:5000])','gauss1'); + Fit_kr_s2=fit([0:200:20000]',hist(s2_phe_bottom_214(inrange(s2_phe_bottom_214,[0 20000])),[0:200:20000])','gauss1'); + Fit_kr_s1_sig = Fit_kr_s1.c1/sqrt(2); + Fit_kr_s2_sig = Fit_kr_s2.c1/sqrt(2); + Fit_kr_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_214(inrange(s1_phe_both_214,[0 5000])))); % == sigma/sqrt(N); + Fit_kr_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_bottom_214(inrange(s2_phe_bottom_214,[0 20000])))); % == sigma/sqrt(N); + %cut and fit around 3 sigma of the mean, after the first guess + cut_kr_sig_s1= inrange(s1_phe_both_214,[Fit_kr_s1.b1-n_sig*Fit_kr_s1_sig Fit_kr_s1.b1+n_sig*Fit_kr_s1_sig]); + Fit_kr_s1=fit([0:50:5000]',hist(s1_phe_both_214(cut_kr_sig_s1),[0:50:5000])','gauss1'); + cut_kr_sig_s2= inrange(s2_phe_bottom_214,[Fit_kr_s2.b1-n_sig*Fit_kr_s2_sig Fit_kr_s2.b1+n_sig*Fit_kr_s2_sig]); + Fit_kr_s2=fit([0:200:20000]',hist(s2_phe_bottom_214(cut_kr_sig_s2),[0:200:20000])','gauss1'); + Fit_kr_s1_sig = Fit_kr_s1.c1/sqrt(2); + Fit_kr_s2_sig = Fit_kr_s2.c1/sqrt(2); + Bi214_S1Mu=Fit_kr_s1.b1; + Bi214_S1Sig=Fit_kr_s1_sig; + Bi214_S2Mu=Fit_kr_s2.b1; + Bi214_S2Sig=Fit_kr_s2_sig; + Bi214_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_214(cut_kr_sig_s1))); % == sigma/sqrt(N); + Bi214_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_bottom_214(cut_kr_sig_s2))); % == sigma/sqrt(N); + + + +Tot_bot_diffs = [16.2959 24.5270 0.8642 629.6990 54.5295 106.4575 138.0665 124.6813 552.9506]; %S2 Total v S2 bot differences + +%Inlcuded errors: +%S1 variation over time, based on Kr170: 1.9799 +%S2/SE variation over time, based on Kr170: 9.3597 +%Stat error on Mean fit (_s1_meanerr and s2_meanerr) +%Error in using top v bot S2 (ToT_bot_diffs) +%Saturation error, such as (Cs_S2Mu*0.055).^2 + + for count=1:5; %attila does 5 iterations + %% Make Doke plot + S1_OverE_keV=[Kr_170_S1Mu/41.55 Kr_100_S1Mu/41.55 Kr_50_S1Mu/41.55 Cs_S1Mu/661.657 Xe131_S1Mu/163.9 Xe129_S1Mu/236.1 Xe127_S1Mu/208.3 Xe127_2_S1Mu/408.791 Bi214_S1Mu/609.312]; %Bi214_S1Mu/607 Xe127_S1Mu/207.3 + S2_OverE_keV=[Kr_170_S2Mu/41.55 Kr_100_S2Mu/41.55 Kr_50_S2Mu/41.55 Cs_S2Mu/661.657 Xe131_S2Mu/163.9 Xe129_S2Mu/236.1 Xe127_S2Mu/208.3 Xe127_2_S2Mu/408.791 Bi214_S2Mu/609.312]; %Bi214_S2Mu/607 Xe127_S2Mu/207.3 + + S1_mean_sig=[(Kr_170_s1_meanerr.^2 + 1.9799.^2).^(1/2) (Kr_100_s1_meanerr.^2 + (1.9799*Kr_100_S1Mu/Kr_170_S1Mu).^2).^(1/2) (Kr_50_s1_meanerr.^2 + (1.9799*Kr_50_S1Mu/Kr_170_S1Mu).^2).^(1/2) (Cs_s1_meanerr.^2 + (1.9799*Cs_S1Mu/Kr_170_S1Mu).^2).^(1/2)... + (Xe131_s1_meanerr.^2 + (1.9799*Xe131_S1Mu/Kr_170_S1Mu).^2).^(1/2) (Xe129_s1_meanerr.^2 + (1.9799*Xe129_S1Mu/Kr_170_S1Mu).^2).^(1/2) (Xe127_s1_meanerr.^2 + (1.9799*Xe127_S1Mu/Kr_170_S1Mu).^2).^(1/2)... + (Xe127_2_s1_meanerr + (1.9799*Xe127_2_S1Mu/Kr_170_S1Mu).^2).^(1/2) (Bi214_s1_meanerr + (1.9799*Bi214_S1Mu/Kr_170_S1Mu).^2).^(1/2)]; % + S2_mean_sig=[((Kr_170_S2Mu*0.01).^2 + Kr_170_s2_meanerr.^2 + Tot_bot_diffs(1).^2 + 9.3597.^2).^(1/2) ((Kr_100_S2Mu*0.01).^2 + Kr_100_s2_meanerr.^2 + Tot_bot_diffs(2).^2 + (9.3597*Kr_100_S2Mu/Kr_170_S2Mu).^2).^(1/2) ((Kr_50_S2Mu*0.01).^2 + Kr_50_s2_meanerr.^2 + Tot_bot_diffs(3).^2 + (9.3597*Kr_50_S2Mu/Kr_170_S2Mu).^2).^(1/2) ((Cs_S2Mu*0.01).^2 + (Cs_S2Mu*0.055).^2 + Cs_s2_meanerr.^2 + Tot_bot_diffs(4).^2 + (9.3597*Cs_S2Mu/Kr_170_S2Mu).^2).^(1/2)... + ((Xe131_S2Mu*0.01).^2 + Xe131_s2_meanerr.^2 + Tot_bot_diffs(5).^2 + (9.3597*Xe131_S2Mu/Kr_170_S2Mu).^2).^(1/2) ((Xe129_S2Mu*0.01).^2 + Xe129_s2_meanerr.^2 + Tot_bot_diffs(6).^2 + (9.3597*Xe129_S2Mu/Kr_170_S2Mu).^2).^(1/2) ((Xe127_S2Mu*0.01).^2 + Xe127_s2_meanerr.^2 + Tot_bot_diffs(7).^2 + (9.3597*Xe127_S2Mu/Kr_170_S2Mu).^2).^(1/2)... + ((Xe127_2_S2Mu*0.01).^2 + Xe127_2_s2_meanerr.^2 + Tot_bot_diffs(8).^2 + (9.3597*Xe127_2_S2Mu/Kr_170_S2Mu).^2).^(1/2) ((Bi214_S2Mu*0.01).^2 + Bi214_s2_meanerr.^2 + Tot_bot_diffs(9).^2+ (9.3597*Bi214_S2Mu/Kr_170_S2Mu).^2).^(1/2)]; % + + Energies=[41.55;41.55;41.55;661.657;163.9;236.1;208.3;408.791;609.312]; %in keV %607 is Bi ;207.3 is Xe127 + + %Doing MCMC + clear data model options + data.xdata=S2_OverE_keV'; data.ydata=S1_OverE_keV'; %setting up data + data.xdataerr=(S2_mean_sig./(Energies'))'; data.ydataerr=(S1_mean_sig./(Energies'))'; + +modelfun = @(x,theta) theta(1).*x+theta(2); +inv_sigma2 = @(theta,data) 1./( (theta(1).*data.xdataerr).^2 + data.ydataerr.^2); +ssfun = @(theta,data) 0.5.*( sum( (data.ydata - modelfun(data.xdata,theta)).^2.*inv_sigma2(theta,data) - log(inv_sigma2(theta,data)) )); + +[tmin,ssmin]=fminsearch(ssfun,[-0.1;7.3],[],data); %minimizing sum of squares + n = length(data.xdata); %number of data points + p = 2; %number of parameters in model (slope and intercept) + mse = ssmin/(n-p); % estimate for the error variance + + %setting up variables for MCMC code + params = {{'theta1', tmin(1), -1} {'theta2', tmin(2), 0}}; + model.ssfun = ssfun; + options.nsimu = 50000; + [res,chain,s2chain] = mcmcrun(model,data,params,options); + + + + g1=mean(chain(:,2))/73 % W=1/73 [keV/Phe] + EE=-mean(chain(:,2))/mean(chain(:,1))/73 + +%Previous way of getting errors -- INCORRECT METHOD +% sig_g1=std(chain(:,2))/73 +% sig_EE=1/73 * sqrt( (std(chain(:,2))/mean(chain(:,1)))^2 + (std(chain(:,1))*mean(chain(:,2))/mean(chain(:,1))^2)^2 ) + +%Getting Errors + clear g1_chain EE_chain + g1_chain=(chain(:,2))./73; % W=1/73 [keV/Phe] + EE_chain=-chain(:,2)./chain(:,1)./73; + g2_chain=24.66.*EE_chain; + +%cov_g1_EE and cov_g1_g2 are consistent when no SE systematic is added in +cov_g1_EE=cov(g1_chain,EE_chain); +cov_g1_1g2=cov(g1_chain,1./g2_chain); + cov_g1_1g2(2,2)=cov_g1_1g2(2,2)+(0.258/(25.2*25.2))^2; %Adding in error on SE +cov_g1_g2=cov(g1_chain,g2_chain); + cov_g1_g2(2,2)=cov_g1_g2(2,2)+0.258^2;%Adding in error on SE +cov_m_b=cov(chain(:,1),chain(:,2)); +sig_g1=sqrt(cov_g1_EE(1,1)); +sig_g2=sqrt(cov_g1_g2(2,2)); +sig_EE=sqrt(cov_g1_EE(2,2)); + +% %Doke Plot +% Doke_fig=figure; +% x = linspace(0,250)'; +% modelfun = @(x,theta) theta(1)*x + theta(2); %setting up model +% out = mcmcpred(res,chain,[],x,modelfun); +% mcmcpredplot(out); %plots 50,90,95, and 99% bands +% hold on; +% %Making Doke plot +% scatter(S2_OverE_keV, S1_OverE_keV,150,Energies,'o','fill','linewidth',1,'markeredgecolor','k'); +% xlabel('S2/E = n_e/(n_e+n_\gamma) \times g2/(W*SE) [electrons/keV] '); +% ylabel('S1/E = n_\gamma/(n_e+n_\gamma) \times g1/W [Phe/keV] '); +% % set(gca,'ytick',[3.8:.2:5.8]);set(gca,'xtick',[80:20:200]); +% h_c=colorbar;caxis([0 700]); box on; +% myfigview(16); ylabel(h_c,'Energy [keV] ','fontsize',20); +% for i=1:length(Energies) +% plot([S2_OverE_keV(i)-S2_mean_sig(i)./(Energies(i)) S2_OverE_keV(i)+S2_mean_sig(i)./(Energies(i))],[S1_OverE_keV(i) S1_OverE_keV(i)],'-k','LineWidth',2) +% plot([S2_OverE_keV(i) S2_OverE_keV(i)],[S1_OverE_keV(i)-S1_mean_sig(i)/(Energies(i)) S1_OverE_keV(i)+S1_mean_sig(i)/(Energies(i))],'-k','LineWidth',2) +% end +% xlim([5 30]);ylim([3.8 7.5]); +% set(gca,'ytick',[3.5:.25:8]);set(gca,'xtick',[0:2:30]); +% text(16,6.5,strcat('Best fit: \newline g1=',num2str(g1,3),'\pm',num2str(sig_g1,1),'\newline','EE=',num2str(EE,3),'\pm',num2str(sig_EE,'%1.2f')),'FontSize',16) +% + clear Fit_kr_E cut_kr_sig_E Fit_kr_E Fit_kr_s1 Fit_kr_s2 cut_kr_sig_s1 cut_kr_sig_s2 + + %Redo Kr170 + n_sig_stat=4; + n_sig=3; + E_com_kr170=1/73.*(s1_phe_both_xyz_kr170/g1 + s2_phe_bottom_xyz_kr170/(EE)); + %Cuts on combined energy + Fit_kr_E=fit([30:0.2:60]',hist(E_com_kr170,[30:0.2:60])','gauss1'); + cut_kr_sig_E= inrange(E_com_kr170,[Fit_kr_E.b1-n_sig*Fit_kr_E.c1/sqrt(2) Fit_kr_E.b1+n_sig*Fit_kr_E.c1/sqrt(2)]); +%Fits to energy cut + Fit_kr_s1=fit([0:1:600]',hist(s1_phe_both_xyz_kr170(cut_kr_sig_E ),[0:1:600])','gauss1'); + Fit_kr_s2=fit([0:2:1000]',hist(s2_phe_bottom_xyz_kr170(cut_kr_sig_E ),[0:2:1000])','gauss1'); + Fit_kr_s1_sig = Fit_kr_s1.c1/sqrt(2); + Fit_kr_s2_sig = Fit_kr_s2.c1/sqrt(2); + Fit_kr_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_xyz_kr170(cut_kr_sig_E ))); % == sigma/sqrt(N); + Fit_kr_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_bottom_xyz_kr170(cut_kr_sig_E ))); % == sigma/sqrt(N); +%Fits to energy cut and sigma cut + cut_kr_sig_s1= inrange(s1_phe_both_xyz_kr170,[Fit_kr_s1.b1-n_sig*Fit_kr_s1_sig Fit_kr_s1.b1+n_sig*Fit_kr_s1_sig]); + Fit_kr_s1=fit([0:1:600]',hist(s1_phe_both_xyz_kr170(cut_kr_sig_E & cut_kr_sig_s1),[0:1:600])','gauss1'); + cut_kr_sig_s2= inrange(s2_phe_bottom_xyz_kr170,[Fit_kr_s2.b1-n_sig*Fit_kr_s2_sig Fit_kr_s2.b1+n_sig*Fit_kr_s2_sig]); + Fit_kr_s2=fit([0:2:1000]',hist(s2_phe_bottom_xyz_kr170(cut_kr_sig_E & cut_kr_sig_s2),[0:2:1000])','gauss1'); + Kr_170_S1Mu=Fit_kr_s1.b1; + Kr_170_S1Sig=Fit_kr_s1_sig; + Kr_170_S2Mu=Fit_kr_s2.b1; + Kr_170_S2Sig=Fit_kr_s2_sig; + Kr_170_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_xyz_kr170(cut_kr_sig_E & cut_kr_sig_s2))); % == sigma/sqrt(N); + Kr_170_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_bottom_xyz_kr170(cut_kr_sig_E & cut_kr_sig_s2))); % == sigma/sqrt(N); + Kr170_fit_s1=Fit_kr_s1; + Kr170_fit_s2=Fit_kr_s2; + Kr170_fit_E=Fit_kr_E; + + clear Fit_kr_E cut_kr_sig_E Fit_kr_E Fit_kr_s1 Fit_kr_s2 cut_kr_sig_s1 cut_kr_sig_s2 + %Redo Kr100 + E_com_kr100=1/73.*(s1_phe_both_xyz_kr100/g1 + s2_phe_both_xyz_kr100/(EE)); + n_sig=3; + %Cuts on combined energy + Fit_kr_E=fit([30:0.2:60]',hist(E_com_kr100,[30:0.2:60])','gauss1'); + cut_kr_sig_E= inrange(E_com_kr100,[Fit_kr_E.b1-n_sig*Fit_kr_E.c1/sqrt(2) Fit_kr_E.b1+n_sig*Fit_kr_E.c1/sqrt(2)]); +%Fits to energy cut + Fit_kr_s1=fit([0:1:600]',hist(s1_phe_both_xyz_kr100(cut_kr_sig_E ),[0:1:600])','gauss1'); + Fit_kr_s2=fit([0:2:1000]',hist(s2_phe_both_xyz_kr100(cut_kr_sig_E ),[0:2:1000])','gauss1'); + Fit_kr_s1_sig = Fit_kr_s1.c1/sqrt(2); + Fit_kr_s2_sig = Fit_kr_s2.c1/sqrt(2); + Fit_kr_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_xyz_kr100(cut_kr_sig_E ))); % == sigma/sqrt(N); + Fit_kr_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_both_xyz_kr100(cut_kr_sig_E ))); % == sigma/sqrt(N); +%Fits to energy cut and sigma cut + cut_kr_sig_s1= inrange(s1_phe_both_xyz_kr100,[Fit_kr_s1.b1-n_sig*Fit_kr_s1_sig Fit_kr_s1.b1+n_sig*Fit_kr_s1_sig]); + Fit_kr_s1=fit([0:1:600]',hist(s1_phe_both_xyz_kr100(cut_kr_sig_E & cut_kr_sig_s1),[0:1:600])','gauss1'); + cut_kr_sig_s2= inrange(s2_phe_both_xyz_kr100,[Fit_kr_s2.b1-n_sig*Fit_kr_s2_sig Fit_kr_s2.b1+n_sig*Fit_kr_s2_sig]); + Fit_kr_s2=fit([0:2:1000]',hist(s2_phe_both_xyz_kr100(cut_kr_sig_E & cut_kr_sig_s2),[0:2:1000])','gauss1'); + Kr_100_S1Mu=Fit_kr_s1.b1; + Kr_100_S1Sig=Fit_kr_s1_sig; + Kr_100_S2Mu=Fit_kr_s2.b1; + Kr_100_S2Sig=Fit_kr_s2_sig; + Kr_100_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_xyz_kr100(cut_kr_sig_E & cut_kr_sig_s2))); % == sigma/sqrt(N); + Kr_100_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_both_xyz_kr100(cut_kr_sig_E & cut_kr_sig_s2))); % == sigma/sqrt(N); + Kr100_fit_s1=Fit_kr_s1; + Kr100_fit_s2=Fit_kr_s2; + Kr100_fit_E=Fit_kr_E; + + clear Fit_kr_E cut_kr_sig_E Fit_kr_E Fit_kr_s1 Fit_kr_s2 cut_kr_sig_s1 cut_kr_sig_s2 + %Redo Kr50 + E_com_kr50=1/73.*(s1_phe_both_xyz_kr50/g1 + s2_phe_bottom_xyz_kr50/(EE)); + n_sig=3; + %Cuts on combined energy + Fit_kr_E=fit([30:0.2:60]',hist(E_com_kr50,[30:0.2:60])','gauss1'); + cut_kr_sig_E= inrange(E_com_kr50,[Fit_kr_E.b1-n_sig*Fit_kr_E.c1/sqrt(2) Fit_kr_E.b1+n_sig*Fit_kr_E.c1/sqrt(2)]); +%Fits to energy cut + Fit_kr_s1=fit([0:1:600]',hist(s1_phe_both_xyz_kr50(cut_kr_sig_E ),[0:1:600])','gauss1'); + Fit_kr_s2=fit([0:2:1000]',hist(s2_phe_bottom_xyz_kr50(cut_kr_sig_E ),[0:2:1000])','gauss1'); + Fit_kr_s1_sig = Fit_kr_s1.c1/sqrt(2); + Fit_kr_s2_sig = Fit_kr_s2.c1/sqrt(2); + Fit_kr_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_xyz_kr50(cut_kr_sig_E ))); % == sigma/sqrt(N); + Fit_kr_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_bottom_xyz_kr50(cut_kr_sig_E ))); % == sigma/sqrt(N); +%Fits to energy cut and sigma cut + cut_kr_sig_s1= inrange(s1_phe_both_xyz_kr50,[Fit_kr_s1.b1-n_sig*Fit_kr_s1_sig Fit_kr_s1.b1+n_sig*Fit_kr_s1_sig]); + Fit_kr_s1=fit([0:1:600]',hist(s1_phe_both_xyz_kr50(cut_kr_sig_E & cut_kr_sig_s1),[0:1:600])','gauss1'); + cut_kr_sig_s2= inrange(s2_phe_bottom_xyz_kr50,[Fit_kr_s2.b1-n_sig*Fit_kr_s2_sig Fit_kr_s2.b1+n_sig*Fit_kr_s2_sig]); + Fit_kr_s2=fit([0:2:1000]',hist(s2_phe_bottom_xyz_kr50(cut_kr_sig_E & cut_kr_sig_s2),[0:2:1000])','gauss1'); + Kr_50_S1Mu=Fit_kr_s1.b1; + Kr_50_S1Sig=Fit_kr_s1_sig; + Kr_50_S2Mu=Fit_kr_s2.b1; + Kr_50_S2Sig=Fit_kr_s2_sig; + Kr_50_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_xyz_kr50(cut_kr_sig_E & cut_kr_sig_s2))); % == sigma/sqrt(N); + Kr_50_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_bottom_xyz_kr50(cut_kr_sig_E & cut_kr_sig_s2))); % == sigma/sqrt(N); + Kr50_fit_s1=Fit_kr_s1; + Kr50_fit_s2=Fit_kr_s2; + Kr50_fit_E=Fit_kr_E; + clear Fit_kr_E cut_kr_sig_E Fit_kr_E Fit_kr_s1 Fit_kr_s2 cut_kr_sig_s1 cut_kr_sig_s2 + + %Redo Cs + n_sig=2; + E_com_cs=1/73.*(s1_phe_both_cut_cs/g1 + s2_phe_both_cut_cs/(EE)); + %Cuts on combined energy + Fit_kr_E=fit([600:2:800]',hist(E_com_cs,[600:2:800])','gauss1'); + cut_kr_sig_E= inrange(E_com_cs,[Fit_kr_E.b1-n_sig*Fit_kr_E.c1/sqrt(2) Fit_kr_E.b1+n_sig*Fit_kr_E.c1/sqrt(2)]); +%Fits to energy cut + Fit_kr_s1=fit([0:50:6000]',hist(s1_phe_both_cut_cs(cut_kr_sig_E),[0:50:6000])','gauss1'); + Fit_kr_s2=fit([0:300:30000]',hist(s2_phe_both_cut_cs(cut_kr_sig_E ),[0:300:30000])','gauss1'); + Fit_kr_s1_sig = Fit_kr_s1.c1/sqrt(2); + Fit_kr_s2_sig = Fit_kr_s2.c1/sqrt(2); + Fit_kr_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_cut_cs(cut_kr_sig_E ))); % == sigma/sqrt(N); + Fit_kr_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_both_cut_cs(cut_kr_sig_E ))); % == sigma/sqrt(N); +%Fits to energy cut and sigma cut + cut_kr_sig_s1= inrange(s1_phe_both_cut_cs,[Fit_kr_s1.b1-n_sig*Fit_kr_s1_sig Fit_kr_s1.b1+n_sig*Fit_kr_s1_sig]); + Fit_kr_s1=fit([0:50:6000]',hist(s1_phe_both_cut_cs(cut_kr_sig_E & cut_kr_sig_s1),[0:50:6000])','gauss1'); + cut_kr_sig_s2= inrange(s2_phe_both_cut_cs,[Fit_kr_s2.b1-n_sig*Fit_kr_s2_sig Fit_kr_s2.b1+n_sig*Fit_kr_s2_sig]); + Fit_kr_s2=fit([0:300:30000]',hist(s2_phe_both_cut_cs(cut_kr_sig_E & cut_kr_sig_s2),[0:300:30000])','gauss1'); + Cs_S1Mu=Fit_kr_s1.b1; + Cs_S1Sig=Fit_kr_s1_sig; + Cs_S2Mu=Fit_kr_s2.b1; + Cs_S2Sig=Fit_kr_s2_sig; + Cs_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_cut_cs(cut_kr_sig_E & cut_kr_sig_s2))); % == sigma/sqrt(N); + Cs_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_both_cut_cs(cut_kr_sig_E & cut_kr_sig_s2))); % == sigma/sqrt(N); + Cs_fit_s1=Fit_kr_s1; + Cs_fit_s2=Fit_kr_s2; + Cs_fit_E=Fit_kr_E; + clear Fit_kr_E cut_kr_sig_E Fit_kr_E Fit_kr_s1 Fit_kr_s2 cut_kr_sig_s1 cut_kr_sig_s2 + +%Redo Xe131m at 163.9 keV (shitty stats) +n_sig=2; + E_com_131=1/73.*(s1_phe_both_131/g1 + s2_phe_bottom_131/(EE)); + %Cuts on combined energy + Fit_kr_E=fit([130:1:200]',hist(E_com_131,[130:1:200])','gauss1'); + cut_kr_sig_E= inrange(E_com_131,[Fit_kr_E.b1-n_sig*Fit_kr_E.c1/sqrt(2) Fit_kr_E.b1+n_sig*Fit_kr_E.c1/sqrt(2)]); +%Fits to energy cut + Fit_kr_s1=fit([500:5:1500]',hist(s1_phe_both_131(cut_kr_sig_E),[500:5:1500])','gauss1'); + Fit_kr_s2=fit([500:30:4000]',hist(s2_phe_bottom_131(cut_kr_sig_E ),[500:30:4000])','gauss1'); + Fit_kr_s1_sig = Fit_kr_s1.c1/sqrt(2); + Fit_kr_s2_sig = Fit_kr_s2.c1/sqrt(2); + Fit_kr_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_131(cut_kr_sig_E ))); % == sigma/sqrt(N); + Fit_kr_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_bottom_131(cut_kr_sig_E ))); % == sigma/sqrt(N); +%Fits to energy cut and sigma cut + cut_kr_sig_s1= inrange(s1_phe_both_131,[Fit_kr_s1.b1-n_sig*Fit_kr_s1_sig Fit_kr_s1.b1+n_sig*Fit_kr_s1_sig]); + Fit_kr_s1=fit([500:5:1500]',hist(s1_phe_both_131(cut_kr_sig_E & cut_kr_sig_s1),[500:5:1500])','gauss1'); + cut_kr_sig_s2= inrange(s2_phe_bottom_131,[Fit_kr_s2.b1-n_sig*Fit_kr_s2_sig Fit_kr_s2.b1+n_sig*Fit_kr_s2_sig]); + Fit_kr_s2=fit([500:30:4000]',hist(s2_phe_bottom_131(cut_kr_sig_E & cut_kr_sig_s2),[500:30:4000])','gauss1'); + Xe131_S1Mu=Fit_kr_s1.b1; + Xe131_S1Sig=Fit_kr_s1_sig; + Xe131_S2Mu=Fit_kr_s2.b1; + Xe131_S2Sig=Fit_kr_s2_sig; + Xe131_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_131(cut_kr_sig_E & cut_kr_sig_s2))); % == sigma/sqrt(N); + Xe131_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_bottom_131(cut_kr_sig_E & cut_kr_sig_s2))); % == sigma/sqrt(N); + Xe131_fit_s1=Fit_kr_s1; + Xe131_fit_s2=Fit_kr_s2; + Xe131_fit_E=Fit_kr_E; + clear Fit_kr_E cut_kr_sig_E Fit_kr_E Fit_kr_s1 Fit_kr_s2 cut_kr_sig_s1 cut_kr_sig_s2 + +%Redo Xe127m at 207.3 +n_sig=1.4; + E_com_127=1/73.*(s1_phe_both_127/g1 + s2_phe_bottom_127/(EE)); + %Cuts on combined energy + Fit_kr_E=fit([160:1:250]',hist(E_com_127,[160:1:250])','gauss1'); + cut_kr_sig_E= inrange(E_com_127,[Fit_kr_E.b1-n_sig*Fit_kr_E.c1/sqrt(2) Fit_kr_E.b1+n_sig*Fit_kr_E.c1/sqrt(2)]); +%Fits to energy cut + Fit_kr_s1=fit([600:10:1800]',hist(s1_phe_both_127(cut_kr_sig_E),[600:10:1800])','gauss1'); + Fit_kr_s2=fit([500:30:5500]',hist(s2_phe_bottom_127(cut_kr_sig_E ),[500:30:5500])','gauss1'); + Fit_kr_s1_sig = Fit_kr_s1.c1/sqrt(2); + Fit_kr_s2_sig = Fit_kr_s2.c1/sqrt(2); + Fit_kr_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_127(cut_kr_sig_E ))); % == sigma/sqrt(N); + Fit_kr_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_bottom_127(cut_kr_sig_E ))); % == sigma/sqrt(N); +%Fits to energy cut and sigma cut + cut_kr_sig_s1= inrange(s1_phe_both_127,[Fit_kr_s1.b1-n_sig*Fit_kr_s1_sig Fit_kr_s1.b1+n_sig*Fit_kr_s1_sig]); + Fit_kr_s1=fit([600:10:1800]',hist(s1_phe_both_127(cut_kr_sig_E & cut_kr_sig_s1),[600:10:1800])','gauss1'); + cut_kr_sig_s2= inrange(s2_phe_bottom_127,[Fit_kr_s2.b1-n_sig*Fit_kr_s2_sig Fit_kr_s2.b1+n_sig*Fit_kr_s2_sig]); + Fit_kr_s2=fit([500:40:5500]',hist(s2_phe_bottom_127(cut_kr_sig_E & cut_kr_sig_s2),[500:40:5500])','gauss1'); + Xe127_S1Mu=Fit_kr_s1.b1; + Xe127_S1Sig=Fit_kr_s1_sig; + Xe127_S2Mu=Fit_kr_s2.b1; + Xe127_S2Sig=Fit_kr_s2_sig; + Xe127_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_127(cut_kr_sig_E & cut_kr_sig_s2))); % == sigma/sqrt(N); + Xe127_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_bottom_127(cut_kr_sig_E & cut_kr_sig_s2))); % == sigma/sqrt(N); + Xe127_fit_s1=Fit_kr_s1; + Xe127_fit_s2=Fit_kr_s2; + Xe127_fit_E=Fit_kr_E; + clear Fit_kr_E cut_kr_sig_E Fit_kr_E Fit_kr_s1 Fit_kr_s2 cut_kr_sig_s1 cut_kr_sig_s2 + +% Redo Xe129 at 236.1 +n_sig=1.5; + E_com_129=1/73.*(s1_phe_both_129/g1 + s2_phe_bottom_129/(EE)); + %Cuts on combined energy + Fit_kr_E=fit([200:1:275]',hist(E_com_129,[200:1:275])','gauss1'); + cut_kr_sig_E= inrange(E_com_129,[Fit_kr_E.b1-n_sig*Fit_kr_E.c1/sqrt(2) Fit_kr_E.b1+n_sig*Fit_kr_E.c1/sqrt(2)]); +%Fits to energy cut + Fit_kr_s1=fit([600:10:2000]',hist(s1_phe_both_129(cut_kr_sig_E),[600:10:2000])','gauss1'); + Fit_kr_s2=fit([500:30:6000]',hist(s2_phe_bottom_129(cut_kr_sig_E ),[500:30:6000])','gauss1'); + Fit_kr_s1_sig = Fit_kr_s1.c1/sqrt(2); + Fit_kr_s2_sig = Fit_kr_s2.c1/sqrt(2); + Fit_kr_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_129(cut_kr_sig_E ))); % == sigma/sqrt(N); + Fit_kr_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_bottom_129(cut_kr_sig_E ))); % == sigma/sqrt(N); +%Fits to energy cut and sigma cut + cut_kr_sig_s1= inrange(s1_phe_both_129,[Fit_kr_s1.b1-n_sig*Fit_kr_s1_sig Fit_kr_s1.b1+n_sig*Fit_kr_s1_sig]); + Fit_kr_s1=fit([600:10:2000]',hist(s1_phe_both_129(cut_kr_sig_E & cut_kr_sig_s1),[600:10:2000])','gauss1'); + cut_kr_sig_s2= inrange(s2_phe_bottom_129,[Fit_kr_s2.b1-n_sig*Fit_kr_s2_sig Fit_kr_s2.b1+n_sig*Fit_kr_s2_sig]); + Fit_kr_s2=fit([500:30:6000]',hist(s2_phe_bottom_129(cut_kr_sig_E & cut_kr_sig_s2),[500:30:6000])','gauss1'); + Xe129_S1Mu=Fit_kr_s1.b1; + Xe129_S1Sig=Fit_kr_s1_sig; + Xe129_S2Mu=Fit_kr_s2.b1; + Xe129_S2Sig=Fit_kr_s2_sig; + Xe129_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_129(cut_kr_sig_E & cut_kr_sig_s2))); % == sigma/sqrt(N); + Xe129_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_bottom_129(cut_kr_sig_E & cut_kr_sig_s2))); % == sigma/sqrt(N); + Xe129_fit_s1=Fit_kr_s1; + Xe129_fit_s2=Fit_kr_s2; + Xe129_fit_E=Fit_kr_E; + clear Fit_kr_E cut_kr_sig_E Fit_kr_E Fit_kr_s1 Fit_kr_s2 cut_kr_sig_s1 cut_kr_sig_s2 + + +% Redo 127 at 410 + n_sig=0.7; + E_com_127_2=1/73.*(s1_phe_both_127_2/g1 + s2_phe_bottom_127_2/(EE)); + %Cuts on combined energy + Fit_kr_E=fit([320:1:500]',hist(E_com_127_2,[320:1:500])','gauss1'); + cut_kr_sig_E= inrange(E_com_127_2,[Fit_kr_E.b1-n_sig*Fit_kr_E.c1/sqrt(2) Fit_kr_E.b1+n_sig*Fit_kr_E.c1/sqrt(2)]); +%Fits to energy cut + Fit_kr_s1=fit([600:20:3500]',hist(s1_phe_both_127_2(cut_kr_sig_E),[600:20:3500])','gauss1'); + Fit_kr_s2=fit([1000:50:15000]',hist(s2_phe_bottom_127_2(cut_kr_sig_E ),[1000:50:15000])','gauss1'); + Fit_kr_s1_sig = Fit_kr_s1.c1/sqrt(2); + Fit_kr_s2_sig = Fit_kr_s2.c1/sqrt(2); + Fit_kr_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_127_2(cut_kr_sig_E ))); % == sigma/sqrt(N); + Fit_kr_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_bottom_127_2(cut_kr_sig_E ))); % == sigma/sqrt(N); +%Fits to energy cut and sigma cut + cut_kr_sig_s1= inrange(s1_phe_both_127_2,[Fit_kr_s1.b1-n_sig*Fit_kr_s1_sig Fit_kr_s1.b1+n_sig*Fit_kr_s1_sig]); + Fit_kr_s1=fit([600:20:3500]',hist(s1_phe_both_127_2(cut_kr_sig_E & cut_kr_sig_s1),[600:20:3500])','gauss1'); + cut_kr_sig_s2= inrange(s2_phe_bottom_127_2,[Fit_kr_s2.b1-n_sig*Fit_kr_s2_sig Fit_kr_s2.b1+n_sig*Fit_kr_s2_sig]); + Fit_kr_s2=fit([1000:50:15000]',hist(s2_phe_bottom_127_2(cut_kr_sig_E & cut_kr_sig_s2),[1000:50:15000])','gauss1'); + Xe127_2_S1Mu=Fit_kr_s1.b1; + Xe127_2_S1Sig=Fit_kr_s1_sig; + Xe127_2_S2Mu=Fit_kr_s2.b1; + Xe127_2_S2Sig=Fit_kr_s2_sig; + Xe127_2_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_127_2(cut_kr_sig_E & cut_kr_sig_s2))); % == sigma/sqrt(N); + Xe127_2_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_bottom_127_2(cut_kr_sig_E & cut_kr_sig_s2))); % == sigma/sqrt(N); + Xe127_2_fit_s1=Fit_kr_s1; + Xe127_2_fit_s2=Fit_kr_s2; + Xe127_2_fit_E=Fit_kr_E; + clear Fit_kr_E cut_kr_sig_E Fit_kr_E Fit_kr_s1 Fit_kr_s2 cut_kr_sig_s1 cut_kr_sig_s2 + + % Redo Bi214 at 601 + n_sig=1.5; + E_com_214=1/73.*(s1_phe_both_214/g1 + s2_phe_bottom_214/EE); + %Cuts on combined energy + Fit_kr_E=fit([500:5:1000]',hist(E_com_214,[500:5:1000])','gauss1'); + cut_kr_sig_E= inrange(E_com_214,[Fit_kr_E.b1-n_sig*Fit_kr_E.c1/sqrt(2) Fit_kr_E.b1+n_sig*Fit_kr_E.c1/sqrt(2)]); +%Fits to energy cut + Fit_kr_s1=fit([0:50:5000]',hist(s1_phe_both_214(cut_kr_sig_E),[0:50:5000])','gauss1'); + Fit_kr_s2=fit([0:200:20000]',hist(s2_phe_bottom_214(cut_kr_sig_E ),[0:200:20000])','gauss1'); + Fit_kr_s1_sig = Fit_kr_s1.c1/sqrt(2); + Fit_kr_s2_sig = Fit_kr_s2.c1/sqrt(2); + Fit_kr_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_214(cut_kr_sig_E ))); % == sigma/sqrt(N); + Fit_kr_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_bottom_214(cut_kr_sig_E ))); % == sigma/sqrt(N); +%Fits to energy cut and sigma cut + cut_kr_sig_s1= inrange(s1_phe_both_214,[Fit_kr_s1.b1-n_sig*Fit_kr_s1_sig Fit_kr_s1.b1+n_sig*Fit_kr_s1_sig]); + Fit_kr_s1=fit([0:50:5000]',hist(s1_phe_both_214(cut_kr_sig_E & cut_kr_sig_s1),[0:50:5000])','gauss1'); + cut_kr_sig_s2= inrange(s2_phe_bottom_214,[Fit_kr_s2.b1-n_sig*Fit_kr_s2_sig Fit_kr_s2.b1+n_sig*Fit_kr_s2_sig]); + Fit_kr_s2=fit([0:200:20000]',hist(s2_phe_bottom_214(cut_kr_sig_E & cut_kr_sig_s2),[0:200:20000])','gauss1'); + Bi214_S1Mu=Fit_kr_s1.b1; + Bi214_S1Sig=Fit_kr_s1_sig; + Bi214_S2Mu=Fit_kr_s2.b1; + Bi214_S2Sig=Fit_kr_s2_sig; + Bi214_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_214(cut_kr_sig_E & cut_kr_sig_s2))); % == sigma/sqrt(N); + Bi214_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_bottom_214(cut_kr_sig_E & cut_kr_sig_s2))); % == sigma/sqrt(N); + Bi214_fit_s1=Fit_kr_s1; + Bi214_fit_s2=Fit_kr_s2; + Bi214_fit_E=Fit_kr_E; + clear Fit_kr_E cut_kr_sig_E Fit_kr_E Fit_kr_s1 Fit_kr_s2 cut_kr_sig_s1 cut_kr_sig_s2 + + end + + %% Making plots + + %Doke Plot + Doke_fig=figure; + x = linspace(0,250)'; + dimc=[0.9 0.9 0.9]; + xpoints=0:2:30; + modelfun = @(x,theta) theta(1)*x + theta(2); %setting up model +% out = mcmcpred(res,chain,[],x,modelfun); +% mcmcpredplot(out); %plots 50,90,95, and 99% bands + hold on; + %Making Doke plot +onesig_upper=(mean(chain(:,1))+std(chain(:,1))).*xpoints+(mean(chain(:,2))-std(chain(:,2))); +onesig_upper_2=(mean(chain(:,1))-std(chain(:,1))).*xpoints+(mean(chain(:,2))); +onesig_upper_3=(mean(chain(:,1))).*xpoints+(mean(chain(:,2))-std(chain(:,2))); +onesig_lower_3=(mean(chain(:,1))).*xpoints+(mean(chain(:,2))+std(chain(:,2))); +onesig_lower_2=(mean(chain(:,1))+std(chain(:,1))).*xpoints+(mean(chain(:,2))); +onesig_lower=(mean(chain(:,1))-std(chain(:,1))).*xpoints+(mean(chain(:,2))+std(chain(:,2))); +twosig_upper=(mean(chain(:,1))+2*std(chain(:,1))).*xpoints+(mean(chain(:,2))-2*std(chain(:,2))); +twosig_lower=(mean(chain(:,1))-2*std(chain(:,1))).*xpoints+(mean(chain(:,2))+2*std(chain(:,2))); +twosig_upper_2=(mean(chain(:,1))+2*std(chain(:,1))).*xpoints+(mean(chain(:,2))); +twosig_lower_2=(mean(chain(:,1))-2*std(chain(:,1))).*xpoints+(mean(chain(:,2))); +twosig_upper_3=(mean(chain(:,1))).*xpoints+(mean(chain(:,2))-2*std(chain(:,2))); +twosig_lower_3=(mean(chain(:,1))).*xpoints+(mean(chain(:,2))+2*std(chain(:,2))); + +fillyy(xpoints,twosig_lower_3,twosig_upper_3,dimc) +fillyy(xpoints,twosig_lower_2,twosig_upper_2,dimc) +fillyy(xpoints,onesig_lower_2,onesig_upper_2,0.5*dimc) +fillyy(xpoints,onesig_lower_3,onesig_upper_3,0.5*dimc) + +% plot(xpoints,onesig_upper,'--b','LineWidth',2) +% plot(xpoints,onesig_lower,'--b','LineWidth',2) +% plot(xpoints,twosig_upper,'--r','LineWidth',2) +% plot(xpoints,twosig_lower,'--r','LineWidth',2) +% plot(xpoints,onesig_upper_2,'--b','LineWidth',2) +% plot(xpoints,onesig_lower_2,'--b','LineWidth',2) +% plot(xpoints,twosig_upper_2,'--r','LineWidth',2) +% plot(xpoints,twosig_lower_2,'--r','LineWidth',2) +% plot(xpoints,onesig_upper_3,'--g','LineWidth',2) +% plot(xpoints,onesig_lower_3,'--g','LineWidth',2) +% plot(xpoints,twosig_upper_3,'--m','LineWidth',2) +% plot(xpoints,twosig_lower_3,'--m','LineWidth',2) + + scatter(S2_OverE_keV, S1_OverE_keV,150,Energies,'o','fill','linewidth',1,'markeredgecolor','k'); + xlabel('S2/E = n_e/(n_e+n_\gamma) \times g2/(W*SE) [electrons/keV] '); + ylabel('S1/E = n_\gamma/(n_e+n_\gamma) \times g1/W [Phe/keV] '); +% set(gca,'ytick',[3.8:.2:5.8]);set(gca,'xtick',[80:20:200]); + h_c=colorbar;caxis([0 700]); box on; + myfigview(16); ylabel(h_c,'Energy [keV] ','fontsize',20); + for i=1:length(Energies) + plot([S2_OverE_keV(i)-S2_mean_sig(i)./(Energies(i)) S2_OverE_keV(i)+S2_mean_sig(i)./(Energies(i))],[S1_OverE_keV(i) S1_OverE_keV(i)],'-k','LineWidth',2) + plot([S2_OverE_keV(i) S2_OverE_keV(i)],[S1_OverE_keV(i)-S1_mean_sig(i)/(Energies(i)) S1_OverE_keV(i)+S1_mean_sig(i)/(Energies(i))],'-k','LineWidth',2) + end +xlim([5 30]);ylim([3 7.5]); +xpoints=0:2:30; +ypoints=mean(chain(:,1)).*xpoints+mean(chain(:,2)); +plot(xpoints,ypoints,'-k','LineWidth',2) +set(gca,'ytick',[3.25:.25:8]);set(gca,'xtick',[0:2:30]); +text(16,6.5,strcat('Best fit: \newline g1=',num2str(g1,3),'\pm',num2str(sig_g1,1),'\newline','EE=',num2str(EE,3),'\pm',num2str(sig_EE,'%1.2f')),'FontSize',16) + + +% Plot theta1 and theta2 for each simulation + figure; clf + mcmcplot(chain,[],res,'chainpanel');myfigview(16); + + +%Plot theta1 v theta2 scatter to show covariance +figure; clf +densityplot(chain(:,1),chain(:,2),'rectangle',[0.001 0.01]) +xlabel('Slope (S1/S2)'),ylabel('Intercept (S1/E)');myfigview(16); +c=colorbar; +ylabel(c,'Density of points'); + +% Plot g1 v g2 + figure; clf +densityplot(g1_chain,g2_chain,'rectangle',[0.001 0.01]) +xlabel('G1'),ylabel('G2');myfigview(16); +c=colorbar; +ylabel(c,'Density of points'); + +%Plot g1 v 1/g2 +figure; clf +densityplot(g1_chain,1./g2_chain,'rectangle',[0.001 0.001]) +xlabel('G1'),ylabel('1/G2');myfigview(16); +c=colorbar; +ylabel(c,'Density of points'); + + + +%Save correlation of g1 and g2 +save('G1G2Cov_DQ_KrSE','cov_m_b','cov_g1_EE','cov_g1_g2','cov_g1_1g2'); + + +% figure; clf +% mcmcplot(sqrt(s2chain),[],[],'hist') +% title('Error std posterior'); +% myfigview(16); + +%All Energy Peaks +figure +hold on; +step(E_com_kr170,[20:0.1:70],'k') +xlabel('Energy (keV)'); +ylabel('Count'); +title('Kr83 170V/cm Energy Reconstruction'); +line([41.55 41.55],[0 length(E_com_kr170)],'LineWidth',2) +myfigview(16); + +figure +hold on; +step(E_com_kr100,[20:0.1:70],'k') +xlabel('Energy (keV)'); +ylabel('Count'); +title('Kr83 100V/cm Energy Reconstruction'); +line([41.55 41.55],[0 length(E_com_kr100)],'LineWidth',2) +myfigview(16); + +figure +hold on; +step(E_com_kr50,[20:0.1:70],'k') +xlabel('Energy (keV)'); +ylabel('Count'); +title('Kr83 50V/cm Energy Reconstruction'); +line([41.55 41.55],[0 length(E_com_kr50)],'LineWidth',2) +myfigview(16); + +figure +hold on; +step(E_com_127,[150:2:250],'k') +xlabel('Energy (keV)'); +ylabel('Count'); +title('Xe127 Energy Reconstruction'); +line([208.3 208.3],[0 length(E_com_127)],'LineWidth',2) +myfigview(16); + +figure +hold on; +step(E_com_127_2,[350:3:500],'k') +xlabel('Energy (keV)'); +ylabel('Count'); +title('Xe127 Energy Reconstruction'); +line([408.791 408.791],[0 length(E_com_127_2)],'LineWidth',2) +myfigview(16); + + +figure +hold on; +step(E_com_129,[200:1:300],'k') +xlabel('Energy (keV)'); +ylabel('Count'); +title('Xe129 Energy Reconstruction'); +line([236.1 236.1],[0 length(E_com_127_2)],'LineWidth',2) +myfigview(16); + +figure +hold on; +step(E_com_131,[100:1:200],'k') +xlabel('Energy (keV)'); +ylabel('Count'); +title('Xe131 Energy Reconstruction'); +line([163.9 163.9],[0 length(E_com_131)],'LineWidth',2) +myfigview(16); + +figure +hold on; +step(E_com_214,[500:5:800],'k'); +xlabel('Energy (keV)'); +ylabel('Count'); +title('Bi214 Energy Reconstruction'); +line([609.312 609.312],[0 length(E_com_214)],'LineWidth',2) +myfigview(16); + +figure +hold on; +step(E_com_cs,[600:2:800],'k'); +xlabel('Energy (keV)'); +ylabel('Count'); +title('Cs137 Energy Reconstruction'); +line([661.657 661.657],[0 length(E_com_cs)],'LineWidth',2) +myfigview(16); + + +%Event Selection +all_s1=[s1_phe_both_xyz_act;s1_phe_both_xyz_cs;s1_phe_both_xyz_kr100_phe]; +all_s2=[s2_phe_bottom_xyz_act;s2_phe_both_xyz_cs;s2_phe_both_xyz_kr100_phe]; +% +% % all_s1_e=[s1_phe_both_127;s1_phe_both_127_2;s1_phe_both_129;s1_phe_both_131;s1_phe_both_214;s1_phe_both_cut_cs; s1_phe_both_xyz_kr100]; +% % all_s2_e=[s2_phe_bottom_127;s2_phe_bottom_127_2; s2_phe_bottom_129; s2_phe_bottom_131; s2_phe_bottom_214; s2_phe_both_cut_cs; s2_phe_both_xyz_kr100]; +% figure +% density(log10(all_s2),log10(all_s1),[3:0.015:6.5],[2:0.015:4.5],'binscale','log10'); +% xlabel('log10(S2 phe)'); +% ylabel('log10(S1 phe)') +% myfigview(16); +% +% figure +% hold on; +% density(log10(s2_phe_bottom_xyz_act),log10(s1_phe_both_xyz_act),[4:0.015:6.5],[2.5:0.015:4.5],'binscale','log10') +% colormapeditor +% +% xdata=[4.1:0.1:5]; +% ydata=-0.6*xdata+5.75; +% plot(xdata,ydata,'-k','Linewidth',1) +% ydata=-0.6*xdata+5.66; +% plot(xdata,ydata,'-k','Linewidth',1) +% ydata=-0.6*xdata+5.475; +% plot(xdata,ydata,'-k','Linewidth',1) +% ydata=-0.6*xdata+5.61; +% plot(xdata,ydata,'-k','Linewidth',1) +% ydata=-0.6*xdata+5.87; +% plot(xdata,ydata,'-k','Linewidth',1) +% ydata=-0.65*xdata+6.52; +% plot(xdata,ydata,'-k','Linewidth',1) +% +% xdata=[4.5:0.1:5.3]; +% ydata=-0.65*xdata+6.52; +% plot(xdata,ydata,'-k','Linewidth',1) +% ydata=-0.65*xdata+6.34; +% plot(xdata,ydata,'-k','Linewidth',1) +% +% xdata=[4.6:0.1:5.4]; +% ydata=-0.8*xdata+7.55; +% plot(xdata,ydata,'-k','Linewidth',1) +% ydata=-0.8*xdata+7.35; +% plot(xdata,ydata,'-k','Linewidth',1) +% xlabel('log10(S2 phe)'); +% ylabel('log10(S1 phe)') +% myfigview(16); +% + + + +%% Redo fits for Rplot + + %Redo Kr170 + n_sig_stat=4; + n_sig=3; + E_com_kr170=1/73.*(s1_phe_both_xyz_kr170/g1 + s2_phe_bottom_xyz_kr170/(EE)); + %Cuts on combined energy + Fit_kr_E=fit([30:0.2:60]',hist(E_com_kr170,[30:0.2:60])','gauss1'); + cut_kr_sig_E= inrange(E_com_kr170,[Fit_kr_E.b1-n_sig*Fit_kr_E.c1/sqrt(2) Fit_kr_E.b1+n_sig*Fit_kr_E.c1/sqrt(2)]); +%Fits to energy cut + Fit_kr_s1=fit([0:1:600]',hist(s1_phe_both_xyz_kr170(cut_kr_sig_E ),[0:1:600])','gauss1'); + Fit_kr_s2=fit([0:2:1000]',hist(s2_phe_bottom_xyz_kr170(cut_kr_sig_E ),[0:2:1000])','gauss1'); + Fit_kr_s1_sig = Fit_kr_s1.c1/sqrt(2); + Fit_kr_s2_sig = Fit_kr_s2.c1/sqrt(2); + Fit_kr_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_xyz_kr170(cut_kr_sig_E ))); % == sigma/sqrt(N); + Fit_kr_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_bottom_xyz_kr170(cut_kr_sig_E ))); % == sigma/sqrt(N); +%Fits to energy cut and sigma cut + cut_kr_sig_s1= inrange(s1_phe_both_xyz_kr170,[Fit_kr_s1.b1-n_sig*Fit_kr_s1_sig Fit_kr_s1.b1+n_sig*Fit_kr_s1_sig]); + Fit_kr_s1=fit([0:1:600]',hist(s1_phe_both_xyz_kr170(cut_kr_sig_E & cut_kr_sig_s1),[0:1:600])','gauss1'); + cut_kr_sig_s2= inrange(s2_phe_bottom_xyz_kr170,[Fit_kr_s2.b1-n_sig*Fit_kr_s2_sig Fit_kr_s2.b1+n_sig*Fit_kr_s2_sig]); + Fit_kr_s2=fit([0:2:1000]',hist(s2_phe_bottom_xyz_kr170(cut_kr_sig_E & cut_kr_sig_s2),[0:2:1000])','gauss1'); + Kr_170_S1Mu=Fit_kr_s1.b1; + Kr_170_S1Sig=Fit_kr_s1_sig; + Kr_170_S2Mu=Fit_kr_s2.b1; + Kr_170_S2Sig=Fit_kr_s2_sig; + Kr_170_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_xyz_kr170(cut_kr_sig_E & cut_kr_sig_s2))); % == sigma/sqrt(N); + Kr_170_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_bottom_xyz_kr170(cut_kr_sig_E & cut_kr_sig_s2))); % == sigma/sqrt(N); + Kr170_fit_s1=Fit_kr_s1; + Kr170_fit_s2=Fit_kr_s2; + Kr170_fit_E=Fit_kr_E; + + clear Fit_kr_E cut_kr_sig_E Fit_kr_E Fit_kr_s1 Fit_kr_s2 cut_kr_sig_s1 cut_kr_sig_s2 + %Redo Kr100 + E_com_kr100=1/73.*(s1_phe_both_xyz_kr100/g1 + s2_phe_both_xyz_kr100/(EE)); + n_sig=3; + %Cuts on combined energy + Fit_kr_E=fit([30:0.2:60]',hist(E_com_kr100,[30:0.2:60])','gauss1'); + cut_kr_sig_E= inrange(E_com_kr100,[Fit_kr_E.b1-n_sig*Fit_kr_E.c1/sqrt(2) Fit_kr_E.b1+n_sig*Fit_kr_E.c1/sqrt(2)]); +%Fits to energy cut + Fit_kr_s1=fit([0:1:600]',hist(s1_phe_both_xyz_kr100(cut_kr_sig_E ),[0:1:600])','gauss1'); + Fit_kr_s2=fit([0:2:1000]',hist(s2_phe_both_xyz_kr100(cut_kr_sig_E ),[0:2:1000])','gauss1'); + Fit_kr_s1_sig = Fit_kr_s1.c1/sqrt(2); + Fit_kr_s2_sig = Fit_kr_s2.c1/sqrt(2); + Fit_kr_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_xyz_kr100(cut_kr_sig_E ))); % == sigma/sqrt(N); + Fit_kr_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_both_xyz_kr100(cut_kr_sig_E ))); % == sigma/sqrt(N); +%Fits to energy cut and sigma cut + cut_kr_sig_s1= inrange(s1_phe_both_xyz_kr100,[Fit_kr_s1.b1-n_sig*Fit_kr_s1_sig Fit_kr_s1.b1+n_sig*Fit_kr_s1_sig]); + Fit_kr_s1=fit([0:1:600]',hist(s1_phe_both_xyz_kr100(cut_kr_sig_E & cut_kr_sig_s1),[0:1:600])','gauss1'); + cut_kr_sig_s2= inrange(s2_phe_both_xyz_kr100,[Fit_kr_s2.b1-n_sig*Fit_kr_s2_sig Fit_kr_s2.b1+n_sig*Fit_kr_s2_sig]); + Fit_kr_s2=fit([0:2:1000]',hist(s2_phe_both_xyz_kr100(cut_kr_sig_E & cut_kr_sig_s2),[0:2:1000])','gauss1'); + Kr_100_S1Mu=Fit_kr_s1.b1; + Kr_100_S1Sig=Fit_kr_s1_sig; + Kr_100_S2Mu=Fit_kr_s2.b1; + Kr_100_S2Sig=Fit_kr_s2_sig; + Kr_100_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_xyz_kr100(cut_kr_sig_E & cut_kr_sig_s2))); % == sigma/sqrt(N); + Kr_100_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_both_xyz_kr100(cut_kr_sig_E & cut_kr_sig_s2))); % == sigma/sqrt(N); + Kr100_fit_s1=Fit_kr_s1; + Kr100_fit_s2=Fit_kr_s2; + Kr100_fit_E=Fit_kr_E; + + clear Fit_kr_E cut_kr_sig_E Fit_kr_E Fit_kr_s1 Fit_kr_s2 cut_kr_sig_s1 cut_kr_sig_s2 + %Redo Kr50 + E_com_kr50=1/73.*(s1_phe_both_xyz_kr50/g1 + s2_phe_bottom_xyz_kr50/(EE)); + n_sig=3; + %Cuts on combined energy + Fit_kr_E=fit([30:0.2:60]',hist(E_com_kr50,[30:0.2:60])','gauss1'); + cut_kr_sig_E= inrange(E_com_kr50,[Fit_kr_E.b1-n_sig*Fit_kr_E.c1/sqrt(2) Fit_kr_E.b1+n_sig*Fit_kr_E.c1/sqrt(2)]); +%Fits to energy cut + Fit_kr_s1=fit([0:1:600]',hist(s1_phe_both_xyz_kr50(cut_kr_sig_E ),[0:1:600])','gauss1'); + Fit_kr_s2=fit([0:2:1000]',hist(s2_phe_bottom_xyz_kr50(cut_kr_sig_E ),[0:2:1000])','gauss1'); + Fit_kr_s1_sig = Fit_kr_s1.c1/sqrt(2); + Fit_kr_s2_sig = Fit_kr_s2.c1/sqrt(2); + Fit_kr_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_xyz_kr50(cut_kr_sig_E ))); % == sigma/sqrt(N); + Fit_kr_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_bottom_xyz_kr50(cut_kr_sig_E ))); % == sigma/sqrt(N); +%Fits to energy cut and sigma cut + cut_kr_sig_s1= inrange(s1_phe_both_xyz_kr50,[Fit_kr_s1.b1-n_sig*Fit_kr_s1_sig Fit_kr_s1.b1+n_sig*Fit_kr_s1_sig]); + Fit_kr_s1=fit([0:1:600]',hist(s1_phe_both_xyz_kr50(cut_kr_sig_E & cut_kr_sig_s1),[0:1:600])','gauss1'); + cut_kr_sig_s2= inrange(s2_phe_bottom_xyz_kr50,[Fit_kr_s2.b1-n_sig*Fit_kr_s2_sig Fit_kr_s2.b1+n_sig*Fit_kr_s2_sig]); + Fit_kr_s2=fit([0:2:1000]',hist(s2_phe_bottom_xyz_kr50(cut_kr_sig_E & cut_kr_sig_s2),[0:2:1000])','gauss1'); + Kr_50_S1Mu=Fit_kr_s1.b1; + Kr_50_S1Sig=Fit_kr_s1_sig; + Kr_50_S2Mu=Fit_kr_s2.b1; + Kr_50_S2Sig=Fit_kr_s2_sig; + Kr_50_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_xyz_kr50(cut_kr_sig_E & cut_kr_sig_s2))); % == sigma/sqrt(N); + Kr_50_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_bottom_xyz_kr50(cut_kr_sig_E & cut_kr_sig_s2))); % == sigma/sqrt(N); + Kr50_fit_s1=Fit_kr_s1; + Kr50_fit_s2=Fit_kr_s2; + Kr50_fit_E=Fit_kr_E; + clear Fit_kr_E cut_kr_sig_E Fit_kr_E Fit_kr_s1 Fit_kr_s2 cut_kr_sig_s1 cut_kr_sig_s2 + + %Redo Cs + n_sig=1.5; + E_com_cs=1/73.*(s1_phe_both_cut_cs/g1 + s2_phe_both_cut_cs/(EE)); + %Cuts on combined energy + Fit_kr_E=fit([600:2:800]',hist(E_com_cs,[600:2:800])','gauss1'); + cut_kr_sig_E= inrange(E_com_cs,[Fit_kr_E.b1-n_sig*Fit_kr_E.c1/sqrt(2) Fit_kr_E.b1+n_sig*Fit_kr_E.c1/sqrt(2)]); +%Fits to energy cut + Fit_kr_s1=fit([0:50:6000]',hist(s1_phe_both_cut_cs(cut_kr_sig_E),[0:50:6000])','gauss1'); + Fit_kr_s2=fit([0:300:30000]',hist(s2_phe_both_cut_cs(cut_kr_sig_E ),[0:300:30000])','gauss1'); + Fit_kr_s1_sig = Fit_kr_s1.c1/sqrt(2); + Fit_kr_s2_sig = Fit_kr_s2.c1/sqrt(2); + Fit_kr_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_cut_cs(cut_kr_sig_E ))); % == sigma/sqrt(N); + Fit_kr_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_both_cut_cs(cut_kr_sig_E ))); % == sigma/sqrt(N); +%Fits to energy cut and sigma cut + cut_kr_sig_s1= inrange(s1_phe_both_cut_cs,[Fit_kr_s1.b1-n_sig*Fit_kr_s1_sig Fit_kr_s1.b1+n_sig*Fit_kr_s1_sig]); + Fit_kr_s1=fit([0:50:6000]',hist(s1_phe_both_cut_cs(cut_kr_sig_E & cut_kr_sig_s1),[0:50:6000])','gauss1'); + cut_kr_sig_s2= inrange(s2_phe_both_cut_cs,[Fit_kr_s2.b1-n_sig*Fit_kr_s2_sig Fit_kr_s2.b1+n_sig*Fit_kr_s2_sig]); + Fit_kr_s2=fit([0:300:30000]',hist(s2_phe_both_cut_cs(cut_kr_sig_E & cut_kr_sig_s2),[0:300:30000])','gauss1'); + Cs_S1Mu=Fit_kr_s1.b1; + Cs_S1Sig=Fit_kr_s1_sig; + Cs_S2Mu=Fit_kr_s2.b1; + Cs_S2Sig=Fit_kr_s2_sig; + Cs_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_cut_cs(cut_kr_sig_E & cut_kr_sig_s2))); % == sigma/sqrt(N); + Cs_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_both_cut_cs(cut_kr_sig_E & cut_kr_sig_s2))); % == sigma/sqrt(N); + Cs_fit_s1=Fit_kr_s1; + Cs_fit_s2=Fit_kr_s2; + Cs_fit_E=Fit_kr_E; + clear Fit_kr_E cut_kr_sig_E Fit_kr_E Fit_kr_s1 Fit_kr_s2 cut_kr_sig_s1 cut_kr_sig_s2 + +%Redo Xe131m at 163.9 keV (shitty stats) +n_sig=1; + E_com_131=1/73.*(s1_phe_both_131/g1 + s2_phe_bottom_131/(EE)); + %Cuts on combined energy + Fit_kr_E=fit([130:1:200]',hist(E_com_131,[130:1:200])','gauss1'); + cut_kr_sig_E= inrange(E_com_131,[Fit_kr_E.b1-n_sig*Fit_kr_E.c1/sqrt(2) Fit_kr_E.b1+n_sig*Fit_kr_E.c1/sqrt(2)]); +%Fits to energy cut + Fit_kr_s1=fit([500:5:1500]',hist(s1_phe_both_131(cut_kr_sig_E),[500:5:1500])','gauss1'); + Fit_kr_s2=fit([500:30:4000]',hist(s2_phe_bottom_131(cut_kr_sig_E ),[500:30:4000])','gauss1'); + Fit_kr_s1_sig = Fit_kr_s1.c1/sqrt(2); + Fit_kr_s2_sig = Fit_kr_s2.c1/sqrt(2); + Fit_kr_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_131(cut_kr_sig_E ))); % == sigma/sqrt(N); + Fit_kr_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_bottom_131(cut_kr_sig_E ))); % == sigma/sqrt(N); +%Fits to energy cut and sigma cut + cut_kr_sig_s1= inrange(s1_phe_both_131,[Fit_kr_s1.b1-n_sig*Fit_kr_s1_sig Fit_kr_s1.b1+n_sig*Fit_kr_s1_sig]); + Fit_kr_s1=fit([500:5:1500]',hist(s1_phe_both_131(cut_kr_sig_E & cut_kr_sig_s1),[500:5:1500])','gauss1'); + cut_kr_sig_s2= inrange(s2_phe_bottom_131,[Fit_kr_s2.b1-n_sig*Fit_kr_s2_sig Fit_kr_s2.b1+n_sig*Fit_kr_s2_sig]); + Fit_kr_s2=fit([500:30:4000]',hist(s2_phe_bottom_131(cut_kr_sig_E & cut_kr_sig_s2),[500:30:4000])','gauss1'); + Xe131_S1Mu=Fit_kr_s1.b1; + Xe131_S1Sig=Fit_kr_s1_sig; + Xe131_S2Mu=Fit_kr_s2.b1; + Xe131_S2Sig=Fit_kr_s2_sig; + Xe131_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_131(cut_kr_sig_E & cut_kr_sig_s2))); % == sigma/sqrt(N); + Xe131_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_bottom_131(cut_kr_sig_E & cut_kr_sig_s2))); % == sigma/sqrt(N); + Xe131_fit_s1=Fit_kr_s1; + Xe131_fit_s2=Fit_kr_s2; + Xe131_fit_E=Fit_kr_E; + clear Fit_kr_E cut_kr_sig_E Fit_kr_E Fit_kr_s1 Fit_kr_s2 cut_kr_sig_s1 cut_kr_sig_s2 + +%Redo Xe127m at 207.3 +n_sig=1; + E_com_127=1/73.*(s1_phe_both_127/g1 + s2_phe_bottom_127/(EE)); + %Cuts on combined energy + Fit_kr_E=fit([160:1:250]',hist(E_com_127,[160:1:250])','gauss1'); + cut_kr_sig_E= inrange(E_com_127,[Fit_kr_E.b1-n_sig*Fit_kr_E.c1/sqrt(2) Fit_kr_E.b1+n_sig*Fit_kr_E.c1/sqrt(2)]); +%Fits to energy cut + Fit_kr_s1=fit([600:10:1800]',hist(s1_phe_both_127(cut_kr_sig_E),[600:10:1800])','gauss1'); + Fit_kr_s2=fit([500:30:5500]',hist(s2_phe_bottom_127(cut_kr_sig_E ),[500:30:5500])','gauss1'); + Fit_kr_s1_sig = Fit_kr_s1.c1/sqrt(2); + Fit_kr_s2_sig = Fit_kr_s2.c1/sqrt(2); + Fit_kr_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_127(cut_kr_sig_E ))); % == sigma/sqrt(N); + Fit_kr_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_bottom_127(cut_kr_sig_E ))); % == sigma/sqrt(N); +%Fits to energy cut and sigma cut + cut_kr_sig_s1= inrange(s1_phe_both_127,[Fit_kr_s1.b1-n_sig*Fit_kr_s1_sig Fit_kr_s1.b1+n_sig*Fit_kr_s1_sig]); + Fit_kr_s1=fit([600:10:1800]',hist(s1_phe_both_127(cut_kr_sig_E & cut_kr_sig_s1),[600:10:1800])','gauss1'); + cut_kr_sig_s2= inrange(s2_phe_bottom_127,[Fit_kr_s2.b1-n_sig*Fit_kr_s2_sig Fit_kr_s2.b1+n_sig*Fit_kr_s2_sig]); + Fit_kr_s2=fit([500:40:5500]',hist(s2_phe_bottom_127(cut_kr_sig_E & cut_kr_sig_s2),[500:40:5500])','gauss1'); + Xe127_S1Mu=Fit_kr_s1.b1; + Xe127_S1Sig=Fit_kr_s1_sig; + Xe127_S2Mu=Fit_kr_s2.b1; + Xe127_S2Sig=Fit_kr_s2_sig; + Xe127_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_127(cut_kr_sig_E & cut_kr_sig_s2))); % == sigma/sqrt(N); + Xe127_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_bottom_127(cut_kr_sig_E & cut_kr_sig_s2))); % == sigma/sqrt(N); + Xe127_fit_s1=Fit_kr_s1; + Xe127_fit_s2=Fit_kr_s2; + Xe127_fit_E=Fit_kr_E; + clear Fit_kr_E cut_kr_sig_E Fit_kr_E Fit_kr_s1 Fit_kr_s2 cut_kr_sig_s1 cut_kr_sig_s2 + +% Redo Xe129 at 236.1 +n_sig=1; + E_com_129=1/73.*(s1_phe_both_129/g1 + s2_phe_bottom_129/(EE)); + %Cuts on combined energy + Fit_kr_E=fit([200:1:275]',hist(E_com_129,[200:1:275])','gauss1'); + cut_kr_sig_E= inrange(E_com_129,[Fit_kr_E.b1-n_sig*Fit_kr_E.c1/sqrt(2) Fit_kr_E.b1+n_sig*Fit_kr_E.c1/sqrt(2)]); +%Fits to energy cut + Fit_kr_s1=fit([600:10:2000]',hist(s1_phe_both_129(cut_kr_sig_E),[600:10:2000])','gauss1'); + Fit_kr_s2=fit([500:30:6000]',hist(s2_phe_bottom_129(cut_kr_sig_E ),[500:30:6000])','gauss1'); + Fit_kr_s1_sig = Fit_kr_s1.c1/sqrt(2); + Fit_kr_s2_sig = Fit_kr_s2.c1/sqrt(2); + Fit_kr_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_129(cut_kr_sig_E ))); % == sigma/sqrt(N); + Fit_kr_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_bottom_129(cut_kr_sig_E ))); % == sigma/sqrt(N); +%Fits to energy cut and sigma cut + cut_kr_sig_s1= inrange(s1_phe_both_129,[Fit_kr_s1.b1-n_sig*Fit_kr_s1_sig Fit_kr_s1.b1+n_sig*Fit_kr_s1_sig]); + Fit_kr_s1=fit([600:10:2000]',hist(s1_phe_both_129(cut_kr_sig_E & cut_kr_sig_s1),[600:10:2000])','gauss1'); + cut_kr_sig_s2= inrange(s2_phe_bottom_129,[Fit_kr_s2.b1-n_sig*Fit_kr_s2_sig Fit_kr_s2.b1+n_sig*Fit_kr_s2_sig]); + Fit_kr_s2=fit([500:30:6000]',hist(s2_phe_bottom_129(cut_kr_sig_E & cut_kr_sig_s2),[500:30:6000])','gauss1'); + Xe129_S1Mu=Fit_kr_s1.b1; + Xe129_S1Sig=Fit_kr_s1_sig; + Xe129_S2Mu=Fit_kr_s2.b1; + Xe129_S2Sig=Fit_kr_s2_sig; + Xe129_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_129(cut_kr_sig_E & cut_kr_sig_s2))); % == sigma/sqrt(N); + Xe129_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_bottom_129(cut_kr_sig_E & cut_kr_sig_s2))); % == sigma/sqrt(N); + Xe129_fit_s1=Fit_kr_s1; + Xe129_fit_s2=Fit_kr_s2; + Xe129_fit_E=Fit_kr_E; + clear Fit_kr_E cut_kr_sig_E Fit_kr_E Fit_kr_s1 Fit_kr_s2 cut_kr_sig_s1 cut_kr_sig_s2 + + +% Redo 127 at 410 + n_sig=1.5; + E_com_127_2=1/73.*(s1_phe_both_127_2/g1 + s2_phe_bottom_127_2/(EE)); + %Cuts on combined energy + Fit_kr_E=fit([320:1:500]',hist(E_com_127_2,[320:1:500])','gauss1'); + cut_kr_sig_E= inrange(E_com_127_2,[Fit_kr_E.b1-n_sig*Fit_kr_E.c1/sqrt(2) Fit_kr_E.b1+n_sig*Fit_kr_E.c1/sqrt(2)]); +%Fits to energy cut + Fit_kr_s1=fit([600:20:3500]',hist(s1_phe_both_127_2(cut_kr_sig_E),[600:20:3500])','gauss1'); + Fit_kr_s2=fit([1000:50:15000]',hist(s2_phe_bottom_127_2(cut_kr_sig_E ),[1000:50:15000])','gauss1'); + Fit_kr_s1_sig = Fit_kr_s1.c1/sqrt(2); + Fit_kr_s2_sig = Fit_kr_s2.c1/sqrt(2); + Fit_kr_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_127_2(cut_kr_sig_E ))); % == sigma/sqrt(N); + Fit_kr_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_bottom_127_2(cut_kr_sig_E ))); % == sigma/sqrt(N); +%Fits to energy cut and sigma cut + cut_kr_sig_s1= inrange(s1_phe_both_127_2,[Fit_kr_s1.b1-n_sig*Fit_kr_s1_sig Fit_kr_s1.b1+n_sig*Fit_kr_s1_sig]); + Fit_kr_s1=fit([600:20:3500]',hist(s1_phe_both_127_2(cut_kr_sig_E & cut_kr_sig_s1),[600:20:3500])','gauss1'); + cut_kr_sig_s2= inrange(s2_phe_bottom_127_2,[Fit_kr_s2.b1-n_sig*Fit_kr_s2_sig Fit_kr_s2.b1+n_sig*Fit_kr_s2_sig]); + Fit_kr_s2=fit([1000:50:15000]',hist(s2_phe_bottom_127_2(cut_kr_sig_E & cut_kr_sig_s2),[1000:50:15000])','gauss1'); + Xe127_2_S1Mu=Fit_kr_s1.b1; + Xe127_2_S1Sig=Fit_kr_s1_sig; + Xe127_2_S2Mu=Fit_kr_s2.b1; + Xe127_2_S2Sig=Fit_kr_s2_sig; + Xe127_2_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_127_2(cut_kr_sig_E & cut_kr_sig_s2))); % == sigma/sqrt(N); + Xe127_2_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_bottom_127_2(cut_kr_sig_E & cut_kr_sig_s2))); % == sigma/sqrt(N); + Xe127_2_fit_s1=Fit_kr_s1; + Xe127_2_fit_s2=Fit_kr_s2; + Xe127_2_fit_E=Fit_kr_E; + clear Fit_kr_E cut_kr_sig_E Fit_kr_E Fit_kr_s1 Fit_kr_s2 cut_kr_sig_s1 cut_kr_sig_s2 + + % Redo Bi214 at 601 + n_sig=1.5; + E_com_214=1/73.*(s1_phe_both_214/g1 + s2_phe_bottom_214/EE); + %Cuts on combined energy + Fit_kr_E=fit([500:5:1000]',hist(E_com_214,[500:5:1000])','gauss1'); + cut_kr_sig_E= inrange(E_com_214,[Fit_kr_E.b1-n_sig*Fit_kr_E.c1/sqrt(2) Fit_kr_E.b1+n_sig*Fit_kr_E.c1/sqrt(2)]); +%Fits to energy cut + Fit_kr_s1=fit([0:50:5000]',hist(s1_phe_both_214(cut_kr_sig_E),[0:50:5000])','gauss1'); + Fit_kr_s2=fit([0:200:20000]',hist(s2_phe_bottom_214(cut_kr_sig_E ),[0:200:20000])','gauss1'); + Fit_kr_s1_sig = Fit_kr_s1.c1/sqrt(2); + Fit_kr_s2_sig = Fit_kr_s2.c1/sqrt(2); + Fit_kr_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_214(cut_kr_sig_E ))); % == sigma/sqrt(N); + Fit_kr_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_bottom_214(cut_kr_sig_E ))); % == sigma/sqrt(N); +%Fits to energy cut and sigma cut + cut_kr_sig_s1= inrange(s1_phe_both_214,[Fit_kr_s1.b1-n_sig*Fit_kr_s1_sig Fit_kr_s1.b1+n_sig*Fit_kr_s1_sig]); + Fit_kr_s1=fit([0:50:5000]',hist(s1_phe_both_214(cut_kr_sig_E & cut_kr_sig_s1),[0:50:5000])','gauss1'); + cut_kr_sig_s2= inrange(s2_phe_bottom_214,[Fit_kr_s2.b1-n_sig*Fit_kr_s2_sig Fit_kr_s2.b1+n_sig*Fit_kr_s2_sig]); + Fit_kr_s2=fit([0:200:20000]',hist(s2_phe_bottom_214(cut_kr_sig_E & cut_kr_sig_s2),[0:200:20000])','gauss1'); + Bi214_S1Mu=Fit_kr_s1.b1; + Bi214_S1Sig=Fit_kr_s1_sig; + Bi214_S2Mu=Fit_kr_s2.b1; + Bi214_S2Sig=Fit_kr_s2_sig; + Bi214_s1_meanerr = Fit_kr_s1_sig/sqrt(length(s1_phe_both_214(cut_kr_sig_E & cut_kr_sig_s2))); % == sigma/sqrt(N); + Bi214_s2_meanerr = Fit_kr_s2_sig/sqrt(length(s2_phe_bottom_214(cut_kr_sig_E & cut_kr_sig_s2))); % == sigma/sqrt(N); + Bi214_fit_s1=Fit_kr_s1; + Bi214_fit_s2=Fit_kr_s2; + Bi214_fit_E=Fit_kr_E; + clear Fit_kr_E cut_kr_sig_E Fit_kr_E Fit_kr_s1 Fit_kr_s2 cut_kr_sig_s1 cut_kr_sig_s2 + + %% Doke plot LY measurements + S1_OverE_keV=[Kr_170_S1Mu/41.55 Kr_100_S1Mu/41.55 Kr_50_S1Mu/41.55 Cs_S1Mu/661.657 Xe131_S1Mu/163.9 Xe129_S1Mu/236.1 Xe127_S1Mu/208.3 Xe127_2_S1Mu/408.791 Bi214_S1Mu/609.312]; %Bi214_S1Mu/607 Xe127_S1Mu/207.3 + S2_OverE_keV=[Kr_170_S2Mu/41.55 Kr_100_S2Mu/41.55 Kr_50_S2Mu/41.55 Cs_S2Mu/661.657 Xe131_S2Mu/163.9 Xe129_S2Mu/236.1 Xe127_S2Mu/208.3 Xe127_2_S2Mu/408.791 Bi214_S2Mu/609.312]; %Bi214_S2Mu/607 Xe127_S2Mu/207.3 + + S1_mean_sig=[(Kr_170_s1_meanerr.^2 + 1.9799.^2).^(1/2) (Kr_100_s1_meanerr.^2 + (1.9799*Kr_100_S1Mu/Kr_170_S1Mu).^2).^(1/2) (Kr_50_s1_meanerr.^2 + (1.9799*Kr_50_S1Mu/Kr_170_S1Mu).^2).^(1/2) (Cs_s1_meanerr.^2 + (1.9799*Cs_S1Mu/Kr_170_S1Mu).^2).^(1/2)... + (Xe131_s1_meanerr.^2 + (1.9799*Xe131_S1Mu/Kr_170_S1Mu).^2).^(1/2) (Xe129_s1_meanerr.^2 + (1.9799*Xe129_S1Mu/Kr_170_S1Mu).^2).^(1/2) (Xe127_s1_meanerr.^2 + (1.9799*Xe127_S1Mu/Kr_170_S1Mu).^2).^(1/2)... + (Xe127_2_s1_meanerr + (1.9799*Xe127_2_S1Mu/Kr_170_S1Mu).^2).^(1/2) (Bi214_s1_meanerr + (1.9799*Bi214_S1Mu/Kr_170_S1Mu).^2).^(1/2)]; % + S2_mean_sig=[((Kr_170_S2Mu*0.01).^2 + Kr_170_s2_meanerr.^2 + Tot_bot_diffs(1).^2 + 9.3597.^2).^(1/2) ((Kr_100_S2Mu*0.01).^2 + Kr_100_s2_meanerr.^2 + Tot_bot_diffs(2).^2 + (9.3597*Kr_100_S2Mu/Kr_170_S2Mu).^2).^(1/2) ((Kr_50_S2Mu*0.01).^2 + Kr_50_s2_meanerr.^2 + Tot_bot_diffs(3).^2 + (9.3597*Kr_50_S2Mu/Kr_170_S2Mu).^2).^(1/2) ((Cs_S2Mu*0.01).^2 + (Cs_S2Mu*0.055).^2 + Cs_s2_meanerr.^2 + Tot_bot_diffs(4).^2 + (9.3597*Cs_S2Mu/Kr_170_S2Mu).^2).^(1/2)... + ((Xe131_S2Mu*0.01).^2 + Xe131_s2_meanerr.^2 + Tot_bot_diffs(5).^2 + (9.3597*Xe131_S2Mu/Kr_170_S2Mu).^2).^(1/2) ((Xe129_S2Mu*0.01).^2 + Xe129_s2_meanerr.^2 + Tot_bot_diffs(6).^2 + (9.3597*Xe129_S2Mu/Kr_170_S2Mu).^2).^(1/2) ((Xe127_S2Mu*0.01).^2 + Xe127_s2_meanerr.^2 + Tot_bot_diffs(7).^2 + (9.3597*Xe127_S2Mu/Kr_170_S2Mu).^2).^(1/2)... + ((Xe127_2_S2Mu*0.01).^2 + Xe127_2_s2_meanerr.^2 + Tot_bot_diffs(8).^2 + (9.3597*Xe127_2_S2Mu/Kr_170_S2Mu).^2).^(1/2) ((Bi214_S2Mu*0.01).^2 + Bi214_s2_meanerr.^2 + Tot_bot_diffs(9).^2+ (9.3597*Bi214_S2Mu/Kr_170_S2Mu).^2).^(1/2)]; % + + photonsratio_OverE_keV=(1/73).*S1_OverE_keV./0.123; + photonsratio_OverE_keV_err=(1/73)*(((S1_mean_sig./(Energies.'))./0.123).^2+(0.003*S1_OverE_keV./(0.123^2)).^2).^(1/2); %hardcoded with the official g1 numbers and errors + + electronsratio_OverE_keV=(1/73).*S2_OverE_keV./(0.423); + electronsratio_OverE_keV_err=(1/73).*(((S2_mean_sig./(Energies.'))./0.423).^2 + (0.019.*S2_OverE_keV./(0.423^2)).^2).^(1/2); + + %Remake doke plot in units of quanta over total quanta + Doke_quanta_fig=figure; + hold on; + scatter(electronsratio_OverE_keV,photonsratio_OverE_keV,150,Energies,'o','fill','linewidth',1,'markeredgecolor','k'); + xlabel('n_e/(n_e+n_\gamma)'); + ylabel('n_\gamma/(n_e+n_\gamma)'); + h_c=colorbar;caxis([0 700]); box on; + myfigview(16); ylabel(h_c,'Energy [keV] ','fontsize',20); + for i=1:length(Energies) + plot([electronsratio_OverE_keV(i)-electronsratio_OverE_keV_err(i) electronsratio_OverE_keV(i)+electronsratio_OverE_keV_err(i)],[photonsratio_OverE_keV(i) photonsratio_OverE_keV(i)],'-k','LineWidth',2) + plot([electronsratio_OverE_keV(i) electronsratio_OverE_keV(i)],[photonsratio_OverE_keV(i)-photonsratio_OverE_keV_err(i) photonsratio_OverE_keV(i)+photonsratio_OverE_keV_err(i)],'-k','LineWidth',2) + end +xlim([0 1]);ylim([0 1]); +xpoints=0:0.05:1; +yfit=polyfit(electronsratio_OverE_keV,photonsratio_OverE_keV,1); +ypoints=polyval(yfit,xpoints); +plot(xpoints,ypoints,'-k','LineWidth',2) +set(gca,'ytick',[0:0.2:1]);set(gca,'xtick',[0:0.2:1]); +text(16,6.5,strcat('Best fit: \newline g1=',num2str(g1,3),'\pm',num2str(sig_g1,1),'\newline','EE=',num2str(EE,3),'\pm',num2str(sig_EE,'%1.2f')),'FontSize',16) + + %Charge yield calculation + photons_OverE_keV=S1_OverE_keV./0.123; + photons_OverE_keV_err=(((S1_mean_sig./(Energies.'))./0.123).^2+(0.003*S1_OverE_keV./(0.123^2)).^2).^(1/2); %hardcoded with the official g1 numbers and errors + LY_plot=figure; + errorbar(Energies(4:end),photons_OverE_keV(4:end),photons_OverE_keV_err(4:end),'.k') + + %% Calculate sigmaR sigmaNg and sigmaNe in units of quanta + + W=1/73; + S1_mean=S1_OverE_keV.*Energies.'; + S2_mean=S2_OverE_keV.*Energies.'; + %% Make Doke plot + sigR(1)=sqrt(1/2)*sqrt( (Kr170_fit_s1.c1/sqrt(2)/g1)^2 + (Kr170_fit_s2.c1/sqrt(2)/EE)^2 - (Kr170_fit_E.c1/sqrt(2)/W)^2 ); + sigR(2)=sqrt(1/2)*sqrt( (Kr100_fit_s1.c1/sqrt(2)/g1)^2 + (Kr100_fit_s2.c1/sqrt(2)/EE)^2 - (Kr100_fit_E.c1/sqrt(2)/W)^2 ); + sigR(3)=sqrt(1/2)*sqrt( (Kr50_fit_s1.c1/sqrt(2)/g1)^2 + (Kr50_fit_s2.c1/sqrt(2)/EE)^2 - (Kr50_fit_E.c1/sqrt(2)/W)^2 ); + sigR(4)=sqrt(1/2)*sqrt( (Cs_fit_s1.c1/sqrt(2)/g1)^2 + (Cs_fit_s2.c1/sqrt(2)/EE)^2 - (Cs_fit_E.c1/sqrt(2)/W)^2 ); + sigR(5)=sqrt(1/2)*sqrt( (Xe131_fit_s1.c1/sqrt(2)/g1)^2 + (Xe131_fit_s2.c1/sqrt(2)/EE)^2 - (Xe131_fit_E.c1/sqrt(2)/W)^2 ); + sigR(6)=sqrt(1/2)*sqrt( (Xe129_fit_s1.c1/sqrt(2)/g1)^2 + (Xe129_fit_s2.c1/sqrt(2)/EE)^2 - (Xe129_fit_E.c1/sqrt(2)/W)^2 ); + sigR(7)=sqrt(1/2)*sqrt( (Xe127_fit_s1.c1/sqrt(2)/g1)^2 + (Xe127_fit_s2.c1/sqrt(2)/EE)^2 - (Xe127_fit_E.c1/sqrt(2)/W)^2 ); + sigR(8)=sqrt(1/2)*sqrt( (Xe127_2_fit_s1.c1/sqrt(2)/g1)^2 + (Xe127_2_fit_s2.c1/sqrt(2)/EE)^2 - (Xe127_2_fit_E.c1/sqrt(2)/W)^2 ); + sigR(9)=sqrt(1/2)*sqrt( (Bi214_fit_s1.c1/sqrt(2)/g1)^2 + (Bi214_fit_s2.c1/sqrt(2)/EE)^2 - (Bi214_fit_E.c1/sqrt(2)/W)^2 ); + + %figure out sig_sig for s1,s2, and E fits + clear temp; temp=confint(Kr170_fit_s1,.683); + Kr170_fit_s1_sig_sig=abs((Kr170_fit_s1.c1-temp(1,3)))/sqrt(2); + clear temp; temp=confint(Kr170_fit_s2,.683); + Kr170_fit_s2_sig_sig=abs((Kr170_fit_s2.c1-temp(1,3)))/sqrt(2); + clear temp; temp=confint(Kr170_fit_E,.683); + Kr170_fit_E_sig_sig=abs((Kr170_fit_E.c1-temp(1,3)))/sqrt(2); + + clear temp; temp=confint(Kr100_fit_s1,.683); + Kr100_fit_s1_sig_sig=abs((Kr100_fit_s1.c1-temp(1,3)))/sqrt(2); + clear temp; temp=confint(Kr100_fit_s2,.683); + Kr100_fit_s2_sig_sig=abs((Kr100_fit_s2.c1-temp(1,3)))/sqrt(2); + clear temp; temp=confint(Kr100_fit_E,.683); + Kr100_fit_E_sig_sig=abs((Kr100_fit_E.c1-temp(1,3)))/sqrt(2); + + clear temp; temp=confint(Kr50_fit_s1,.683); + Kr50_fit_s1_sig_sig=abs((Kr50_fit_s1.c1-temp(1,3)))/sqrt(2); + clear temp; temp=confint(Kr50_fit_s2,.683); + Kr50_fit_s2_sig_sig=abs((Kr50_fit_s2.c1-temp(1,3)))/sqrt(2); + clear temp; temp=confint(Kr50_fit_E,.683); + Kr50_fit_E_sig_sig=abs((Kr50_fit_E.c1-temp(1,3)))/sqrt(2); + + clear temp; temp=confint(Cs_fit_s1,.683); + Cs_fit_s1_sig_sig=abs((Cs_fit_s1.c1-temp(1,3)))/sqrt(2); + clear temp; temp=confint(Cs_fit_s2,.683); + Cs_fit_s2_sig_sig=abs((Cs_fit_s2.c1-temp(1,3)))/sqrt(2); + clear temp; temp=confint(Cs_fit_E,.683); + Cs_fit_E_sig_sig=abs((Cs_fit_E.c1-temp(1,3)))/sqrt(2); + + clear temp; temp=confint(Xe131_fit_s1,.683); + Xe131_fit_s1_sig_sig=abs((Xe131_fit_s1.c1-temp(1,3)))/sqrt(2); + clear temp; temp=confint(Xe131_fit_s2,.683); + Xe131_fit_s2_sig_sig=abs((Xe131_fit_s2.c1-temp(1,3)))/sqrt(2); + clear temp; temp=confint(Xe131_fit_E,.683); + Xe131_fit_E_sig_sig=abs((Xe131_fit_E.c1-temp(1,3)))/sqrt(2); + + clear temp; temp=confint(Xe129_fit_s1,.683); + Xe129_fit_s1_sig_sig=abs((Xe129_fit_s1.c1-temp(1,3)))/sqrt(2); + clear temp; temp=confint(Xe129_fit_s2,.683); + Xe129_fit_s2_sig_sig=abs((Xe129_fit_s2.c1-temp(1,3)))/sqrt(2); + clear temp; temp=confint(Xe129_fit_E,.683); + Xe129_fit_E_sig_sig=abs((Xe129_fit_E.c1-temp(1,3)))/sqrt(2); + + clear temp; temp=confint(Xe127_fit_s1,.683); + Xe127_fit_s1_sig_sig=abs((Xe127_fit_s1.c1-temp(1,3)))/sqrt(2); + clear temp; temp=confint(Xe127_fit_s2,.683); + Xe127_fit_s2_sig_sig=abs((Xe127_fit_s2.c1-temp(1,3)))/sqrt(2); + clear temp; temp=confint(Xe127_fit_E,.683); + Xe127_fit_E_sig_sig=abs((Xe127_fit_E.c1-temp(1,3)))/sqrt(2); + + clear temp; temp=confint(Xe127_2_fit_s1,.683); + Xe127_2_fit_s1_sig_sig=abs((Xe127_2_fit_s1.c1-temp(1,3)))/sqrt(2); + clear temp; temp=confint(Xe127_2_fit_s2,.683); + Xe127_2_fit_s2_sig_sig=abs((Xe127_2_fit_s2.c1-temp(1,3)))/sqrt(2); + clear temp; temp=confint(Xe127_2_fit_E,.683); + Xe127_2_fit_E_sig_sig=abs((Xe127_2_fit_E.c1-temp(1,3)))/sqrt(2); + + clear temp; temp=confint(Bi214_fit_s1,.683); + Bi214_fit_s1_sig_sig=abs((Bi214_fit_s1.c1-temp(1,3)))/sqrt(2); + clear temp; temp=confint(Bi214_fit_s2,.683); + Bi214_fit_s2_sig_sig=abs((Bi214_fit_s2.c1-temp(1,3)))/sqrt(2); + clear temp; temp=confint(Bi214_fit_E,.683); + Bi214_fit_E_sig_sig=abs((Bi214_fit_E.c1-temp(1,3)))/sqrt(2); + + sig_sigR(1)=sqrt(1/2)*sqrt( ((Kr170_fit_s1.c1/sqrt(2)+Kr170_fit_s1_sig_sig)/g1)^2 + ((Kr170_fit_s2.c1/sqrt(2)+Kr170_fit_s2_sig_sig)/EE)^2 - ((Kr170_fit_E.c1/sqrt(2)-Kr170_fit_E_sig_sig)/W)^2 ) - sigR(1); + sig_sigR(2)=sqrt(1/2)*sqrt( ((Kr100_fit_s1.c1/sqrt(2)+Kr100_fit_s1_sig_sig)/g1)^2 + ((Kr100_fit_s2.c1/sqrt(2)+Kr100_fit_s2_sig_sig)/EE)^2 - ((Kr100_fit_E.c1/sqrt(2)-Kr100_fit_E_sig_sig)/W)^2 ) - sigR(2); + sig_sigR(3)=sqrt(1/2)*sqrt( ((Kr50_fit_s1.c1/sqrt(2)+Kr50_fit_s1_sig_sig)/g1)^2 + ((Kr50_fit_s2.c1/sqrt(2)+Kr50_fit_s2_sig_sig)/EE)^2 - ((Kr50_fit_E.c1/sqrt(2)-Kr50_fit_E_sig_sig)/W)^2 ) - sigR(3); + sig_sigR(4)=sqrt(1/2)*sqrt( ((Cs_fit_s1.c1/sqrt(2)+Cs_fit_s1_sig_sig)/g1)^2 + ((Cs_fit_s2.c1/sqrt(2)+Cs_fit_s2_sig_sig)/EE)^2 - ((Cs_fit_E.c1/sqrt(2)-Cs_fit_E_sig_sig)/W)^2 ) - sigR(4); + sig_sigR(5)=sqrt(1/2)*sqrt( ((Xe131_fit_s1.c1/sqrt(2)+Xe131_fit_s1_sig_sig)/g1)^2 + ((Xe131_fit_s2.c1/sqrt(2)+Xe131_fit_s2_sig_sig)/EE)^2 - ((Xe131_fit_E.c1/sqrt(2)-Xe131_fit_E_sig_sig)/W)^2 ) - sigR(5); + sig_sigR(6)=sqrt(1/2)*sqrt( ((Xe129_fit_s1.c1/sqrt(2)+Xe129_fit_s1_sig_sig)/g1)^2 + ((Xe129_fit_s2.c1/sqrt(2)+Xe129_fit_s2_sig_sig)/EE)^2 - ((Xe129_fit_E.c1/sqrt(2)-Xe129_fit_E_sig_sig)/W)^2 ) - sigR(6); + sig_sigR(7)=sqrt(1/2)*sqrt( ((Xe127_fit_s1.c1/sqrt(2)+Xe127_fit_s1_sig_sig)/g1)^2 + ((Xe127_fit_s2.c1/sqrt(2)+Xe127_fit_s2_sig_sig)/EE)^2 - ((Xe127_fit_E.c1/sqrt(2)-Xe127_fit_E_sig_sig)/W)^2 ) - sigR(7); + sig_sigR(8)=sqrt(1/2)*sqrt( ((Xe127_2_fit_s1.c1/sqrt(2)+Xe127_2_fit_s1_sig_sig)/g1)^2 + ((Xe127_2_fit_s2.c1/sqrt(2)+Xe127_2_fit_s2_sig_sig)/EE)^2 - ((Xe127_2_fit_E.c1/sqrt(2)-Xe127_2_fit_E_sig_sig)/W)^2 ) - sigR(8); + sig_sigR(9)=sqrt(1/2)*sqrt( ((Bi214_fit_s1.c1/sqrt(2)+Bi214_fit_s1_sig_sig)/g1)^2 + ((Bi214_fit_s2.c1/sqrt(2)+Bi214_fit_s2_sig_sig)/EE)^2 - ((Bi214_fit_E.c1/sqrt(2)-Bi214_fit_E_sig_sig)/W)^2 ) - sigR(9); + + s1_ng_stat(1)=sqrt( (Kr170_fit_s1.c1/sqrt(2)/g1)^2-sigR(1)^2); + s1_ng_stat(2)=sqrt( (Kr100_fit_s1.c1/sqrt(2)/g1)^2-sigR(2)^2); + s1_ng_stat(3)=sqrt( (Kr50_fit_s1.c1/sqrt(2)/g1)^2-sigR(3)^2); + s1_ng_stat(4)=sqrt( (Cs_fit_s1.c1/sqrt(2)/g1)^2-sigR(4)^2); + s1_ng_stat(5)=sqrt( (Xe131_fit_s1.c1/sqrt(2)/g1)^2-sigR(5)^2); + s1_ng_stat(6)=sqrt( (Xe129_fit_s1.c1/sqrt(2)/g1)^2-sigR(6)^2); + s1_ng_stat(7)=sqrt( (Xe127_fit_s1.c1/sqrt(2)/g1)^2-sigR(7)^2); + s1_ng_stat(8)=sqrt( (Xe127_2_fit_s1.c1/sqrt(2)/g1)^2-sigR(8)^2); + s1_ng_stat(9)=sqrt( (Bi214_fit_s1.c1/sqrt(2)/g1)^2-sigR(9)^2); + + + sig_s1_ng_stat(1)=sqrt( ((Kr170_fit_s1.c1/sqrt(2)+Kr170_fit_s1_sig_sig)/g1)^2-sigR(1)^2) - s1_ng_stat(1); + sig_s1_ng_stat(2)=sqrt( ((Kr100_fit_s1.c1/sqrt(2)+Kr100_fit_s1_sig_sig)/g1)^2-sigR(2)^2) - s1_ng_stat(2); + sig_s1_ng_stat(3)=sqrt( ((Kr50_fit_s1.c1/sqrt(2)+Kr50_fit_s1_sig_sig)/g1)^2-sigR(3)^2) - s1_ng_stat(3); + sig_s1_ng_stat(4)=sqrt( ((Cs_fit_s1.c1/sqrt(2)+Cs_fit_s1_sig_sig)/g1)^2-sigR(4)^2) - s1_ng_stat(4); + sig_s1_ng_stat(5)=sqrt( ((Xe131_fit_s1.c1/sqrt(2)+Xe131_fit_s1_sig_sig)/g1)^2-sigR(5)^2) - s1_ng_stat(5); + sig_s1_ng_stat(6)=sqrt( ((Xe129_fit_s1.c1/sqrt(2)+Xe129_fit_s1_sig_sig)/g1)^2-sigR(6)^2) - s1_ng_stat(6); + sig_s1_ng_stat(7)=sqrt( ((Xe127_fit_s1.c1/sqrt(2)+Xe127_fit_s1_sig_sig)/g1)^2-sigR(7)^2) - s1_ng_stat(7); + sig_s1_ng_stat(8)=sqrt( ((Xe127_2_fit_s1.c1/sqrt(2)+Xe127_2_fit_s1_sig_sig)/g1)^2-sigR(8)^2) - s1_ng_stat(8); + sig_s1_ng_stat(9)=sqrt( ((Bi214_fit_s1.c1/sqrt(2)+Bi214_fit_s1_sig_sig)/g1)^2-sigR(9)^2) - s1_ng_stat(9); + + + + s2_ne_stat(1)=sqrt( (Kr170_fit_s2.c1/sqrt(2)/EE)^2-sigR(1)^2); + s2_ne_stat(2)=sqrt( (Kr100_fit_s2.c1/sqrt(2)/EE)^2-sigR(2)^2); + s2_ne_stat(3)=sqrt( (Kr50_fit_s2.c1/sqrt(2)/EE)^2-sigR(3)^2); + s2_ne_stat(4)=sqrt( (Cs_fit_s2.c1/sqrt(2)/EE)^2-sigR(4)^2); + s2_ne_stat(5)=sqrt( (Xe131_fit_s2.c1/sqrt(2)/EE)^2-sigR(5)^2); + s2_ne_stat(6)=sqrt( (Xe129_fit_s2.c1/sqrt(2)/EE)^2-sigR(6)^2); + s2_ne_stat(7)=sqrt( (Xe127_fit_s2.c1/sqrt(2)/EE)^2-sigR(7)^2); + s2_ne_stat(8)=sqrt( (Xe127_2_fit_s2.c1/sqrt(2)/EE)^2-sigR(8)^2); + s2_ne_stat(9)=sqrt( (Bi214_fit_s2.c1/sqrt(2)/EE)^2-sigR(9)^2); + + + sig_s2_ne_stat(1)=sqrt( ((Kr170_fit_s2.c1/sqrt(2)+Kr170_fit_s2_sig_sig)/EE)^2-sigR(1)^2) - s2_ne_stat(1); + sig_s2_ne_stat(2)=sqrt( ((Kr100_fit_s2.c1/sqrt(2)+Kr100_fit_s2_sig_sig)/EE)^2-sigR(2)^2) - s2_ne_stat(2); + sig_s2_ne_stat(3)=sqrt( ((Kr50_fit_s2.c1/sqrt(2)+Kr50_fit_s2_sig_sig)/EE)^2-sigR(3)^2) - s2_ne_stat(3); + sig_s2_ne_stat(4)=sqrt( ((Cs_fit_s2.c1/sqrt(2)+Cs_fit_s2_sig_sig)/EE)^2-sigR(4)^2) - s2_ne_stat(4); + sig_s2_ne_stat(5)=sqrt( ((Xe131_fit_s2.c1/sqrt(2)+Xe131_fit_s2_sig_sig)/EE)^2-sigR(5)^2) - s2_ne_stat(5); + sig_s2_ne_stat(6)=sqrt( ((Xe129_fit_s2.c1/sqrt(2)+Xe129_fit_s2_sig_sig)/EE)^2-sigR(6)^2) - s2_ne_stat(6); + sig_s2_ne_stat(7)=sqrt( ((Xe127_fit_s2.c1/sqrt(2)+Xe127_fit_s2_sig_sig)/EE)^2-sigR(7)^2) - s2_ne_stat(7); + sig_s2_ne_stat(8)=sqrt( ((Xe127_2_fit_s2.c1/sqrt(2)+Xe127_2_fit_s2_sig_sig)/EE)^2-sigR(8)^2) - s2_ne_stat(8); + sig_s2_ne_stat(9)=sqrt( ((Bi214_fit_s2.c1/sqrt(2)+Bi214_fit_s2_sig_sig)/EE)^2-sigR(9)^2) - s2_ne_stat(9); + %% Fit to S1_stat vs. ng, and S2_stat vs. ng. Do not fit to the Xray. Kr is ok + % + % Then plot. S1_stat, S2_stat, sigR vs. Energy and Quanta + % + + g = fittype('a*x'); + + Fit_ng=fit(S1_mean([1:8])'/g1,s1_ng_stat([1:8])',g,'startpoint',[0.005]); % not fitting to the X-ray + Fit_ne=fit(S2_mean([1:8])'/EE,s2_ne_stat([1:8])',g,'startpoint',[0.005]); + Fit_R=fit(Energies([1:8])/W,sigR([1:8])',g,'startpoint',[0.01]); + + fluc_E_fig= figure; + hold on; + her=errorbar(Energies([1:8]),sigR([1:8]),sig_sigR([1:8]),'ok','markerfacecolor','k','markersize',8,'markeredgecolor','k'); + removeErrorBarEnds(her); + her2=errorbar(Energies([1:8]),s1_ng_stat([1:8]),sig_s1_ng_stat([1:8]),'sb','markerfacecolor','b','markersize',8,'markeredgecolor','k'); + removeErrorBarEnds(her2); + her3=errorbar(Energies([1:8]),s2_ne_stat([1:8]),sig_s2_ne_stat([1:8]),'^r','markerfacecolor','r','markersize',8,'markeredgecolor','k'); + removeErrorBarEnds(her3); + box on; + ylabel('stdev (#quanta) '); + xlabel('Energy [keV_{ee}] '); + myfigview(18); + ylim([0 3500]); + legend([her her2 her3],'R Flucs','S1(n_\gamma) Flucs','S2(n_e) Flucs','location','northwest'); + + %////////////Quanta//////////////////////////////////////////////// + sig_W=0.001; + + fluc_Q_fig=figure; + hold on; + + x_fit=0:500:50000; + hR=plot(x_fit,x_fit.*Fit_R.a,'--k','linewidth',2); + h_S1=plot(x_fit,x_fit.*Fit_ng.a,'--b','linewidth',2); + h_S2=plot(x_fit,x_fit.*Fit_ne.a,'--r','linewidth',2); + + + HH=ploterr((Energies([1:8])/W),(sigR([1:8])),(sig_W*Energies([1:8])/W^2), (sig_sigR([1:8]))); + set(HH(1),'Marker','o','Color','k','LineStyle','none','markersize',8,'linewidth',1,'markerfacecolor','k','markeredgecolor','k');set(HH(2),'Color','k','linewidth',1);set(HH(3),'Color','k','linewidth',1); + HH2=ploterr(S1_mean([1:8])/g1,s1_ng_stat([1:8]),S1_mean_sig([1:8])/g1,sig_s1_ng_stat([1:8])); + set(HH2(1),'Marker','s','Color','b','LineStyle','none','markersize',8,'linewidth',1,'markerfacecolor','b','markeredgecolor','k');set(HH2(2),'Color','b','linewidth',1);set(HH2(3),'Color','b','linewidth',1); + HH3=ploterr(S2_mean([1:8])/EE,s2_ne_stat([1:8]),S2_mean_sig([1:8])/EE,sig_s2_ne_stat([1:8])); + set(HH3(1),'Marker','^','Color','r','LineStyle','none','markersize',8,'linewidth',1,'markerfacecolor','r','markeredgecolor','k');set(HH3(2),'Color','r','linewidth',1);set(HH3(3),'Color','r','linewidth',1); + + + ylim([0 3500]); + box on; + ylabel('stdev (#quanta) '); + xlabel('Quanta '); + + myfigview(18); + + legend([HH2(1) HH3(1) HH(1)],'S1(n_\gamma) Flucs','S2(n_e) Flucs','R Flucs','location','northwest'); + + +% %% Plot in Discrimination space (ne/ng) showing all calibrations, and calculate ovals of R,S1,S2 fluctuations. +% +% Ng_mean=S1_mean/g1; +% Ne_mean=S2_mean./EE; +% E_keV_fits=[Kr170_fit_E.b1 Kr100_fit_E.b1 Kr50_fit_E.b1 Cs_fit_E.b1 Xe131_fit_E.b1 Xe129_fit_E.b1 Xe127_fit_E.b1 Xe127_2_fit_E.b1 Bi214_fit_E.b1]; +% +% sigR_logNeNg_u=log((Ne_mean+sigR)./(Ng_mean-sigR))-log(Ne_mean./Ng_mean); +% sigR_logNeNg_l=log((Ne_mean-sigR)./(Ng_mean+sigR))-log(Ne_mean./Ng_mean); +% +% sigNg_logNeNg_u=log((Ne_mean)./(Ng_mean+s1_ng_stat)); +% sigNg_logNeNg_uE=E_keV_fits+s1_ng_stat*W; +% sigNg_logNeNg_l=log((Ne_mean)./(Ng_mean-s1_ng_stat)); +% sigNg_logNeNg_lE=E_keV_fits-s1_ng_stat*W; +% +% sigNe_logNeNg_u=log((Ne_mean+s2_ne_stat)./(Ng_mean)); +% sigNe_logNeNg_uE=E_keV_fits+s2_ne_stat*W; +% sigNe_logNeNg_l=log((Ne_mean-s2_ne_stat)./(Ng_mean)); +% sigNe_logNeNg_lE=E_keV_fits-s2_ne_stat*W; +% +% % +% All_disc_figure = figure; +% hold on; +% density(E_com(cut & E_com<800 ), logNeNg(cut & E_com<800 ), [0:5:800],[-2:.02:.5],'binscale','log10'); +% colormap(MAP); +% myfigview(20); box on; set(gca,'linewidth',2); +% hc=colorbar; +% ylabel(hc,'log_{10}[Count/(n_e/n_\gamma)] ','fontsize',20); +% xlabel('Energy [keV] '); ylabel('Count/5keV '); +% ylabel('log(n_e/n_\gamma) '); +% set(gca,'xtick',[0:100:800]); +% caxis([0 3]); +% +% % add all fits and save plot +% H_Rec=errorbar( E_keV_fits,log(Ne_mean./Ng_mean),sigR_logNeNg_l, sigR_logNeNg_u ,'xk','markersize',8,'linewidth',2,'linestyle','none'); +% removeErrorBarEnds(H_Rec); +% %h_Rec=line([E_keV_fits;E_keV_fits],[sigR_logNeNg_l;sigR_logNeNg_u]+[log(Ne_mean./Ng_mean);log(Ne_mean./Ng_mean)],'color','k','linewidth',2); +% h_S2_stat=line([sigNe_logNeNg_lE;sigNe_logNeNg_uE],[sigNe_logNeNg_l;sigNe_logNeNg_u],'color','r','linewidth',2); +% h_S1_stat=line([sigNg_logNeNg_lE;sigNg_logNeNg_uE],[sigNg_logNeNg_l;sigNg_logNeNg_u],'color','w','linewidth',2); +% +% % Plot ellipses +% rot_s2s1=[0 0 1/100 1/100 1/100 1/200 1/300 1/500]; +% for ii=1:length(E_keV_fits); +% +% center_logS2S2=log(Ne_mean(ii)/Ng_mean(ii)); +% sig_E_ellipse=(sigNg_logNeNg_uE(ii)-sigNg_logNeNg_lE(ii))/2; +% plotellipse([E_keV_fits(ii), center_logS2S2, sig_E_ellipse, sigR_logNeNg_u(ii), rot_s2s1(ii)],'-k') +% +% end +% + + %% Calculate quanta and recombination fraciton + + + + Ng_mono= S1_mean/g1; + Ne_mono= S2_mean/EE; + +data_alpha=0.20; +N_ions_mono=(Ne_mono+Ng_mono)./(1+data_alpha); +N_quanta_mono=(Ne_mono+Ng_mono); +r_mono=(Ng_mono./Ne_mono-data_alpha)./(Ng_mono./Ne_mono+1); +R_mono=r_mono.*N_ions_mono; +bino_V_mono=(1-r_mono).*r_mono.*N_ions_mono; +y_mono=Ne_mono./(Ne_mono+Ng_mono); +s_mono=Ng_mono./(Ne_mono+Ng_mono); + + +% save('sigR_ng_ne','sigR','sig_sigR','s1_ng_stat','sig_s1_ng_stat',... +% 's2_ne_stat','sig_s2_ne_stat','Ng_mono','Ne_mono','N_ions_mono',... +% 'N_quanta_mono','r_mono','R_mono','bino_V_mono','y_mono','s_mono'); + +% save('G1G2_DQ_KrSE_Session'); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% using: +% 29.7 keV Xe-xray (only near the skin) +% 42.6 keV combinded Kr83m decay (be careful for time dependance) +% 662 keV Cs137 +% 236 keV Xe-129 (late March, early April 2013) +% 163 keV Xe-131 (late March, early April 2013) +% 236.1, 207.3 Xe-127 (late March, early April 2013) +% 410 Xe-127 +% 607 Bi-214 +% +% First make a density plot s1 vs s2 then apply a simple box cut +% - find mean s2 and s1 for a given energy, then make Doke plot +% -plot S1/E vs. S2/E, use intercepts to find g1,g2 +% +% - Using an R_c<20 cm cut to increase the stats for Xe_activation +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/Misc/Load_ALL_Kr50_G1G2_SatFixed_SECenter.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/Misc/Load_ALL_Kr50_G1G2_SatFixed_SECenter.m new file mode 100644 index 0000000..a9e3737 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/Misc/Load_ALL_Kr50_G1G2_SatFixed_SECenter.m @@ -0,0 +1,213 @@ +dir_path='/scratch4/LUXData/G1G2_Data/Kr_50Vcm/'; + +potential_folders_to_load={' '}; +folders_to_load={' '}; + +% Check that we are only loading folders with lux10_ +% and that they contain at least 10 MB of data +list=dir(dir_path); + + k=1; +for ii=1:length(list) + + if length(list(ii).name) > 6 + + if strcmp(list(ii).name(1:6),'lux10_') + + folder_contents=dir(strcat(dir_path,'/',list(ii).name)); + dir_size=sum([folder_contents.bytes]); + + if dir_size > 10^7 % 10 MB + + potential_folders_to_load{k}=list(ii).name; + k=k+1; + + end + + + end + end + +end + + +% Once we determined good folders to load, check their multiplicity +% Keep higher CP unless duplicated folder with a higher CP number contains no data +folder_names_char=char(potential_folders_to_load); +folder_name_no_cp=cellstr([folder_names_char(:,1:19)]); %convert the char back to a cell array of chars + +k=1; +good_index=1; +while good_index<=length(potential_folders_to_load) + + + folder_multiplicity=sum(strcmp(potential_folders_to_load{good_index}(1:19),folder_name_no_cp )); + good_index=good_index+folder_multiplicity-1; + + folders_to_load{k}=potential_folders_to_load{good_index}; + + k=k+1; + good_index=good_index+1; + +end + +%% + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing','golden'... + ,'top_bottom_ratio','z_corrected_pulse_area_all_phe','event_timestamp_samples'... + ,'x_corrected','y_corrected','selected_s1_s2','top_bottom_ratio',... + 'correction_electron_lifetime','correction_s2_xy_dependence','correction_s1_xyz_dependence',... + 'correction_s2_xy_dependence_bot','correction_s1_xyz_dependence_bot','aft_t0_samples',... + 'correction_s2_xy_dependence','spike_count','xyz_corrected_pulse_area_all_phe','xyz_corrected_pulse_area_bot_phe','s2_rec','x_cm','y_cm'}; + +ii=1; + + path=strcat(dir_path,'/',folders_to_load{ii}); + + d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + d = se_wrt_first_s1_func(d); + +%% VUV and Spike Corrections + % These correction factors are put in here by hand; they are the ratio of +% the two gain versions, per channel. +gainCorr = [ 1.07852885, 1.02147302, 1.14704873, 1.06599796, 1.,1.06565116, 1.17260696, 1.23915269, 1.05237586, 1.04581427,1.19078187, 1.01920447, 1.10806574, 1.04368312, 1.09359576, 1.20713643, 1.01269677, 0.97496447, 1.15328135, 1.04632389,1.09657976, 1.0540953 , 1.06966811, 1.18564767, 1.03347816,1.12664979, 1.21384238, 1.04435383, 1.096459 , 1.07002231,1.13197335, 1. , 0.99399306, 1.01098228, 1.2029547 ,1.07295668, 1.0696273 , 1.00686858, 1.08148498, 1.16649075,1.04850371, 1.05249835, 1.14049429, 1.00785073, 1.0943977 ,1.02962349, 1.08931321, 1.18235792, 1.03934669, 1.00709524,1.14178315, 1.04650374, 1.07221255, 1.03081791, 1.1338022 ,1.23879521, 0.9849912 , 1.02989339, 1.20126104, 1.0419401 ,1.08283583, 1.05111627, 1.16620644, 1.19375442, 1.06260808,1.01510865, 1.13129887, 1.09737434, 1.05748364, 1.08007699,1.07439593, 1.2135306 , 1.05225111, 1.06547247, 1.13095721,1.07715678, 1.0901655 , 1.06751444, 1.12705449, 1.17057193,1.09581789, 1.09417162, 1.23750879, 1.0706705 , 1.18163888,1.10125419, 1.14468798, 1.19880273, 1.12981092, 1.06592446,1.19612131, 1.14547149, 1. , 1.06916959, 1.1169941 ,1.15057597, 1.08348327, 1.08020233, 1.13099728, 1.08311348,1.11291194, 1.04754566, 1.10311997, 1.18206575, 1.0658937 ,1.03623549, 1.17802513, 1.07419023, 1.04725227, 1.08861405,1.10805692, 1.19684977, 1.07895852, 1.05339989, 1.15828588,1.08408482, 1.02837954, 1.05048981, 1.09229397, 1.14161773,1.01265111, 1.06664276]; + + +n_sig=2; + +rcut_min = 0; +rcut_max = 25;%cm + s1area_bound_min = 0; + s1area_bound_max = 10^5; + + s2area_bound_min = 50; + s2area_bound_max = 2*10^6; + + time_wait=d.event_timestamp_samples/1e8/60 > 60; %cut out first hour of high field data + time_wait_cut=repmat(time_wait,10,1); + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=time_wait_cut & (d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=time_wait_cut & (d.pulse_classification==2) & s2_area_cut ; + + s1_single_cut = logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden + s2_single_cut = logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + s2_rec_c=d.s2_rec; + + s1=d.pulse_area_phe(s1_single_cut); + s2=d.pulse_area_phe(s2_single_cut); + s2_bot=d.phe_bottom(s2_single_cut); + s2_c=s2_rec_c(s2_single_cut); + + s1_phe_both_xyz_VUV=mean(gainCorr).*s1; + s2_phe_both_xyz_VUV=mean(gainCorr).*s2; + s2_phe_bot_xyz_VUV=mean(gainCorr).*s2_bot; + s2_phe_both_xyz_VUV_SatFixed=mean(gainCorr).*s2_c; + + s2x_c=d.x_corrected(s2_single_cut); + s2y_c=d.y_corrected(s2_single_cut); + drift_time = d.z_drift_samples(s2_single_cut)/100; %units of us + + %% No tracking of XeAct means, sigma, errors, and number of events since we don't do the cuts in this code + +%% + + % Calculate Single Electron Size + s4_class=time_wait_cut & (d.pulse_classification==4) ; + cut_se_s1_z = d.t_btw_se_first_s1 > 100*10; + + SE_good_cut =logical( cut_se_s1_z & s4_class & ( cumsum(s1_single_cut)-cumsum(s2_single_cut) ) ); % only events between good S1 and S2s + SE_phe_both_VUV=mean(gainCorr).*d.xyz_corrected_pulse_area_all_phe(SE_good_cut); + + SE_x=d.x_cm(SE_good_cut); + SE_y=d.y_cm(SE_good_cut); + SE_radius=(SE_x.^2+SE_y.^2).^(1/2); + + num_SE(ii)=length(SE_phe_both_VUV(SE_radius<12)); + + SE_fit_VUV=fit([0:0.5:45]',hist(SE_phe_both_VUV(SE_radius<12),[0:0.5:45])','gauss1'); + SE_Size_VUV(ii)=SE_fit_VUV.b1; + SE_sig_VUV(ii)=SE_fit_VUV.c1/sqrt(2); + SE_Size_err_VUV(ii)=SE_sig_VUV(ii)/sqrt(length(SE_phe_both_VUV(SE_radius<12))); + + %Both PMT Second fit + n_sig_fit=2; + + fit_start=SE_Size_VUV(ii)-n_sig_fit*SE_sig_VUV(ii); + fit_end=SE_Size_VUV(ii)+n_sig_fit*SE_sig_VUV(ii); + xfit=fit_start:0.1:fit_end; + + SE_cut=SE_phe_both_VUV(SE_radius<12); + [xxo, yyo, xo, no] = step(SE_cut(inrange(SE_cut,[fit_start fit_end]))); + s = fitoptions('Method','NonlinearLeastSquares','Robust','On','Algorithm','Trust-Region','Lower',[-5,0,0,0],'Upper',[5,Inf,Inf,Inf],... + 'Startpoint',[1,max(no),10,5]); + skewGauss1 = fittype('a1/c1*exp(-((x-b1)/c1)^2)*(1+erf(a*(x-b1)/c1))','options',s); + + [f_bot,g_bot] = fit(xo',no',skewGauss1); + delta_bot = f_bot.a/sqrt(1+f_bot.a^2); + SE_mu_both = f_bot.b1 + f_bot.c1/sqrt(2)*delta_bot*sqrt(2/pi); + SE_sig_both = sqrt((f_bot.c1/sqrt(2))^2 * (1 - 2 * (delta_bot)^2/pi)); + skew_both = (4-pi)/2 * (delta_bot * sqrt(2/pi))^3 / (1 - 2 * delta_bot^2/pi)^(3/2); + kurt_both = 2*(pi-3) * (delta_bot * sqrt(2/pi))^3 / (1 - 2 * delta_bot^2/pi)^2; + ci_both = confint(f_bot); + y_fit_both = f_bot(xfit); + + SE_Size_VUV(ii)=SE_mu_both; + SE_sig_VUV(ii)=SE_sig_both; + + S2_numelectrons_VUV=s2_phe_both_xyz_VUV./SE_Size_VUV(ii); + S2_numelectrons_VUV_SatFixed=s2_phe_both_xyz_VUV_SatFixed./SE_Size_VUV(ii); + + %% + + %Bottom SE Size + SE_phe_bot_VUV=mean(gainCorr).*d.xyz_corrected_pulse_area_bot_phe(SE_good_cut); + + num_SE_bot(ii)=length(SE_phe_bot_VUV(SE_radius<12)); + + SE_fit_VUV=fit([0:0.2:30]',hist(SE_phe_bot_VUV(SE_radius<12),[0:0.2:30])','gauss1'); + SE_Size_bot_VUV(ii)=SE_fit_VUV.b1; + SE_sig_bot_VUV(ii)=SE_fit_VUV.c1/sqrt(2); + SE_Size_bot_err_VUV(ii)=SE_sig_VUV(ii)/sqrt(length(SE_phe_both_VUV(SE_radius<12))); + + %Bottom PMT Second fit + n_sig_fit=2; + + fit_start=SE_Size_bot_VUV(ii)-n_sig_fit*SE_sig_VUV(ii); + fit_end=SE_Size_bot_VUV(ii)+n_sig_fit*SE_sig_VUV(ii); + xfit=fit_start:0.1:fit_end; + + SE_cut_bot=SE_phe_bot_VUV(SE_radius<12); + + [xxo, yyo, xo, no] = step(SE_cut_bot(inrange(SE_cut_bot,[fit_start fit_end]))); + s = fitoptions('Method','NonlinearLeastSquares','Robust','On','Algorithm','Trust-Region','Lower',[-5,0,0,0],'Upper',[5,Inf,Inf,Inf],... + 'Startpoint',[1,max(no),10,5]); + skewGauss1 = fittype('a1/c1*exp(-((x-b1)/c1)^2)*(1+erf(a*(x-b1)/c1))','options',s); + + [f_bot,g_bot] = fit(xo',no',skewGauss1); + delta_bot = f_bot.a/sqrt(1+f_bot.a^2); + SE_mu_bot = f_bot.b1 + f_bot.c1/sqrt(2)*delta_bot*sqrt(2/pi); + SE_sig_bot = sqrt((f_bot.c1/sqrt(2))^2 * (1 - 2 * (delta_bot)^2/pi)); + skew_bot = (4-pi)/2 * (delta_bot * sqrt(2/pi))^3 / (1 - 2 * delta_bot^2/pi)^(3/2); + kurt_bot = 2*(pi-3) * (delta_bot * sqrt(2/pi))^3 / (1 - 2 * delta_bot^2/pi)^2; + ci_bot = confint(f_bot); + y_fit_bot = f_bot(xfit); + + SE_Size_bot_VUV(ii)=SE_mu_both; + SE_sig_bot_VUV(ii)=SE_sig_both; + + S2_numelectrons_bot_VUV=s2_phe_bot_xyz_VUV./SE_Size_bot_VUV(ii); + + save('/scratch4/LUXData/G1G2_Data/Kr_50Vcm/Run03Kr_50Vcm_SatCorr_SECenter_TimeCut','num_SE','SE_Size_VUV','SE_Size_err_VUV','SE_sig_VUV',... + 's1_phe_both_xyz_VUV',... + 's2_phe_both_xyz_VUV','S2_numelectrons_bot_VUV','SE_Size_bot_VUV','SE_sig_bot_VUV','SE_Size_bot_err_VUV','S2_numelectrons_VUV_SatFixed','s2_phe_both_xyz_VUV_SatFixed','s2x_c','s2y_c','drift_time','S2_numelectrons_VUV'); diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/Misc/MakeDDEnergySpectra_NoFieldCorr.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/Misc/MakeDDEnergySpectra_NoFieldCorr.m new file mode 100644 index 0000000..ac950ec --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/Misc/MakeDDEnergySpectra_NoFieldCorr.m @@ -0,0 +1,739 @@ +% load('C:\Program Files\MATLAB\R2012a\bin\Run04_ERBand\Kr2p14_FixedZHisto\S1aS1bParamScan_BothPolyFloat_FixedZHisto_FourParam_FineRes_test.mat') + + +s1ab_s2_xyz_fit_map.p1=-0.5448; +s1ab_s2_xyz_fit_map.p2=1.7272; +c1=1-s1ab_s2_xyz_fit_map.p1.*2.7313.^2-2.7313.*s1ab_s2_xyz_fit_map.p2; +s1ab_s2_xyz_fit_map.p3=c1; + + +a2=0.34; b2=-1.4; +s1ab_s1_xyz_fit_map.p1=a2; +s1ab_s1_xyz_fit_map.p2=b2; +c2=1-a2.*2.7313.^2-2.7313.*b2; +s1ab_s1_xyz_fit_map.p3=c2; + +inpaint_on=1; + +%HAVE TO MAKE THIS .MAT FILE STILL FROM THE DD KR DATASET +load('C:\Program Files\MATLAB\R2012a\bin\Run04_ERBand\Kr2p14_FixedZHisto\MappingParametersFit_Start_Oct2015DDKr.mat') + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Calculate 2015 DD Corrections +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% %If we can use 3D map, do so. If there aren't enough events do 1D then 2D +% if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +% %Removing zeros from map with nearest neighbor method +% s1ab_xyz_mean_old=s1ab_xyz_mean; +% temp_map=s1ab_xyz_mean; +% q= ~isnan(temp_map); +% r=nearestpoint(find(~q),find(q)); +% s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); +% +% %interpolating with cubic so that we get NaN when extrapolating +% s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); +% s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); +% s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3)./(s1ab_s2_xyz_fit_map.p1.*s1as1b_at_center.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_at_center+s1ab_s2_xyz_fit_map.p3); +% s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3)./(s1ab_s1_xyz_fit_map.p1.*s1as1b_at_center.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_at_center+s1ab_s1_xyz_fit_map.p3); +% +% %Filling in NaN values with the s1a/s1b Z map polynomial +% s1as1b_zvalues= polyval(s1ab_P,drift_time); +% s1as1b_z_at_center=polyval(s1ab_P,z_center); +% s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3)./(s1ab_s2_xyz_fit_map.p1.*s1as1b_z_at_center.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_z_at_center+s1ab_s2_xyz_fit_map.p3); +% s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3)./(s1ab_s1_xyz_fit_map.p1.*s1as1b_z_at_center.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_z_at_center+s1ab_s1_xyz_fit_map.p3); +% s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); +% s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); +% +% s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +% s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +% s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +% s1_phe_both=s1_phe_both./s1_3Dfieldremoval; +% +% +% else +% %Removing zeros from map with nearest neighbor method +% s1ab_xy_mean_old=s1ab_xy_mean; +% temp_map=s1ab_xy_mean; +% q= ~isnan(temp_map); +% r=nearestpoint(find(~q),find(q)); +% s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); +% +% %interpolating with cubic so that we get NaN when extrapolating +% s1as1b_zvalues= polyval(s1ab_P,drift_time); +% s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); +% s1as1b_z_at_center=polyval(s1ab_P,z_center); +% s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); +% +% s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3)./(s1ab_s2_xyz_fit_map.p1.*s1as1b_z_at_center.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_z_at_center+s1ab_s2_xyz_fit_map.p3); +% s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3)./(s1ab_s2_xyz_fit_map.p1.*s1as1b_xy_at_center.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_xy_at_center+s1ab_s2_xyz_fit_map.p3); +% s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3)./(s1ab_s1_xyz_fit_map.p1.*s1as1b_z_at_center.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_z_at_center+s1ab_s1_xyz_fit_map.p3); +% s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3)./(s1ab_s1_xyz_fit_map.p1.*s1as1b_xy_at_center.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_xy_at_center+s1ab_s1_xyz_fit_map.p3); +% +% %Filling in NaN values with no XY correction. (Z dependence should never be NaN) +% s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; +% s2_zfieldremoval(isnan(s2_zfieldremoval))=1; +% s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; +% s1_zfieldremoval(isnan(s1_zfieldremoval))=1; +% +% +% s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval.*s2_xyfieldremoval); +% s2_phe_both=s2_phe_both./(s2_zfieldremoval.*s2_xyfieldremoval); +% s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval.*s1_xyfieldremoval); +% s1_phe_both=s1_phe_both./(s1_zfieldremoval.*s1_xyfieldremoval); +% +% +% +% end + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=1000; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1500]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[5+bin_size, 500] );%from 50 to 300us for the fit, based on when s1as1b values get strange + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + %%Tracker for pseudo-lifetime + s2_at_bottom=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_2015=-320/log(s2_at_bottom/s2_at_top); + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_xbins),floor(s2_ybins)); +Sigma_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); +Count_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>30; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_xbins),floor(s1_ybins)); +Sigma_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); +Count_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>30; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XYZ. 3D Map, caluculate and Submit IQ +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% if Kr_events>150000 +% +% % LUXkrypCal_S1_3D(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_distance_\mus,user_name,file_id_cp,dp_version,submit); +% LUXkrypCal_S1_3D_Run04_local_2p14FixedZHisto(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_time,x_center,y_center,z_center,det_edge,inpaint_on,user_name,file_id_cp,dp_version, algorithm_name, submit); +% +% +% end +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%Apply Corrections to 2015 DD Data +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +% NEED TO LOAD THE DD DATA .MAT FILE HERE +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\Run04_ERBand\Kr2p14_FixedZHisto\Oct2015_DD.mat'); + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'spline',1); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'spline',1); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + %% Redo with r<10 cm + +fid_cut=(drift_time< -s2radius.^2+280) & drift_time>50 & drift_time<250; + +DD_s1_2015=s1_phe_both_xyz(fid_cut); +DD_s2_2015=s2_phe_both_xyz(fid_cut); + +%% NEED TO COME UP WITH CUTS TO SELECT NON DD DATA... FOR INSTANCE, NR CUT? Also a slopped radial cut to cut out wall + +%% Make the plots + + +g1=0.105; ee=0.98; +% g2_sep2014=27.21*ee; %converting to g2 with SE size + g2=25.28*ee; +%Kr 2014 data + +DD_E_2015=(1/73).*(DD_s1_2015./g1+DD_s2_2015./g2); + + +figure +step(DD_E_2015,[0:3:500],'k') +hold on; +line([163.9 163.9],[0 length(DD_E_2015)],'Color','r','LineWidth',2) %Xe131 +% line([236.1 236.1],[0 length(DD_E_2015)],'Color','r','LineWidth',2) %Xe129 +% % line([280 280],[0 length(DD_E_2015)],'Color','r','LineWidth',2) %Xe125? +% line([40 40],[0 length(DD_E_2015)],'Color','r','LineWidth',2) +% line([80 80],[0 length(DD_E_2015)],'Color','r','LineWidth',2) +% line([33.2 33.2],[0 length(DD_E_2015)],'Color','r','LineWidth',2) %Xray (127?) +% line([5.3 5.3],[0 length(DD_E_2015)],'Color','r','LineWidth',2) %xray (127?) +% line([275 275],[0 length(DD_E_2015)],'Color','r','LineWidth',2) +ylim([0 100]); +xlim([20 400]); +xlabel('Energy (keV)'); ylabel('Counts'); myfigview(16); +legend('Data','Expected'); + + + +ht=text(0,0,'Xe125 (275 keV)'); +set(ht,'FontSize',18) +set(ht,'Rotation',90) +set(ht,'Color',[1 0 0]) + +ht=text(0,0,'Xe129 (236 keV)'); +set(ht,'FontSize',18) +set(ht,'Rotation',90) +set(ht,'Color',[1 0 0]) + +ht=text(0,0,'Xe 131 (163.9 keV)'); +set(ht,'FontSize',18) +set(ht,'Rotation',90) +set(ht,'Color',[1 0 0]) + +ht=text(0,0,'Xe 129 (40 keV)'); +set(ht,'FontSize',18) +set(ht,'Rotation',90) +set(ht,'Color',[1 0 0]) + +ht=text(0,0,'Xe 131 (80 keV)'); +set(ht,'FontSize',18) +set(ht,'Rotation',90) +set(ht,'Color',[1 0 0]) + +%% Fit to the mose distinguishable DD peaks + +cut_40kev=inrange(DD_E_2015,[30 60]); +cut_80kev=inrange(DD_E_2015,[70 95]); +cut_164kev=inrange(DD_E_2015,[140 180]); +cut_236kev=inrange(DD_E_2015,[210,250]); +cut_275kev=inrange(DD_E_2015,[265,285]); + +fit_40kev=fit([30:3:60].',hist(DD_E_2015(cut_40kev),[30:3:60]).','gauss1'); +fit_80kev=fit([70:3:95].',hist(DD_E_2015(cut_80kev),[70:3:95]).','gauss1'); +fit_164kev=fit([140:3:180].',hist(DD_E_2015(cut_164kev),[140:3:180]).','gauss1'); +fit_236kev=fit([210:3:250].',hist(DD_E_2015(cut_236kev),[210:3:250]).','gauss1'); +fit_275kev=fit([265:3:285].',hist(DD_E_2015(cut_275kev),[265:3:285]).','gauss1'); + +resolution_40keV=(fit_40kev.c1/sqrt(2))/fit_40kev.b1 +resolution_80keV=(fit_80kev.c1/sqrt(2))/fit_80kev.b1 +resolution_164keV=(fit_164kev.c1/sqrt(2))/fit_164kev.b1 +resolution_236keV=(fit_236kev.c1/sqrt(2))/fit_236kev.b1 +resolution_275keV=(fit_275kev.c1/sqrt(2))/fit_275kev.b1 + +%show the fits +% figure +% step(DD_E_2015,[0:3:500],'-k'); +hold on; +x=[25:1:60]; y=fit_40kev.a1.*exp(-((x-fit_40kev.b1)./fit_40kev.c1).^2); +plot(x,y,'-b','LineWidth',2); +x=[60:3:120]; y=fit_80kev.a1.*exp(-((x-fit_80kev.b1)./fit_80kev.c1).^2); +plot(x,y,'-b','LineWidth',2); +x=[130:3:190]; y=fit_164kev.a1.*exp(-((x-fit_164kev.b1)./fit_164kev.c1).^2); +plot(x,y,'-b','LineWidth',2); +x=[200:3:260]; y=fit_236kev.a1.*exp(-((x-fit_236kev.b1)./fit_236kev.c1).^2); +plot(x,y,'-b','LineWidth',2); +x=[260:3:295]; y=fit_275kev.a1.*exp(-((x-fit_275kev.b1)./fit_275kev.c1).^2); +plot(x,y,'-b','LineWidth',2); +line([236.1 236.1],[0 length(DD_E_2015)],'Color','r','LineWidth',2) %Xe129 +line([40 40],[0 length(DD_E_2015)],'Color','r','LineWidth',2) +line([80 80],[0 length(DD_E_2015)],'Color','r','LineWidth',2) +line([275 275],[0 length(DD_E_2015)],'Color','r','LineWidth',2) +ylim([0 100]); +xlim([20 400]); +legend('Data','Expected','Fits'); + +fit_40kev.b1 +fit_40kev.c1/sqrt(2) +temp=confint(fit_40kev,0.68); +abs(fit_40kev.b1-temp(1,2)) +abs(fit_40kev.c1-temp(1,3))/sqrt(2) + +fit_80kev.b1 +fit_80kev.c1/sqrt(2) +temp=confint(fit_80kev,0.68); +abs(fit_80kev.b1-temp(1,2)) +abs(fit_80kev.c1-temp(1,3))/sqrt(2) + +fit_164kev.b1 +fit_164kev.c1/sqrt(2) +temp=confint(fit_164kev,0.68); +abs(fit_164kev.b1-temp(1,2)) +abs(fit_164kev.c1-temp(1,3))/sqrt(2) + + +fit_236kev.b1 +fit_236kev.c1/sqrt(2) +temp=confint(fit_236kev,0.68); +abs(fit_236kev.b1-temp(1,2)) +abs(fit_236kev.c1-temp(1,3))/sqrt(2) + +fit_275kev.b1 +fit_275kev.c1/sqrt(2) +temp=confint(fit_275kev,0.68); +abs(fit_275kev.b1-temp(1,2)) +abs(fit_275kev.c1-temp(1,3))/sqrt(2) \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/Misc/MakeDDEnergySpectra_NoFieldCorr_FixedG1G2.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/Misc/MakeDDEnergySpectra_NoFieldCorr_FixedG1G2.m new file mode 100644 index 0000000..c95973b --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/Misc/MakeDDEnergySpectra_NoFieldCorr_FixedG1G2.m @@ -0,0 +1,664 @@ +% load('C:\Program Files\MATLAB\R2012a\bin\Run04_ERBand\Kr2p14_FixedZHisto\S1aS1bParamScan_BothPolyFloat_FixedZHisto_FourParam_FineRes_test.mat') + + +s1ab_s2_xyz_fit_map.p1=-0.5448; +s1ab_s2_xyz_fit_map.p2=1.7272; +c1=1-s1ab_s2_xyz_fit_map.p1.*2.7313.^2-2.7313.*s1ab_s2_xyz_fit_map.p2; +s1ab_s2_xyz_fit_map.p3=c1; + + +a2=0.34; b2=-1.4; +s1ab_s1_xyz_fit_map.p1=a2; +s1ab_s1_xyz_fit_map.p2=b2; +c2=1-a2.*2.7313.^2-2.7313.*b2; +s1ab_s1_xyz_fit_map.p3=c2; + +inpaint_on=1; + +%HAVE TO MAKE THIS .MAT FILE STILL FROM THE DD KR DATASET +load('C:\Program Files\MATLAB\R2012a\bin\Run04_ERBand\Kr2p14_FixedZHisto\MappingParametersFit_Start_Oct2015DDKr.mat') + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Calculate 2015 DD Corrections +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% %If we can use 3D map, do so. If there aren't enough events do 1D then 2D +% if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +% %Removing zeros from map with nearest neighbor method +% s1ab_xyz_mean_old=s1ab_xyz_mean; +% temp_map=s1ab_xyz_mean; +% q= ~isnan(temp_map); +% r=nearestpoint(find(~q),find(q)); +% s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); +% +% %interpolating with cubic so that we get NaN when extrapolating +% s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); +% s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); +% s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3)./(s1ab_s2_xyz_fit_map.p1.*s1as1b_at_center.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_at_center+s1ab_s2_xyz_fit_map.p3); +% s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3)./(s1ab_s1_xyz_fit_map.p1.*s1as1b_at_center.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_at_center+s1ab_s1_xyz_fit_map.p3); +% +% %Filling in NaN values with the s1a/s1b Z map polynomial +% s1as1b_zvalues= polyval(s1ab_P,drift_time); +% s1as1b_z_at_center=polyval(s1ab_P,z_center); +% s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3)./(s1ab_s2_xyz_fit_map.p1.*s1as1b_z_at_center.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_z_at_center+s1ab_s2_xyz_fit_map.p3); +% s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3)./(s1ab_s1_xyz_fit_map.p1.*s1as1b_z_at_center.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_z_at_center+s1ab_s1_xyz_fit_map.p3); +% s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); +% s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); +% +% s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +% s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +% s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +% s1_phe_both=s1_phe_both./s1_3Dfieldremoval; +% +% +% else +% %Removing zeros from map with nearest neighbor method +% s1ab_xy_mean_old=s1ab_xy_mean; +% temp_map=s1ab_xy_mean; +% q= ~isnan(temp_map); +% r=nearestpoint(find(~q),find(q)); +% s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); +% +% %interpolating with cubic so that we get NaN when extrapolating +% s1as1b_zvalues= polyval(s1ab_P,drift_time); +% s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); +% s1as1b_z_at_center=polyval(s1ab_P,z_center); +% s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); +% +% s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3)./(s1ab_s2_xyz_fit_map.p1.*s1as1b_z_at_center.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_z_at_center+s1ab_s2_xyz_fit_map.p3); +% s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3)./(s1ab_s2_xyz_fit_map.p1.*s1as1b_xy_at_center.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_xy_at_center+s1ab_s2_xyz_fit_map.p3); +% s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3)./(s1ab_s1_xyz_fit_map.p1.*s1as1b_z_at_center.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_z_at_center+s1ab_s1_xyz_fit_map.p3); +% s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3)./(s1ab_s1_xyz_fit_map.p1.*s1as1b_xy_at_center.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_xy_at_center+s1ab_s1_xyz_fit_map.p3); +% +% %Filling in NaN values with no XY correction. (Z dependence should never be NaN) +% s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; +% s2_zfieldremoval(isnan(s2_zfieldremoval))=1; +% s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; +% s1_zfieldremoval(isnan(s1_zfieldremoval))=1; +% +% +% s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval.*s2_xyfieldremoval); +% s2_phe_both=s2_phe_both./(s2_zfieldremoval.*s2_xyfieldremoval); +% s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval.*s1_xyfieldremoval); +% s1_phe_both=s1_phe_both./(s1_zfieldremoval.*s1_xyfieldremoval); +% +% +% +% end + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=1000; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1500]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[5+bin_size, 500] );%from 50 to 300us for the fit, based on when s1as1b values get strange + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + %%Tracker for pseudo-lifetime + s2_at_bottom=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_2015=-320/log(s2_at_bottom/s2_at_top); + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_xbins),floor(s2_ybins)); +Sigma_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); +Count_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>30; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_xbins),floor(s1_ybins)); +Sigma_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); +Count_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>30; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XYZ. 3D Map, caluculate and Submit IQ +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% if Kr_events>150000 +% +% % LUXkrypCal_S1_3D(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_distance_\mus,user_name,file_id_cp,dp_version,submit); +% LUXkrypCal_S1_3D_Run04_local_2p14FixedZHisto(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_time,x_center,y_center,z_center,det_edge,inpaint_on,user_name,file_id_cp,dp_version, algorithm_name, submit); +% +% +% end +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%Apply Corrections to 2015 DD Data +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +% NEED TO LOAD THE DD DATA .MAT FILE HERE +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\Run04_ERBand\Kr2p14_FixedZHisto\Oct2015_DD.mat'); + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'spline',1); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'spline',1); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + %% Redo with r<10 cm + +fid_cut=(drift_time< -s2radius.^2+280) & drift_time>50 & drift_time<250; + +DD_s1_2015=s1_phe_both_xyz(fid_cut); +DD_s2_2015=s2_phe_both_xyz(fid_cut); + +%% NEED TO COME UP WITH CUTS TO SELECT NON DD DATA... FOR INSTANCE, NR CUT? Also a slopped radial cut to cut out wall + +%% Make the plots + + +g1=0.1025; ee=0.76; +% g2_sep2014=27.21*ee; %converting to g2 with SE size + g2=25.28*ee; +%Kr 2014 data + +DD_E_2015=(1/73).*(DD_s1_2015./g1+DD_s2_2015./g2); + + +figure +step(DD_E_2015,[0:3:500],'k') +hold on; +line([163.9 163.9],[0 length(DD_E_2015)],'Color','r','LineWidth',2) %Xe131 +line([236.1 236.1],[0 length(DD_E_2015)],'Color','r','LineWidth',2) %Xe129 +% line([280 280],[0 length(DD_E_2015)],'Color','r','LineWidth',2) %Xe125? +line([40 40],[0 length(DD_E_2015)],'Color','r','LineWidth',2) +line([80 80],[0 length(DD_E_2015)],'Color','r','LineWidth',2) +% line([33.2 33.2],[0 length(DD_E_2015)],'Color','r','LineWidth',2) %Xray (127?) +% line([5.3 5.3],[0 length(DD_E_2015)],'Color','r','LineWidth',2) %xray (127?) +line([275 275],[0 length(DD_E_2015)],'Color','r','LineWidth',2) +ylim([0 100]); +xlim([20 400]); +xlabel('Energy (keV)'); ylabel('Counts'); myfigview(16); +legend('Data','Expected'); + +ht=text(0,0,'Xe125 (275 keV)'); +set(ht,'FontSize',18) +set(ht,'Rotation',90) +set(ht,'Color',[1 0 0]) + +ht=text(0,0,'Xe129 (236 keV)'); +set(ht,'FontSize',18) +set(ht,'Rotation',90) +set(ht,'Color',[1 0 0]) + +ht=text(0,0,'Xe 131 (163.9 keV)'); +set(ht,'FontSize',18) +set(ht,'Rotation',90) +set(ht,'Color',[1 0 0]) + +ht=text(0,0,'Xe 129 (40 keV)'); +set(ht,'FontSize',18) +set(ht,'Rotation',90) +set(ht,'Color',[1 0 0]) + +ht=text(0,0,'Xe 131 (80 keV)'); +set(ht,'FontSize',18) +set(ht,'Rotation',90) +set(ht,'Color',[1 0 0]) \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/Misc/MakeERBand_NoFieldCorr.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/Misc/MakeERBand_NoFieldCorr.m new file mode 100644 index 0000000..3684f51 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/Misc/MakeERBand_NoFieldCorr.m @@ -0,0 +1,1738 @@ +% load('C:\Program Files\MATLAB\R2012a\bin\Run04_ERBand\Kr2p14_FixedZHisto\S1aS1bParamScan_BothPolyFloat_FixedZHisto_FourParam_FineRes_test.mat') + +s1ab_s2_xyz_fit_map.p1=-0.5448; +s1ab_s2_xyz_fit_map.p2=1.7272; +c1=1-s1ab_s2_xyz_fit_map.p1.*2.7313.^2-2.7313.*s1ab_s2_xyz_fit_map.p2; +s1ab_s2_xyz_fit_map.p3=c1; + + +a2=0.34; b2=-1.4; +s1ab_s1_xyz_fit_map.p1=a2; +s1ab_s1_xyz_fit_map.p2=b2; +c2=1-a2.*2.7313.^2-2.7313.*b2; +s1ab_s1_xyz_fit_map.p3=c2; + +inpaint_on=1; + +%HAVE TO MAKE THIS .MAT FILE STILL - USE class 1 and class 9 for S1 +load('C:\Program Files\MATLAB\R2012a\bin\Run04_ERBand\Kr2p20\MappingParametersFit_Start_2015_CutDown.mat') + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Calculate 2015 Corrections +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% %If we can use 3D map, do so. If there aren't enough events do 1D then 2D +% if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +% %Removing zeros from map with nearest neighbor method +% s1ab_xyz_mean_old=s1ab_xyz_mean; +% temp_map=s1ab_xyz_mean; +% q= ~isnan(temp_map); +% r=nearestpoint(find(~q),find(q)); +% s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); +% +% %interpolating with cubic so that we get NaN when extrapolating +% s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); +% s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); +% s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3)./(s1ab_s2_xyz_fit_map.p1.*s1as1b_at_center.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_at_center+s1ab_s2_xyz_fit_map.p3); +% s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3)./(s1ab_s1_xyz_fit_map.p1.*s1as1b_at_center.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_at_center+s1ab_s1_xyz_fit_map.p3); +% +% %Filling in NaN values with the s1a/s1b Z map polynomial +% s1as1b_zvalues= polyval(s1ab_P,drift_time); +% s1as1b_z_at_center=polyval(s1ab_P,z_center); +% s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3)./(s1ab_s2_xyz_fit_map.p1.*s1as1b_z_at_center.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_z_at_center+s1ab_s2_xyz_fit_map.p3); +% s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3)./(s1ab_s1_xyz_fit_map.p1.*s1as1b_z_at_center.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_z_at_center+s1ab_s1_xyz_fit_map.p3); +% s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); +% s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); +% +% s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +% s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +% s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +% s1_phe_both=s1_phe_both./s1_3Dfieldremoval; +% +% +% else +% %Removing zeros from map with nearest neighbor method +% s1ab_xy_mean_old=s1ab_xy_mean; +% temp_map=s1ab_xy_mean; +% q= ~isnan(temp_map); +% r=nearestpoint(find(~q),find(q)); +% s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); +% +% %interpolating with cubic so that we get NaN when extrapolating +% s1as1b_zvalues= polyval(s1ab_P,drift_time); +% s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); +% s1as1b_z_at_center=polyval(s1ab_P,z_center); +% s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); +% +% s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3)./(s1ab_s2_xyz_fit_map.p1.*s1as1b_z_at_center.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_z_at_center+s1ab_s2_xyz_fit_map.p3); +% s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3)./(s1ab_s2_xyz_fit_map.p1.*s1as1b_xy_at_center.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_xy_at_center+s1ab_s2_xyz_fit_map.p3); +% s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3)./(s1ab_s1_xyz_fit_map.p1.*s1as1b_z_at_center.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_z_at_center+s1ab_s1_xyz_fit_map.p3); +% s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3)./(s1ab_s1_xyz_fit_map.p1.*s1as1b_xy_at_center.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_xy_at_center+s1ab_s1_xyz_fit_map.p3); +% +% %Filling in NaN values with no XY correction. (Z dependence should never be NaN) +% s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; +% s2_zfieldremoval(isnan(s2_zfieldremoval))=1; +% s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; +% s1_zfieldremoval(isnan(s1_zfieldremoval))=1; +% +% +% s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval.*s2_xyfieldremoval); +% s2_phe_both=s2_phe_both./(s2_zfieldremoval.*s2_xyfieldremoval); +% s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval.*s1_xyfieldremoval); +% s1_phe_both=s1_phe_both./(s1_zfieldremoval.*s1_xyfieldremoval); +% +% +% +% end + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=1000; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1500]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + + % % Making a plot of the S2 Z dependence +% figure +colors={'r','b','g'}; +colors2={[1 0.6 0.6],[0.6 0.6 1],[0.6 1 0.6]}; +hold on; +i=1; +for dT_max=90:60:210; +s2z_fit_temp=fit(x,hist(s1_phe_both(cut==1 & inrange(drift_time,[dT_max-60 dT_max])),x)','gauss1'); +step(s1_phe_both(cut==1 & inrange(drift_time,[dT_max-60 dT_max])),x.',colors2{i}); +xx=[0:1:400]; y=s2z_fit_temp.a1.*exp(-((xx-s2z_fit_temp.b1)./s2z_fit_temp.c1).^2); +i=i+1; +end +legend('30-90 uSec','90-150 uSec','150-210 uSec'); +myfigview(16); +xlabel('S1_F (phe)'); ylabel('Counts'); +i=1; +for dT_max=90:60:210; +s2z_fit_temp=fit(x,hist(s1_phe_both(cut==1 & inrange(drift_time,[dT_max-60 dT_max])),x)','gauss1'); +xx=[0:1:400]; y=s2z_fit_temp.a1.*exp(-((xx-s2z_fit_temp.b1)./s2z_fit_temp.c1).^2); plot(xx,y,'LineWidth',2,'Color',colors{i}); +i=i+1; +end +xlim([100 350]) + + + +% Plot s1 z dep + + light_correction_fig = figure; + errorbar(mean_index,means,means_error,'.k'); + hold on + [yplot_s1_both] = polyval(P_s1_both,dT_fit); + [center_s1_both, center_s1_both_err] = polyval(P_s1_both,z_center, S); %160[us]*1.51[\mus/us] + plot(dT_fit,yplot_s1_both,'-r','LineWidth',1); + xlabel('Drift Time(\mus)', 'FontSize',16); ylabel('S1_F (phe)', 'FontSize', 16); +% title(strcat(file_id_cp,'.Kr83m. S1 Mean vs. Z'), 'FontSize', 16,'Interpreter','none'); + line([0 det_edge],[center_s1_both center_s1_both],'linestyle','--'); + line([z_center; z_center;],[min(means) max(means)],'linestyle','--'); + legend('S1\_both Mean', strcat('y=', num2str(P_s1_both(1),'%10.2e'), '*Z^2 + ', num2str(P_s1_both(2),'%10.2e')... + , '*Z + ', num2str(P_s1_both(3),4)),strcat('Det center = ',num2str(center_s1_both,4), ' [Phe]'),'location','northwest') + + box on; + myfigview(16); + xlim([0 det_edge]); + ylim([0.8*min(means) 1.15*max(means)]); +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[5+bin_size, 500] );%from 50 to 300us for the fit, based on when s1as1b values get strange + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + %%Tracker for pseudo-lifetime + s2_at_bottom=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_2015=-320/log(s2_at_bottom/s2_at_top); + + % % Making a plot of the S2 Z dependence +% figure +colors={'r','b','g'}; +colors2={[1 0.6 0.6],[0.6 0.6 1],[0.6 1 0.6]}; +hold on; +i=1; +for dT_max=90:60:210; +s2z_fit_temp=fit(x2,hist(s2_phe_both(cut==1 & inrange(drift_time,[dT_max-60 dT_max])),x2)','gauss1'); +step(s2_phe_both(cut==1 & inrange(drift_time,[dT_max-60 dT_max])),x2.',colors2{i}); +xx=[0:10:50000]; y=s2z_fit_temp.a1.*exp(-((xx-s2z_fit_temp.b1)./s2z_fit_temp.c1).^2); +i=i+1; +end +legend('30-90 uSec','90-150 uSec','150-210 uSec'); +myfigview(16); +xlabel('S2_F (phe)'); ylabel('Counts'); +i=1; +for dT_max=90:60:210; +s2z_fit_temp=fit(x2,hist(s2_phe_both(cut==1 & inrange(drift_time,[dT_max-60 dT_max])),x2)','gauss1'); +xx=[0:10:50000]; y=s2z_fit_temp.a1.*exp(-((xx-s2z_fit_temp.b1)./s2z_fit_temp.c1).^2); plot(xx,y,'LineWidth',2,'Color',colors{i}); +i=i+1; +end +xlim([5000 30000]) + +% S2_E Z dep figure + + lifetime_fig_both = figure; + errorbar(mean_index(2:end),means(2:end),means_error(2:end),'.k'); %first bin is anode, skip it + hold on + plot([0:0.1:350],RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,[0:0.1:350]),'-r','LineWidth',1); + xlabel('Drift Time (\mus)', 'FontSize',16); ylabel('S2_F (phe)', 'FontSize', 16); +% title(strcat(file_id_cp,'.Kr83m. S2_both Electron Lifetime'), 'FontSize', 16,'Interpreter','none'); + myfigview(16); + xlim([0 det_edge]); + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_xbins),floor(s2_ybins)); +Sigma_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); +Count_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>30; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + + + %centerS2b= 1; %interp2(s2xbins,s2ybins,mean_S2_bottom_xy,x_center,y_center,'spline'); + + color_range_max= max(max(mean_S2_both_xy)) ; + color_range_min= min(min(mean_S2_both_xy(mean_S2_both_xy>0))) ; + vc_step=(color_range_max-color_range_min)/50; + + vc=color_range_min:vc_step:color_range_max; + + s2_xy_both_fig = figure; + contourf(s2xbins,s2ybins,mean_S2_both_xy,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S2_F (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_xbins),floor(s1_ybins)); +Sigma_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); +Count_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>30; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +%plot + +color_range_max=max(max(mean_S1_both_xy)); +color_range_min=min(min(mean_S1_both_xy(mean_S1_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + +s1_xy_both_fig = figure; +contourf(s1xbins,s1ybins,mean_S1_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'S1_F (phe)','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XYZ. 3D Map, caluculate and Submit IQ +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% if Kr_events>150000 +% +% % LUXkrypCal_S1_3D(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_distance_\mus,user_name,file_id_cp,dp_version,submit); +% LUXkrypCal_S1_3D_Run04_local_2p14FixedZHisto(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_time,x_center,y_center,z_center,det_edge,inpaint_on,user_name,file_id_cp,dp_version, algorithm_name, submit); +% +% +% end + + +%% Apply corrections to CH3T and calculate the ER band shift + +%First load the data + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\Run04_ERBand\Kr2p20\CH3T_Sep2015_NoCorrections.mat'); + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = S2_x; +s1_y_cm = S2_y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'spline',1); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,S2_x,S2_y,'spline',1); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +%% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + h3_cut= inrange(drift_time,[40 300]) & inrange(s2radius_c,[0,18]) & inrange(s1_phe_both,[0 120]) ... + & (log10(s1_phe_both)+0.5*log10(s2_phe_both_xyz)<4) & s2_phe_both>100 & s2_phe_both<16000 ... + & drift_time<-2.*s2radius.^2+380; %used to be drift time 100 to 250 + +h3_s1_c_2015=s1_phe_both_xyz(h3_cut); +h3_s2_c_2015=s2_phe_both_xyz(h3_cut); +drift_time_2015=drift_time(h3_cut); +s2radius_2015=s2radius(h3_cut); + + kr_cut= inrange(drift_time,[40 300]) & inrange(s2radius_c,[0,18]) & inrange(s1_phe_both,[30 1000]) ... + & (log10(s1_phe_both)+0.5*log10(s2_phe_both_xyz)>4) & s2_phe_both>3000 & s2_phe_both<60000 ... + & drift_time<-2.*s2radius.^2+380; %used to be drift time 100 to 250 + + +kr_s1_c_2015=s1_phe_both_xyz(kr_cut); +kr_s2_c_2015=s2_phe_both_xyz(kr_cut); +kr_2015_drift_time=drift_time(kr_cut); +kr_2015_s2x=S2_x(kr_cut); +kr_2015_s2y=S2_y(kr_cut); + + clearvars -except param_counter a1_list b1_list a2_list b2_list total_chi2_list h3_chi2_list kr_chi2_list g1_list g2_list total_chi2_map h3_chi2_map kr_chi2_map chi2_midtobot_list... + best_chi2_midtotop besta1_midtotop besta2_midtotop bestb1_midtotop bestb2_midtotop best_chi2_midtobot... + besta1_midtobot besta1_midtotop bestb1_midtobot bestb1_midtotop a1 b1 a2 b2 chi2_midtotop_map chi2_midtobot_map b_counter a_counter... + besta1_combined bestb1_combined besta2_combined bestb2_combined best_chi2_combined chi2_combined_map chi2_combined_list b1_counter a1_counter a2_counter b2_counter... + a1_counter b1_counter a2_counter b2_counter c1_list c2_list bestc1_midtobot bestc2_midtobot bestc1_midtotop bestc2_midtotop bestc1_combined bestc2_combined... + besta1_combined besta2_combined bestb1_combined bestb2_combined besta1 bestb1 bestc1 besta2 bestb2 bestc2 bestg1 bestg2 best_total_chi2 NEST_CH3T_Spectrum inpaint_on... + best_kr_chi2 best_h3_chi2 electron_lifetime_list electron_lifetime_map a2_start a1_start b1_start b2_start ... + total_h3_chi2_list total_kr_chi2_list total_chi2_list h3_chi2_2014_list h3_chi2_2015_list kr_chi2_2014_list kr_chi2_2015_list ... + electron_lifetime_2014_list electron_lifetime_2015_list total_h3_chi2_map total_kr_chi2_map total_chi2_map h3_chi2_2014_map h3_chi2_2015_map ... + kr_chi2_2014_map kr_chi2_2015_map electron_lifetime_2014_map electron_lifetime_2015_map NEST_CH3T_Spectrum g1 g2 bestg1 bestg2 g1_counter g2_counter ... + firsta1 firstb1 firsta2 firstb2 firstg1 firstg2 kr_means_2015_map kr_means_2014_map kr_sigma_2015_map kr_sigma_2014_map kr_staterr_2015_map kr_staterr_2014_map ... + kr_means_2015_list kr_means_2014_list kr_2015_num_events kr_2014_num_events kr_sigma_2015_list kr_sigma_2014_list kr_staterr_2015_list kr_staterr_2014_list ... + pseudo_lifetime_2014 pseudo_lifetime_2015 kr_s1_c_2015 kr_s2_c_2015 h3_s1_c_2015 h3_s2_c_2015 s1ab_s2_xyz_fit_map s1ab_s1_xyz_fit_map ... + kr_2015_drift_time kr_2015_s2x kr_2015_s2y kr_chi2_2014_zslice_list kr_chi2_2015_zslice_list kr_chi2_zslice_zcenter_list ... + full_kr_chi2_2014_list full_kr_chi2_2015_list best_total_kr_chi2 best_total_h3_chi2 drift_time_2015 s2radius_2015 drift_time_2014 s2radius_2014 + + + + +%%%%%%%%%%%%%%%%%%%%% +%% REPEAT FOR 2014 DATA +%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\Run04_ERBand\Kr2p20\MappingParametersFit_Start_2014_CutDown.mat') + +% %If we can use 3D map, do so. If there aren't enough events do 1D then 2D +% if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +% %Removing zeros from map with nearest neighbor method +% s1ab_xyz_mean_old=s1ab_xyz_mean; +% temp_map=s1ab_xyz_mean; +% q= ~isnan(temp_map); +% r=nearestpoint(find(~q),find(q)); +% s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); +% +% %interpolating with cubic so that we get NaN when extrapolating +% s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); +% s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); +% s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3)./(s1ab_s2_xyz_fit_map.p1.*s1as1b_at_center.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_at_center+s1ab_s2_xyz_fit_map.p3); +% s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3)./(s1ab_s1_xyz_fit_map.p1.*s1as1b_at_center.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_at_center+s1ab_s1_xyz_fit_map.p3); +% +% %Filling in NaN values with the s1a/s1b Z map polynomial +% s1as1b_zvalues= polyval(s1ab_P,drift_time); +% s1as1b_z_at_center=polyval(s1ab_P,z_center); +% s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3)./(s1ab_s2_xyz_fit_map.p1.*s1as1b_z_at_center.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_z_at_center+s1ab_s2_xyz_fit_map.p3); +% s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3)./(s1ab_s1_xyz_fit_map.p1.*s1as1b_z_at_center.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_z_at_center+s1ab_s1_xyz_fit_map.p3); +% s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); +% s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); +% +% s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +% s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +% s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +% s1_phe_both=s1_phe_both./s1_3Dfieldremoval; +% +% +% else +% %Removing zeros from map with nearest neighbor method +% s1ab_xy_mean_old=s1ab_xy_mean; +% temp_map=s1ab_xy_mean; +% q= ~isnan(temp_map); +% r=nearestpoint(find(~q),find(q)); +% s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); +% +% %interpolating with cubic so that we get NaN when extrapolating +% s1as1b_zvalues= polyval(s1ab_P,drift_time); +% s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); +% s1as1b_z_at_center=polyval(s1ab_P,z_center); +% s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); +% +% s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3)./(s1ab_s2_xyz_fit_map.p1.*s1as1b_z_at_center.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_z_at_center+s1ab_s2_xyz_fit_map.p3); +% s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3)./(s1ab_s2_xyz_fit_map.p1.*s1as1b_xy_at_center.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_xy_at_center+s1ab_s2_xyz_fit_map.p3); +% s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3)./(s1ab_s1_xyz_fit_map.p1.*s1as1b_z_at_center.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_z_at_center+s1ab_s1_xyz_fit_map.p3); +% s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3)./(s1ab_s1_xyz_fit_map.p1.*s1as1b_xy_at_center.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_xy_at_center+s1ab_s1_xyz_fit_map.p3); +% +% %Filling in NaN values with no XY correction. (Z dependence should never be NaN) +% s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; +% s2_zfieldremoval(isnan(s2_zfieldremoval))=1; +% s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; +% s1_zfieldremoval(isnan(s1_zfieldremoval))=1; +% +% +% s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval.*s2_xyfieldremoval); +% s2_phe_both=s2_phe_both./(s2_zfieldremoval.*s2_xyfieldremoval); +% s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval.*s1_xyfieldremoval); +% s1_phe_both=s1_phe_both./(s1_zfieldremoval.*s1_xyfieldremoval); +% +% +% +% end + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[5+bin_size, 500] );%from 50 to 300us for the fit, based on when s1as1b values get strange + +s2_both_norm_z_index=mean_index(dT_range); +s2_both_norm_z_means=means(dT_range); + s2_at_top=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + %%Tracker for pseudo-lifetime + s2_at_bottom=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_2014=-320/log(s2_at_bottom/s2_at_top); +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_xbins),floor(s2_ybins)); +Sigma_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); +Count_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>30; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_xbins),floor(s1_ybins)); +Sigma_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); +Count_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>30; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Apply corrections to 2014 Kr data +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\Run04_ERBand\Kr2p20\MappingParametersFit_Start_2014_CutDown.mat') + + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; +% +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'spline',1); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'spline',1); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate ER Band shift +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + liquid_cut= inrange(drift_time,[40 300]) & inrange(s2radius,[0,18]) & inrange(s1_phe_both_xyz,[30 1000]) ... + & (log10(s1_phe_both_xyz)+0.5*log10(s2_phe_both_xyz)>4.2) & s2_phe_both>3000 & s2_phe_both<60000 ... ;%used to be drift time 100 to 250 + & drift_time<-1.4.*s2radius.^2+400; + + +kr_s1_c_2014=s1_phe_both_xyz(liquid_cut); +kr_s2_c_2014=s2_phe_both_xyz(liquid_cut); +kr_2014_drift_time=drift_time(liquid_cut); +kr_2014_s2x=s2x(liquid_cut); +kr_2014_s2y=s2y(liquid_cut); + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%Apply Corrections to 2014 CH3T Data +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\Run04_ERBand\Kr2p20\CH3T_Sep2014_NoCorrections.mat'); + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +% electron_lifetime_2014=e_lifetime_both; +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = S2_x; +s1_y_cm = S2_y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'spline',1); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,S2_x,S2_y,'spline',1); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate ER Band shift +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +s1_min=0; +s1_max=120; + + %% Redo with r<10 cm + + liquid_cut= clean_cut & inrange(drift_time,[40 300]) & inrange(s2radius_c,[0,18]) & inrange(s1_phe_both_xyz,[s1_min s1_max]) ... + & (log10(s1_phe_both_xyz)+0.5*log10(s2_phe_both_xyz)<4.2) & s2_phe_both>100 & s2_phe_both<16000 ... ;%used to be drift time 100 to 250 + & drift_time<-1.4.*s2radius.^2+400; + +h3_s1_c_2014=s1_phe_both_xyz(liquid_cut); +h3_s2_c_2014=s2_phe_both_xyz(liquid_cut); +drift_time_2014=drift_time(liquid_cut); +s2radius_2014=s2radius(liquid_cut); + + clearvars -except param_counter a1_list b1_list a2_list b2_list total_chi2_list h3_chi2_list kr_chi2_list g1_list g2_list total_chi2_map h3_chi2_map kr_chi2_map chi2_midtobot_list... + best_chi2_midtotop besta1_midtotop besta2_midtotop bestb1_midtotop bestb2_midtotop best_chi2_midtobot... + besta1_midtobot besta1_midtotop bestb1_midtobot bestb1_midtotop a1 b1 a2 b2 chi2_midtotop_map chi2_midtobot_map b_counter a_counter... + besta1_combined bestb1_combined besta2_combined bestb2_combined best_chi2_combined chi2_combined_map chi2_combined_list b1_counter a1_counter a2_counter b2_counter... + a1_counter b1_counter a2_counter b2_counter c1_list c2_list bestc1_midtobot bestc2_midtobot bestc1_midtotop bestc2_midtotop bestc1_combined bestc2_combined... + besta1_combined besta2_combined bestb1_combined bestb2_combined besta1 bestb1 bestc1 besta2 bestb2 bestc2 bestg1 bestg2 best_total_chi2 NEST_CH3T_Spectrum inpaint_on... + best_kr_chi2 best_h3_chi2 electron_lifetime_list electron_lifetime_map a2_start a1_start b1_start b2_start ... + total_h3_chi2_list total_kr_chi2_list total_chi2_list h3_chi2_2014_list h3_chi2_2015_list kr_chi2_2014_list kr_chi2_2015_list ... + electron_lifetime_2014_list electron_lifetime_2015_list total_h3_chi2_map total_kr_chi2_map total_chi2_map h3_chi2_2014_map h3_chi2_2015_map ... + kr_chi2_2014_map kr_chi2_2015_map electron_lifetime_2014_map electron_lifetime_2015_map NEST_CH3T_Spectrum g1 g2 bestg1 bestg2 g1_counter g2_counter ... + firsta1 firstb1 firsta2 firstb2 firstg1 firstg2 kr_means_2015_map kr_means_2014_map kr_sigma_2015_map kr_sigma_2014_map kr_staterr_2015_map kr_staterr_2014_map ... + kr_means_2015_list kr_means_2014_list kr_2015_num_events kr_2014_num_events kr_sigma_2015_list kr_sigma_2014_list kr_staterr_2015_list kr_staterr_2014_list ... + pseudo_lifetime_2014 pseudo_lifetime_2015 kr_s1_c_2015 kr_s2_c_2015 h3_s1_c_2015 h3_s2_c_2015 kr_s1_c_2014 kr_s2_c_2014 h3_s1_c_2014 h3_s2_c_2014 ... + kr_2015_drift_time kr_2015_s2x kr_2015_s2y kr_2014_drift_time kr_2014_s2x kr_2014_s2y ... + kr_chi2_2014_zslice_list kr_chi2_2015_zslice_list kr_chi2_zslice_zcenter_list ... + full_kr_chi2_2014_list full_kr_chi2_2015_list best_total_kr_chi2 best_total_h3_chi2 drift_time_2015 s2radius_2015 drift_time_2014 s2radius_2014 + +%% Make 2015 plots + +s1_min=0; +s1_max=50; + + +%% reset fiducial for ER band plots +max_r=21; +fiducial_cut=inrange(drift_time_2015,[40 300]) & inrange(s2radius_2015,[0,max_r]); +tritium_cut= inrange(h3_s1_c_2015,[0 50]) & fiducial_cut; + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:.05:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=tritium_cut & inrange(h3_s1_c_2015,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(h3_s2_c_2015(ER_fit_cut)./h3_s1_c_2015(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(h3_s2_c_2015(ER_fit_cut)./h3_s1_c_2015(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); + %ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + b=confint(ER_mean_power_fit,.68); + sigma_a_ER_mean=(b(2,1)-b(1,1))/2; + sigma_b_ER_mean=(b(2,2)-b(1,2))/2; + + ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + b=confint(ER_lower_power_fit,.68); + sigma_a_ER_lower=(b(2,1)-b(1,1))/2; + sigma_b_ER_lower=(b(2,2)-b(1,2))/2; + + ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + b=confint(ER_upper_power_fit,.68); + sigma_a_ER_upper=(b(2,1)-b(1,1))/2; + sigma_b_ER_upper=(b(2,2)-b(1,2))/2; + + + %Make Plot + + no_fid_new=figure; + hold on + %plot(s1_phe_both_xyz(tritium_cut),log10(s2_phe_both_xyz(tritium_cut)./s1_phe_both_xyz(tritium_cut)),'ok','markersize',2) + density(h3_s1_c_2015(tritium_cut),log10(h3_s2_c_2015(tritium_cut)./h3_s1_c_2015(tritium_cut)),[0:.2:100],[0:.02:4]); +% densityplot(s1_phe_both_xyz(tritium_cut),log10(s2_phe_both_xyz(tritium_cut)./s1_phe_both_xyz(tritium_cut)),'rectangle',[.5 .05],'lin'); + cc=colorbar; + ylabel(cc,'Count','FontSize',16); + colormap; + ylabel('Corrected log10(S2_E/S1_E)'); xlabel('S1_E corrected (Pulse Area Phe)'); + title(sprintf('Sep 2015 Run 04 CH3T ',max_r),'fontsize',16,'Interpreter','none'); + myfigview(16); + ylim([0 3.5]);xlim([0 s1_max]); +% plot(ER_bins,lower_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_lower_fit,'--k','markersize',14,'linewidth',2) +% plot(ER_bins,mean_ER_band,'ok','markersize',6,'linewidth',2)%plot mean of ER band + plot(ER_bins,ER_mean_fit,'-k','markersize',20,'linewidth',2) +% plot(ER_bins,upper_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_upper_fit,'--k','markersize',14,'linewidth',2) + + + bin_step=2; + + total_count=length(log10(h3_s2_c_2015(tritium_cut))); + + + box; + text(10,2.8,strcat('Total Count= ',num2str(total_count)),'fontsize',16); + %text(5,.7,strcat('NEST\_SE_{bot} Fit=',num2str(ER_mean_NEST_fit.SE_ER_fit*73/64*27/max_r,3),'\pm ', num2str(sigma_SE_ER_fit*73/64*27/max_r,2),'[Phe]'),'fontsize',16,'color','m','interpreter','tex'); + %text(5,.8,'NEST Platinum V4-b', 'fontsize',16,'color','m','interpreter','tex' ); + text(5,.55,strcat('+',num2str(band_sigma),'\sigma = (',num2str(ER_upper_power_fit.a,3),'\pm', num2str(sigma_a_ER_upper,1) ,')\times S1_c ^{', num2str(ER_upper_power_fit.b,3),'\pm',num2str(sigma_b_ER_upper,1),'}'),'fontsize',16,'interpreter','tex'); + text(5,.3,strcat('Mean=(',num2str(ER_mean_power_fit.a,3),'\pm', num2str(sigma_a_ER_mean,1),')\times S1_c ^{', num2str(ER_mean_power_fit.b,3),'\pm', num2str(sigma_b_ER_mean,1),'}'),'fontsize',16,'interpreter','tex'); + text(5,.05,strcat('-',num2str(band_sigma),'\sigma = (',num2str(ER_lower_power_fit.a,3),'\pm', num2str(sigma_a_ER_lower,1),')\times S1_c ^{', num2str(ER_lower_power_fit.b,3),'\pm', num2str(sigma_b_ER_lower,1),'}'),'fontsize',16,'interpreter','tex'); + + + +%% Make 2014 plots + +s1_min=0; +s1_max=50; + + +%% reset fiducial for ER band plots +max_r=21; +fiducial_cut=inrange(drift_time_2014,[40 300]) & inrange(s2radius_2014,[0,max_r]); +tritium_cut= inrange(h3_s1_c_2014,[0 50]) & fiducial_cut; + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:.05:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=tritium_cut & inrange(h3_s1_c_2014,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(h3_s2_c_2014(ER_fit_cut)./h3_s1_c_2014(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(h3_s2_c_2014(ER_fit_cut)./h3_s1_c_2014(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); + %ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + b=confint(ER_mean_power_fit,.68); + sigma_a_ER_mean=(b(2,1)-b(1,1))/2; + sigma_b_ER_mean=(b(2,2)-b(1,2))/2; + + ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + b=confint(ER_lower_power_fit,.68); + sigma_a_ER_lower=(b(2,1)-b(1,1))/2; + sigma_b_ER_lower=(b(2,2)-b(1,2))/2; + + ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + b=confint(ER_upper_power_fit,.68); + sigma_a_ER_upper=(b(2,1)-b(1,1))/2; + sigma_b_ER_upper=(b(2,2)-b(1,2))/2; + + + %Make Plot + + no_fid_new=figure; + hold on + %plot(s1_phe_both_xyz(tritium_cut),log10(s2_phe_both_xyz(tritium_cut)./s1_phe_both_xyz(tritium_cut)),'ok','markersize',2) + density(h3_s1_c_2014(tritium_cut),log10(h3_s2_c_2014(tritium_cut)./h3_s1_c_2014(tritium_cut)),[0:.2:100],[0:.02:4]); +% densityplot(s1_phe_both_xyz(tritium_cut),log10(s2_phe_both_xyz(tritium_cut)./s1_phe_both_xyz(tritium_cut)),'rectangle',[.5 .05],'lin'); + cc=colorbar; + ylabel(cc,'Count','FontSize',16); + colormap; + ylabel('Corrected log10(S2_E/S1_E)'); xlabel('S1_E corrected (Pulse Area Phe)'); + title(sprintf('Sep 2014 Run 04 CH3T ',max_r),'fontsize',16,'Interpreter','none'); + myfigview(16); + ylim([0 3.5]);xlim([0 s1_max]); +% plot(ER_bins,lower_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_lower_fit,'--k','markersize',14,'linewidth',2) +% plot(ER_bins,mean_ER_band,'ok','markersize',6,'linewidth',2)%plot mean of ER band + plot(ER_bins,ER_mean_fit,'-k','markersize',20,'linewidth',2) +% plot(ER_bins,upper_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_upper_fit,'--k','markersize',14,'linewidth',2) + + + bin_step=2; + + total_count=length(log10(h3_s2_c_2015(tritium_cut))); + + + box; + text(10,2.8,strcat('Total Count= ',num2str(total_count)),'fontsize',16); + %text(5,.7,strcat('NEST\_SE_{bot} Fit=',num2str(ER_mean_NEST_fit.SE_ER_fit*73/64*27/max_r,3),'\pm ', num2str(sigma_SE_ER_fit*73/64*27/max_r,2),'[Phe]'),'fontsize',16,'color','m','interpreter','tex'); + %text(5,.8,'NEST Platinum V4-b', 'fontsize',16,'color','m','interpreter','tex' ); + text(5,.55,strcat('+',num2str(band_sigma),'\sigma = (',num2str(ER_upper_power_fit.a,3),'\pm', num2str(sigma_a_ER_upper,1) ,')\times S1_c ^{', num2str(ER_upper_power_fit.b,3),'\pm',num2str(sigma_b_ER_upper,1),'}'),'fontsize',16,'interpreter','tex'); + text(5,.3,strcat('Mean=(',num2str(ER_mean_power_fit.a,3),'\pm', num2str(sigma_a_ER_mean,1),')\times S1_c ^{', num2str(ER_mean_power_fit.b,3),'\pm', num2str(sigma_b_ER_mean,1),'}'),'fontsize',16,'interpreter','tex'); + text(5,.05,strcat('-',num2str(band_sigma),'\sigma = (',num2str(ER_lower_power_fit.a,3),'\pm', num2str(sigma_a_ER_lower,1),')\times S1_c ^{', num2str(ER_lower_power_fit.b,3),'\pm', num2str(sigma_b_ER_lower,1),'}'),'fontsize',16,'interpreter','tex'); + + + + \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/Misc/MakeEnergySpectra_WithChosenParams_Slices_NoFieldCorr.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/Misc/MakeEnergySpectra_WithChosenParams_Slices_NoFieldCorr.m new file mode 100644 index 0000000..5dd9dc8 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/Misc/MakeEnergySpectra_WithChosenParams_Slices_NoFieldCorr.m @@ -0,0 +1,1592 @@ +% load('C:\Program Files\MATLAB\R2012a\bin\Run04_ERBand\Kr2p14_FixedZHisto\S1aS1bParamScan_BothPolyFloat_FixedZHisto_FourParam_FineRes_test.mat') + +s1ab_s2_xyz_fit_map.p1=-0.5448; +s1ab_s2_xyz_fit_map.p2=1.7272; +c1=1-s1ab_s2_xyz_fit_map.p1.*2.7313.^2-2.7313.*s1ab_s2_xyz_fit_map.p2; +s1ab_s2_xyz_fit_map.p3=c1; + + +a2=0.34; b2=-1.4; +s1ab_s1_xyz_fit_map.p1=a2; +s1ab_s1_xyz_fit_map.p2=b2; +c2=1-a2.*2.7313.^2-2.7313.*b2; +s1ab_s1_xyz_fit_map.p3=c2; + +inpaint_on=1; + +%HAVE TO MAKE THIS .MAT FILE STILL - USE class 1 and class 9 for S1 +load('C:\Program Files\MATLAB\R2012a\bin\Run04_ERBand\Kr2p20\MappingParametersFit_Start_2015_CutDown.mat') + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Calculate 2015 Corrections +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% %If we can use 3D map, do so. If there aren't enough events do 1D then 2D +% if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +% %Removing zeros from map with nearest neighbor method +% s1ab_xyz_mean_old=s1ab_xyz_mean; +% temp_map=s1ab_xyz_mean; +% q= ~isnan(temp_map); +% r=nearestpoint(find(~q),find(q)); +% s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); +% +% %interpolating with cubic so that we get NaN when extrapolating +% s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); +% s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); +% s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3)./(s1ab_s2_xyz_fit_map.p1.*s1as1b_at_center.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_at_center+s1ab_s2_xyz_fit_map.p3); +% s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3)./(s1ab_s1_xyz_fit_map.p1.*s1as1b_at_center.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_at_center+s1ab_s1_xyz_fit_map.p3); +% +% %Filling in NaN values with the s1a/s1b Z map polynomial +% s1as1b_zvalues= polyval(s1ab_P,drift_time); +% s1as1b_z_at_center=polyval(s1ab_P,z_center); +% s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3)./(s1ab_s2_xyz_fit_map.p1.*s1as1b_z_at_center.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_z_at_center+s1ab_s2_xyz_fit_map.p3); +% s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3)./(s1ab_s1_xyz_fit_map.p1.*s1as1b_z_at_center.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_z_at_center+s1ab_s1_xyz_fit_map.p3); +% s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); +% s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); +% +% s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +% s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +% s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +% s1_phe_both=s1_phe_both./s1_3Dfieldremoval; +% +% +% else +% %Removing zeros from map with nearest neighbor method +% s1ab_xy_mean_old=s1ab_xy_mean; +% temp_map=s1ab_xy_mean; +% q= ~isnan(temp_map); +% r=nearestpoint(find(~q),find(q)); +% s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); +% +% %interpolating with cubic so that we get NaN when extrapolating +% s1as1b_zvalues= polyval(s1ab_P,drift_time); +% s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); +% s1as1b_z_at_center=polyval(s1ab_P,z_center); +% s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); +% +% s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3)./(s1ab_s2_xyz_fit_map.p1.*s1as1b_z_at_center.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_z_at_center+s1ab_s2_xyz_fit_map.p3); +% s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3)./(s1ab_s2_xyz_fit_map.p1.*s1as1b_xy_at_center.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_xy_at_center+s1ab_s2_xyz_fit_map.p3); +% s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3)./(s1ab_s1_xyz_fit_map.p1.*s1as1b_z_at_center.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_z_at_center+s1ab_s1_xyz_fit_map.p3); +% s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3)./(s1ab_s1_xyz_fit_map.p1.*s1as1b_xy_at_center.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_xy_at_center+s1ab_s1_xyz_fit_map.p3); +% +% %Filling in NaN values with no XY correction. (Z dependence should never be NaN) +% s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; +% s2_zfieldremoval(isnan(s2_zfieldremoval))=1; +% s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; +% s1_zfieldremoval(isnan(s1_zfieldremoval))=1; +% +% +% s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval.*s2_xyfieldremoval); +% s2_phe_both=s2_phe_both./(s2_zfieldremoval.*s2_xyfieldremoval); +% s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval.*s1_xyfieldremoval); +% s1_phe_both=s1_phe_both./(s1_zfieldremoval.*s1_xyfieldremoval); +% +% +% +% end + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=1000; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1500]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[5+bin_size, 500] );%from 50 to 300us for the fit, based on when s1as1b values get strange + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + %%Tracker for pseudo-lifetime + s2_at_bottom=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_2015=-320/log(s2_at_bottom/s2_at_top); + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_xbins),floor(s2_ybins)); +Sigma_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); +Count_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>30; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_xbins),floor(s1_ybins)); +Sigma_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); +Count_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>30; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XYZ. 3D Map, caluculate and Submit IQ +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% if Kr_events>150000 +% +% % LUXkrypCal_S1_3D(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_distance_\mus,user_name,file_id_cp,dp_version,submit); +% LUXkrypCal_S1_3D_Run04_local_2p14FixedZHisto(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_time,x_center,y_center,z_center,det_edge,inpaint_on,user_name,file_id_cp,dp_version, algorithm_name, submit); +% +% +% end + + +%% Apply corrections to CH3T and calculate the ER band shift + +%First load the data + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\Run04_ERBand\Kr2p20\CH3T_Sep2015_NoCorrections.mat'); + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = S2_x; +s1_y_cm = S2_y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'spline',1); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,S2_x,S2_y,'spline',1); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +%% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + h3_cut= inrange(drift_time,[40 300]) & inrange(s2radius_c,[0,18]) & inrange(s1_phe_both,[0 120]) ... + & (log10(s1_phe_both)+0.5*log10(s2_phe_both_xyz)<4) & s2_phe_both>100 & s2_phe_both<16000 ... + & drift_time<-2.*s2radius.^2+380; %used to be drift time 100 to 250 + +h3_s1_c_2015=s1_phe_both_xyz(h3_cut); +h3_s2_c_2015=s2_phe_both_xyz(h3_cut); + + kr_cut= inrange(drift_time,[40 300]) & inrange(s2radius_c,[0,18]) & inrange(s1_phe_both,[30 1000]) ... + & (log10(s1_phe_both)+0.5*log10(s2_phe_both_xyz)>4) & s2_phe_both>3000 & s2_phe_both<60000 ... + & drift_time<-2.*s2radius.^2+380; %used to be drift time 100 to 250 + + +kr_s1_c_2015=s1_phe_both_xyz(kr_cut); +kr_s2_c_2015=s2_phe_both_xyz(kr_cut); +kr_2015_drift_time=drift_time(kr_cut); +kr_2015_s2x=S2_x(kr_cut); +kr_2015_s2y=S2_y(kr_cut); + + clearvars -except param_counter a1_list b1_list a2_list b2_list total_chi2_list h3_chi2_list kr_chi2_list g1_list g2_list total_chi2_map h3_chi2_map kr_chi2_map chi2_midtobot_list... + best_chi2_midtotop besta1_midtotop besta2_midtotop bestb1_midtotop bestb2_midtotop best_chi2_midtobot... + besta1_midtobot besta1_midtotop bestb1_midtobot bestb1_midtotop a1 b1 a2 b2 chi2_midtotop_map chi2_midtobot_map b_counter a_counter... + besta1_combined bestb1_combined besta2_combined bestb2_combined best_chi2_combined chi2_combined_map chi2_combined_list b1_counter a1_counter a2_counter b2_counter... + a1_counter b1_counter a2_counter b2_counter c1_list c2_list bestc1_midtobot bestc2_midtobot bestc1_midtotop bestc2_midtotop bestc1_combined bestc2_combined... + besta1_combined besta2_combined bestb1_combined bestb2_combined besta1 bestb1 bestc1 besta2 bestb2 bestc2 bestg1 bestg2 best_total_chi2 NEST_CH3T_Spectrum inpaint_on... + best_kr_chi2 best_h3_chi2 electron_lifetime_list electron_lifetime_map a2_start a1_start b1_start b2_start ... + total_h3_chi2_list total_kr_chi2_list total_chi2_list h3_chi2_2014_list h3_chi2_2015_list kr_chi2_2014_list kr_chi2_2015_list ... + electron_lifetime_2014_list electron_lifetime_2015_list total_h3_chi2_map total_kr_chi2_map total_chi2_map h3_chi2_2014_map h3_chi2_2015_map ... + kr_chi2_2014_map kr_chi2_2015_map electron_lifetime_2014_map electron_lifetime_2015_map NEST_CH3T_Spectrum g1 g2 bestg1 bestg2 g1_counter g2_counter ... + firsta1 firstb1 firsta2 firstb2 firstg1 firstg2 kr_means_2015_map kr_means_2014_map kr_sigma_2015_map kr_sigma_2014_map kr_staterr_2015_map kr_staterr_2014_map ... + kr_means_2015_list kr_means_2014_list kr_2015_num_events kr_2014_num_events kr_sigma_2015_list kr_sigma_2014_list kr_staterr_2015_list kr_staterr_2014_list ... + pseudo_lifetime_2014 pseudo_lifetime_2015 kr_s1_c_2015 kr_s2_c_2015 h3_s1_c_2015 h3_s2_c_2015 s1ab_s2_xyz_fit_map s1ab_s1_xyz_fit_map ... + kr_2015_drift_time kr_2015_s2x kr_2015_s2y kr_chi2_2014_zslice_list kr_chi2_2015_zslice_list kr_chi2_zslice_zcenter_list ... + full_kr_chi2_2014_list full_kr_chi2_2015_list best_total_kr_chi2 best_total_h3_chi2 + + + + +%%%%%%%%%%%%%%%%%%%%% +%% REPEAT FOR 2014 DATA +%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\Run04_ERBand\Kr2p20\MappingParametersFit_Start_2014_CutDown.mat') +% +% %If we can use 3D map, do so. If there aren't enough events do 1D then 2D +% if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +% %Removing zeros from map with nearest neighbor method +% s1ab_xyz_mean_old=s1ab_xyz_mean; +% temp_map=s1ab_xyz_mean; +% q= ~isnan(temp_map); +% r=nearestpoint(find(~q),find(q)); +% s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); +% +% %interpolating with cubic so that we get NaN when extrapolating +% s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); +% s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); +% s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3)./(s1ab_s2_xyz_fit_map.p1.*s1as1b_at_center.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_at_center+s1ab_s2_xyz_fit_map.p3); +% s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3)./(s1ab_s1_xyz_fit_map.p1.*s1as1b_at_center.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_at_center+s1ab_s1_xyz_fit_map.p3); +% +% %Filling in NaN values with the s1a/s1b Z map polynomial +% s1as1b_zvalues= polyval(s1ab_P,drift_time); +% s1as1b_z_at_center=polyval(s1ab_P,z_center); +% s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3)./(s1ab_s2_xyz_fit_map.p1.*s1as1b_z_at_center.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_z_at_center+s1ab_s2_xyz_fit_map.p3); +% s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3)./(s1ab_s1_xyz_fit_map.p1.*s1as1b_z_at_center.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_z_at_center+s1ab_s1_xyz_fit_map.p3); +% s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); +% s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); +% +% s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +% s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +% s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +% s1_phe_both=s1_phe_both./s1_3Dfieldremoval; +% +% +% else +% %Removing zeros from map with nearest neighbor method +% s1ab_xy_mean_old=s1ab_xy_mean; +% temp_map=s1ab_xy_mean; +% q= ~isnan(temp_map); +% r=nearestpoint(find(~q),find(q)); +% s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); +% +% %interpolating with cubic so that we get NaN when extrapolating +% s1as1b_zvalues= polyval(s1ab_P,drift_time); +% s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); +% s1as1b_z_at_center=polyval(s1ab_P,z_center); +% s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); +% +% s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3)./(s1ab_s2_xyz_fit_map.p1.*s1as1b_z_at_center.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_z_at_center+s1ab_s2_xyz_fit_map.p3); +% s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3)./(s1ab_s2_xyz_fit_map.p1.*s1as1b_xy_at_center.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_xy_at_center+s1ab_s2_xyz_fit_map.p3); +% s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3)./(s1ab_s1_xyz_fit_map.p1.*s1as1b_z_at_center.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_z_at_center+s1ab_s1_xyz_fit_map.p3); +% s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3)./(s1ab_s1_xyz_fit_map.p1.*s1as1b_xy_at_center.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_xy_at_center+s1ab_s1_xyz_fit_map.p3); +% +% %Filling in NaN values with no XY correction. (Z dependence should never be NaN) +% s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; +% s2_zfieldremoval(isnan(s2_zfieldremoval))=1; +% s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; +% s1_zfieldremoval(isnan(s1_zfieldremoval))=1; +% +% +% s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval.*s2_xyfieldremoval); +% s2_phe_both=s2_phe_both./(s2_zfieldremoval.*s2_xyfieldremoval); +% s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval.*s1_xyfieldremoval); +% s1_phe_both=s1_phe_both./(s1_zfieldremoval.*s1_xyfieldremoval); +% +% +% +% end + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[5+bin_size, 500] );%from 50 to 300us for the fit, based on when s1as1b values get strange + +s2_both_norm_z_index=mean_index(dT_range); +s2_both_norm_z_means=means(dT_range); + s2_at_top=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + %%Tracker for pseudo-lifetime + s2_at_bottom=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_2014=-320/log(s2_at_bottom/s2_at_top); +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_xbins),floor(s2_ybins)); +Sigma_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); +Count_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>30; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_xbins),floor(s1_ybins)); +Sigma_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); +Count_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>30; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Apply corrections to 2014 Kr data +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\Run04_ERBand\Kr2p20\MappingParametersFit_Start_2014_CutDown.mat') + + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; +% +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'spline',1); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'spline',1); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate ER Band shift +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + liquid_cut= inrange(drift_time,[40 300]) & inrange(s2radius,[0,18]) & inrange(s1_phe_both_xyz,[30 1000]) ... + & (log10(s1_phe_both_xyz)+0.5*log10(s2_phe_both_xyz)>4.2) & s2_phe_both>3000 & s2_phe_both<60000 ... ;%used to be drift time 100 to 250 + & drift_time<-1.4.*s2radius.^2+400; + + +kr_s1_c_2014=s1_phe_both_xyz(liquid_cut); +kr_s2_c_2014=s2_phe_both_xyz(liquid_cut); +kr_2014_drift_time=drift_time(liquid_cut); +kr_2014_s2x=s2x(liquid_cut); +kr_2014_s2y=s2y(liquid_cut); + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%Apply Corrections to 2014 CH3T Data +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\Run04_ERBand\Kr2p20\CH3T_Sep2014_NoCorrections.mat'); + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +% electron_lifetime_2014=e_lifetime_both; +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = S2_x; +s1_y_cm = S2_y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'spline',1); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,S2_x,S2_y,'spline',1); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate ER Band shift +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +s1_min=0; +s1_max=120; + + %% Redo with r<10 cm + + liquid_cut= clean_cut & inrange(drift_time,[40 300]) & inrange(s2radius_c,[0,18]) & inrange(s1_phe_both_xyz,[s1_min s1_max]) ... + & (log10(s1_phe_both_xyz)+0.5*log10(s2_phe_both_xyz)<4.2) & s2_phe_both>100 & s2_phe_both<16000 ... ;%used to be drift time 100 to 250 + & drift_time<-1.4.*s2radius.^2+400; + +h3_s1_c_2014=s1_phe_both_xyz(liquid_cut); +h3_s2_c_2014=s2_phe_both_xyz(liquid_cut); + + clearvars -except param_counter a1_list b1_list a2_list b2_list total_chi2_list h3_chi2_list kr_chi2_list g1_list g2_list total_chi2_map h3_chi2_map kr_chi2_map chi2_midtobot_list... + best_chi2_midtotop besta1_midtotop besta2_midtotop bestb1_midtotop bestb2_midtotop best_chi2_midtobot... + besta1_midtobot besta1_midtotop bestb1_midtobot bestb1_midtotop a1 b1 a2 b2 chi2_midtotop_map chi2_midtobot_map b_counter a_counter... + besta1_combined bestb1_combined besta2_combined bestb2_combined best_chi2_combined chi2_combined_map chi2_combined_list b1_counter a1_counter a2_counter b2_counter... + a1_counter b1_counter a2_counter b2_counter c1_list c2_list bestc1_midtobot bestc2_midtobot bestc1_midtotop bestc2_midtotop bestc1_combined bestc2_combined... + besta1_combined besta2_combined bestb1_combined bestb2_combined besta1 bestb1 bestc1 besta2 bestb2 bestc2 bestg1 bestg2 best_total_chi2 NEST_CH3T_Spectrum inpaint_on... + best_kr_chi2 best_h3_chi2 electron_lifetime_list electron_lifetime_map a2_start a1_start b1_start b2_start ... + total_h3_chi2_list total_kr_chi2_list total_chi2_list h3_chi2_2014_list h3_chi2_2015_list kr_chi2_2014_list kr_chi2_2015_list ... + electron_lifetime_2014_list electron_lifetime_2015_list total_h3_chi2_map total_kr_chi2_map total_chi2_map h3_chi2_2014_map h3_chi2_2015_map ... + kr_chi2_2014_map kr_chi2_2015_map electron_lifetime_2014_map electron_lifetime_2015_map NEST_CH3T_Spectrum g1 g2 bestg1 bestg2 g1_counter g2_counter ... + firsta1 firstb1 firsta2 firstb2 firstg1 firstg2 kr_means_2015_map kr_means_2014_map kr_sigma_2015_map kr_sigma_2014_map kr_staterr_2015_map kr_staterr_2014_map ... + kr_means_2015_list kr_means_2014_list kr_2015_num_events kr_2014_num_events kr_sigma_2015_list kr_sigma_2014_list kr_staterr_2015_list kr_staterr_2014_list ... + pseudo_lifetime_2014 pseudo_lifetime_2015 kr_s1_c_2015 kr_s2_c_2015 h3_s1_c_2015 h3_s2_c_2015 kr_s1_c_2014 kr_s2_c_2014 h3_s1_c_2014 h3_s2_c_2014 ... + kr_2015_drift_time kr_2015_s2x kr_2015_s2y kr_2014_drift_time kr_2014_s2x kr_2014_s2y ... + kr_chi2_2014_zslice_list kr_chi2_2015_zslice_list kr_chi2_zslice_zcenter_list ... + full_kr_chi2_2014_list full_kr_chi2_2015_list best_total_kr_chi2 best_total_h3_chi2 +%% Make plots + + + + +load('C:\Program Files\MATLAB\R2012a\bin\Run04_ERBand\Kr2p20\NEST_CH3T_Spectrum_Sep2014_Kr2p20.mat') +load('C:\Program Files\MATLAB\R2012a\bin\Run04_ERBand\Kr2p20\NEST_CH3T_Spectrum_Sep2015_Kr2p20.mat') + + +best_total_chi2=100000000; +for g1=0.09:0.005:0.125; + for ee=0.55:0.01:1.0; + +% g1=0.1025; ee=0.76; + g2_sep2014=27.21*ee; %converting to g2 with SE size + g2_sep2015=25.8536*ee; +%Kr 2014 data + +Kr_E_2014=(1/73).*(kr_s1_c_2014./g1+kr_s2_c_2014./g2_sep2014); +H3_E_2014=(1/73).*(h3_s1_c_2014./g1+h3_s2_c_2014./g2_sep2014); + +Kr_E_2015=(1/73).*(kr_s1_c_2015./g1+kr_s2_c_2015./g2_sep2015); +H3_E_2015=(1/73).*(h3_s1_c_2015./g1+h3_s2_c_2015./g2_sep2015); + +i=1; +for dT_max=40+20/2:20:300-20/2; + temp_fit_2014=fit([0:1:100].',hist(Kr_E_2014(inrange(kr_2014_drift_time,[dT_max-20 dT_max])),[0:1:100]).','gauss1'); + kr_2014_means(i)=temp_fit_2014.b1; + kr_2014_means_err(i)=temp_fit_2014.c1/sqrt(2)/length(Kr_E_2014(inrange(kr_2014_drift_time,[dT_max-20 dT_max]))); + + temp_fit_2015=fit([0:1:100].',hist(Kr_E_2015(inrange(kr_2015_drift_time,[dT_max-20 dT_max])),[0:1:100]).','gauss1'); + kr_2015_means(i)=temp_fit_2015.b1; + kr_2015_means_err(i)=temp_fit_2015.c1/sqrt(2)/length(Kr_E_2015(inrange(kr_2015_drift_time,[dT_max-20 dT_max]))); + + dT_centers(i)=dT_max-10; + i=i+1; +end + +kr_2014_chi2_slices=((41.55-kr_2014_means)./0.2395).^2; +kr_2015_chi2_slices=((41.55-kr_2015_means)./0.2395).^2; + +% figure +% errorbar(dT_centers,kr_2014_means,kr_2014_means_err,'.k'); +% xlabel('Drift Time (uSec)'); ylabel('Kr Energy Mean (phd)'); +% title('2014 Data'); +% myfigview(16); +% +% figure +% errorbar(dT_centers,kr_2015_means,kr_2015_means_err,'.k'); +% xlabel('Drift Time (uSec)'); ylabel('Kr Energy Mean (phd)'); +% title('2015 Data'); +% myfigview(16); +% +% figure +% errorbar(dT_centers,kr_2014_means,kr_2014_means_err,'.k'); +% hold on; +% errorbar(dT_centers,kr_2015_means,kr_2015_means_err,'.r'); +% xlabel('Drift Time (uSec)'); ylabel('Kr Energy Mean (phd)'); +% legend('2014','2015'); +% myfigview(16); + + + %make CH3T data spectrum + [h3_hist_sep2014,h3_hist_bin_sep2014]=hist(H3_E_2014,NEST_CH3T_Spectrum_Sep2014(1,:)); + [h3_hist_sep2015,h3_hist_bin_sep2015]=hist(H3_E_2015,NEST_CH3T_Spectrum_Sep2015(1,:)); + + %scale the simulation to the data + scale_factor_sep2014=sum(h3_hist_sep2014)./sum(NEST_CH3T_Spectrum_Sep2014(2,:)); + scale_factor_sep2015=sum(h3_hist_sep2015)./sum(NEST_CH3T_Spectrum_Sep2015(2,:)); + h3_scaled_sim_sep2014=NEST_CH3T_Spectrum_Sep2014(2,:).*scale_factor_sep2014; + h3_scaled_sim_sep2015=NEST_CH3T_Spectrum_Sep2015(2,:).*scale_factor_sep2015; + + h3_chi2_Sep2014=(1/63).*sum( (h3_scaled_sim_sep2014(15:80) - h3_hist_sep2014(15:80)).^2 ./(h3_hist_sep2014(15:80))); + h3_chi2_Sep2015=(1/63).*sum( (h3_scaled_sim_sep2015(15:80) - h3_hist_sep2015(15:80)).^2 ./(h3_hist_sep2015(15:80))); + + + total_h3_chi2=(h3_chi2_Sep2014+h3_chi2_Sep2015)/2; + total_kr_chi2=(mean(kr_2014_chi2_slices)+mean(kr_2015_chi2_slices))/2; + total_chi2=(total_h3_chi2+total_kr_chi2)/2; + + if total_chi2 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + clean_cut = (log10(s1_phe_both)+0.6*log10(s2_phe_both)>4.5) & s2radius<25; + + s1_phe_bottom=s1_phe_bottom(clean_cut); + s1_phe_both=s1_phe_both(clean_cut); + s2_phe_bottom=s2_phe_bottom(clean_cut); + s2_phe_both=s2_phe_both(clean_cut); + drift_time=drift_time(clean_cut); + s2x=s2x(clean_cut); + s2y=s2y(clean_cut); + s2radius = (s2x.^2+s2y.^2).^(0.5); + event_timestamp_samples=event_timestamp_samples(clean_cut); + s2_width=s2_width(clean_cut); + s1_width=s1_width(clean_cut); + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + +z_center +%% + + % Calculate Single Electron Size + s4_class=(d.pulse_classification==4) ; %Use or class=2 to fix 33 phe cut off... have to edit se_wrt_first_s1_func tho + d = se_wrt_first_s1_func(d); + cut_se_s1_z = d.t_btw_se_first_s1 > 100*10; + + SE_good_cut =logical( cut_se_s1_z & s4_class & ( cumsum(s1_single_cut)-cumsum(s2_single_cut) ) ); % only events between good S1 and S2s + + SE_phe_both=d.pulse_area_phe(SE_good_cut); + SE_phe_bot=d.phe_bottom(SE_good_cut); + SE_phe_top=SE_phe_both-SE_phe_bot; + + SE_x=d.x_cm(SE_good_cut); + SE_y=d.y_cm(SE_good_cut); + SE_radius=(SE_x.^2+SE_y.^2).^(1/2); + + %Both PMT first fit + SE_fit=fit([0:1:60]',hist(SE_phe_both(SE_radius<17 & inrange(SE_phe_both,[0 60])),[0:1:60])','gauss1'); + SE_Size=SE_fit.b1; + SE_sig=SE_fit.c1/sqrt(2); + SE_both_conf=confint(SE_fit,0.683); + SE_sig_mu_both=abs(SE_Size-SE_both_conf(1,2)); % one sigma + SE_sig_sig_both=abs(SE_sig-SE_both_conf(1,3)/sqrt(2)); % one sigma + + %Both PMT Second fit + n_sig_fit=2; + + fit_start=SE_Size-n_sig_fit*SE_sig; + fit_end=SE_Size+n_sig_fit*SE_sig; + xfit=fit_start:0.1:fit_end; + + SE_cut=SE_phe_both(SE_radius<17); + [xxo, yyo, xo, no] = step(SE_cut(inrange(SE_cut,[fit_start fit_end])),[0:0.2:60]); + s = fitoptions('Method','NonlinearLeastSquares','Robust','On','Algorithm','Trust-Region','Lower',[-5,0,0,0],'Upper',[5,Inf,Inf,Inf],... + 'Startpoint',[1,max(no),10,5]); + skewGauss1 = fittype('a1/c1*exp(-((x-b1)/c1)^2)*(1+erf(a*(x-b1)/c1))','options',s); + + [f_both,g_both] = fit(xo',no',skewGauss1); + delta_both = f_both.a/sqrt(1+f_both.a^2); + SE_mu_both = f_both.b1 + f_both.c1/sqrt(2)*delta_both*sqrt(2/pi); + SE_sig_both = sqrt((f_both.c1/sqrt(2))^2 * (1 - 2 * (delta_both)^2/pi)); + skew_both = (4-pi)/2 * (delta_both * sqrt(2/pi))^3 / (1 - 2 * delta_both^2/pi)^(3/2); + kurt_both = 2*(pi-3) * (delta_both * sqrt(2/pi))^3 / (1 - 2 * delta_both^2/pi)^2; + ci_both = confint(f_both,0.683); + y_fit_both = f_both(xfit); + + both_SE_fig=figure; + hold on; + step(SE_cut,[0:0.2:60],'k'); + h_fit=plot(xfit,y_fit_both,'-r','linewidth',2); + box on; + myfigview(18); + xlabel('Pulse Area Phe (Phe) '); ylabel('Count/Phe '); + legend([h_fit],strcat('\mu = ',num2str(SE_mu_both,'%2.2f'),'\newline \sigma= ',num2str(SE_sig_both,'%2.2f'),'\newline skew=', num2str(skew_both,'%2.2f') ), 'location','northeast'); + + + %% SE Both XY Map + SExybinsize=sqrt((50*50)/(length(SE_phe_both)/100)); + num_SE_events=length(SE_phe_both); + se_xbins=SE_xbin_min+SExybinsize/2:SExybinsize:SE_xbin_max; + se_ybins=SE_ybin_min+SExybinsize/2:SExybinsize:SE_ybin_max; + + mean_SE_both_xy = zeros(length(se_xbins),length(se_ybins)); + mean_err_SE_both_xy = zeros(length(se_xbins),length(se_ybins)); + skew_SE_both_xy = zeros(length(se_xbins),length(se_ybins)); + sigma_SE_both_xy = zeros(length(se_xbins),length(se_ybins)); + kurt_SE_both_xy = zeros(length(se_xbins),length(se_ybins)); + sigma_err_SE_both_xy = zeros(length(se_xbins),length(se_ybins)); + + for x_bin=SE_xbin_min:SExybinsize:(SE_xbin_max-SExybinsize); + for y_bin=SE_ybin_min:SExybinsize:(SE_ybin_max-SExybinsize); + x_min = x_bin; x_max = x_bin+SExybinsize; + y_min = y_bin; y_max = y_bin+SExybinsize; + + x_count=int32(1+x_bin/SExybinsize+SE_xbin_max/SExybinsize); + y_count=int32(1+y_bin/SExybinsize+SE_ybin_max/SExybinsize); + + + bin_cut = (SE_phe_both>0) & inrange(SE_x,[x_min,x_max]) & inrange(SE_y,[y_min,y_max]); + + if length(SE_phe_both(bin_cut)) > 60; + %Both PMT first fit + clear temp_SE + temp_SE=SE_phe_both(bin_cut); + SE_fit_xy=fit([0:1:60]',hist(temp_SE(inrange(temp_SE,[0 60])),[0:1:60])','gauss1'); + SE_Size_xy=SE_fit_xy.b1; + SE_sig_xy=SE_fit_xy.c1/sqrt(2); + SE_both_conf_xy=confint(SE_fit_xy,0.683); + SE_sig_mu_both_xy=abs(SE_Size_xy-SE_both_conf_xy(1,2)); % one sigma + SE_sig_sig_both_xy=abs(SE_sig_xy-SE_both_conf_xy(1,3)/sqrt(2)); % one sigma + + %Both PMT Second fit + n_sig_fit=2; + + fit_start=SE_Size_xy-n_sig_fit*SE_sig_xy; + fit_end=SE_Size_xy+n_sig_fit*SE_sig_xy; + xfit=fit_start:0.1:fit_end; + + [xxo, yyo, xo, no] = step(temp_SE(inrange(temp_SE,[fit_start fit_end])),[0:0.2:60]); + s = fitoptions('Method','NonlinearLeastSquares','Robust','On','Algorithm','Trust-Region','Lower',[-5,0,0,0],'Upper',[5,Inf,Inf,Inf],... + 'Startpoint',[1,max(no),10,5]); + skewGauss1 = fittype('a1/c1*exp(-((x-b1)/c1)^2)*(1+erf(a*(x-b1)/c1))','options',s); + + [f_both_xy,g_both_xy] = fit(xo',no',skewGauss1); + delta_both_xy = f_both_xy.a/sqrt(1+f_both_xy.a^2); + SE_mu_both_xy = f_both_xy.b1 + f_both_xy.c1/sqrt(2)*delta_both_xy*sqrt(2/pi); + SE_sig_both_xy = sqrt((f_both_xy.c1/sqrt(2))^2 * (1 - 2 * (delta_both_xy)^2/pi)); + skew_both_xy = (4-pi)/2 * (delta_both_xy * sqrt(2/pi))^3 / (1 - 2 * delta_both_xy^2/pi)^(3/2); + kurt_both_xy = 2*(pi-3) * (delta_both_xy * sqrt(2/pi))^3 / (1 - 2 * delta_both_xy^2/pi)^2; + ci_both_xy = confint(f_both_xy,0.683); + y_fit_both_xy = f_both_xy(xfit); + + mean_SE_both_xy(y_count,x_count)=SE_mu_both_xy; + skew_SE_both_xy(y_count,x_count)=skew_both_xy; + sigma_SE_both_xy(y_count,x_count)=SE_sig_both_xy; + kurt_SE_both_xy(y_count,x_count)=kurt_both_xy; + mean_err_SE_both_xy(y_count,x_count)=SE_sig_mu_both_xy; + sigma_err_SE_both_xy(y_count,x_count)=SE_sig_sig_both_xy; + + + else + + mean_SE_both_xy(y_count,x_count)=0; + skew_SE_both_xy(y_count,x_count)=0; + sigma_SE_both_xy(y_count,x_count)=0; + kurt_SE_both_xy(y_count,x_count)=0; + mean_err_SE_both_xy(y_count,x_count)=0; + sigma_err_SE_both_xy(y_count,x_count)=0; + + end + end + end + +%%Plot the mean SE_XY both %%%%%%%%%%%%%%%% +color_range_max=max(max(mean_SE_both_xy)); +color_range_min=min(min(mean_SE_both_xy(mean_SE_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; + +SE_xy_both_fig = figure; +contourf(se_xbins,se_ybins,mean_SE_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. SE Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%%Plot the 1 sigma of the mean + +color_range_max=max(max(mean_err_SE_both_xy)); +color_range_min=min(min(mean_err_SE_both_xy(mean_err_SE_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; + +sigma_SE_xy_both_fig = figure; +contourf(se_xbins,se_ybins,mean_err_SE_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. 1-Sigma SE Mean(Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + +%Calculate corrections matrix and 1 sigma corrections matrix for SE_both +% if inpaint_on==1; mean_SE_both_xy(mean_SE_both_xy==0)=nan; mean_SE_both_xy=inpaint_nans(mean_SE_both_xy,3); end; +SE_both_mu_center=interp2(se_xbins,se_ybins,mean_SE_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_SE_both_mu=SE_both_mu_center./mean_SE_both_xy; +norm_SE_both_mu(isinf(norm_SE_both_mu))=1;%no infinity! Do not correct events outside r=25cm +norm_SE_both_mu(isnan(norm_SE_both_mu))=1; + +%Calculate error on SE center +% if inpaint_on==1; mean_err_SE_both_xy(mean_err_SE_both_xy==0)=nan; mean_err_SE_both_xy=inpaint_nans(mean_err_SE_both_xy,3); end; +error_SE_both_mu_center=interp2(se_xbins,se_ybins,mean_err_SE_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +error_SE_both_mu_norm=sqrt((error_SE_both_mu_center./mean_SE_both_xy).^2+(mean_err_SE_both_xy.*SE_both_mu_center./mean_SE_both_xy.^2).^2); +error_SE_both_mu_norm(isinf(error_SE_both_mu_norm))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +error_SE_both_mu_norm(isnan(error_SE_both_mu_norm))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +%Calculate kurt,sigma, and skew at center +% if inpaint_on==1; kurt_SE_both_xy(kurt_SE_both_xy==0)=nan; kurt_SE_both_xy=inpaint_nans(kurt_SE_both_xy,3); end; +% if inpaint_on==1; skew_SE_both_xy(skew_SE_both_xy==0)=nan; skew_SE_both_xy=inpaint_nans(skew_SE_both_xy,3); end; +% if inpaint_on==1; sigma_SE_both_xy(sigma_SE_both_xy==0)=nan; sigma_SE_both_xy=inpaint_nans(sigma_SE_both_xy,3); end; +SE_both_kurt_center=interp2(se_xbins,se_ybins,kurt_SE_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +SE_both_skew_center=interp2(se_xbins,se_ybins,skew_SE_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +SE_both_sigma_center=interp2(se_xbins,se_ybins,sigma_SE_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/Misc/S1b_v_TimeAndField.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/Misc/S1b_v_TimeAndField.m new file mode 100644 index 0000000..2155104 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/Misc/S1b_v_TimeAndField.m @@ -0,0 +1,266 @@ +path='C:\Users\Richard\Desktop\LUX Analysis\lux10_20150929T1905_cp17548'; + + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing','golden'... + ,'selected_s1_s2','top_bottom_ratio','x_cm','y_cm'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +distinguish_string='test'; + +%Hardcoding inputs for ease of use during testing +user_name='RichardKnoche'; +dp_version='2.15_test'; +algorithm_name='test_KrypCal'; +submit=0; +delay_min=0; +inpaint_on=1; + + file=char(d.files_loaded(1)); + file_id=file(1:19); + cp_start=strfind(file,'cp')+2;%find location of 'cp' in string + cp=file(cp_start:cp_start+4);%cp number has four digits + file_id_cp = [file_id '_cp' cp '_' distinguish_string]; + + + gs=0; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 32000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + clean_cut = (log10(s1_phe_both)+0.6*log10(s2_phe_both)>4.5) & s2radius<25; + + s1_phe_bottom=s1_phe_bottom(clean_cut); + s1_phe_both=s1_phe_both(clean_cut); + s2_phe_bottom=s2_phe_bottom(clean_cut); + s2_phe_both=s2_phe_both(clean_cut); + drift_time=drift_time(clean_cut); + s2x=s2x(clean_cut); + s2y=s2y(clean_cut); + s2radius = (s2x.^2+s2y.^2).^(0.5); + event_timestamp_samples=event_timestamp_samples(clean_cut); + s2_width=s2_width(clean_cut); + s1_width=s1_width(clean_cut); + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + +%% + zcut_min = 10; %field changes at 4 uSec + zcut_max = 0.95*det_edge; + + + if Kr_events < 30000 %then create a 10x10 grid. Otherwise 25x25. Want about 30 evts per bin + + S1xybinsize = sqrt((50*50)/(Kr_events/150)); + S1_xbin_min = -25; + S1_xbin_max = 25; + S1_ybin_min = -25; + S1_ybin_max = 25; + SE_ybin_min = -25; + SE_ybin_max = 25; + + S2xybinsize = sqrt((50*50)/(Kr_events/150));%cm +% SExybinsize = 5; DEFINED LATER, based on number of SE events + S2_xbin_min = -25; + S2_xbin_max = 25; + S2_ybin_min = -25; + S2_ybin_max = 25; + SE_xbin_min = -25; + SE_xbin_max = 25; + + + end + + s1_xbins = (S1_xbin_max-S1_xbin_min)./S1xybinsize; + s1_ybins = (S1_ybin_max-S1_ybin_min)./S1xybinsize; + + s2_xbins = (S2_xbin_max-S2_xbin_min)./S2xybinsize; + s2_ybins = (S2_ybin_max-S2_ybin_min)./S2xybinsize; + + + if Kr_events < 4000; % skip krpCal if less than 4000 events + calibrations=zeros(6,1); + end + +%% +%Set up cuts and variables + s1ab_cut=logical(sum(s1_single_cut(:,:),1)); + s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); + s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); + s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); + s1ab_x=d.x_cm(s2_single_cut); + s1ab_y=d.y_cm(s2_single_cut); + s1ab_z=d.z_drift_samples(s2_single_cut)/100; + s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); + +% s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<=25; + %plotting x=s1a v y=s1a/s1b cuts: y<0.035x-1, y>-0.035.*x+5; y>0.01.*x; %y<4.2; x<255 +% s1ab_areacut= (s1a_phe_both./s1b_phe_both-0.035.*s1a_phe_both<-1) & (s1a_phe_both./s1b_phe_both+0.035.*s1a_phe_both>5)... +% & (s1a_phe_both./s1b_phe_both > 0.01.* s1a_phe_both) & (s1a_phe_both./s1b_phe_both<4.2) & (s1a_phe_both<255); + +% s1ab_x=s1ab_x(s1ab_timing_cut); +% s1ab_y=s1ab_y(s1ab_timing_cut); +% s1ab_z=s1ab_z(s1ab_timing_cut); +% s1a_phe_both=s1a_phe_both(s1ab_timing_cut); +% s1b_phe_both=s1b_phe_both(s1ab_timing_cut); + + + +%% 3D Kr s1a/s1b map + +% if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +s1ab_xyz_numbins=floor((length(s1ab_z)/2000)^(1/3)); %number of bins in one direction +s1ab_xyz_zstep=det_edge/s1ab_xyz_numbins; +s1ab_xyz_xstep=50/s1ab_xyz_numbins; +s1ab_xyz_ystep=50/s1ab_xyz_numbins; +s1ab_xyz_xmax=25; +r_max=25; + +% s1ab_xyz_zbins=10+s1ab_xyz_zstep/2:s1ab_xyz_zstep:10+s1ab_xyz_zstep/2+s1ab_xyz_zstep*s1ab_xyz_numbins; %20 us +% s1ab_xyz_xbins=(-r_max+s1ab_xyz_xstep/2):s1ab_xyz_xstep:r_max; +% s1ab_xyz_ybins=(-r_max+s1ab_xyz_ystep/2):s1ab_xyz_ystep:r_max; +% +% s1a_xyz_mean=zeros(length(s1ab_xyz_ybins),length(s1ab_xyz_xbins),length(s1ab_xyz_zbins)); +% s1a_xyz_mean_err=zeros(length(s1ab_xyz_ybins),length(s1ab_xyz_xbins),length(s1ab_xyz_zbins)); +% s1b_xyz_mean=zeros(length(s1ab_xyz_ybins),length(s1ab_xyz_xbins),length(s1ab_xyz_zbins)); +% s1b_xyz_mean_err=zeros(length(s1ab_xyz_ybins),length(s1ab_xyz_xbins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + m=int8(j/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + + %Count the number of events per bin + Count_S1ab_3D(l,m,n)=length(s1a_phe_both(q)); + + if (Count_S1ab_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_xyz_mean(l,m,n)=s1a_z_fit.b1; + s1a_xyz_mean_err(l,m,n)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]) ),[0:2:300]).','gauss1'); + s1b_xyz_mean(l,m,n)=s1b_z_fit.b1; + s1b_xyz_mean_err(l,m,n)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); + else %not enough stats to do the fit + s1a_xyz_mean(l,m,n)=0; + s1a_xyz_mean_err(l,m,n)=0; + s1b_xyz_mean(l,m,n)=0; + s1b_xyz_mean_err(l,m,n)=0; + end + + end + end +k +end +% +% s1ab_xyz_mean=s1a_xyz_mean./s1b_xyz_mean; +% s1ab_xyz_mean_err=sqrt( (s1b_xyz_mean_err.*s1a_xyz_mean./(s1b_xyz_mean.^2)).^2 + (s1a_xyz_mean_err./s1b_xyz_mean).^2); + +% end + diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/Misc/ZCenter_v_Radius.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/Misc/ZCenter_v_Radius.m new file mode 100644 index 0000000..b7e7ed7 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/Misc/ZCenter_v_Radius.m @@ -0,0 +1,210 @@ +path='C:\Users\Richard\Desktop\LUX Analysis\lux10_20150929T1905_cp18197'; + + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples','x_cm_del','y_cm_del'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + + +distinguish_string='test'; + +%Hardcoding inputs for ease of use during testing +user_name='RichardKnoche'; +dp_version='2.15_test'; +algorithm_name='test_KrypCal'; +submit=0; +delay_min=0; +inpaint_on=1; + + file=char(d.files_loaded(1)); + file_id=file(1:19); + cp_start=strfind(file,'cp')+2;%find location of 'cp' in string + cp=file(cp_start:cp_start+4);%cp number has four digits + file_id_cp = [file_id '_cp' cp '_' distinguish_string]; + + + gs=0; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 32000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + s2x_del=d.x_cm_del(s2_single_cut); + s2y_del=d.y_cm_del(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + s2radius_del=(s2x_del.^2+s2y_del.^2).^(0.5); + clean_cut = (log10(s1_phe_both)+0.6*log10(s2_phe_both)>4.5) & s2radius<25; + + s1_phe_bottom=s1_phe_bottom(clean_cut); + s1_phe_both=s1_phe_both(clean_cut); + s2_phe_bottom=s2_phe_bottom(clean_cut); + s2_phe_both=s2_phe_both(clean_cut); + drift_time=drift_time(clean_cut); + s2x=s2x(clean_cut); + s2y=s2y(clean_cut); + s2x_del=s2x_del(clean_cut); + s2y_del=s2y_del(clean_cut); + s2radius_del=s2radius_del(clean_cut); + s2radius = (s2x.^2+s2y.^2).^(0.5); + event_timestamp_samples=event_timestamp_samples(clean_cut); + s2_width=s2_width(clean_cut); + s1_width=s1_width(clean_cut); + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +% z_center=mean(drift_time(drift_time>4)); + +for i=1:1:250; + z_center(i)=mean(drift_time(drift_time>4 & s2radius<=(i/10))); +end + +figure +plot([0.1:0.1:25],z_center,'.k') + +for i=1:1:250; + z_center_del(i)=mean(drift_time(drift_time>4 & s2radius_del<=(i/10))); +end + +figure +plot([0.1:0.1:25],z_center_del,'.k') +title('Delensed Radius') + +for i=1:1:250; + z_count(i)=length(drift_time(drift_time>4 & s2radius_del.^2<=(i/10).^2)); +end + + +figure +plot([0.1:0.1:25],z_count,'.k') +title('Delensed Radius - Z count') + +figure %changing radial cut here shows the efffect of the field effect on radial cut result +step(drift_time(s2radius<20),[0:2:360]) + + + +%Nonuniform drift time even in s2radius_del... leads to artificially high drift time z_center +figure +step(drift_time(s2radius_del<15),[0:2:360]) + +%% What Lucie's map tells us +load('C:\Program Files\MATLAB\R2012a\bin\Run04_ERBand\Kr2p20\LucieSep2015_Map'); +true_x= LucieSep2015Map(:,1); +true_y= LucieSep2015Map(:,2); +true_z= LucieSep2015Map(:,3); +x= LucieSep2015Map(:,5); %uncorrected x +y= LucieSep2015Map(:,6); %uncorrected y +field = LucieSep2015Map(:,4)/100; %Field in V/cm instead of V/m +z=LucieSep2015Map(:,7); %drift time in uSec +r=sqrt(x.^2+y.^2); +event_class=LucieSep2015Map(:,8); + +%True z center of the detector (in lucie's coordinates) is ~-10cm + mean(true_z) + +%The drift time corresponding to this, near xy=0 is 143 +mean(z(~isnan(z) & true_radius<2 & inrange(true_z,[-10.5,-9.5]))) + +%However, if we look at the drift time histogram from Lucie's map, at low radius +%it is clear that the "edge" of the detector is around 330 uSec +figure +step(z(~isnan(z) & true_radius<7),[0:6:360]) + +%I think the low "average" drift time value comes from the holes in the dT histo at +%higher dT, and the spike around 30 uSec. This is a problem with Lucie's map, and is not physical. +%going off of the "edge" of the histogram around 330 uSec, the drift time corresponding to the detector +%center is about 160 uSec... which is consistent with doing no radial cut in the data \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/Compare_S1a_To_Kr2p18.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/Compare_S1a_To_Kr2p18.m new file mode 100644 index 0000000..523053d --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/Compare_S1a_To_Kr2p18.m @@ -0,0 +1,37 @@ +s1ab_s2_xyz_fit_map.p1=-0.8722; +s1ab_s2_xyz_fit_map.p2=3.4276; +c1=1-s1ab_s2_xyz_fit_map.p1.*2.7347.^2-2.7347.*s1ab_s2_xyz_fit_map.p2; +s1ab_s2_xyz_fit_map.p3=c1; + +s1ab_s1_xyz_fit_map.p1=0.46; +b2=1-2.7347.*s1ab_s1_xyz_fit_map.p1; +s1ab_s1_xyz_fit_map.p2=b2; + +x=[2.3:0.1:3.2]; + +%Kr2p18 +y=s1ab_s2_xyz_fit_map.p1.*x.^2+s1ab_s2_xyz_fit_map.p2.*x+s1ab_s2_xyz_fit_map.p3; +plot(x,y,'-r') +hold on; +y=s1ab_s1_xyz_fit_map.p1.*x+s1ab_s2_xyz_fit_map.p2; +plot(x,y,'-r') +y=s1ab_s1_xyz_fit_map.p1.*x+s1ab_s1_xyz_fit_map.p2; +plot(x,y,'-r') + +%S1aMethod, renormalized to Kr2p18 center +s1ab_s2_xyz_fit_map.p1=-1.2500; +s1ab_s2_xyz_fit_map.p2=5.4000; +s1ab_s2_xyz_fit_map.p3=-4.4369; + + +s1ab_s1_xyz_fit_map.p1=0.0025; +s1ab_s1_xyz_fit_map.p2=0.4424; +s1ab_s1_xyz_fit_map.p3=-0.2289; + +y=(s1ab_s2_xyz_fit_map.p1.*x.^2+s1ab_s2_xyz_fit_map.p2.*x+s1ab_s2_xyz_fit_map.p3)./(s1ab_s2_xyz_fit_map.p1.*2.7347.^2+s1ab_s2_xyz_fit_map.p2.*2.7347+s1ab_s2_xyz_fit_map.p3); +plot(x,y,'-b') +y=(s1ab_s1_xyz_fit_map.p1.*x.^2+s1ab_s1_xyz_fit_map.p2.*x+s1ab_s1_xyz_fit_map.p3)./(s1ab_s1_xyz_fit_map.p1.*2.7347.^2+s1ab_s1_xyz_fit_map.p2.*2.7347+s1ab_s1_xyz_fit_map.p3); +plot(x,y,'-b') + +myfigview(16); xlabel('S1a/S1b'); ylabel('Field Strength'); +legend('Kr2.18 - S2 Field Effect','Kr2.18 - S1 Field Effect','S1a Method - S2 Field Effect','S1a Method - S1 Field Effect'); \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/EnergyChi2_S1aMethod_Iron56.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/EnergyChi2_S1aMethod_Iron56.m new file mode 100644 index 0000000..2302773 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/EnergyChi2_S1aMethod_Iron56.m @@ -0,0 +1,1868 @@ +param_counter=1; + best_chi2_midtobot=10^100; + best_chi2_midtotop=10^100; + best_chi2_combined=10^100; + + + %initialize matrices +a2_list=zeros(1,195858); +b2_list=zeros(1,195858); +c2_list=zeros(1,195858); +g1_list=zeros(1,195858); +g2_list=zeros(1,195858); +total_h3_chi2_list=zeros(1,195858); +total_kr_chi2_list=zeros(1,195858); +total_chi2_list=zeros(1,195858); +alternate_total_chi2_list=zeros(1,195858); +h3_chi2_2016_list=zeros(1,195858); +h3_chi2_2015_list=zeros(1,195858); +kr_chi2_2016_list=zeros(1,195858); +kr_chi2_2015_list=zeros(1,195858); +electron_lifetime_2016_list=zeros(1,195858); +electron_lifetime_2015_list=zeros(1,195858); +kr_staterr_2016_list=zeros(1,195858); +kr_staterr_2015_list=zeros(1,195858); +kr_sigma_2016_list=zeros(1,195858); +kr_sigma_2015_list=zeros(1,195858); +kr_2016_num_events=zeros(1,195858); +kr_2015_num_events=zeros(1,195858); +kr_means_2016_list=zeros(1,195858); +kr_means_2015_list=zeros(1,195858); +full_kr_chi2_2016_list=zeros(1,195858); +full_kr_chi2_2015_list=zeros(1,195858); +total_h3_chi2_nothresh_list=zeros(1,195858); +total_chi2_nothresh_list=zeros(1,195858); +alternate_total_chi2_nothresh_list=zeros(1,195858); +h3_chi2_2016_nothresh_list=zeros(1,195858); +h3_chi2_2015_nothresh_list=zeros(1,195858); +h3_chi2_2015_nothresh_separatescaling_list=zeros(1,195858); +h3_chi2_2016_nothresh_separatescaling_list=zeros(1,195858); + +total_h3_chi2_nothresh_separatescaling_list=zeros(1,195858); +total_chi2_nothresh_separatescaling_list=zeros(1,195858); + +h3_chi2_2016_oldsim_list=zeros(1,195858); +h3_chi2_2015_oldsim_list=zeros(1,195858); +total_h3_chi2_oldsim_list=zeros(1,195858); +total_chi2_oldsim_list=zeros(1,195858); + + +ee_list=zeros(1,195858); + +kr_chi2_2016_zslice_list=zeros(195858,length(40+20/2:20:300-20/2)); +kr_chi2_2015_zslice_list=zeros(195858,length(40+20/2:20:300-20/2)); +kr_chi2_zslice_zcenter_list=zeros(195858,length(40+20/2:20:300-20/2)); +% +% total_h3_chi2_map=zeros(36,41,11,31); +% total_kr_chi2_map=zeros(36,41,11,31); +% total_chi2_map=zeros(36,41,11,31); +% alternate_total_chi2_map=zeros(36,41,11,31); +% h3_chi2_2016_map=zeros(36,41,11,31); +% kr_chi2_2016_map=zeros(36,41,11,31); +% h3_chi2_2015_map=zeros(36,41,11,31); +% kr_chi2_2015_map=zeros(36,41,11,31); +% electron_lifetime_2016_map=zeros(36,41,11,31); +% electron_lifetime_2015_map=zeros(36,41,11,31); +% total_h3_chi2_nothresh_map=zeros(36,41,11,31); +% total_chi2_nothresh_map=zeros(36,41,11,31); +% alternate_total_chi2_nothresh_map=zeros(36,41,11,31); +% h3_chi2_2016_nothresh_map=zeros(36,41,11,31); +% h3_chi2_2015_nothresh_map=zeros(36,41,11,31); +% total_h3_chi2_nothresh_separatescaling_map=zeros(36,41,11,31); +% total_chi2_nothresh_separatescaling_map=zeros(36,41,11,31); + +best_total_chi2=1000000000000000000; +best_total_alternate_chi2=1000000000000000000; +best_total_chi2_nothresh=1000000000000000000; +best_total_alternate_chi2_nothresh=1000000000000000000; +best_total_chi2_nothresh_separatescaling=1000000000000000000; +best_total_chi2_oldsim=1000000000000000000; + + +inpaint_on=1; +% Measurement is a1=-0.765; b1=2.939; a2=0.1934; b2=-0.744; + +load('/scratch4/UMDcode/EnergyChi2/KrypCal_2p21/TritiumMethod/libNEST_CH3TModel/NEST_CH3T_Spectrum_Sep2015_Kr2p21.mat') +load('/scratch4/UMDcode/EnergyChi2/KrypCal_2p21/TritiumMethod/libNEST_CH3TModel/NEST_CH3T_Spectrum_Feb2016_Kr2p21.mat') +load('/scratch4/UMDcode/EnergyChi2/KrypCal_2p21/TritiumMethod/libNEST_CH3TModel/NEST_CH3T_Spectrum_old.mat') + + +a2_counter=1; +for a2=-0.9:0.05:1; %p1*x^2 coefficient for s1ab_s2_xyz_fit.p1 + b2_counter=1; + for b2=0:0.15:4; %p1*x^2 coefficient for s1ab_s2_xyz_fit.p1 + + + +g1_counter=1; +g2_counter=1; + + +s1ab_s2_xyz_fit_map.p1=a2; +s1ab_s2_xyz_fit_map.p2=b2; +c2=1-s1ab_s2_xyz_fit_map.p1.*2.7334.^2-2.7334.*s1ab_s2_xyz_fit_map.p2; +s1ab_s2_xyz_fit_map.p3=c2; + + +%From Matthew's S1a method - 2nd order poly +s1ab_s1_xyz_fit_map.p1=-0.0797; +s1ab_s1_xyz_fit_map.p2=0.8596; +s1ab_s1_xyz_fit_map.p3=-0.7542;%% Load the Uncorrected Sep 2015 Kr data + + +%HAVE TO MAKE THIS .MAT FILE STILL - USE class 1 and class 9 for S1 +load('/scratch4/UMDcode/EnergyChi2/KrypCal_2p21/TritiumMethod/libNEST_CH3TModel/MappingParametersFit_Start_2015_CutDown.mat') + + +%% Calculate 2015 Corrections + +try + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>90000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval); + + + + end + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=1000; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1500]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[5+bin_size, 500] );%from 50 to 300us for the fit, based on when s1as1b values get strange + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + %%Tracker for pseudo-lifetime + s2_at_bottom=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_2015=-320/log(s2_at_bottom/s2_at_top); + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_xbins),floor(s2_ybins)); +Sigma_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); +Count_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_xbins),floor(s1_ybins)); +Sigma_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); +Count_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XYZ. 3D Map, caluculate and Submit IQ +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% if Kr_events>150000 +% +% % LUXkrypCal_S1_3D(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_distance_\mus,user_name,file_id_cp,dp_version,submit); +% LUXkrypCal_S1_3D_Run04_local_2p14FixedZHisto(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_time,x_center,y_center,z_center,det_edge,inpaint_on,user_name,file_id_cp,dp_version, algorithm_name, submit); +% +% +% end + + +%% Apply corrections to CH3T and calculate the ER band shift + +%First load the data + +clear s1_phe_both s2_phe_both +load('/scratch4/UMDcode/EnergyChi2/KrypCal_2p21/TritiumMethod/libNEST_CH3TModel/CH3T_Sep2015_NoCorrections.mat'); + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = S2_x; +s1_y_cm = S2_y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,S2_x,S2_y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + h3_cut= inrange(drift_time,[40 300]) & inrange(s1_phe_both,[0 120]) ... + & (log10(s1_phe_both)+0.8*log10(s2_phe_both)<5.2) .... + & (log10(s1_phe_both)-2*log10(s2_phe_both)>-6.8) & (log10(s1_phe_both)-2*log10(s2_phe_both)<-4.8)... + & s2_phe_both>100 & s2_phe_both<16000 & s2radius<25; %used to be drift time 100 to 250 + +h3_s1_c_2015=s1_phe_both_xyz(h3_cut); +h3_s2_c_2015=s2_phe_both_xyz(h3_cut); + + + kr_cut= inrange(drift_time,[40 300]) & inrange(s1_phe_both,[30 1000]) ... + & (log10(s1_phe_both)+0.6*log10(s2_phe_both)>4.5) & (log10(s1_phe_both)+0.6*log10(s2_phe_both)<5.05) ... + & (log10(s1_phe_both)-2*log10(s2_phe_both)>-7.6) & (log10(s1_phe_both)-2*log10(s2_phe_both)<-4.7) ... + & s2_phe_both>3000 & s2_phe_both<60000 & s2radius<25; %used to be drift time 100 to 250 + +kr_s1_c_2015=s1_phe_both_xyz(kr_cut); +kr_s2_c_2015=s2_phe_both_xyz(kr_cut); +kr_2015_drift_time=drift_time(kr_cut); +kr_2015_s2x=S2_x(kr_cut); +kr_2015_s2y=S2_y(kr_cut); + + clearvars -except param_counter a1_list b1_list a2_list b2_list total_chi2_list h3_chi2_list kr_chi2_list g1_list g2_list total_chi2_map h3_chi2_map kr_chi2_map chi2_midtobot_list... + best_chi2_midtotop besta1_midtotop besta2_midtotop bestb1_midtotop bestb2_midtotop best_chi2_midtobot... + besta1_midtobot besta1_midtotop bestb1_midtobot bestb1_midtotop a1 b1 a2 b2 c2 chi2_midtotop_map chi2_midtobot_map b_counter a_counter... + besta1_combined bestb1_combined besta2_combined bestb2_combined best_chi2_combined chi2_combined_map chi2_combined_list b1_counter a1_counter a2_counter b2_counter... + a1_counter b1_counter a2_counter b2_counter c1_list c2_list bestc1_midtobot bestc2_midtobot bestc1_midtotop bestc2_midtotop bestc1_combined bestc2_combined... + besta1_combined besta2_combined bestb1_combined bestb2_combined besta1 bestb1 bestc1 besta2 bestb2 bestc2 bestg1 bestg2 best_total_chi2 NEST_CH3T_Spectrum inpaint_on... + best_kr_chi2 best_h3_chi2 electron_lifetime_list electron_lifetime_map a2_start a1_start b1_start b2_start ... + total_h3_chi2_list total_kr_chi2_list total_chi2_list h3_chi2_2016_list h3_chi2_2015_list kr_chi2_2016_list kr_chi2_2015_list ... + electron_lifetime_2016_list electron_lifetime_2015_list total_h3_chi2_map total_kr_chi2_map total_chi2_map h3_chi2_2016_map h3_chi2_2015_map ... + kr_chi2_2016_map kr_chi2_2015_map electron_lifetime_2016_map electron_lifetime_2015_map NEST_CH3T_Spectrum_Sep2015 NEST_CH3T_Spectrum_Feb2016 g1 g2 bestg1 bestg2 g1_counter g2_counter ... + firsta1 firstb1 firsta2 firstb2 firstg1 firstg2 kr_means_2015_map kr_means_2016_map kr_sigma_2015_map kr_sigma_2016_map kr_staterr_2015_map kr_staterr_2016_map ... + kr_means_2015_list kr_means_2016_list kr_2015_num_events kr_2016_num_events kr_sigma_2015_list kr_sigma_2016_list kr_staterr_2015_list kr_staterr_2016_list ... + pseudo_lifetime_2016 pseudo_lifetime_2015 kr_s1_c_2015 kr_s2_c_2015 h3_s1_c_2015 h3_s2_c_2015 s1ab_s2_xyz_fit_map s1ab_s1_xyz_fit_map ... + kr_2015_drift_time kr_2015_s2x kr_2015_s2y kr_chi2_2016_zslice_list kr_chi2_2015_zslice_list kr_chi2_zslice_zcenter_list ... + full_kr_chi2_2016_list full_kr_chi2_2015_list best_total_kr_chi2 best_total_h3_chi2 alternate_total_chi2_map alternate_total_chi2_list ... + best_total_alternate_chi2 best_total_alternate_kr_chi2 best_total_alternate_h3_chi2 besta2_alternate bestb2_alternate bestg1_alternate bestg2_alternate bestc2_alternate ... + total_h3_chi2_nothresh_list total_chi2_nothresh_list alternate_total_chi2_nothresh_list h3_chi2_2015_nothresh_list h3_chi2_2016_nothresh_list ... + total_h3_chi2_nothresh_map total_chi2_nothresh_map alternate_total_chi2_nothresh_map h3_chi2_2016_nothresh_map h3_chi2_2015_nothresh_map ... + best_total_chi2_nothresh best_total_kr_chi2_nothresh best_total_h3_chi2_nothresh besta2_nothresh bestb2_nothresh bestc2_nothresh bestg1_nothresh bestEE_nothresh ... + best_total_alternate_chi2_nothresh best_total_alternate_kr_chi2_nothresh best_total_alternate_h3_chi2_nothresh besta2_alternate_nothresh bestb2_alternate_nothresh ... + bestc2_alternate_nothresh bestg1_alternate_nothresh bestEE_alternate_nothresh best_total_chi2_nothresh best_total_alternate_chi2_nothresh ee_list ... + total_h3_chi2_nothresh_separatescaling_list total_chi2_nothresh_separatescaling_list best_total_chi2_nothresh_separatescaling ... + best_total_kr_chi2_nothresh_separatescaling best_total_h3_chi2_nothresh_separatescaling besta2_nothresh_separatescaling ... + bestc2_nothresh_separatescaling bestg1_nothresh_separatescaling bestEE_nothresh_separatescaling ... + total_h3_chi2_nothresh_separatescaling_map total_chi2_nothresh_separatescaling_map bestEE_nothresh ... + h3_chi2_2015_nothresh_separatescaling_list h3_chi2_2016_nothresh_separatescaling_list ee_list ... + h3_chi2_2016_oldsim_list h3_chi2_2015_oldsim_list total_h3_chi2_oldsim_list total_chi2_oldsim_list ... + best_total_chi2_oldsim best_total_kr_chi2_oldsim best_total_h3_chi2_oldsim besta2_oldsim bestb2_oldsim ... + bestc2_oldsim bestg1_oldsim bestEE_oldsim NEST_CH3T_Spectrum_old + + + + + +%%%%%%%%%%%%%%%%%%%%% +%% REPEAT FOR 2016 DATA +%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('/scratch4/UMDcode/EnergyChi2/KrypCal_2p21/TritiumMethod/libNEST_CH3TModel/MappingParametersFit_Start_2016_CutDown.mat') + + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>90000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval); + + + + end + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[5+bin_size, 500] );%from 50 to 300us for the fit, based on when s1as1b values get strange + +s2_both_norm_z_index=mean_index(dT_range); +s2_both_norm_z_means=means(dT_range); + s2_at_top=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + %%Tracker for pseudo-lifetime + s2_at_bottom=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_2016=-320/log(s2_at_bottom/s2_at_top); +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_xbins),floor(s2_ybins)); +Sigma_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); +Count_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_xbins),floor(s1_ybins)); +Sigma_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); +Count_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Apply corrections to 2016 Kr data +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('/scratch4/UMDcode/EnergyChi2/KrypCal_2p21/TritiumMethod/libNEST_CH3TModel/MappingParametersFit_Start_2016_CutDown.mat') + + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; +% +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate ER Band shift +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + liquid_cut= inrange(drift_time,[40 300]) ... + & (log10(s1_phe_both)+0.7*log10(s2_phe_both)>4.9) & (log10(s1_phe_both)+0.7*log10(s2_phe_both)<5.5) ... + & s2_phe_both>3000 & s2_phe_both<80000 & s2radius<25; %used to be drift time 100 to 250 + + +kr_s1_c_2016=s1_phe_both_xyz(liquid_cut); +kr_s2_c_2016=s2_phe_both_xyz(liquid_cut); +kr_2016_drift_time=drift_time(liquid_cut); +kr_2016_s2x=s2x(liquid_cut); +kr_2016_s2y=s2y(liquid_cut); + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%Apply Corrections to 2016 CH3T Data +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('/scratch4/UMDcode/EnergyChi2/KrypCal_2p21/TritiumMethod/libNEST_CH3TModel/CH3T_Feb2016_NoCorrections.mat'); + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +% electron_lifetime_2016=e_lifetime_both; +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate ER Band shift +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +s1_min=0; +s1_max=120; + + %% Redo with r<10 cm + + + liquid_cut= clean_cut & inrange(drift_time,[40 300]) ... + & (log10(s1_phe_both)+log10(s2_phe_both)<5.9) & (log10(s1_phe_both)-2.*log10(s2_phe_both)<-4.8) ... + & (log10(s1_phe_both)-2.*log10(s2_phe_both)>-6.8) ... + & s2_phe_both>600 & s2_phe_both<16000 & s2radius<25; %used to be drift time 100 to 250 + + + +h3_s1_c_2016=s1_phe_both_xyz(liquid_cut); +h3_s2_c_2016=s2_phe_both_xyz(liquid_cut); + + clearvars -except param_counter a1_list b1_list a2_list b2_list total_chi2_list h3_chi2_list kr_chi2_list g1_list g2_list total_chi2_map h3_chi2_map kr_chi2_map chi2_midtobot_list... + best_chi2_midtotop besta1_midtotop besta2_midtotop bestb1_midtotop bestb2_midtotop best_chi2_midtobot... + besta1_midtobot besta1_midtotop bestb1_midtobot bestb1_midtotop a1 b1 a2 b2 chi2_midtotop_map chi2_midtobot_map b_counter a_counter... + besta1_combined bestb1_combined besta2_combined bestb2_combined best_chi2_combined chi2_combined_map chi2_combined_list b1_counter a1_counter a2_counter b2_counter... + a1_counter b1_counter a2_counter b2_counter c1_list c2_list bestc1_midtobot bestc2_midtobot bestc1_midtotop bestc2_midtotop bestc1_combined bestc2_combined... + besta1_combined besta2_combined bestb1_combined bestb2_combined besta1 bestb1 bestc1 besta2 bestb2 bestc2 bestg1 bestg2 best_total_chi2 NEST_CH3T_Spectrum inpaint_on... + best_kr_chi2 best_h3_chi2 electron_lifetime_list electron_lifetime_map a2_start a1_start b1_start b2_start ... + total_h3_chi2_list total_kr_chi2_list total_chi2_list h3_chi2_2016_list h3_chi2_2015_list kr_chi2_2016_list kr_chi2_2015_list ... + electron_lifetime_2016_list electron_lifetime_2015_list total_h3_chi2_map total_kr_chi2_map total_chi2_map h3_chi2_2016_map h3_chi2_2015_map ... + kr_chi2_2016_map kr_chi2_2015_map electron_lifetime_2016_map electron_lifetime_2015_map NEST_CH3T_Spectrum_Sep2015 NEST_CH3T_Spectrum_Feb2016 g1 g2 bestg1 bestg2 g1_counter g2_counter ... + firsta1 firstb1 firsta2 firstb2 firstg1 firstg2 kr_means_2015_map kr_means_2016_map kr_sigma_2015_map kr_sigma_2016_map kr_staterr_2015_map kr_staterr_2016_map ... + kr_means_2015_list kr_means_2016_list kr_2015_num_events kr_2016_num_events kr_sigma_2015_list kr_sigma_2016_list kr_staterr_2015_list kr_staterr_2016_list ... + pseudo_lifetime_2016 pseudo_lifetime_2015 kr_s1_c_2015 kr_s2_c_2015 h3_s1_c_2015 h3_s2_c_2015 kr_s1_c_2016 kr_s2_c_2016 h3_s1_c_2016 h3_s2_c_2016 ... + kr_2015_drift_time kr_2015_s2x kr_2015_s2y kr_2016_drift_time kr_2016_s2x kr_2016_s2y ... + kr_chi2_2016_zslice_list kr_chi2_2015_zslice_list kr_chi2_zslice_zcenter_list ... + full_kr_chi2_2016_list full_kr_chi2_2015_list best_total_kr_chi2 best_total_h3_chi2 alternate_total_chi2_map alternate_total_chi2_list ... + best_total_alternate_chi2 best_total_alternate_kr_chi2 best_total_alternate_h3_chi2 besta2_alternate bestb2_alternate bestg1_alternate bestg2_alternate bestc2_alternate c2 ... + total_h3_chi2_nothresh_list total_chi2_nothresh_list alternate_total_chi2_nothresh_list h3_chi2_2015_nothresh_list h3_chi2_2016_nothresh_list ... + total_h3_chi2_nothresh_map total_chi2_nothresh_map alternate_total_chi2_nothresh_map h3_chi2_2016_nothresh_map h3_chi2_2015_nothresh_map ... + best_total_chi2_nothresh best_total_kr_chi2_nothresh best_total_h3_chi2_nothresh besta2_nothresh bestb2_nothresh bestc2_nothresh bestg1_nothresh bestEE_nothresh ... + best_total_alternate_chi2_nothresh best_total_alternate_kr_chi2_nothresh best_total_alternate_h3_chi2_nothresh besta2_alternate_nothresh bestb2_alternate_nothresh ... + bestc2_alternate_nothresh bestg1_alternate_nothresh bestEE_alternate_nothresh best_total_chi2_nothresh best_total_alternate_chi2_nothresh ee_list ... + total_h3_chi2_nothresh_separatescaling_list total_chi2_nothresh_separatescaling_list best_total_chi2_nothresh_separatescaling ... + best_total_kr_chi2_nothresh_separatescaling best_total_h3_chi2_nothresh_separatescaling besta2_nothresh_separatescaling ... + bestc2_nothresh_separatescaling bestg1_nothresh_separatescaling bestEE_nothresh_separatescaling ... + total_h3_chi2_nothresh_separatescaling_map total_chi2_nothresh_separatescaling_map bestEE_nothresh ... + h3_chi2_2015_nothresh_separatescaling_list h3_chi2_2016_nothresh_separatescaling_list ee_list ... + h3_chi2_2016_oldsim_list h3_chi2_2015_oldsim_list total_h3_chi2_oldsim_list total_chi2_oldsim_list ... + best_total_chi2_oldsim best_total_kr_chi2_oldsim best_total_h3_chi2_oldsim besta2_oldsim bestb2_oldsim ... + bestc2_oldsim bestg1_oldsim bestEE_oldsim NEST_CH3T_Spectrum_old + + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% DO CHI2 TO ENEGY SPECTRA +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +g1_counter=1; +for g1=0.093:0.002:0.104; + g2_counter=1; +% for g2=16.5:0.1:21; + for ee=0.6:0.01:0.9; + g2_Feb2016=25.05*ee; %converting to g2 with SE size + g2_sep2015=25.8536*ee; + + h3_energy_2016=(1/73).*(h3_s1_c_2016./g1 + h3_s2_c_2016./g2_Feb2016); + kr_energy_2016=(1/73).*(kr_s1_c_2016./g1 + kr_s2_c_2016./g2_Feb2016); + h3_energy_2015=(1/73).*(h3_s1_c_2015./g1 + h3_s2_c_2015./g2_sep2015); + kr_energy_2015=(1/73).*(kr_s1_c_2015./g1 + kr_s2_c_2015./g2_sep2015); + + + + %make CH3T data spectrum + [h3_hist_2016,h3_hist_bin_2016]=hist(h3_energy_2016,NEST_CH3T_Spectrum_Feb2016(1,:)); + [h3_hist_2015,h3_hist_bin_2015]=hist(h3_energy_2015,NEST_CH3T_Spectrum_Sep2015(1,:)); + + %scale the simulation to the data + scale_factor_2016=sum(h3_hist_2016)/sum(NEST_CH3T_Spectrum_Feb2016(2,:)); %sum(h3_hist_2016(17:80))./sum(NEST_CH3T_Spectrum(2,17:80)); - sims have an expected threshold now... so can ignore the bin cuts + h3_scaled_sim_2016=scale_factor_2016.*NEST_CH3T_Spectrum_Feb2016(2,:); + + scale_factor_2016_nothresh=sum(h3_hist_2016(11:80))/sum(NEST_CH3T_Spectrum_Feb2016(2,11:80)); %sum(h3_hist_2016(17:80))./sum(NEST_CH3T_Spectrum(2,17:80)); - sims have an expected threshold now... so can ignore the bin cuts + h3_scaled_sim_2016_nothresh=scale_factor_2016_nothresh.*NEST_CH3T_Spectrum_Feb2016(2,:); + + scale_factor_2015=sum(h3_hist_2015)/sum(NEST_CH3T_Spectrum_Sep2015(2,:)); %sum(h3_hist_2015(17:80))./sum(NEST_CH3T_Spectrum(2,17:80)); - sims have an expected threshold now... so can ignore the bin cuts + h3_scaled_sim_2015=scale_factor_2015.*NEST_CH3T_Spectrum_Sep2015(2,:); + + scale_factor_2015_nothresh=sum(h3_hist_2015(11:80))/sum(NEST_CH3T_Spectrum_Sep2015(2,11:80)); %sum(h3_hist_2015(17:80))./sum(NEST_CH3T_Spectrum(2,17:80)); - sims have an expected threshold now... so can ignore the bin cuts + h3_scaled_sim_2015_nothresh=scale_factor_2015_nothresh.*NEST_CH3T_Spectrum_Sep2015(2,:); + + scale_factor_2015_oldsim=sum(h3_hist_2015(17:80))/sum(NEST_CH3T_Spectrum_old(2,17:80)); + h3_scaled_oldsim_2015=scale_factor_2015_oldsim.*NEST_CH3T_Spectrum_old(2,:); + + scale_factor_2016_oldsim=sum(h3_hist_2016(17:80))/sum(NEST_CH3T_Spectrum_old(2,17:80)); + h3_scaled_oldsim_2016=scale_factor_2016_oldsim.*NEST_CH3T_Spectrum_old(2,:); + + %Calculate chi2 for h3 spectrum + h3_chi2_2016=(1/74).*sum( (h3_scaled_sim_2016(4:80) - h3_hist_2016(4:80)).^2 ./(h3_hist_2016(4:80))); %(4:80) is to avoid low stat areas in the simulation + h3_chi2_2015=(1/74).*sum( (h3_scaled_sim_2015(4:80) - h3_hist_2015(4:80)).^2 ./(h3_hist_2015(4:80))); + + %Calculate chi2 for h3 spectrum away from threshold + h3_chi2_2016_nothresh=(1/68).*sum( (h3_scaled_sim_2016(11:80) - h3_hist_2016(11:80)).^2 ./(h3_hist_2016(11:80))); %(4:80) is to avoid low stat areas in the simulation + h3_chi2_2015_nothresh=(1/68).*sum( (h3_scaled_sim_2015(11:80) - h3_hist_2015(11:80)).^2 ./(h3_hist_2015(11:80))); + + h3_chi2_2016_nothresh_separatescaling=(1/68).*sum( (h3_scaled_sim_2016_nothresh(11:80) - h3_hist_2016(11:80)).^2 ./(h3_hist_2016(11:80))); %(4:80) is to avoid low stat areas in the simulation + h3_chi2_2015_nothresh_separatescaling=(1/68).*sum( (h3_scaled_sim_2015_nothresh(11:80) - h3_hist_2015(11:80)).^2 ./(h3_hist_2015(11:80))); + + h3_chi2_2016_oldsim=(1/62).*sum( (h3_scaled_oldsim_2016(17:80) - h3_hist_2016(17:80)).^2 ./(h3_hist_2016(17:80))); %(4:80) is to avoid low stat areas in the simulation + h3_chi2_2015_oldsim=(1/62).*sum( (h3_scaled_oldsim_2015(17:80) - h3_hist_2015(17:80)).^2 ./(h3_hist_2015(17:80))); + + dT_step=20; + kr_mean_2016=zeros(length(40+dT_step/2:dT_step:300-dT_step/2),1); + kr_mean_2015=zeros(length(40+dT_step/2:dT_step:300-dT_step/2),1); + dT_centers=zeros(length(40+dT_step/2:dT_step:300-dT_step/2),1); + + full_kr_fit_res_2016=fit([0:1:1000].',hist(kr_energy_2016,[0:1:1000]).','gauss1'); + full_kr_fit_res_2015=fit([0:1:1000].',hist(kr_energy_2015,[0:1:1000]).','gauss1'); + full_kr_chi2_2016=((41.55-full_kr_fit_res_2016.b1)./0.2395).^2; %SHOULD BE 0.2395 BASED ON RUN03 + full_kr_chi2_2015=((41.55-full_kr_fit_res_2015.b1)./0.2395).^2; + + clear kr_fit_res_2016 kr_fit_res_2015 kr_conf_2016 kr_conf_2015 dT_max + kk=1; + for dT_max=40+dT_step/2:dT_step:300-dT_step/2; + clear kr_fit_res_2016 kr_fit_res_2015 + kr_fit_res_2016=fit([0:1:1000].',hist(kr_energy_2016(inrange(kr_2016_drift_time,[dT_max-dT_step dT_max])),[0:1:1000]).','gauss1'); + kr_fit_res_2015=fit([0:1:1000].',hist(kr_energy_2015(inrange(kr_2015_drift_time,[dT_max-dT_step dT_max])),[0:1:1000]).','gauss1'); + kr_mean_2016(kk)=kr_fit_res_2016.b1; + kr_mean_2015(kk)=kr_fit_res_2015.b1; + dT_centers(kk)=dT_max-dT_step/2; + kk=kk+1; + end + + clear cut + cut=kr_mean_2015==0 | kr_mean_2016==0; + kr_mean_2016(cut)=[]; + kr_mean_2015(cut)=[]; + dT_centers(cut)=[]; + + + kr_chi2_2016=((41.55-kr_mean_2016)./0.2395).^2; %SHOULD BE 0.2395 BASED ON RUN03 + kr_chi2_2015=((41.55-kr_mean_2015)./0.2395).^2; + + total_h3_chi2=(h3_chi2_2016+h3_chi2_2015)/2; + total_h3_chi2_nothresh=(h3_chi2_2016_nothresh+h3_chi2_2015_nothresh)/2; + total_h3_chi2_oldsim=(h3_chi2_2016_oldsim+h3_chi2_2015_oldsim)/2; + total_h3_chi2_nothresh_separatescaling=(h3_chi2_2016_nothresh_separatescaling+h3_chi2_2015_nothresh_separatescaling)/2; + + total_kr_chi2_2016=mean(kr_chi2_2016); + total_kr_chi2_2015=mean(kr_chi2_2015); + + total_kr_chi2=(total_kr_chi2_2016+total_kr_chi2_2015)./2; + total_chi2=(total_kr_chi2+total_h3_chi2)/2; + total_chi2_nothresh=(total_kr_chi2+total_h3_chi2_nothresh)/2; + total_chi2_nothresh_separatescaling=(total_kr_chi2+total_h3_chi2_nothresh_separatescaling)/2; + total_chi2_oldsim=(total_kr_chi2+total_h3_chi2_oldsim)/2; + + alternate_total_chi2=(sum( (h3_scaled_sim_2016(4:80) - h3_hist_2016(4:80)).^2 ./(h3_hist_2016(4:80)))+sum(kr_chi2_2016)+sum(kr_chi2_2015))/(74+length(kr_chi2_2016)+length(kr_chi2_2015)-4); + alternate_total_chi2_nothresh=(sum( (h3_scaled_sim_2016(11:80) - h3_hist_2016(11:80)).^2 ./(h3_hist_2016(11:80)))+sum(kr_chi2_2016)+sum(kr_chi2_2015))/(68+length(kr_chi2_2016)+length(kr_chi2_2015)-4); + + if total_chi2 < best_total_chi2; + best_total_chi2=total_chi2; + best_total_kr_chi2=total_kr_chi2; + best_total_h3_chi2=total_h3_chi2; + besta2=a2; + bestb2=b2; + bestc2=c2; + bestg1=g1; + bestEE=ee; + end + + + if alternate_total_chi2 < best_total_alternate_chi2; + best_total_alternate_chi2=alternate_total_chi2; + best_total_alternate_kr_chi2=total_kr_chi2; + best_total_alternate_h3_chi2=total_h3_chi2; + besta2_alternate=a2; + bestb2_alternate=b2; + bestc2_alternate=c2; + bestg1_alternate=g1; + bestEE_alternate=ee; + end + + if total_chi2_nothresh < best_total_chi2_nothresh; + best_total_chi2_nothresh=total_chi2_nothresh; + best_total_kr_chi2_nothresh=total_kr_chi2; + best_total_h3_chi2_nothresh=total_h3_chi2_nothresh; + besta2_nothresh=a2; + bestb2_nothresh=b2; + bestc2_nothresh=c2; + bestg1_nothresh=g1; + bestEE_nothresh=ee; + end + + if total_chi2_nothresh_separatescaling < best_total_chi2_nothresh_separatescaling; + best_total_chi2_nothresh_separatescaling=total_chi2_nothresh_separatescaling; + best_total_kr_chi2_nothresh_separatescaling=total_kr_chi2; + best_total_h3_chi2_nothresh_separatescaling=total_h3_chi2_nothresh_separatescaling; + besta2_nothresh_separatescaling=a2; + bestb2_nothresh_separatescaling=b2; + bestc2_nothresh_separatescaling=c2; + bestg1_nothresh_separatescaling=g1; + bestEE_nothresh_separatescaling=ee; + end + + if alternate_total_chi2_nothresh < best_total_alternate_chi2_nothresh; + best_total_alternate_chi2_nothresh=alternate_total_chi2_nothresh; + best_total_alternate_kr_chi2_nothresh=total_kr_chi2; + best_total_alternate_h3_chi2_nothresh=total_h3_chi2_nothresh; + besta2_alternate_nothresh=a2; + bestb2_alternate_nothresh=b2; + bestc2_alternate_nothresh=c2; + bestg1_alternate_nothresh=g1; + bestEE_alternate_nothresh=ee; + end + + if total_chi2_oldsim < best_total_chi2_oldsim; + best_total_chi2_oldsim=total_chi2_oldsim; + best_total_kr_chi2_oldsim=total_kr_chi2; + best_total_h3_chi2_oldsim=total_h3_chi2_oldsim; + besta2_oldsim=a2; + bestb2_oldsim=b2; + bestc2_oldsim=c2; + bestg1_oldsim=g1; + bestEE_oldsim=ee; + end + +a2_list(param_counter)=a2; +b2_list(param_counter)=b2; +c2_list(param_counter)=c2; +g1_list(param_counter)=g1; +ee_list(param_counter)=ee; +total_h3_chi2_list(param_counter)=total_h3_chi2; +total_h3_chi2_nothresh_list(param_counter)=total_h3_chi2_nothresh; +total_kr_chi2_list(param_counter)=total_kr_chi2; +total_chi2_list(param_counter)=total_chi2; +total_chi2_nothresh_list(param_counter)=total_chi2_nothresh; +alternate_total_chi2_list(param_counter)=alternate_total_chi2; +alternate_total_chi2_nothresh_list(param_counter)=alternate_total_chi2_nothresh; + +total_h3_chi2_nothresh_separatescaling_list(param_counter)=total_h3_chi2_nothresh_separatescaling; +total_chi2_nothresh_separatescaling_list(param_counter)=total_chi2_nothresh_separatescaling; + +h3_chi2_2016_list(param_counter)=h3_chi2_2016; +h3_chi2_2016_nothresh_list(param_counter)=h3_chi2_2016_nothresh; +h3_chi2_2015_list(param_counter)=h3_chi2_2015; +h3_chi2_2015_nothresh_list(param_counter)=h3_chi2_2015_nothresh; +h3_chi2_2015_nothresh_separatescaling_list(param_counter)=h3_chi2_2015_nothresh_separatescaling; +h3_chi2_2016_nothresh_separatescaling_list(param_counter)=h3_chi2_2016_nothresh_separatescaling; + +kr_chi2_2016_list(param_counter)=total_kr_chi2_2016; +kr_chi2_2015_list(param_counter)=total_kr_chi2_2015; +full_kr_chi2_2016_list(param_counter)=full_kr_chi2_2016; +full_kr_chi2_2015_list(param_counter)=full_kr_chi2_2015; +electron_lifetime_2016_list(param_counter)=pseudo_lifetime_2016; +electron_lifetime_2015_list(param_counter)=pseudo_lifetime_2015; + +kr_chi2_2016_zslice_list(param_counter,:)=kr_chi2_2016; +kr_chi2_2015_zslice_list(param_counter,:)=kr_chi2_2015; +kr_chi2_zslice_zcenter_list(param_counter,:)=dT_centers; + +h3_chi2_2016_oldsim_list(param_counter)=h3_chi2_2016_oldsim; +h3_chi2_2015_oldsim_list(param_counter)=h3_chi2_2015_oldsim; +total_h3_chi2_oldsim_list(param_counter)=total_h3_chi2_oldsim; +total_chi2_oldsim_list(param_counter)=total_chi2_oldsim; + +% total_h3_chi2_map(a2_counter,b2_counter,g1_counter,g2_counter)=total_h3_chi2; +% total_h3_chi2_nothresh_map(a2_counter,b2_counter,g1_counter,g2_counter)=total_h3_chi2_nothresh; +% total_kr_chi2_map(a2_counter,b2_counter,g1_counter,g2_counter)=total_kr_chi2; +% total_chi2_map(a2_counter,b2_counter,g1_counter,g2_counter)=total_chi2; +% total_chi2_nothresh_map(a2_counter,b2_counter,g1_counter,g2_counter)=total_chi2_nothresh; +% alternate_total_chi2_map(a2_counter,b2_counter,g1_counter,g2_counter)=alternate_total_chi2; +% alternate_total_chi2_nothresh_map(a2_counter,b2_counter,g1_counter,g2_counter)=alternate_total_chi2_nothresh; +% h3_chi2_2016_map(a2_counter,b2_counter,g1_counter,g2_counter)=h3_chi2_2016; +% h3_chi2_2016_nothresh_map(a2_counter,b2_counter,g1_counter,g2_counter)=h3_chi2_2016_nothresh; +% kr_chi2_2016_map(a2_counter,b2_counter,g1_counter,g2_counter)=total_kr_chi2_2016; +% h3_chi2_2015_map(a2_counter,b2_counter,g1_counter,g2_counter)=h3_chi2_2015; +% h3_chi2_2015_nothresh_map(a2_counter,b2_counter,g1_counter,g2_counter)=h3_chi2_2015_nothresh; +% kr_chi2_2015_map(a2_counter,b2_counter,g1_counter,g2_counter)=total_kr_chi2_2015; +% electron_lifetime_2016_map(a2_counter,b2_counter,g1_counter,g2_counter)=pseudo_lifetime_2016; +% electron_lifetime_2015_map(a2_counter,b2_counter,g1_counter,g2_counter)=pseudo_lifetime_2015; +% +% total_h3_chi2_nothresh_separatescaling_map(a2_counter,b2_counter,g1_counter,g2_counter)=total_h3_chi2_nothresh_separatescaling; +% total_chi2_nothresh_separatescaling_map(a2_counter,b2_counter,g1_counter,g2_counter)=total_chi2_nothresh_separatescaling; + +param_counter=param_counter+1; +g2_counter=g2_counter+1; + end +g1_counter=g1_counter+1; +end + + +catch + %Tried the b2 loop, but failed +sprintf('Caught Error, so skipped. a2=%0.3f b2=%0.3f', a2, b2) + +a2_list(param_counter)=a2; +b2_list(param_counter)=b2; +% c1_list(param_counter)=c1; +c2_list(param_counter)=c2; +g1_list(param_counter)=-1; +ee_list(param_counter)=-1; +total_h3_chi2_list(param_counter)=-1; +total_kr_chi2_list(param_counter)=-1; +total_chi2_list(param_counter)=-1; +alternate_total_chi2_list(param_counter)=-1; +h3_chi2_2016_list(param_counter)=-1; +h3_chi2_2015_list(param_counter)=-1; +kr_chi2_2016_list(param_counter)=-1; +kr_chi2_2015_list(param_counter)=-1; +electron_lifetime_2016_list(param_counter)=-1; +electron_lifetime_2015_list(param_counter)=-1; +full_kr_chi2_2016_list(param_counter)=-1; +full_kr_chi2_2015_list(param_counter)=-1; +kr_chi2_2016_zslice_list(param_counter,:)=-1; +kr_chi2_2015_zslice_list(param_counter,:)=-1; +kr_chi2_zslice_zcenter_list(param_counter,:)=-1; +total_h3_chi2_nothresh_list(param_counter)=-1; +total_chi2_nothresh_list(param_counter)=-1; +alternate_total_chi2_nothresh_list(param_counter)=-1; +h3_chi2_2015_nothresh_list(param_counter)=-1; +h3_chi2_2016_nothresh_list(param_counter)=-1; +h3_chi2_2015_nothresh_separatescaling_list(param_counter)=-1; +h3_chi2_2016_nothresh_separatescaling_list(param_counter)=-1; + +total_h3_chi2_nothresh_separatescaling_list(param_counter)=-1; +total_chi2_nothresh_separatescaling_list(param_counter)=-1; + + +h3_chi2_2016_oldsim_list(param_counter)=-1; +h3_chi2_2015_oldsim_list(param_counter)=-1; +total_h3_chi2_oldsim_list(param_counter)=-1; +total_chi2_oldsim_list(param_counter)=-1; + +% total_h3_chi2_map(a2_counter,b2_counter,:,:)=-1; +% total_kr_chi2_map(a2_counter,b2_counter,:,:)=-1; +% total_chi2_map(a2_counter,b2_counter,:,:)=-1; +% alternate_total_chi2_map(a2_counter,b2_counter,:,:)=-1; +% h3_chi2_2016_map(a2_counter,b2_counter,:,:)=-1; +% kr_chi2_2016_map(a2_counter,b2_counter,:,:)=-1; +% h3_chi2_2015_map(a2_counter,b2_counter,:,:)=-1; +% kr_chi2_2015_map(a2_counter,b2_counter,:,:)=-1; +% electron_lifetime_2016_map(a2_counter,b2_counter,:,:)=-1; +% electron_lifetime_2015_map(a2_counter,b2_counter,:,:)=-1; +% total_h3_chi2_nothresh_map(a2_counter,b2_counter,:,:)=-1; +% total_chi2_nothresh_map(a2_counter,b2_counter,:,:)=-1; +% alternate_total_chi2_nothresh_map(a2_counter,b2_counter,:,:)=-1; +% h3_chi2_2016_nothresh_map(a2_counter,b2_counter,:,:)=-1; +% h3_chi2_2015_nothresh_map(a2_counter,b2_counter,:,:)=-1; +% +% total_h3_chi2_nothresh_separatescaling_map(a2_counter,b2_counter,:,:)=-1; +% total_chi2_nothresh_separatescaling_map(a2_counter,b2_counter,:,:)=-1; + + +param_counter=param_counter+1; +end + +g1_counter=1; +% g1=firstg1; + +%Done with b2, so save and incriment counter +clearvars -except param_counter a1_list b1_list a2_list b2_list total_chi2_list h3_chi2_list kr_chi2_list g1_list g2_list total_chi2_map h3_chi2_map kr_chi2_map chi2_midtobot_list... + best_chi2_midtotop besta1_midtotop besta2_midtotop bestb1_midtotop bestb2_midtotop best_chi2_midtobot... + besta1_midtobot besta1_midtotop bestb1_midtobot bestb1_midtotop a1 b1 a2 b2 chi2_midtotop_map chi2_midtobot_map b_counter a_counter... + besta1_combined bestb1_combined besta2_combined bestb2_combined best_chi2_combined chi2_combined_map chi2_combined_list b1_counter a1_counter a2_counter b2_counter... + a1_counter b1_counter a2_counter b2_counter c1_list c2_list bestc1_midtobot bestc2_midtobot bestc1_midtotop bestc2_midtotop bestc1_combined bestc2_combined... + besta1_combined besta2_combined bestb1_combined bestb2_combined besta1 bestb1 bestc1 besta2 bestb2 bestc2 bestg1 bestg2 best_total_chi2 NEST_CH3T_Spectrum inpaint_on... + best_kr_chi2 best_h3_chi2 electron_lifetime_list electron_lifetime_map a2_start a1_start b1_start b2_start ... + total_h3_chi2_list total_kr_chi2_list total_chi2_list h3_chi2_2016_list h3_chi2_2015_list kr_chi2_2016_list kr_chi2_2015_list ... + electron_lifetime_2016_list electron_lifetime_2015_list total_h3_chi2_map total_kr_chi2_map total_chi2_map h3_chi2_2016_map h3_chi2_2015_map ... + kr_chi2_2016_map kr_chi2_2015_map electron_lifetime_2016_map electron_lifetime_2015_map NEST_CH3T_Spectrum_Sep2015 NEST_CH3T_Spectrum_Feb2016 g1 g2 bestg1 bestg2 g1_counter g2_counter ... + firsta1 firstb1 firsta2 firstb2 firstg1 firstg2 kr_means_2015_map kr_means_2016_map kr_sigma_2015_map kr_sigma_2016_map kr_staterr_2015_map kr_staterr_2016_map ... + kr_means_2015_list kr_means_2016_list kr_2015_num_events kr_2016_num_events kr_sigma_2015_list kr_sigma_2016_list kr_staterr_2015_list kr_staterr_2016_list ... + pseudo_lifetime_2016 pseudo_lifetime_2015 kr_2015_drift_time kr_2015_s2x kr_2015_s2y kr_2016_drift_time kr_2016_s2x kr_2016_s2y ... + kr_chi2_2016_zslice_list kr_chi2_2015_zslice_list kr_chi2_zslice_zcenter_list ... + full_kr_chi2_2016_list full_kr_chi2_2015_list best_total_kr_chi2 best_total_h3_chi2 alternate_total_chi2_map alternate_total_chi2_list ... + best_total_alternate_chi2 best_total_alternate_kr_chi2 best_total_alternate_h3_chi2 besta2_alternate bestb2_alternate bestg1_alternate bestg2_alternate bestc2_alternate c2 ... + total_h3_chi2_nothresh_list total_chi2_nothresh_list alternate_total_chi2_nothresh_list h3_chi2_2015_nothresh_list h3_chi2_2016_nothresh_list ... + total_h3_chi2_nothresh_map total_chi2_nothresh_map alternate_total_chi2_nothresh_map h3_chi2_2016_nothresh_map h3_chi2_2015_nothresh_map ... + best_total_chi2_nothresh best_total_kr_chi2_nothresh best_total_h3_chi2_nothresh besta2_nothresh bestb2_nothresh bestc2_nothresh bestg1_nothresh bestEE_nothresh ... + best_total_alternate_chi2_nothresh best_total_alternate_kr_chi2_nothresh best_total_alternate_h3_chi2_nothresh besta2_alternate_nothresh bestb2_alternate_nothresh ... + bestc2_alternate_nothresh bestg1_alternate_nothresh bestEE_alternate_nothresh best_total_chi2_nothresh best_total_alternate_chi2_nothresh ee_list ... + total_h3_chi2_nothresh_separatescaling_list total_chi2_nothresh_separatescaling_list best_total_chi2_nothresh_separatescaling ... + best_total_kr_chi2_nothresh_separatescaling best_total_h3_chi2_nothresh_separatescaling besta2_nothresh_separatescaling ... + bestc2_nothresh_separatescaling bestg1_nothresh_separatescaling bestEE_nothresh_separatescaling ... + total_h3_chi2_nothresh_separatescaling_map total_chi2_nothresh_separatescaling_map bestEE_nothresh ... + h3_chi2_2015_nothresh_separatescaling_list h3_chi2_2016_nothresh_separatescaling_list ee_list ... + h3_chi2_2016_oldsim_list h3_chi2_2015_oldsim_list total_h3_chi2_oldsim_list total_chi2_oldsim_list ... + best_total_chi2_oldsim best_total_kr_chi2_oldsim best_total_h3_chi2_oldsim besta2_oldsim bestb2_oldsim ... + bestc2_oldsim bestg1_oldsim bestEE_oldsim NEST_CH3T_Spectrum_old + + + +save('/scratch4/UMDcode/EnergyChi2/KrypCal_2p21/S1aMethod/libNEST_CH3TModel/S1aS1bParamScan_EnergyChi2_S1aMethod_newrange2.mat') + + + b2_counter=b2_counter+1; + + end + + a2_counter=a2_counter+1; + b2_counter=1; + end + diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/BandPredictionCode/PredictERBand_Feb2015.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/BandPredictionCode/PredictERBand_Feb2015.m new file mode 100644 index 0000000..bf7149f --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/BandPredictionCode/PredictERBand_Feb2015.m @@ -0,0 +1,224 @@ +% Load in the S1a/S1b -> ER Band map + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\S1aMethod\libNEST_CH3TModel\RecombPhysicsResult\ERBandPrediction\S1aS1b_To_ERBand_RZVoxels.mat') + + +%% Load in Sep2014 ER S1a/S1b + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\S1aMethod\libNEST_CH3TModel\RecombPhysicsResult\ERBandPrediction\Feb2015_S1aS1b.mat') + + +SE_size_Sep2015=25.64; +SE_size_Sep2014=27.21; +SE_size_Nov2014=26.13; +SE_size_Feb2015=26.23; + + +MCMC_events=[]; +MCMC_events_x=[]; + + +for i=1:size(s1ab_xyz_mean,1) + for j=1:size(s1ab_xyz_mean,2) + for k=1:size(s1ab_xyz_mean,3) + if ~isnan(s1ab_xyz_mean(i,j,k)) + [powerlaw_a powerlaw_a_err]=polyval(S1aS1b_to_mean_a_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_mean_a_fit_err); + [powerlaw_b powerlaw_b_err]=polyval(S1aS1b_to_mean_b_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_mean_b_fit_err); + [powerlaw_a_upper powerlaw_a_upper_err]=polyval(S1aS1b_to_upper_a_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_upper_a_fit_err); + [powerlaw_b_upper powerlaw_b_upper_err]=polyval(S1aS1b_to_upper_b_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_upper_b_fit_err); + [powerlaw_a_lower powerlaw_a_lower_err]=polyval(S1aS1b_to_lower_a_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_lower_a_fit_err); + [powerlaw_b_lower powerlaw_b_lower_err]=polyval(S1aS1b_to_lower_b_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_lower_b_fit_err); + + %Make MCMC of predicted band for the voxel + for counter=1:Kr_count_3D(i,j,k)/10; + xx=50*rand(1); %pick random S1 value + yy= log10((10.^(powerlaw_a.*xx.^powerlaw_b)).*(SE_size_Feb2015/SE_size_Sep2015)); %Get associate log10(S1/S2) mean from power law fit + yy_sigma=abs(yy-log10((10.^(powerlaw_a_upper.*xx.^powerlaw_b_upper)).*(SE_size_Feb2015/SE_size_Sep2015)) )/1.28; %Get associate log10(S1/S2) gaussian width from power law fit + MCMC_events=[MCMC_events; normrnd(yy,yy_sigma,1)]; + MCMC_events_x=[MCMC_events_x; xx]; + end + end + end + end +end + +%% Fit total MCMC band +s1_min=0; +s1_max=50; + band_sigma=1.28; %90% confidence bounds + + s2_s1_bin= 1:.05:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + MCMC_counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut= inrange(MCMC_events_x,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(MCMC_events(ER_fit_cut),s2_s1_bin); + MCMC_counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(MCMC_events(ER_fit_cut),s2_s1_bin); + + %band=confint(Fit_ER,.1); + %ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*MCMC_counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + MCMC_ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + MCMC_ER_mean_fit=MCMC_ER_mean_power_fit.a.*ER_bins.^(MCMC_ER_mean_power_fit.b); + b=confint(MCMC_ER_mean_power_fit,.68); + MCMC_sigma_a_ER_mean=(b(2,1)-b(1,1))/2; + MCMC_sigma_b_ER_mean=(b(2,2)-b(1,2))/2; + + MCMC_ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + MCMC_ER_lower_fit=MCMC_ER_lower_power_fit.a.*ER_bins.^(MCMC_ER_lower_power_fit.b); + b=confint(MCMC_ER_lower_power_fit,.68); + MCMC_sigma_a_ER_lower=(b(2,1)-b(1,1))/2; + MCMC_sigma_b_ER_lower=(b(2,2)-b(1,2))/2; + + MCMC_ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + MCMC_ER_upper_fit=MCMC_ER_upper_power_fit.a.*ER_bins.^(MCMC_ER_upper_power_fit.b); + b=confint(MCMC_ER_upper_power_fit,.68); + MCMC_sigma_a_ER_upper=(b(2,1)-b(1,1))/2; + MCMC_sigma_b_ER_upper=(b(2,2)-b(1,2))/2; + + MCMC_powerlaw_a=MCMC_ER_mean_power_fit.a; + MCMC_powerlaw_b=MCMC_ER_mean_power_fit.b; + MCMC_powerlaw_a_upper=MCMC_ER_upper_power_fit.a; + MCMC_powerlaw_b_upper=MCMC_ER_upper_power_fit.b; + MCMC_powerlaw_a_lower=MCMC_ER_lower_power_fit.a; + MCMC_powerlaw_b_lower=MCMC_ER_lower_power_fit.b; + MCMC_powerlaw_a_err=MCMC_sigma_a_ER_mean; + MCMC_powerlaw_b_err=MCMC_sigma_b_ER_mean; + MCMC_powerlaw_a_upper_err=MCMC_sigma_a_ER_upper; + MCMC_powerlaw_b_upper_err=MCMC_sigma_b_ER_upper; + MCMC_powerlaw_a_lower_err=MCMC_sigma_a_ER_lower; + MCMC_powerlaw_b_lower_err=MCMC_sigma_b_ER_lower; + + %% Compare to actual band + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\S1aMethod\libNEST_CH3TModel\RecombPhysicsResult\ERBandPrediction\Feb2015_ERFit.mat') + + %Make Plot + + no_fid_new=figure; + hold on + plot(MCMC_events_x,MCMC_events,'.k','MarkerSize',1) + cc=colorbar; + ylabel(cc,'Count','FontSize',16); + colormap; + ylabel('Corrected log10(S2/S1)'); xlabel('S1 corrected (Pulse Area Phe)'); + title(sprintf('Run 04 CH3T, MonteCarlo Band'),'fontsize',16,'Interpreter','none'); + myfigview(16); + ylim([0 3.5]);xlim([0 s1_max]); +% plot(ER_bins,lower_bound,'ok','markersize',6,'linewidth',2) +plot(ER_bins,MCMC_ER_mean_fit,'-b','markersize',20,'linewidth',2) +plot(ER_bins,ER_mean_fit,'-r','markersize',14,'linewidth',2) +% plot(ER_bins,mean_ER_band,'ok','markersize',6,'linewidth',2)%plot mean of ER band + plot(ER_bins,ER_lower_fit,'--r','markersize',20,'linewidth',2) +% plot(ER_bins,upper_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_upper_fit,'--r','markersize',14,'linewidth',2) +plot(ER_bins,MCMC_ER_lower_fit,'--b','markersize',20,'linewidth',2) +plot(ER_bins,MCMC_ER_upper_fit,'--b','markersize',20,'linewidth',2) + legend('Data','MCMC Band','Measured ER Band'); + + + bin_step=2; + + total_count=length(log10(MCMC_events_x)); + +% +% box; +% text(10,2.8,strcat('Total Count= ',num2str(total_count)),'fontsize',16); +% text(5,.55,strcat('+',num2str(band_sigma),'\sigma = (',num2str(ER_upper_power_fit.a,3),'\pm', num2str(sigma_a_ER_upper,1) ,')\times S1_c ^{', num2str(ER_upper_power_fit.b,3),'\pm',num2str(sigma_b_ER_upper,1),'}'),'fontsize',16,'interpreter','tex'); +% text(5,.3,strcat('Mean=(',num2str(ER_mean_power_fit.a,3),'\pm', num2str(sigma_a_ER_mean,1),')\times S1_c ^{', num2str(ER_mean_power_fit.b,3),'\pm', num2str(sigma_b_ER_mean,1),'}'),'fontsize',16,'interpreter','tex'); +% text(5,.05,strcat('-',num2str(band_sigma),'\sigma = (',num2str(ER_lower_power_fit.a,3),'\pm', num2str(sigma_a_ER_lower,1),')\times S1_c ^{', num2str(ER_lower_power_fit.b,3),'\pm', num2str(sigma_b_ER_lower,1),'}'),'fontsize',16,'interpreter','tex'); +% title('Feb2015 CH3T') + + box; + + text(5,.55,strcat('+',num2str(band_sigma),'\sigma = (',num2str(MCMC_ER_upper_power_fit.a,3),'\pm', num2str(MCMC_sigma_a_ER_upper,1) ,')\times S1_c ^{', num2str(MCMC_ER_upper_power_fit.b,3),'\pm',num2str(MCMC_sigma_b_ER_upper,1),'}'),'fontsize',16,'interpreter','tex'); + text(5,.3,strcat('Mean=(',num2str(MCMC_ER_mean_power_fit.a,3),'\pm', num2str(MCMC_sigma_a_ER_mean,1),')\times S1_c ^{', num2str(MCMC_ER_mean_power_fit.b,3),'\pm', num2str(MCMC_sigma_b_ER_mean,1),'}'),'fontsize',16,'interpreter','tex'); + text(5,.05,strcat('-',num2str(band_sigma),'\sigma = (',num2str(MCMC_ER_lower_power_fit.a,3),'\pm', num2str(MCMC_sigma_a_ER_lower,1),')\times S1_c ^{', num2str(MCMC_ER_lower_power_fit.b,3),'\pm', num2str(MCMC_sigma_b_ER_lower,1),'}'),'fontsize',16,'interpreter','tex'); + title('Feb2015 CH3T') + + + + +%% Stats about the difference + + +%Real Data Band +x=[1:0.1:50]; +band_mean_data=ER_mean_power_fit.a*x.^ER_mean_power_fit.b; +band_upper_data=ER_upper_power_fit.a.*x.^ER_upper_power_fit.b; +band_lower_data=ER_lower_power_fit.a.*x.^ER_lower_power_fit.b; +band_width_data=(band_mean_data-band_lower_data)./(1.28); + +%KrypCal Band - uses slightly different ER band than the one in the figures +band_mean_mc=MCMC_ER_mean_power_fit.a.*x.^MCMC_ER_mean_power_fit.b; +band_upper_mc=MCMC_ER_upper_power_fit.a*x.^MCMC_ER_upper_power_fit.b; +band_lower_mc=MCMC_ER_lower_power_fit.a*x.^MCMC_ER_lower_power_fit.b; +band_width_mc=(band_mean_mc-band_lower_mc)./(1.28); + +%Improvement in bands: Negative is worse resolution +width_difference=mean((band_width_data-band_width_mc)./(band_width_data)) + +%Shift in bands: Positive is upward shift +mean_shift=-mean((band_mean_data-band_mean_mc)./(band_mean_data)) + +%Chi2 for band mean +temp=confint(ER_mean_power_fit); +ER_mean_power_fit_a_err=abs(ER_mean_power_fit.a-temp(1,1)); +ER_mean_power_fit_b_err=abs(ER_mean_power_fit.b-temp(1,2)); +band_mean_data_err=sqrt( ((x.^ER_mean_power_fit.b).*(ER_mean_power_fit_a_err)).^2 + (ER_mean_power_fit_b_err.*ER_mean_power_fit.a.*(x.^ER_mean_power_fit.b).*log(x)).^2); +mean_chi2=sum( ((band_mean_mc-band_mean_data)./band_mean_data_err).^2) +mean_p_value=1-chi2cdf(mean_chi2,length(band_mean_data)-1) + +%Chi2 for upper 90% +temp=confint(ER_upper_power_fit); +ER_upper_power_fit_a_err=abs(ER_upper_power_fit.a-temp(1,1)); +ER_upper_power_fit_b_err=abs(ER_upper_power_fit.b-temp(1,2)); +band_upper_data_err=sqrt( ((x.^ER_upper_power_fit.b).*(ER_upper_power_fit_a_err)).^2 + (ER_upper_power_fit_b_err.*ER_upper_power_fit.a.*(x.^ER_upper_power_fit.b).*log(x)).^2); +upper_chi2=sum( ((band_upper_mc-band_upper_data)./band_upper_data_err).^2) +upper_p_value=1-chi2cdf(upper_chi2,length(band_mean_data)-1) + +%Chi2 for lower 90% +temp=confint(ER_lower_power_fit); +ER_lower_power_fit_a_err=abs(ER_lower_power_fit.a-temp(1,1)); +ER_lower_power_fit_b_err=abs(ER_lower_power_fit.b-temp(1,2)); +band_lower_data_err=sqrt( ((x.^ER_lower_power_fit.b).*(ER_lower_power_fit_a_err)).^2 + (ER_lower_power_fit_b_err.*ER_lower_power_fit.a.*(x.^ER_lower_power_fit.b).*log(x)).^2); +lower_chi2=sum( ((band_lower_mc-band_lower_data)./band_lower_data_err).^2) +lower_p_value=1-chi2cdf(lower_chi2,length(band_mean_data)-1) + + +%Chi2 for total width +expected_width=(band_upper_data-band_lower_data); +expected_width_err=sqrt(band_upper_data_err.^2 + band_lower_data_err.^2); +observed_width=(band_upper_mc-band_lower_mc); +width_chi2=sum( ((observed_width-expected_width)./(expected_width_err)).^2) +width_p_value=1-chi2cdf(width_chi2,length(band_mean_data)-1) diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/BandPredictionCode/PredictERBand_Nov2014.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/BandPredictionCode/PredictERBand_Nov2014.m new file mode 100644 index 0000000..2bd8753 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/BandPredictionCode/PredictERBand_Nov2014.m @@ -0,0 +1,248 @@ +% Load in the S1a/S1b -> ER Band map + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\S1aMethod\libNEST_CH3TModel\RecombPhysicsResult\ERBandPrediction\S1aS1b_To_ERBand_RZVoxels.mat') + + +%% Load in Sep2014 ER S1a/S1b + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\S1aMethod\libNEST_CH3TModel\RecombPhysicsResult\ERBandPrediction\Nov2014_S1aS1b.mat') + + +SE_size_Sep2015=25.64; +SE_size_Sep2014=27.21; +SE_size_Nov2014=26.13; +SE_size_Feb2015=26.23; + + +MCMC_events=[]; +MCMC_events_x=[]; +% +% +% for i=1:size(s1ab_xyz_mean,1) +% for j=1:size(s1ab_xyz_mean,2) +% for k=1:size(s1ab_xyz_mean,3) +% if ~isnan(s1ab_xyz_mean(i,j,k)) +% [powerlaw_a powerlaw_a_err]=polyval(S1aS1b_to_mean_a_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_mean_a_fit_err); +% [powerlaw_b powerlaw_b_err]=polyval(S1aS1b_to_mean_b_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_mean_b_fit_err); +% [powerlaw_a_upper powerlaw_a_upper_err]=polyval(S1aS1b_to_upper_a_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_upper_a_fit_err); +% [powerlaw_b_upper powerlaw_b_upper_err]=polyval(S1aS1b_to_upper_b_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_upper_b_fit_err); +% [powerlaw_a_lower powerlaw_a_lower_err]=polyval(S1aS1b_to_lower_a_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_lower_a_fit_err); +% [powerlaw_b_lower powerlaw_b_lower_err]=polyval(S1aS1b_to_lower_b_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_lower_b_fit_err); +% +% %Make MCMC of predicted band for the voxel +% for counter=1:Kr_count_3D(i,j,k)/10; +% xx=50*rand(1); %pick random S1 value +% yy= log10((10.^(powerlaw_a.*xx.^powerlaw_b)).*(SE_size_Nov2014/SE_size_Sep2015)); %Get associate log10(S1/S2) mean from power law fit +% yy_sigma=abs(yy-log10((10.^(powerlaw_a_upper.*xx.^powerlaw_b_upper)).*(SE_size_Nov2014/SE_size_Sep2015)) )/1.28; %Get associate log10(S1/S2) gaussian width from power law fit +% MCMC_events=[MCMC_events; normrnd(yy,yy_sigma,1)]; +% MCMC_events_x=[MCMC_events_x; xx]; +% end +% end +% end +% end +% end +% + + +for i=1:size(s1ab_z_means,2) + if ~isnan(s1ab_z_means(i)) + [powerlaw_a powerlaw_a_err]=polyval(S1aS1b_to_mean_a_fit,s1ab_z_means(i),S1aS1b_to_mean_a_fit_err); + [powerlaw_b powerlaw_b_err]=polyval(S1aS1b_to_mean_b_fit,s1ab_z_means(i),S1aS1b_to_mean_b_fit_err); + [powerlaw_a_upper powerlaw_a_upper_err]=polyval(S1aS1b_to_upper_a_fit,s1ab_z_means(i),S1aS1b_to_upper_a_fit_err); + [powerlaw_b_upper powerlaw_b_upper_err]=polyval(S1aS1b_to_upper_b_fit,s1ab_z_means(i),S1aS1b_to_upper_b_fit_err); + [powerlaw_a_lower powerlaw_a_lower_err]=polyval(S1aS1b_to_lower_a_fit,s1ab_z_means(i),S1aS1b_to_lower_a_fit_err); + [powerlaw_b_lower powerlaw_b_lower_err]=polyval(S1aS1b_to_lower_b_fit,s1ab_z_means(i),S1aS1b_to_lower_b_fit_err); + + %Make MCMC of predicted band for the voxel + for counter=1:Kr_count_1D(i); + xx=50*rand(1); %pick random S1 value + yy= log10((10.^(powerlaw_a.*xx.^powerlaw_b)).*(SE_size_Sep2015/SE_size_Sep2015)); %Get associate log10(S1/S2) mean from power law fit + yy_sigma=abs(yy-log10((10.^(powerlaw_a_upper.*xx.^powerlaw_b_upper)).*(SE_size_Sep2015/SE_size_Sep2015)) )/1.28; %Get associate log10(S1/S2) gaussian width from power law fit + MCMC_events=[MCMC_events; normrnd(yy,yy_sigma,1)]; + MCMC_events_x=[MCMC_events_x; xx]; + end + end +end + +%% Fit total MCMC band +s1_min=0; +s1_max=50; + band_sigma=1.28; %90% confidence bounds + + s2_s1_bin= 1:.05:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + MCMC_counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut= inrange(MCMC_events_x,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(MCMC_events(ER_fit_cut),s2_s1_bin); + MCMC_counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(MCMC_events(ER_fit_cut),s2_s1_bin); + + %band=confint(Fit_ER,.1); + %ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*MCMC_counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + MCMC_ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + MCMC_ER_mean_fit=MCMC_ER_mean_power_fit.a.*ER_bins.^(MCMC_ER_mean_power_fit.b); + b=confint(MCMC_ER_mean_power_fit,.68); + MCMC_sigma_a_ER_mean=(b(2,1)-b(1,1))/2; + MCMC_sigma_b_ER_mean=(b(2,2)-b(1,2))/2; + + MCMC_ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + MCMC_ER_lower_fit=MCMC_ER_lower_power_fit.a.*ER_bins.^(MCMC_ER_lower_power_fit.b); + b=confint(MCMC_ER_lower_power_fit,.68); + MCMC_sigma_a_ER_lower=(b(2,1)-b(1,1))/2; + MCMC_sigma_b_ER_lower=(b(2,2)-b(1,2))/2; + + MCMC_ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + MCMC_ER_upper_fit=MCMC_ER_upper_power_fit.a.*ER_bins.^(MCMC_ER_upper_power_fit.b); + b=confint(MCMC_ER_upper_power_fit,.68); + MCMC_sigma_a_ER_upper=(b(2,1)-b(1,1))/2; + MCMC_sigma_b_ER_upper=(b(2,2)-b(1,2))/2; + + MCMC_powerlaw_a=MCMC_ER_mean_power_fit.a; + MCMC_powerlaw_b=MCMC_ER_mean_power_fit.b; + MCMC_powerlaw_a_upper=MCMC_ER_upper_power_fit.a; + MCMC_powerlaw_b_upper=MCMC_ER_upper_power_fit.b; + MCMC_powerlaw_a_lower=MCMC_ER_lower_power_fit.a; + MCMC_powerlaw_b_lower=MCMC_ER_lower_power_fit.b; + MCMC_powerlaw_a_err=MCMC_sigma_a_ER_mean; + MCMC_powerlaw_b_err=MCMC_sigma_b_ER_mean; + MCMC_powerlaw_a_upper_err=MCMC_sigma_a_ER_upper; + MCMC_powerlaw_b_upper_err=MCMC_sigma_b_ER_upper; + MCMC_powerlaw_a_lower_err=MCMC_sigma_a_ER_lower; + MCMC_powerlaw_b_lower_err=MCMC_sigma_b_ER_lower; + + %% Compare to actual band + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\S1aMethod\libNEST_CH3TModel\RecombPhysicsResult\ERBandPrediction\Nov2014_ERFit.mat') + + %Make Plot + + no_fid_new=figure; + hold on + plot(MCMC_events_x,MCMC_events,'.k','MarkerSize',1) + cc=colorbar; + ylabel(cc,'Count','FontSize',16); + colormap; + ylabel('Corrected log10(S2/S1)'); xlabel('S1 corrected (Pulse Area Phe)'); + title(sprintf('Run 04 CH3T, MonteCarlo Band'),'fontsize',16,'Interpreter','none'); + myfigview(16); + ylim([0 3.5]);xlim([0 s1_max]); +% plot(ER_bins,lower_bound,'ok','markersize',6,'linewidth',2) +plot(ER_bins,MCMC_ER_mean_fit,'-b','markersize',20,'linewidth',2) +plot(ER_bins,ER_mean_fit,'-r','markersize',14,'linewidth',2) +% plot(ER_bins,mean_ER_band,'ok','markersize',6,'linewidth',2)%plot mean of ER band + plot(ER_bins,ER_lower_fit,'--r','markersize',20,'linewidth',2) +% plot(ER_bins,upper_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_upper_fit,'--r','markersize',14,'linewidth',2) +plot(ER_bins,MCMC_ER_lower_fit,'--b','markersize',20,'linewidth',2) +plot(ER_bins,MCMC_ER_upper_fit,'--b','markersize',20,'linewidth',2) + legend('Data','MCMC Band','Measured ER Band'); + + + bin_step=2; + + total_count=length(log10(MCMC_events_x)); + +% +% box; +% text(10,2.8,strcat('Total Count= ',num2str(total_count)),'fontsize',16); +% text(5,.55,strcat('+',num2str(band_sigma),'\sigma = (',num2str(ER_upper_power_fit.a,3),'\pm', num2str(sigma_a_ER_upper,1) ,')\times S1_c ^{', num2str(ER_upper_power_fit.b,3),'\pm',num2str(sigma_b_ER_upper,1),'}'),'fontsize',16,'interpreter','tex'); +% text(5,.3,strcat('Mean=(',num2str(ER_mean_power_fit.a,3),'\pm', num2str(sigma_a_ER_mean,1),')\times S1_c ^{', num2str(ER_mean_power_fit.b,3),'\pm', num2str(sigma_b_ER_mean,1),'}'),'fontsize',16,'interpreter','tex'); +% text(5,.05,strcat('-',num2str(band_sigma),'\sigma = (',num2str(ER_lower_power_fit.a,3),'\pm', num2str(sigma_a_ER_lower,1),')\times S1_c ^{', num2str(ER_lower_power_fit.b,3),'\pm', num2str(sigma_b_ER_lower,1),'}'),'fontsize',16,'interpreter','tex'); +% title('Nov2014 CH3T') + + box; + + text(5,.55,strcat('+',num2str(band_sigma),'\sigma = (',num2str(MCMC_ER_upper_power_fit.a,3),'\pm', num2str(MCMC_sigma_a_ER_upper,1) ,')\times S1_c ^{', num2str(MCMC_ER_upper_power_fit.b,3),'\pm',num2str(MCMC_sigma_b_ER_upper,1),'}'),'fontsize',16,'interpreter','tex'); + text(5,.3,strcat('Mean=(',num2str(MCMC_ER_mean_power_fit.a,3),'\pm', num2str(MCMC_sigma_a_ER_mean,1),')\times S1_c ^{', num2str(MCMC_ER_mean_power_fit.b,3),'\pm', num2str(MCMC_sigma_b_ER_mean,1),'}'),'fontsize',16,'interpreter','tex'); + text(5,.05,strcat('-',num2str(band_sigma),'\sigma = (',num2str(MCMC_ER_lower_power_fit.a,3),'\pm', num2str(MCMC_sigma_a_ER_lower,1),')\times S1_c ^{', num2str(MCMC_ER_lower_power_fit.b,3),'\pm', num2str(MCMC_sigma_b_ER_lower,1),'}'),'fontsize',16,'interpreter','tex'); + title('Nov2014 CH3T') + + + + +%% Stats about the difference + +%% Stats about the difference + + +%Real Data Band +x=[1:0.1:50]; +band_mean_data=ER_mean_power_fit.a*x.^ER_mean_power_fit.b; +band_upper_data=ER_upper_power_fit.a.*x.^ER_upper_power_fit.b; +band_lower_data=ER_lower_power_fit.a.*x.^ER_lower_power_fit.b; +band_width_data=(band_mean_data-band_lower_data)./(1.28); + +%KrypCal Band - uses slightly different ER band than the one in the figures +band_mean_mc=MCMC_ER_mean_power_fit.a.*x.^MCMC_ER_mean_power_fit.b; +band_upper_mc=MCMC_ER_upper_power_fit.a*x.^MCMC_ER_upper_power_fit.b; +band_lower_mc=MCMC_ER_lower_power_fit.a*x.^MCMC_ER_lower_power_fit.b; +band_width_mc=(band_mean_mc-band_lower_mc)./(1.28); + +%Improvement in bands: Negative is worse resolution +width_difference=mean((band_width_data-band_width_mc)./(band_width_data)) + +%Shift in bands: Positive is upward shift +mean_shift=-mean((band_mean_data-band_mean_mc)./(band_mean_data)) + +%Chi2 for band mean +temp=confint(ER_mean_power_fit); +ER_mean_power_fit_a_err=abs(ER_mean_power_fit.a-temp(1,1)); +ER_mean_power_fit_b_err=abs(ER_mean_power_fit.b-temp(1,2)); +band_mean_data_err=sqrt( ((x.^ER_mean_power_fit.b).*(ER_mean_power_fit_a_err)).^2 + (ER_mean_power_fit_b_err.*ER_mean_power_fit.a.*(x.^ER_mean_power_fit.b).*log(x)).^2); +mean_chi2=sum( ((band_mean_mc-band_mean_data)./band_mean_data_err).^2) +mean_p_value=1-chi2cdf(mean_chi2,length(band_mean_data)-1) + +%Chi2 for upper 90% +temp=confint(ER_upper_power_fit); +ER_upper_power_fit_a_err=abs(ER_upper_power_fit.a-temp(1,1)); +ER_upper_power_fit_b_err=abs(ER_upper_power_fit.b-temp(1,2)); +band_upper_data_err=sqrt( ((x.^ER_upper_power_fit.b).*(ER_upper_power_fit_a_err)).^2 + (ER_upper_power_fit_b_err.*ER_upper_power_fit.a.*(x.^ER_upper_power_fit.b).*log(x)).^2); +upper_chi2=sum( ((band_upper_mc-band_upper_data)./band_upper_data_err).^2) +upper_p_value=1-chi2cdf(upper_chi2,length(band_mean_data)-1) + +%Chi2 for lower 90% +temp=confint(ER_lower_power_fit); +ER_lower_power_fit_a_err=abs(ER_lower_power_fit.a-temp(1,1)); +ER_lower_power_fit_b_err=abs(ER_lower_power_fit.b-temp(1,2)); +band_lower_data_err=sqrt( ((x.^ER_lower_power_fit.b).*(ER_lower_power_fit_a_err)).^2 + (ER_lower_power_fit_b_err.*ER_lower_power_fit.a.*(x.^ER_lower_power_fit.b).*log(x)).^2); +lower_chi2=sum( ((band_lower_mc-band_lower_data)./band_lower_data_err).^2) +lower_p_value=1-chi2cdf(lower_chi2,length(band_mean_data)-1) + + +%Chi2 for total width +expected_width=(band_upper_data-band_lower_data); +expected_width_err=sqrt(band_upper_data_err.^2 + band_lower_data_err.^2); +observed_width=(band_upper_mc-band_lower_mc); +width_chi2=sum( ((observed_width-expected_width)./(expected_width_err)).^2) +width_p_value=1-chi2cdf(width_chi2,length(band_mean_data)-1) diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/BandPredictionCode/PredictERBand_Sep2014.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/BandPredictionCode/PredictERBand_Sep2014.m new file mode 100644 index 0000000..c326633 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/BandPredictionCode/PredictERBand_Sep2014.m @@ -0,0 +1,225 @@ +% Load in the S1a/S1b -> ER Band map + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\S1aMethod\libNEST_CH3TModel\RecombPhysicsResult\ERBandPrediction\S1aS1b_To_ERBand_RZVoxels.mat') + + +%% Load in Sep2014 ER S1a/S1b + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\S1aMethod\libNEST_CH3TModel\RecombPhysicsResult\ERBandPrediction\Sep2014_S1aS1b.mat') + + +SE_size_Sep2015=25.64; +SE_size_Sep2014=27.21; +SE_size_Nov2014=26.13; +SE_size_Feb2015=26.23; + + +MCMC_events=[]; +MCMC_events_x=[]; + + +for i=1:size(s1ab_xyz_mean,1) + for j=1:size(s1ab_xyz_mean,2) + for k=1:size(s1ab_xyz_mean,3) + if ~isnan(s1ab_xyz_mean(i,j,k)) + [powerlaw_a powerlaw_a_err]=polyval(S1aS1b_to_mean_a_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_mean_a_fit_err); + [powerlaw_b powerlaw_b_err]=polyval(S1aS1b_to_mean_b_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_mean_b_fit_err); + [powerlaw_a_upper powerlaw_a_upper_err]=polyval(S1aS1b_to_upper_a_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_upper_a_fit_err); + [powerlaw_b_upper powerlaw_b_upper_err]=polyval(S1aS1b_to_upper_b_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_upper_b_fit_err); + [powerlaw_a_lower powerlaw_a_lower_err]=polyval(S1aS1b_to_lower_a_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_lower_a_fit_err); + [powerlaw_b_lower powerlaw_b_lower_err]=polyval(S1aS1b_to_lower_b_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_lower_b_fit_err); + + %Make MCMC of predicted band for the voxel + for counter=1:Kr_count_3D(i,j,k)/10; + xx=50*rand(1); %pick random S1 value + yy= log10((10.^(powerlaw_a.*xx.^powerlaw_b)).*(SE_size_Sep2014/SE_size_Sep2015)); %Get associate log10(S1/S2) mean from power law fit + yy_sigma=abs(yy-log10((10.^(powerlaw_a_upper.*xx.^powerlaw_b_upper)).*(SE_size_Sep2014/SE_size_Sep2015)) )/1.28; %Get associate log10(S1/S2) gaussian width from power law fit + MCMC_events=[MCMC_events; normrnd(yy,yy_sigma,1)]; + MCMC_events_x=[MCMC_events_x; xx]; + end + end + end + end +end + +%% Fit total MCMC band +s1_min=0; +s1_max=50; + band_sigma=1.28; %90% confidence bounds + + s2_s1_bin= 1:.05:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + MCMC_counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut= inrange(MCMC_events_x,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(MCMC_events(ER_fit_cut),s2_s1_bin); + MCMC_counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(MCMC_events(ER_fit_cut),s2_s1_bin); + + %band=confint(Fit_ER,.1); + %ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*MCMC_counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + MCMC_ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + MCMC_ER_mean_fit=MCMC_ER_mean_power_fit.a.*ER_bins.^(MCMC_ER_mean_power_fit.b); + b=confint(MCMC_ER_mean_power_fit,.68); + MCMC_sigma_a_ER_mean=(b(2,1)-b(1,1))/2; + MCMC_sigma_b_ER_mean=(b(2,2)-b(1,2))/2; + + MCMC_ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + MCMC_ER_lower_fit=MCMC_ER_lower_power_fit.a.*ER_bins.^(MCMC_ER_lower_power_fit.b); + b=confint(MCMC_ER_lower_power_fit,.68); + MCMC_sigma_a_ER_lower=(b(2,1)-b(1,1))/2; + MCMC_sigma_b_ER_lower=(b(2,2)-b(1,2))/2; + + MCMC_ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + MCMC_ER_upper_fit=MCMC_ER_upper_power_fit.a.*ER_bins.^(MCMC_ER_upper_power_fit.b); + b=confint(MCMC_ER_upper_power_fit,.68); + MCMC_sigma_a_ER_upper=(b(2,1)-b(1,1))/2; + MCMC_sigma_b_ER_upper=(b(2,2)-b(1,2))/2; + + MCMC_powerlaw_a=MCMC_ER_mean_power_fit.a; + MCMC_powerlaw_b=MCMC_ER_mean_power_fit.b; + MCMC_powerlaw_a_upper=MCMC_ER_upper_power_fit.a; + MCMC_powerlaw_b_upper=MCMC_ER_upper_power_fit.b; + MCMC_powerlaw_a_lower=MCMC_ER_lower_power_fit.a; + MCMC_powerlaw_b_lower=MCMC_ER_lower_power_fit.b; + MCMC_powerlaw_a_err=MCMC_sigma_a_ER_mean; + MCMC_powerlaw_b_err=MCMC_sigma_b_ER_mean; + MCMC_powerlaw_a_upper_err=MCMC_sigma_a_ER_upper; + MCMC_powerlaw_b_upper_err=MCMC_sigma_b_ER_upper; + MCMC_powerlaw_a_lower_err=MCMC_sigma_a_ER_lower; + MCMC_powerlaw_b_lower_err=MCMC_sigma_b_ER_lower; + + %% Compare to actual band + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\S1aMethod\libNEST_CH3TModel\RecombPhysicsResult\ERBandPrediction\Sep2014_ERFit.mat') + + %Make Plot + + no_fid_new=figure; + hold on + plot(MCMC_events_x,MCMC_events,'.k','MarkerSize',1) + cc=colorbar; + ylabel(cc,'Count','FontSize',16); + colormap; + ylabel('Corrected log10(S2/S1)'); xlabel('S1 corrected (Pulse Area Phe)'); + title(sprintf('Run 04 CH3T, MonteCarlo Band'),'fontsize',16,'Interpreter','none'); + myfigview(16); + ylim([0 3.5]);xlim([0 s1_max]); +% plot(ER_bins,lower_bound,'ok','markersize',6,'linewidth',2) +plot(ER_bins,MCMC_ER_mean_fit,'-b','markersize',20,'linewidth',2) +plot(ER_bins,ER_mean_fit,'-r','markersize',14,'linewidth',2) +% plot(ER_bins,mean_ER_band,'ok','markersize',6,'linewidth',2)%plot mean of ER band + plot(ER_bins,ER_lower_fit,'--r','markersize',20,'linewidth',2) +% plot(ER_bins,upper_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_upper_fit,'--r','markersize',14,'linewidth',2) +plot(ER_bins,MCMC_ER_lower_fit,'--b','markersize',20,'linewidth',2) +plot(ER_bins,MCMC_ER_upper_fit,'--b','markersize',20,'linewidth',2) + legend('Data','MCMC Band','Measured ER Band'); + + + bin_step=2; + + total_count=length(log10(MCMC_events_x)); + +% +% box; +% text(10,2.8,strcat('Total Count= ',num2str(total_count)),'fontsize',16); +% text(5,.55,strcat('+',num2str(band_sigma),'\sigma = (',num2str(ER_upper_power_fit.a,3),'\pm', num2str(sigma_a_ER_upper,1) ,')\times S1_c ^{', num2str(ER_upper_power_fit.b,3),'\pm',num2str(sigma_b_ER_upper,1),'}'),'fontsize',16,'interpreter','tex'); +% text(5,.3,strcat('Mean=(',num2str(ER_mean_power_fit.a,3),'\pm', num2str(sigma_a_ER_mean,1),')\times S1_c ^{', num2str(ER_mean_power_fit.b,3),'\pm', num2str(sigma_b_ER_mean,1),'}'),'fontsize',16,'interpreter','tex'); +% text(5,.05,strcat('-',num2str(band_sigma),'\sigma = (',num2str(ER_lower_power_fit.a,3),'\pm', num2str(sigma_a_ER_lower,1),')\times S1_c ^{', num2str(ER_lower_power_fit.b,3),'\pm', num2str(sigma_b_ER_lower,1),'}'),'fontsize',16,'interpreter','tex'); +% title('Sep2014 CH3T') + + box; + + text(5,.55,strcat('+',num2str(band_sigma),'\sigma = (',num2str(MCMC_ER_upper_power_fit.a,3),'\pm', num2str(MCMC_sigma_a_ER_upper,1) ,')\times S1_c ^{', num2str(MCMC_ER_upper_power_fit.b,3),'\pm',num2str(MCMC_sigma_b_ER_upper,1),'}'),'fontsize',16,'interpreter','tex'); + text(5,.3,strcat('Mean=(',num2str(MCMC_ER_mean_power_fit.a,3),'\pm', num2str(MCMC_sigma_a_ER_mean,1),')\times S1_c ^{', num2str(MCMC_ER_mean_power_fit.b,3),'\pm', num2str(MCMC_sigma_b_ER_mean,1),'}'),'fontsize',16,'interpreter','tex'); + text(5,.05,strcat('-',num2str(band_sigma),'\sigma = (',num2str(MCMC_ER_lower_power_fit.a,3),'\pm', num2str(MCMC_sigma_a_ER_lower,1),')\times S1_c ^{', num2str(MCMC_ER_lower_power_fit.b,3),'\pm', num2str(MCMC_sigma_b_ER_lower,1),'}'),'fontsize',16,'interpreter','tex'); + title('Sep2014 CH3T') + + + +%% Stats about the difference + +%% Stats about the difference + + +%Real Data Band +x=[1:0.1:50]; +band_mean_data=ER_mean_power_fit.a*x.^ER_mean_power_fit.b; +band_upper_data=ER_upper_power_fit.a.*x.^ER_upper_power_fit.b; +band_lower_data=ER_lower_power_fit.a.*x.^ER_lower_power_fit.b; +band_width_data=(band_mean_data-band_lower_data)./(1.28); + +%KrypCal Band - uses slightly different ER band than the one in the figures +band_mean_mc=MCMC_ER_mean_power_fit.a.*x.^MCMC_ER_mean_power_fit.b; +band_upper_mc=MCMC_ER_upper_power_fit.a*x.^MCMC_ER_upper_power_fit.b; +band_lower_mc=MCMC_ER_lower_power_fit.a*x.^MCMC_ER_lower_power_fit.b; +band_width_mc=(band_mean_mc-band_lower_mc)./(1.28); + +%Improvement in bands: Negative is worse resolution +width_difference=mean((band_width_data-band_width_mc)./(band_width_data)) + +%Shift in bands: Positive is upward shift +mean_shift=-mean((band_mean_data-band_mean_mc)./(band_mean_data)) + +%Chi2 for band mean +temp=confint(ER_mean_power_fit); +ER_mean_power_fit_a_err=abs(ER_mean_power_fit.a-temp(1,1)); +ER_mean_power_fit_b_err=abs(ER_mean_power_fit.b-temp(1,2)); +band_mean_data_err=sqrt( ((x.^ER_mean_power_fit.b).*(ER_mean_power_fit_a_err)).^2 + (ER_mean_power_fit_b_err.*ER_mean_power_fit.a.*(x.^ER_mean_power_fit.b).*log(x)).^2); +mean_chi2=sum( ((band_mean_mc-band_mean_data)./band_mean_data_err).^2) +mean_p_value=1-chi2cdf(mean_chi2,length(band_mean_data)-1) + +%Chi2 for upper 90% +temp=confint(ER_upper_power_fit); +ER_upper_power_fit_a_err=abs(ER_upper_power_fit.a-temp(1,1)); +ER_upper_power_fit_b_err=abs(ER_upper_power_fit.b-temp(1,2)); +band_upper_data_err=sqrt( ((x.^ER_upper_power_fit.b).*(ER_upper_power_fit_a_err)).^2 + (ER_upper_power_fit_b_err.*ER_upper_power_fit.a.*(x.^ER_upper_power_fit.b).*log(x)).^2); +upper_chi2=sum( ((band_upper_mc-band_upper_data)./band_upper_data_err).^2) +upper_p_value=1-chi2cdf(upper_chi2,length(band_mean_data)-1) + +%Chi2 for lower 90% +temp=confint(ER_lower_power_fit); +ER_lower_power_fit_a_err=abs(ER_lower_power_fit.a-temp(1,1)); +ER_lower_power_fit_b_err=abs(ER_lower_power_fit.b-temp(1,2)); +band_lower_data_err=sqrt( ((x.^ER_lower_power_fit.b).*(ER_lower_power_fit_a_err)).^2 + (ER_lower_power_fit_b_err.*ER_lower_power_fit.a.*(x.^ER_lower_power_fit.b).*log(x)).^2); +lower_chi2=sum( ((band_lower_mc-band_lower_data)./band_lower_data_err).^2) +lower_p_value=1-chi2cdf(lower_chi2,length(band_mean_data)-1) + + +%Chi2 for total width +expected_width=(band_upper_data-band_lower_data); +expected_width_err=sqrt(band_upper_data_err.^2 + band_lower_data_err.^2); +observed_width=(band_upper_mc-band_lower_mc); +width_chi2=sum( ((observed_width-expected_width)./(expected_width_err)).^2) +width_p_value=1-chi2cdf(width_chi2,length(band_mean_data)-1) diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/BandPredictionCode/PredictERBand_Sep2015.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/BandPredictionCode/PredictERBand_Sep2015.m new file mode 100644 index 0000000..61c823d --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/BandPredictionCode/PredictERBand_Sep2015.m @@ -0,0 +1,270 @@ +% Load in the S1a/S1b -> ER Band map + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\S1aMethod\libNEST_CH3TModel\RecombPhysicsResult\ERBandPrediction\S1aS1b_To_ERBand_RZVoxels.mat') + + +%% Load in Sep2015 ER S1a/S1b + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\S1aMethod\libNEST_CH3TModel\RecombPhysicsResult\ERBandPrediction\Sep2015_S1aS1b.mat') + + +SE_size_Sep2015=25.64; +SE_size_Sep2014=27.21; +SE_size_Nov2014=26.13; +SE_size_Feb2015=26.23; + + +MCMC_events=[]; +MCMC_events_x=[]; + +% +% for i=1:size(s1ab_xyz_mean,1) +% for j=1:size(s1ab_xyz_mean,2) +% for k=1:size(s1ab_xyz_mean,3) +% if ~isnan(s1ab_xyz_mean(i,j,k)) +% [powerlaw_a powerlaw_a_err]=polyval(S1aS1b_to_mean_a_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_mean_a_fit_err); +% [powerlaw_b powerlaw_b_err]=polyval(S1aS1b_to_mean_b_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_mean_b_fit_err); +% [powerlaw_a_upper powerlaw_a_upper_err]=polyval(S1aS1b_to_upper_a_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_upper_a_fit_err); +% [powerlaw_b_upper powerlaw_b_upper_err]=polyval(S1aS1b_to_upper_b_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_upper_b_fit_err); +% [powerlaw_a_lower powerlaw_a_lower_err]=polyval(S1aS1b_to_lower_a_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_lower_a_fit_err); +% [powerlaw_b_lower powerlaw_b_lower_err]=polyval(S1aS1b_to_lower_b_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_lower_b_fit_err); +% +% %Make MCMC of predicted band for the voxel +% for counter=1:Kr_count_3D(i,j,k)/10; +% xx=50*rand(1); %pick random S1 value +% yy= powerlaw_a.*xx.^powerlaw_b; %Get associate log10(S1/S2) mean from power law fit +% yy_sigma=abs(yy-(powerlaw_a_upper.*xx.^powerlaw_b_upper))/1.28; %Get associate log10(S1/S2) gaussian width from power law fit +% MCMC_events=[MCMC_events; normrnd(yy,yy_sigma,1)]; +% MCMC_events_x=[MCMC_events_x; xx]; +% end +% end +% end +% end +% end + + + +% for i=1:size(s1ab_r2z_mean,1) +% for j=1:size(s1ab_r2z_mean,2) +% if ~isnan(s1ab_r2z_mean(i,j)) +% [powerlaw_a powerlaw_a_err]=polyval(S1aS1b_to_mean_a_fit,s1ab_r2z_mean(i,j),S1aS1b_to_mean_a_fit_err); +% [powerlaw_b powerlaw_b_err]=polyval(S1aS1b_to_mean_b_fit,s1ab_r2z_mean(i,j),S1aS1b_to_mean_b_fit_err); +% [powerlaw_a_upper powerlaw_a_upper_err]=polyval(S1aS1b_to_upper_a_fit,s1ab_r2z_mean(i,j),S1aS1b_to_upper_a_fit_err); +% [powerlaw_b_upper powerlaw_b_upper_err]=polyval(S1aS1b_to_upper_b_fit,s1ab_r2z_mean(i,j),S1aS1b_to_upper_b_fit_err); +% [powerlaw_a_lower powerlaw_a_lower_err]=polyval(S1aS1b_to_lower_a_fit,s1ab_r2z_mean(i,j),S1aS1b_to_lower_a_fit_err); +% [powerlaw_b_lower powerlaw_b_lower_err]=polyval(S1aS1b_to_lower_b_fit,s1ab_r2z_mean(i,j),S1aS1b_to_lower_b_fit_err); +% +% %Make MCMC of predicted band for the voxel +% for counter=1:Kr_count_2D(i,j)/10; +% xx=50*rand(1); %pick random S1 value +% yy= powerlaw_a.*xx.^powerlaw_b; %Get associate log10(S1/S2) mean from power law fit +% yy_sigma=abs(yy-(powerlaw_a_upper.*xx.^powerlaw_b_upper))/1.28; %Get associate log10(S1/S2) gaussian width from power law fit +% MCMC_events=[MCMC_events; normrnd(yy,yy_sigma,1)]; +% MCMC_events_x=[MCMC_events_x; xx]; +% end +% end +% end +% end + + + +for i=1:size(s1ab_z_means,2) + if ~isnan(s1ab_z_means(i)) + [powerlaw_a powerlaw_a_err]=polyval(S1aS1b_to_mean_a_fit,s1ab_z_means(i),S1aS1b_to_mean_a_fit_err); + [powerlaw_b powerlaw_b_err]=polyval(S1aS1b_to_mean_b_fit,s1ab_z_means(i),S1aS1b_to_mean_b_fit_err); + [powerlaw_a_upper powerlaw_a_upper_err]=polyval(S1aS1b_to_upper_a_fit,s1ab_z_means(i),S1aS1b_to_upper_a_fit_err); + [powerlaw_b_upper powerlaw_b_upper_err]=polyval(S1aS1b_to_upper_b_fit,s1ab_z_means(i),S1aS1b_to_upper_b_fit_err); + [powerlaw_a_lower powerlaw_a_lower_err]=polyval(S1aS1b_to_lower_a_fit,s1ab_z_means(i),S1aS1b_to_lower_a_fit_err); + [powerlaw_b_lower powerlaw_b_lower_err]=polyval(S1aS1b_to_lower_b_fit,s1ab_z_means(i),S1aS1b_to_lower_b_fit_err); + + %Make MCMC of predicted band for the voxel + for counter=1:Kr_count_1D(i); + xx=50*rand(1); %pick random S1 value + yy= powerlaw_a.*xx.^powerlaw_b; %Get associate log10(S1/S2) mean from power law fit + yy_sigma=abs(yy-(powerlaw_a_upper.*xx.^powerlaw_b_upper))/1.28; %Get associate log10(S1/S2) gaussian width from power law fit + MCMC_events=[MCMC_events; normrnd(yy,yy_sigma,1)]; + MCMC_events_x=[MCMC_events_x; xx]; + end + end +end + +%% Fit total MCMC band +s1_min=0; +s1_max=50; + band_sigma=1.28; %90% confidence bounds + + s2_s1_bin= 1:.05:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + MCMC_counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut= inrange(MCMC_events_x,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(MCMC_events(ER_fit_cut),s2_s1_bin); + MCMC_counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(MCMC_events(ER_fit_cut),s2_s1_bin); + + %band=confint(Fit_ER,.1); + %ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*MCMC_counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + MCMC_ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + MCMC_ER_mean_fit=MCMC_ER_mean_power_fit.a.*ER_bins.^(MCMC_ER_mean_power_fit.b); + b=confint(MCMC_ER_mean_power_fit,.68); + MCMC_sigma_a_ER_mean=(b(2,1)-b(1,1))/2; + MCMC_sigma_b_ER_mean=(b(2,2)-b(1,2))/2; + + MCMC_ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + MCMC_ER_lower_fit=MCMC_ER_lower_power_fit.a.*ER_bins.^(MCMC_ER_lower_power_fit.b); + b=confint(MCMC_ER_lower_power_fit,.68); + MCMC_sigma_a_ER_lower=(b(2,1)-b(1,1))/2; + MCMC_sigma_b_ER_lower=(b(2,2)-b(1,2))/2; + + MCMC_ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + MCMC_ER_upper_fit=MCMC_ER_upper_power_fit.a.*ER_bins.^(MCMC_ER_upper_power_fit.b); + b=confint(MCMC_ER_upper_power_fit,.68); + MCMC_sigma_a_ER_upper=(b(2,1)-b(1,1))/2; + MCMC_sigma_b_ER_upper=(b(2,2)-b(1,2))/2; + + MCMC_powerlaw_a=MCMC_ER_mean_power_fit.a; + MCMC_powerlaw_b=MCMC_ER_mean_power_fit.b; + MCMC_powerlaw_a_upper=MCMC_ER_upper_power_fit.a; + MCMC_powerlaw_b_upper=MCMC_ER_upper_power_fit.b; + MCMC_powerlaw_a_lower=MCMC_ER_lower_power_fit.a; + MCMC_powerlaw_b_lower=MCMC_ER_lower_power_fit.b; + MCMC_powerlaw_a_err=MCMC_sigma_a_ER_mean; + MCMC_powerlaw_b_err=MCMC_sigma_b_ER_mean; + MCMC_powerlaw_a_upper_err=MCMC_sigma_a_ER_upper; + MCMC_powerlaw_b_upper_err=MCMC_sigma_b_ER_upper; + MCMC_powerlaw_a_lower_err=MCMC_sigma_a_ER_lower; + MCMC_powerlaw_b_lower_err=MCMC_sigma_b_ER_lower; + + %% Compare to actual band + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\S1aMethod\libNEST_CH3TModel\RecombPhysicsResult\ERBandPrediction\Sep2015_ERFit.mat') + + %Make Plot + + no_fid_new=figure; + hold on + plot(MCMC_events_x,MCMC_events,'.k','MarkerSize',1) + cc=colorbar; + ylabel(cc,'Count','FontSize',16); + colormap; + ylabel('Corrected log10(S2/S1)'); xlabel('S1 corrected (Pulse Area Phe)'); + title(sprintf('Run 04 CH3T, MonteCarlo Band'),'fontsize',16,'Interpreter','none'); + myfigview(16); + ylim([0 3.5]);xlim([0 s1_max]); +% plot(ER_bins,lower_bound,'ok','markersize',6,'linewidth',2) +plot(ER_bins,MCMC_ER_mean_fit,'-b','markersize',20,'linewidth',2) +plot(ER_bins,ER_mean_fit,'-r','markersize',14,'linewidth',2) +% plot(ER_bins,mean_ER_band,'ok','markersize',6,'linewidth',2)%plot mean of ER band + plot(ER_bins,ER_lower_fit,'--r','markersize',20,'linewidth',2) +% plot(ER_bins,upper_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_upper_fit,'--r','markersize',14,'linewidth',2) +plot(ER_bins,MCMC_ER_lower_fit,'--b','markersize',20,'linewidth',2) +plot(ER_bins,MCMC_ER_upper_fit,'--b','markersize',20,'linewidth',2) + legend('Data','MCMC Band','Measured ER Band'); + + + bin_step=2; + + total_count=length(log10(MCMC_events_x)); + +% +% box; +% text(10,2.8,strcat('Total Count= ',num2str(total_count)),'fontsize',16); +% text(5,.55,strcat('+',num2str(band_sigma),'\sigma = (',num2str(ER_upper_power_fit.a,3),'\pm', num2str(sigma_a_ER_upper,1) ,')\times S1_c ^{', num2str(ER_upper_power_fit.b,3),'\pm',num2str(sigma_b_ER_upper,1),'}'),'fontsize',16,'interpreter','tex'); +% text(5,.3,strcat('Mean=(',num2str(ER_mean_power_fit.a,3),'\pm', num2str(sigma_a_ER_mean,1),')\times S1_c ^{', num2str(ER_mean_power_fit.b,3),'\pm', num2str(sigma_b_ER_mean,1),'}'),'fontsize',16,'interpreter','tex'); +% text(5,.05,strcat('-',num2str(band_sigma),'\sigma = (',num2str(ER_lower_power_fit.a,3),'\pm', num2str(sigma_a_ER_lower,1),')\times S1_c ^{', num2str(ER_lower_power_fit.b,3),'\pm', num2str(sigma_b_ER_lower,1),'}'),'fontsize',16,'interpreter','tex'); +% title('Sep2015 CH3T') + + box; + + text(5,.55,strcat('+',num2str(band_sigma),'\sigma = (',num2str(MCMC_ER_upper_power_fit.a,3),'\pm', num2str(MCMC_sigma_a_ER_upper,1) ,')\times S1_c ^{', num2str(MCMC_ER_upper_power_fit.b,3),'\pm',num2str(MCMC_sigma_b_ER_upper,1),'}'),'fontsize',16,'interpreter','tex'); + text(5,.3,strcat('Mean=(',num2str(MCMC_ER_mean_power_fit.a,3),'\pm', num2str(MCMC_sigma_a_ER_mean,1),')\times S1_c ^{', num2str(MCMC_ER_mean_power_fit.b,3),'\pm', num2str(MCMC_sigma_b_ER_mean,1),'}'),'fontsize',16,'interpreter','tex'); + text(5,.05,strcat('-',num2str(band_sigma),'\sigma = (',num2str(MCMC_ER_lower_power_fit.a,3),'\pm', num2str(MCMC_sigma_a_ER_lower,1),')\times S1_c ^{', num2str(MCMC_ER_lower_power_fit.b,3),'\pm', num2str(MCMC_sigma_b_ER_lower,1),'}'),'fontsize',16,'interpreter','tex'); + title('Sep2015 CH3T') + + + + +%% Stats about the difference + + +%Real Data Band +x=[1:0.1:50]; +band_mean_data=ER_mean_power_fit.a*x.^ER_mean_power_fit.b; +band_upper_data=ER_upper_power_fit.a.*x.^ER_upper_power_fit.b; +band_lower_data=ER_lower_power_fit.a.*x.^ER_lower_power_fit.b; +band_width_data=(band_mean_data-band_lower_data)./(1.28); + +%KrypCal Band - uses slightly different ER band than the one in the figures +band_mean_mc=MCMC_ER_mean_power_fit.a.*x.^MCMC_ER_mean_power_fit.b; +band_upper_mc=MCMC_ER_upper_power_fit.a*x.^MCMC_ER_upper_power_fit.b; +band_lower_mc=MCMC_ER_lower_power_fit.a*x.^MCMC_ER_lower_power_fit.b; +band_width_mc=(band_mean_mc-band_lower_mc)./(1.28); + +%Improvement in bands: Negative is worse resolution +width_difference=mean((band_width_data-band_width_mc)./(band_width_data)) + +%Shift in bands: Positive is upward shift +mean_shift=-mean((band_mean_data-band_mean_mc)./(band_mean_data)) + +%Chi2 for band mean +temp=confint(ER_mean_power_fit); +ER_mean_power_fit_a_err=abs(ER_mean_power_fit.a-temp(1,1)); +ER_mean_power_fit_b_err=abs(ER_mean_power_fit.b-temp(1,2)); +band_mean_data_err=sqrt( ((x.^ER_mean_power_fit.b).*(ER_mean_power_fit_a_err)).^2 + (ER_mean_power_fit_b_err.*ER_mean_power_fit.a.*(x.^ER_mean_power_fit.b).*log(x)).^2); +mean_chi2=sum( ((band_mean_mc-band_mean_data)./band_mean_data_err).^2) +mean_p_value=1-chi2cdf(mean_chi2,length(band_mean_data)-1) + +%Chi2 for upper 90% +temp=confint(ER_upper_power_fit); +ER_upper_power_fit_a_err=abs(ER_upper_power_fit.a-temp(1,1)); +ER_upper_power_fit_b_err=abs(ER_upper_power_fit.b-temp(1,2)); +band_upper_data_err=sqrt( ((x.^ER_upper_power_fit.b).*(ER_upper_power_fit_a_err)).^2 + (ER_upper_power_fit_b_err.*ER_upper_power_fit.a.*(x.^ER_upper_power_fit.b).*log(x)).^2); +upper_chi2=sum( ((band_upper_mc-band_upper_data)./band_upper_data_err).^2) +upper_p_value=1-chi2cdf(upper_chi2,length(band_mean_data)-1) + +%Chi2 for lower 90% +temp=confint(ER_lower_power_fit); +ER_lower_power_fit_a_err=abs(ER_lower_power_fit.a-temp(1,1)); +ER_lower_power_fit_b_err=abs(ER_lower_power_fit.b-temp(1,2)); +band_lower_data_err=sqrt( ((x.^ER_lower_power_fit.b).*(ER_lower_power_fit_a_err)).^2 + (ER_lower_power_fit_b_err.*ER_lower_power_fit.a.*(x.^ER_lower_power_fit.b).*log(x)).^2); +lower_chi2=sum( ((band_lower_mc-band_lower_data)./band_lower_data_err).^2) +lower_p_value=1-chi2cdf(lower_chi2,length(band_mean_data)-1) + + +%Chi2 for total width +expected_width=(band_upper_data-band_lower_data); +expected_width_err=sqrt(band_upper_data_err.^2 + band_lower_data_err.^2); +observed_width=(band_upper_mc-band_lower_mc); +width_chi2=sum( ((observed_width-expected_width)./(expected_width_err)).^2) +width_p_value=1-chi2cdf(width_chi2,length(band_mean_data)-1) diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/Feb2015_ER_Band.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/Feb2015_ER_Band.m new file mode 100644 index 0000000..cee6fa5 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/Feb2015_ER_Band.m @@ -0,0 +1,1290 @@ +%% Make corrections with the chosen polynomial +path='C:\Users\Richard\Desktop\LUX Analysis\lux10_20150226T1943_cp18525'; + + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +delay_min=0; +file_id_cp='test'; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 32000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + + + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + + zcut_min = 10; %field changes at 4 uSec + zcut_max = 0.95*det_edge; + + + if Kr_events < 30000 %then create a 10x10 grid. Otherwise 25x25. Want about 30 evts per bin + + S1xybinsize = sqrt((50*50)/(Kr_events/150)); + S1_xbin_min = -25; + S1_xbin_max = 25; + S1_ybin_min = -25; + S1_ybin_max = 25; + SE_ybin_min = -25; + SE_ybin_max = 25; + + S2xybinsize = sqrt((50*50)/(Kr_events/150));%cm +% SExybinsize = 5; DEFINED LATER, based on number of SE events + S2_xbin_min = -25; + S2_xbin_max = 25; + S2_ybin_min = -25; + S2_ybin_max = 25; + SE_xbin_min = -25; + SE_xbin_max = 25; + + + end + + s1_xbins = (S1_xbin_max-S1_xbin_min)./S1xybinsize; + s1_ybins = (S1_ybin_max-S1_ybin_min)./S1xybinsize; + + s2_xbins = (S2_xbin_max-S2_xbin_min)./S2xybinsize; + s2_ybins = (S2_ybin_max-S2_ybin_min)./S2xybinsize; + + %% Kr S1a/S2b map + +%Set up cuts and variables + s1ab_cut=logical(sum(s1_single_cut(:,:),1)); + s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); + s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); + s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); + s1ab_x=d.x_cm(s2_single_cut); + s1ab_y=d.y_cm(s2_single_cut); + s1ab_z=d.z_drift_samples(s2_single_cut)/100; + s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); + s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<25; + + s1ab_x=s1ab_x(s1ab_timing_cut); + s1ab_y=s1ab_y(s1ab_timing_cut); + s1ab_z=s1ab_z(s1ab_timing_cut); + s1a_phe_both=s1a_phe_both(s1ab_timing_cut); + s1b_phe_both=s1b_phe_both(s1ab_timing_cut); + s1ab_radius=s1ab_radius(s1ab_timing_cut); + + %fidicual Z cut for s1ab_xy measurement + [s1ab_z_hist s1ab_z_hist_bins]=hist(s1ab_z(inrange(s1ab_z,[0,400])),[0:1:400]); + frac_hist=cumsum(s1ab_z_hist)./sum(s1ab_z_hist); + s1ab_z_cut_lower= min(s1ab_z_hist_bins(frac_hist>.10)); + s1ab_z_cut_upper= max(s1ab_z_hist_bins(frac_hist<.90)); + s1ab_z_cut=inrange(s1ab_z,[s1ab_z_cut_lower,s1ab_z_cut_upper]); + + %R cut for s1ab_Z measurement + [upperz_r_hist upperz_r_hist_bins]=hist(s1ab_radius(s1ab_z>s1ab_z_cut_upper & s1ab_radius<=26),[0:1:26]); + [lowerz_r_hist lowerz_r_hist_bins]=hist(s1ab_radius(s1ab_z0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:400]).','gauss1'); + s1b_fit=fit([0:2:300].',hist(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:300]).','gauss1'); + s1a_z_means(i)=s1a_fit.b1; + s1a_z_means_err(i)=s1a_fit.c1/sqrt(2)/sqrt(length(s1a_phe_both(s1ab_r_cut.' & s1a_phe_both>0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1b_z_means(i)=s1b_fit.b1; + s1b_z_means_err(i)=s1b_fit.c1/sqrt(2)/sqrt(length(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1ab_bincenters(i)=z_max-dT_step/2; + i=i+1; + end + +s1ab_z_means=s1a_z_means./s1b_z_means; +s1ab_z_means_err=sqrt( (s1b_z_means_err.*s1a_z_means./(s1b_z_means.^2)).^2 + (s1a_z_means_err./s1b_z_means).^2); + +%fit polynomial to s1az and s1bz, to remove z dependence later in xy fit +[s1a_P, s1a_S]=polyfit(s1ab_bincenters,s1a_z_means,3); +[s1b_P, s1b_S]=polyfit(s1ab_bincenters,s1b_z_means,3); +[s1ab_P, s1ab_S]=polyfit(s1ab_bincenters,s1ab_z_means,3); + +%S1a z dependence plot +s1az_plot=figure; +errorbar(s1ab_bincenters,s1a_z_means,s1a_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a Mean (phe)'); title('S1a Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1a_P,[10:1:320]),'-r','LineWidth',2) + + +%S1b z dependence plot +s1bz_plot=figure; +errorbar(s1ab_bincenters,s1b_z_means,s1b_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1b Mean (phe)'); title('S1b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1b_P,[10:1:320]),'-r','LineWidth',2) + + +%S1a/b z dependence plot +s1a_over_bz_plot=figure; +errorbar(s1ab_bincenters,s1ab_z_means,s1ab_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a/b'); title('S1 a/b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1ab_P,[10:1:320]),'-r','LineWidth',2) + + +%Correcting z dependence to get XY dependence in same manner that Kr/CH3T +%map does + s1a_phe_both_z=s1a_phe_both.'.*polyval(s1a_P,z_center)./polyval(s1a_P,s1ab_z); + s1b_phe_both_z=s1b_phe_both.'.*polyval(s1b_P,z_center)./polyval(s1b_P,s1ab_z); + +%% S1a/b XY map (after z correction) +s1ab_xbin_min=-25; +s1ab_ybin_min=-25; +s1ab_xbin_max=25; +s1ab_ybin_max=25; +s1ab_xybinsize=sqrt((50*50)/(length(s1ab_z)/300)); +clear s1a_xy_mean s1a_xy_mean_err s1b_xy_mean s1b_xy_mean_err + +s1ab_xbins=s1ab_xbin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_xbin_max; +s1ab_ybins=s1ab_ybin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_ybin_max; + +s1a_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); +s1b_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); + + for x_bin=s1ab_xbin_min:s1ab_xybinsize:(s1ab_xbin_max-s1ab_xybinsize/2); + for y_bin=s1ab_ybin_min:s1ab_xybinsize:(s1ab_ybin_max-s1ab_xybinsize/2); + x_min = x_bin; x_max = x_bin+s1ab_xybinsize; + y_min = y_bin; y_max = y_bin+s1ab_xybinsize; + + x_count=int32(1+x_bin/s1ab_xybinsize+s1ab_xbin_max/s1ab_xybinsize); + y_count=int32(1+y_bin/s1ab_xybinsize+s1ab_ybin_max/s1ab_xybinsize); + + bin_cut = s1ab_z_cut.' & inrange(s1ab_z,[10 330]).' & s1a_phe_both>0 & s1b_phe_both>0 & inrange(s1ab_x,[x_min,x_max]).' & inrange(s1ab_y,[y_min,y_max]).'; + if length(s1a_phe_both_z(bin_cut))>100; + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400])),[0:2:400]).','gauss1'); + s1a_xy_mean(y_count,x_count)=s1a_z_fit.b1; + s1a_xy_mean_err(y_count,x_count)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300])),[0:2:300]).','gauss1'); + s1b_xy_mean(y_count,x_count)=s1b_z_fit.b1; + s1b_xy_mean_err(y_count,x_count)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300]))); + else + s1a_xy_mean(y_count,x_count)=0; + s1a_xy_mean_err(y_count,x_count)=0; + s1b_xy_mean(y_count,x_count)=0; + s1b_xy_mean_err(y_count,x_count)=0; + end + + end + end + s1ab_xy_mean=s1a_xy_mean./s1b_xy_mean; + s1ab_xy_mean_err=sqrt( (s1b_xy_mean_err.*s1a_xy_mean./(s1b_xy_mean.^2)).^2 + (s1a_xy_mean_err./s1b_xy_mean).^2); + + + %Plot s1a XY means + color_range_max=max(max(s1a_xy_mean)); + color_range_min=min(min(s1a_xy_mean(s1a_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1a_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1a_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %Plot s1a XY means + color_range_max=max(max(s1b_xy_mean)); + color_range_min=min(min(s1b_xy_mean(s1b_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1b_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1b_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1b Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1b Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %s1a/b XY Ratio + color_range_max=max(max(s1ab_xy_mean)); + color_range_min=min(min(s1ab_xy_mean(s1ab_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1ab_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a/b Ratio vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a/b Ratio','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + +%% 3D Kr s1a/s1b map + +if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +s1ab_xyz_numbins=floor((length(s1ab_z)/200)^(1/3)); %number of bins in one direction +s1ab_xyz_zstep=det_edge/s1ab_xyz_numbins; +s1ab_xyz_xstep=50/s1ab_xyz_numbins; +s1ab_xyz_ystep=50/s1ab_xyz_numbins; +s1ab_xyz_xmax=25; +r_max=25; + +s1ab_xyz_zbins=10+s1ab_xyz_zstep/2:s1ab_xyz_zstep:10+s1ab_xyz_zstep/2+s1ab_xyz_zstep*s1ab_xyz_numbins; %20 us +s1ab_xyz_xbins=(-r_max+s1ab_xyz_xstep/2):s1ab_xyz_xstep:r_max; +s1ab_xyz_ybins=(-r_max+s1ab_xyz_ystep/2):s1ab_xyz_ystep:r_max; + +s1a_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + + %Count the number of events per bin + Count_S1ab_3D(l,m,n)=length(s1a_phe_both(q)); + + if (Count_S1ab_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_xyz_mean(l,m,n)=s1a_z_fit.b1; + s1a_xyz_mean_err(l,m,n)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]) ),[0:2:300]).','gauss1'); + s1b_xyz_mean(l,m,n)=s1b_z_fit.b1; + s1b_xyz_mean_err(l,m,n)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); + else %not enough stats to do the fit + s1a_xyz_mean(l,m,n)=0; + s1a_xyz_mean_err(l,m,n)=0; + s1b_xyz_mean(l,m,n)=0; + s1b_xyz_mean_err(l,m,n)=0; + end + + end + end +k +end + + s1ab_xyz_mean=s1a_xyz_mean./s1b_xyz_mean; + s1ab_xyz_mean_err=sqrt( (s1b_xyz_mean_err.*s1a_xyz_mean./(s1b_xyz_mean.^2)).^2 + (s1a_xyz_mean_err./s1b_xyz_mean).^2); + +end + %% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % Removing field dependence from S1 and S2 + % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + %Hardcoded numbers from Energy Chi2 Fit + + +s1ab_s2_xyz_fit_map.p1=-0.0097; +s1ab_s2_xyz_fit_map.p2=-1.7; +s1ab_s2_xyz_fit_map.p3=5.7225; + + +s1ab_s1_xyz_fit_map.p1=0.0025; +s1ab_s1_xyz_fit_map.p2=0.4424; +s1ab_s1_xyz_fit_map.p3=-0.2289; + + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval.*s2_xyfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval.*s2_xyfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval.*s1_xyfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval.*s1_xyfieldremoval); + + + + end + + + figure + plot(drift_time,s1_3Dfieldremoval,'.k') + hold on; + plot(drift_time,s2_3Dfieldremoval,'.r') + %% Calculate Single Electron Size + + s4_class=(d.pulse_classification==4) ; %Use or class=2 to fix 33 phe cut off... have to edit se_wrt_first_s1_func tho + d = se_wrt_first_s1_func(d); + cut_se_s1_z = d.t_btw_se_first_s1 > 100*10; + + SE_good_cut =logical( cut_se_s1_z & s4_class & ( cumsum(s1_single_cut)-cumsum(s2_single_cut) ) ); % only events between good S1 and S2s + + SE_phe_both=d.pulse_area_phe(SE_good_cut); + SE_phe_bot=d.phe_bottom(SE_good_cut); + SE_phe_top=SE_phe_both-SE_phe_bot; + + SE_x=d.x_cm(SE_good_cut); + SE_y=d.y_cm(SE_good_cut); + SE_radius=(SE_x.^2+SE_y.^2).^(1/2); + + %Both PMT first fit + SE_fit=fit([0:1:60]',hist(SE_phe_both(SE_radius<17 & inrange(SE_phe_both,[0 60])),[0:1:60])','gauss1'); %normally is 17 + SE_Size=SE_fit.b1; + SE_sig=SE_fit.c1/sqrt(2); + SE_both_conf=confint(SE_fit,0.683); + SE_sig_mu_both=abs(SE_Size-SE_both_conf(1,2)); % one sigma + SE_sig_sig_both=abs(SE_sig-SE_both_conf(1,3)/sqrt(2)); % one sigma + + %Both PMT Second fit + n_sig_fit=2; + + fit_start=SE_Size-n_sig_fit*SE_sig; + fit_end=SE_Size+n_sig_fit*SE_sig; + xfit=fit_start:0.1:fit_end; + + SE_cut=SE_phe_both(SE_radius<17); + [xxo, yyo, xo, no] = step(SE_cut(inrange(SE_cut,[fit_start fit_end])),[0:0.2:60]); + s = fitoptions('Method','NonlinearLeastSquares','Robust','On','Algorithm','Trust-Region','Lower',[-5,0,0,0],'Upper',[5,Inf,Inf,Inf],... + 'Startpoint',[1,max(no),10,5]); + skewGauss1 = fittype('a1/c1*exp(-((x-b1)/c1)^2)*(1+erf(a*(x-b1)/c1))','options',s); + + [f_both,g_both] = fit(xo',no',skewGauss1); + delta_both = f_both.a/sqrt(1+f_both.a^2); + SE_mu_both = f_both.b1 + f_both.c1/sqrt(2)*delta_both*sqrt(2/pi); + SE_sig_both = sqrt((f_both.c1/sqrt(2))^2 * (1 - 2 * (delta_both)^2/pi)); + skew_both = (4-pi)/2 * (delta_both * sqrt(2/pi))^3 / (1 - 2 * delta_both^2/pi)^(3/2); + kurt_both = 2*(pi-3) * (delta_both * sqrt(2/pi))^3 / (1 - 2 * delta_both^2/pi)^2; + ci_both = confint(f_both,0.683); + y_fit_both = f_both(xfit); + + both_SE_fig=figure; + hold on; + step(SE_cut,[0:0.2:60],'k'); + h_fit=plot(xfit,y_fit_both,'-r','linewidth',2); + box on; + myfigview(18); + xlabel('Pulse Area Phe (Phe) '); ylabel('Count/Phe '); + legend([h_fit],strcat('\mu = ',num2str(SE_mu_both,'%2.2f'),'\newline \sigma= ',num2str(SE_sig_both,'%2.2f'),'\newline skew=', num2str(skew_both,'%2.2f') ), 'location','northeast'); + + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S1 Z-dependence (Both PMT arrays) +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + light_correction_fig = figure; + errorbar(mean_index,means,means_error,'.k'); + hold on + [yplot_s1_both] = polyval(P_s1_both,dT_fit); + [center_s1_both, center_s1_both_err] = polyval(P_s1_both,z_center, S); %160[us]*1.51[\mus/us] + plot(dT_fit,yplot_s1_both,'-r','LineWidth',1); + xlabel('Depth (\mus)', 'FontSize',16); ylabel('Mean (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S1 Mean vs. Z'), 'FontSize', 16,'Interpreter','none'); + line([0 det_edge],[center_s1_both center_s1_both],'linestyle','--'); + line([z_center; z_center;],[min(means) max(means)],'linestyle','--'); + legend('S1\_both Mean', strcat('y=', num2str(P_s1_both(1),'%10.2e'), '*Z^2 + ', num2str(P_s1_both(2),'%10.2e')... + , '*Z + ', num2str(P_s1_both(3),4)),strcat('Det center = ',num2str(center_s1_both,4), ' [Phe]'),'location','northwest') + + box on; + myfigview(16); + xlim([0 det_edge]); + ylim([0.8*min(means) 1.15*max(means)]); + + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + + + + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + + %%calculate S2/S1 also, just to double check the lifetime from S2 only + % hist_s2_both_s1(:,bin)= hist(s2_phe_both(time_cut)./s1_phe_both_z(time_cut),x3)'; + % temp_hist=hist_s2_both_s1(:,bin); + %Fit_s2_both_s1{bin}=fit(x3(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + % means_s2_s1(bin)=Fit_s2_both_s1{bin}.b1; + % means_error_s2_s1(bin) = Fit_s2_both_s1{bin}.c1/2/sqrt(sum(hist_s2_both_s1(:,bin))); % == sigma/sqrt(N); + % mean_index_s2_s1(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + + dT_range= inrange( mean_index,[5+bin_size,500] );%from 50 to 300us for the fit + + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + %%Tracker for pseudo-lifetime + s2_at_bottom_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_both=-320/log(s2_at_bottom_both/s2_at_top_both); + + dT_fit=0:1:det_edge; + + Fit_EL= fit(mean_index(dT_range),means(dT_range),'exp1'); + yfitEL = Fit_EL.a.*exp(Fit_EL.b.*dT_fit); + + e_lifetime_both=-1/Fit_EL.b; + s2_z0_both=Fit_EL.a; + + b=confint(Fit_EL, 0.683);%1 sigma matrix + sigma_e_lifetime_both=(1/b(1,2)-1/b(2,2))/2; + sigma_s2_z0_both=(b(2,1)-b(1,1))/2; + + lifetime_fig_both = figure; + errorbar(mean_index(2:end),means(2:end),means_error(2:end),'.k'); %first bin is anode, skip it + hold on + plot(dT_fit,yfitEL,'-r','LineWidth',1); + xlabel('Time (\mus)', 'FontSize',16); ylabel('Mean S2 (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S2_both Electron Lifetime'), 'FontSize', 16,'Interpreter','none'); + legend('S2\_both Mean', strcat( '\lambda= ', num2str(e_lifetime_both,4), ' \pm ', num2str(sigma_e_lifetime_both,2), ' \mus' )... + ,'location','northeast'); + myfigview(16); + xlim([0 det_edge]); + + + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_ybins),floor(s2_xbins)); +Sigma_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); +Count_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + +color_range_max=max(max(mean_S2_both_xy)); +color_range_min=min(min(mean_S2_both_xy(mean_S2_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + +s2_xy_both_fig = figure; +contourf(s2xbins,s2ybins,mean_S2_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. S2 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_ybins),floor(s1_xbins)); +Sigma_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); +Count_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +color_range_max=max(max(mean_S1_both_xy)); +color_range_min=min(min(mean_S1_both_xy(mean_S1_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + +s1_xy_both_fig = figure; +contourf(s1xbins,s1ybins,mean_S1_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp,'. S1 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%% Apply corrections to CH3T and calculate the ER band + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\Run04_CH3T\KrypCal2p18_IQs\MakePlots\CH3T_Feb2015_Kr2p18.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'spline',1); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'spline',1); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +%% Make ER Band + +s1_min=0; +s1_max=50; + +%% First make plot of CH3T selection + +figure +density(log10(s2_phe_both_xyz),log10(s1_phe_both_xyz),[2.5:0.01:5],[0:0.01:3]) +cc=colorbar; +ylabel(cc,'Count','FontSize',16); +caxis +hold on; +xlabel('log10(Corrected S2)'); ylabel ('log10(Corrected S1)'); myfigview(16) +x=[3.629:0.001:4.185]; +y=-0.7.*x+4.8; +plot(x,y,'-r','LineWidth',2); +x=[2.703:0.001:3.26]; +y=-0.7.*x+2.3; +plot(x,y,'-r','LineWidth',2); +x=[2.703:0.001:3.629]; +y=2.*x-5; +plot(x,y,'-r','LineWidth',2); +x=[3.26:0.001:4.185]; +y=2.*x-6.5; +plot(x,y,'-r','LineWidth',2); +title('Feb2015 CH3T'); + +%% First figure out where the outliers are in space + +pulse_area_cut= (log10(s1_phe_both_xyz)+0.7*log10(s2_phe_both_xyz)<4.8) & (log10(s1_phe_both_xyz)+0.7*log10(s2_phe_both_xyz)>2.3) & ... + (log10(s1_phe_both_xyz)-2*log10(s2_phe_both_xyz)<-5) & (log10(s1_phe_both_xyz)-2*log10(s2_phe_both_xyz)>-6.5); + + +max_r=21; +fiducial_cut=inrange(drift_time,[40 300]) & inrange(s2radius_del,[0,max_r]); + +tritium_cut= clean_cut & pulse_area_cut & fiducial_cut; + +%% Next, make plot of fiducial cut + +figure +density(s2radius_del.^2,drift_time,[0:10:1000],[0:2:450]) +cc=colorbar; +ylabel(cc,'Count','FontSize',16); +set(gca,'Ydir','reverse') +hold on; +line([441 441],[40 300],'Color','r','LineWidth',2) +line([0 441],[300 300],'Color','r','LineWidth',2) +line([0 441],[40 40],'Color','r','LineWidth',2) +xlabel('Delensed Radius^2 (cm^2)'); ylabel('Drift Time (uSec)'); myfigview(16); +title('Feb2015 CH3T') +% plot(s2radius_del(~fiducial_cut).^2,drift_time(~fiducial_cut),'.k','MarkerSize',2) + + + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:.05:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=tritium_cut & inrange(s1_phe_both_xyz,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); + %ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + b=confint(ER_mean_power_fit,.68); + sigma_a_ER_mean=(b(2,1)-b(1,1))/2; + sigma_b_ER_mean=(b(2,2)-b(1,2))/2; + + ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + b=confint(ER_lower_power_fit,.68); + sigma_a_ER_lower=(b(2,1)-b(1,1))/2; + sigma_b_ER_lower=(b(2,2)-b(1,2))/2; + + ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + b=confint(ER_upper_power_fit,.68); + sigma_a_ER_upper=(b(2,1)-b(1,1))/2; + sigma_b_ER_upper=(b(2,2)-b(1,2))/2; + + + %Make Plot + + no_fid_new=figure; + hold on + %plot(s1_phe_both_xyz(tritium_cut),log10(s2_phe_both_xyz(tritium_cut)./s1_phe_both_xyz(tritium_cut)),'ok','markersize',2) + density(s1_phe_both_xyz(tritium_cut),log10(s2_phe_both_xyz(tritium_cut)./s1_phe_both_xyz(tritium_cut)),[0:.5:100],[0:.05:4]); +% densityplot(s1_phe_both_xyz(tritium_cut),log10(s2_phe_both_xyz(tritium_cut)./s1_phe_both_xyz(tritium_cut)),'rectangle',[.5 .05],'lin'); + cc=colorbar; + ylabel(cc,'Count','FontSize',16); + colormap; + ylabel('Corrected log10(S2/S1)'); xlabel('S1 corrected (Pulse Area Phe)'); + title(sprintf('Run 04 CH3T, R<%d cm',max_r),'fontsize',16,'Interpreter','none'); + myfigview(16); + ylim([0 3.5]);xlim([0 s1_max]); +% plot(ER_bins,lower_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_lower_fit,'--k','markersize',14,'linewidth',2) +% plot(ER_bins,mean_ER_band,'ok','markersize',6,'linewidth',2)%plot mean of ER band + plot(ER_bins,ER_mean_fit,'-k','markersize',20,'linewidth',2) +% plot(ER_bins,upper_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_upper_fit,'--k','markersize',14,'linewidth',2) + + + bin_step=2; + + total_count=length(log10(s2_phe_both_xyz(tritium_cut))); + + + box; + text(10,2.8,strcat('Total Count= ',num2str(total_count)),'fontsize',16); + %text(5,.7,strcat('NEST\_SE_{bot} Fit=',num2str(ER_mean_NEST_fit.SE_ER_fit*73/64*27/max_r,3),'\pm ', num2str(sigma_SE_ER_fit*73/64*27/max_r,2),'[Phe]'),'fontsize',16,'color','m','interpreter','tex'); + %text(5,.8,'NEST Platinum V4-b', 'fontsize',16,'color','m','interpreter','tex' ); + text(5,.55,strcat('+',num2str(band_sigma),'\sigma = (',num2str(ER_upper_power_fit.a,3),'\pm', num2str(sigma_a_ER_upper,1) ,')\times S1_c ^{', num2str(ER_upper_power_fit.b,3),'\pm',num2str(sigma_b_ER_upper,1),'}'),'fontsize',16,'interpreter','tex'); + text(5,.3,strcat('Mean=(',num2str(ER_mean_power_fit.a,3),'\pm', num2str(sigma_a_ER_mean,1),')\times S1_c ^{', num2str(ER_mean_power_fit.b,3),'\pm', num2str(sigma_b_ER_mean,1),'}'),'fontsize',16,'interpreter','tex'); + text(5,.05,strcat('-',num2str(band_sigma),'\sigma = (',num2str(ER_lower_power_fit.a,3),'\pm', num2str(sigma_a_ER_lower,1),')\times S1_c ^{', num2str(ER_lower_power_fit.b,3),'\pm', num2str(sigma_b_ER_lower,1),'}'),'fontsize',16,'interpreter','tex'); + title('feb2015 CH3T') + + s1_phe_both_xyz_all=s1_phe_both_xyz(tritium_cut & inrange(drift_time,[0,110])); + log10_s2s1_xyz_all=log10(s2_phe_both_xyz(tritium_cut & inrange(drift_time,[0,110]))./s1_phe_both_xyz(tritium_cut & inrange(drift_time,[0,110]))); + ER_lower_fit_all=ER_lower_fit; + ER_upper_fit_all=ER_upper_fit; + ER_mean_fit_all=ER_mean_fit; + + + + %Save ER Band fits + save('Feb2015_ERFit','ER_bins','mean_ER_band','ER_sigma','ER_lower_power_fit','ER_upper_power_fit','ER_mean_power_fit','ER_lower_fit','ER_upper_fit','ER_mean_fit'); + \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/MakeS1aS1bMap_Feb2015.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/MakeS1aS1bMap_Feb2015.m new file mode 100644 index 0000000..b5afc18 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/MakeS1aS1bMap_Feb2015.m @@ -0,0 +1,324 @@ +%% Make corrections with the chosen polynomial +path='C:\Users\Richard\Desktop\LUX Analysis\lux10_20150226T1943_cp18525'; + + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +delay_min=0; +file_id_cp='test'; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 32000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + + + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + + zcut_min = 10; %field changes at 4 uSec + zcut_max = 0.95*det_edge; + + + if Kr_events < 30000 %then create a 10x10 grid. Otherwise 25x25. Want about 30 evts per bin + + S1xybinsize = sqrt((50*50)/(Kr_events/150)); + S1_xbin_min = -25; + S1_xbin_max = 25; + S1_ybin_min = -25; + S1_ybin_max = 25; + SE_ybin_min = -25; + SE_ybin_max = 25; + + S2xybinsize = sqrt((50*50)/(Kr_events/150));%cm +% SExybinsize = 5; DEFINED LATER, based on number of SE events + S2_xbin_min = -25; + S2_xbin_max = 25; + S2_ybin_min = -25; + S2_ybin_max = 25; + SE_xbin_min = -25; + SE_xbin_max = 25; + + + end + + s1_xbins = (S1_xbin_max-S1_xbin_min)./S1xybinsize; + s1_ybins = (S1_ybin_max-S1_ybin_min)./S1xybinsize; + + s2_xbins = (S2_xbin_max-S2_xbin_min)./S2xybinsize; + s2_ybins = (S2_ybin_max-S2_ybin_min)./S2xybinsize; + + %% Kr S1a/S2b map + +%Set up cuts and variables + s1ab_cut=logical(sum(s1_single_cut(:,:),1)); + s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); + s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); + s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); + s1ab_x=d.x_cm(s2_single_cut); + s1ab_y=d.y_cm(s2_single_cut); + s1ab_z=d.z_drift_samples(s2_single_cut)/100; + s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); + s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<25; + + s1ab_x=s1ab_x(s1ab_timing_cut); + s1ab_y=s1ab_y(s1ab_timing_cut); + s1ab_z=s1ab_z(s1ab_timing_cut); + s1a_phe_both=s1a_phe_both(s1ab_timing_cut); + s1b_phe_both=s1b_phe_both(s1ab_timing_cut); + s1ab_radius=s1ab_radius(s1ab_timing_cut); + + %fidicual Z cut for s1ab_xy measurement + [s1ab_z_hist s1ab_z_hist_bins]=hist(s1ab_z(inrange(s1ab_z,[0,400])),[0:1:400]); + frac_hist=cumsum(s1ab_z_hist)./sum(s1ab_z_hist); + s1ab_z_cut_lower= min(s1ab_z_hist_bins(frac_hist>.10)); + s1ab_z_cut_upper= max(s1ab_z_hist_bins(frac_hist<.90)); + s1ab_z_cut=inrange(s1ab_z,[s1ab_z_cut_lower,s1ab_z_cut_upper]); + + %R cut for s1ab_Z measurement + [upperz_r_hist upperz_r_hist_bins]=hist(s1ab_radius(s1ab_z>s1ab_z_cut_upper & s1ab_radius<=26),[0:1:26]); + [lowerz_r_hist lowerz_r_hist_bins]=hist(s1ab_radius(s1ab_z0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:400]).','gauss1'); + s1b_fit=fit([0:2:300].',hist(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:300]).','gauss1'); + s1a_z_means(i)=s1a_fit.b1; + s1a_z_means_err(i)=s1a_fit.c1/sqrt(2)/sqrt(length(s1a_phe_both(s1ab_r_cut.' & s1a_phe_both>0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1b_z_means(i)=s1b_fit.b1; + s1b_z_means_err(i)=s1b_fit.c1/sqrt(2)/sqrt(length(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1ab_bincenters(i)=z_max-dT_step/2; + Kr_count_1D(i)=length(s1_phe_both(inrange(drift_time,[z_max-dT_step,z_max]) & kr_r_cut)); + i=i+1; + end + +s1ab_z_means=s1a_z_means./s1b_z_means; +s1ab_z_means_err=sqrt( (s1b_z_means_err.*s1a_z_means./(s1b_z_means.^2)).^2 + (s1a_z_means_err./s1b_z_means).^2); + +%fit polynomial to s1az and s1bz, to remove z dependence later in xy fit +[s1a_P, s1a_S]=polyfit(s1ab_bincenters,s1a_z_means,3); +[s1b_P, s1b_S]=polyfit(s1ab_bincenters,s1b_z_means,3); +[s1ab_P, s1ab_S]=polyfit(s1ab_bincenters,s1ab_z_means,3); + +%S1a z dependence plot +s1az_plot=figure; +errorbar(s1ab_bincenters,s1a_z_means,s1a_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a Mean (phe)'); title('S1a Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1a_P,[10:1:320]),'-r','LineWidth',2) + + +%S1b z dependence plot +s1bz_plot=figure; +errorbar(s1ab_bincenters,s1b_z_means,s1b_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1b Mean (phe)'); title('S1b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1b_P,[10:1:320]),'-r','LineWidth',2) + + +%S1a/b z dependence plot +s1a_over_bz_plot=figure; +errorbar(s1ab_bincenters,s1ab_z_means,s1ab_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a/b'); title('S1 a/b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1ab_P,[10:1:320]),'-r','LineWidth',2) + + +%Correcting z dependence to get XY dependence in same manner that Kr/CH3T +%map does + s1a_phe_both_z=s1a_phe_both.'.*polyval(s1a_P,z_center)./polyval(s1a_P,s1ab_z); + s1b_phe_both_z=s1b_phe_both.'.*polyval(s1b_P,z_center)./polyval(s1b_P,s1ab_z); + + + + +%% 3D Kr s1a/s1b map + +if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +s1ab_xyz_numbins=floor((length(s1ab_z)/200)^(1/3)); %number of bins in one direction +s1ab_xyz_zstep=det_edge/s1ab_xyz_numbins; +s1ab_xyz_xstep=50/s1ab_xyz_numbins; +s1ab_xyz_ystep=50/s1ab_xyz_numbins; +s1ab_xyz_xmax=25; +r_max=25; + +s1ab_xyz_zbins=10+s1ab_xyz_zstep/2:s1ab_xyz_zstep:10+s1ab_xyz_zstep/2+s1ab_xyz_zstep*s1ab_xyz_numbins; %20 us +s1ab_xyz_xbins=(-r_max+s1ab_xyz_xstep/2):s1ab_xyz_xstep:r_max; +s1ab_xyz_ybins=(-r_max+s1ab_xyz_ystep/2):s1ab_xyz_ystep:r_max; + +s1a_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +Kr_count_3D=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + kr_q=s2x(j-s1ab_xyz_xstep) & s2y(i-s1ab_xyz_ystep) & inrange(drift_time,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + + %Count the number of events per bin + Count_S1ab_3D(l,m,n)=length(s1a_phe_both(q)); + Kr_count_3D(l,m,n)=length(s1_phe_both(kr_q)); + + if (Count_S1ab_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_xyz_mean(l,m,n)=s1a_z_fit.b1; + s1a_xyz_mean_err(l,m,n)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]) ),[0:2:300]).','gauss1'); + s1b_xyz_mean(l,m,n)=s1b_z_fit.b1; + s1b_xyz_mean_err(l,m,n)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); + else %not enough stats to do the fit + s1a_xyz_mean(l,m,n)=0; + s1a_xyz_mean_err(l,m,n)=0; + s1b_xyz_mean(l,m,n)=0; + s1b_xyz_mean_err(l,m,n)=0; + end + + end + end +k +end + + s1ab_xyz_mean=s1a_xyz_mean./s1b_xyz_mean; + s1ab_xyz_mean_err=sqrt( (s1b_xyz_mean_err.*s1a_xyz_mean./(s1b_xyz_mean.^2)).^2 + (s1a_xyz_mean_err./s1b_xyz_mean).^2); + + + + %Save ER Band fits + save('Feb2015_S1aS1b','s1ab_xyz_mean','s1ab_xyz_xbins','s1ab_xyz_ybins','s1ab_xyz_zbins','s1ab_P','s1ab_z_means','s1ab_bincenters','Kr_count_3D','Kr_count_1D'); + +else + %Save ER Band fits + save('Feb2015_S1aS1b','s1ab_P','s1ab_z_means','s1ab_bincenters','Kr_count_1D'); + +end + + + diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/MakeS1aS1bMap_Nov2014.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/MakeS1aS1bMap_Nov2014.m new file mode 100644 index 0000000..fab616a --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/MakeS1aS1bMap_Nov2014.m @@ -0,0 +1,324 @@ +%% Make corrections with the chosen polynomial +path='C:\Users\Richard\Desktop\LUX Analysis\lux10_20141104T1748_cp18524'; + + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +delay_min=0; +file_id_cp='test'; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 32000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + + + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + + zcut_min = 10; %field changes at 4 uSec + zcut_max = 0.95*det_edge; + + + if Kr_events < 30000 %then create a 10x10 grid. Otherwise 25x25. Want about 30 evts per bin + + S1xybinsize = sqrt((50*50)/(Kr_events/150)); + S1_xbin_min = -25; + S1_xbin_max = 25; + S1_ybin_min = -25; + S1_ybin_max = 25; + SE_ybin_min = -25; + SE_ybin_max = 25; + + S2xybinsize = sqrt((50*50)/(Kr_events/150));%cm +% SExybinsize = 5; DEFINED LATER, based on number of SE events + S2_xbin_min = -25; + S2_xbin_max = 25; + S2_ybin_min = -25; + S2_ybin_max = 25; + SE_xbin_min = -25; + SE_xbin_max = 25; + + + end + + s1_xbins = (S1_xbin_max-S1_xbin_min)./S1xybinsize; + s1_ybins = (S1_ybin_max-S1_ybin_min)./S1xybinsize; + + s2_xbins = (S2_xbin_max-S2_xbin_min)./S2xybinsize; + s2_ybins = (S2_ybin_max-S2_ybin_min)./S2xybinsize; + + %% Kr S1a/S2b map + +%Set up cuts and variables + s1ab_cut=logical(sum(s1_single_cut(:,:),1)); + s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); + s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); + s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); + s1ab_x=d.x_cm(s2_single_cut); + s1ab_y=d.y_cm(s2_single_cut); + s1ab_z=d.z_drift_samples(s2_single_cut)/100; + s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); + s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<25; + + s1ab_x=s1ab_x(s1ab_timing_cut); + s1ab_y=s1ab_y(s1ab_timing_cut); + s1ab_z=s1ab_z(s1ab_timing_cut); + s1a_phe_both=s1a_phe_both(s1ab_timing_cut); + s1b_phe_both=s1b_phe_both(s1ab_timing_cut); + s1ab_radius=s1ab_radius(s1ab_timing_cut); + + %fidicual Z cut for s1ab_xy measurement + [s1ab_z_hist s1ab_z_hist_bins]=hist(s1ab_z(inrange(s1ab_z,[0,400])),[0:1:400]); + frac_hist=cumsum(s1ab_z_hist)./sum(s1ab_z_hist); + s1ab_z_cut_lower= min(s1ab_z_hist_bins(frac_hist>.10)); + s1ab_z_cut_upper= max(s1ab_z_hist_bins(frac_hist<.90)); + s1ab_z_cut=inrange(s1ab_z,[s1ab_z_cut_lower,s1ab_z_cut_upper]); + + %R cut for s1ab_Z measurement + [upperz_r_hist upperz_r_hist_bins]=hist(s1ab_radius(s1ab_z>s1ab_z_cut_upper & s1ab_radius<=26),[0:1:26]); + [lowerz_r_hist lowerz_r_hist_bins]=hist(s1ab_radius(s1ab_z0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:400]).','gauss1'); + s1b_fit=fit([0:2:300].',hist(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:300]).','gauss1'); + s1a_z_means(i)=s1a_fit.b1; + s1a_z_means_err(i)=s1a_fit.c1/sqrt(2)/sqrt(length(s1a_phe_both(s1ab_r_cut.' & s1a_phe_both>0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1b_z_means(i)=s1b_fit.b1; + s1b_z_means_err(i)=s1b_fit.c1/sqrt(2)/sqrt(length(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1ab_bincenters(i)=z_max-dT_step/2; + Kr_count_1D(i)=length(s1_phe_both(inrange(drift_time,[z_max-dT_step,z_max]) & kr_r_cut)); + + i=i+1; + end + +s1ab_z_means=s1a_z_means./s1b_z_means; +s1ab_z_means_err=sqrt( (s1b_z_means_err.*s1a_z_means./(s1b_z_means.^2)).^2 + (s1a_z_means_err./s1b_z_means).^2); + +%fit polynomial to s1az and s1bz, to remove z dependence later in xy fit +[s1a_P, s1a_S]=polyfit(s1ab_bincenters,s1a_z_means,3); +[s1b_P, s1b_S]=polyfit(s1ab_bincenters,s1b_z_means,3); +[s1ab_P, s1ab_S]=polyfit(s1ab_bincenters,s1ab_z_means,3); + +%S1a z dependence plot +s1az_plot=figure; +errorbar(s1ab_bincenters,s1a_z_means,s1a_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a Mean (phe)'); title('S1a Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1a_P,[10:1:320]),'-r','LineWidth',2) + + +%S1b z dependence plot +s1bz_plot=figure; +errorbar(s1ab_bincenters,s1b_z_means,s1b_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1b Mean (phe)'); title('S1b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1b_P,[10:1:320]),'-r','LineWidth',2) + + +%S1a/b z dependence plot +s1a_over_bz_plot=figure; +errorbar(s1ab_bincenters,s1ab_z_means,s1ab_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a/b'); title('S1 a/b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1ab_P,[10:1:320]),'-r','LineWidth',2) + + +%Correcting z dependence to get XY dependence in same manner that Kr/CH3T +%map does + s1a_phe_both_z=s1a_phe_both.'.*polyval(s1a_P,z_center)./polyval(s1a_P,s1ab_z); + s1b_phe_both_z=s1b_phe_both.'.*polyval(s1b_P,z_center)./polyval(s1b_P,s1ab_z); + + + + +%% 3D Kr s1a/s1b map + +if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +s1ab_xyz_numbins=floor((length(s1ab_z)/200)^(1/3)); %number of bins in one direction +s1ab_xyz_zstep=det_edge/s1ab_xyz_numbins; +s1ab_xyz_xstep=50/s1ab_xyz_numbins; +s1ab_xyz_ystep=50/s1ab_xyz_numbins; +s1ab_xyz_xmax=25; +r_max=25; + +s1ab_xyz_zbins=10+s1ab_xyz_zstep/2:s1ab_xyz_zstep:10+s1ab_xyz_zstep/2+s1ab_xyz_zstep*s1ab_xyz_numbins; %20 us +s1ab_xyz_xbins=(-r_max+s1ab_xyz_xstep/2):s1ab_xyz_xstep:r_max; +s1ab_xyz_ybins=(-r_max+s1ab_xyz_ystep/2):s1ab_xyz_ystep:r_max; + +s1a_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +Kr_count_3D=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + kr_q=s2x(j-s1ab_xyz_xstep) & s2y(i-s1ab_xyz_ystep) & inrange(drift_time,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + + %Count the number of events per bin + Count_S1ab_3D(l,m,n)=length(s1a_phe_both(q)); + Kr_count_3D(l,m,n)=length(s1_phe_both(kr_q)); + if (Count_S1ab_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_xyz_mean(l,m,n)=s1a_z_fit.b1; + s1a_xyz_mean_err(l,m,n)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]) ),[0:2:300]).','gauss1'); + s1b_xyz_mean(l,m,n)=s1b_z_fit.b1; + s1b_xyz_mean_err(l,m,n)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); + else %not enough stats to do the fit + s1a_xyz_mean(l,m,n)=0; + s1a_xyz_mean_err(l,m,n)=0; + s1b_xyz_mean(l,m,n)=0; + s1b_xyz_mean_err(l,m,n)=0; + end + + end + end +k +end + + s1ab_xyz_mean=s1a_xyz_mean./s1b_xyz_mean; + s1ab_xyz_mean_err=sqrt( (s1b_xyz_mean_err.*s1a_xyz_mean./(s1b_xyz_mean.^2)).^2 + (s1a_xyz_mean_err./s1b_xyz_mean).^2); + + + + %Save ER Band fits + save('Nov2014_S1aS1b','s1ab_xyz_mean','s1ab_xyz_xbins','s1ab_xyz_ybins','s1ab_xyz_zbins','s1ab_P','s1ab_z_means','s1ab_bincenters','Kr_count_3D','Kr_count_1D'); + +else + %Save ER Band fits + save('Nov2014_S1aS1b','s1ab_P','s1ab_z_means','s1ab_bincenters','Kr_count_1D'); + +end + + + diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/MakeS1aS1bMap_Sep2014.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/MakeS1aS1bMap_Sep2014.m new file mode 100644 index 0000000..e88d512 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/MakeS1aS1bMap_Sep2014.m @@ -0,0 +1,323 @@ +%% Make corrections with the chosen polynomial +path='C:\Users\Richard\Desktop\LUX Analysis\lux10_20140903T1918_cp17059'; + + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +delay_min=0; +file_id_cp='test'; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 32000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + + + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + + zcut_min = 10; %field changes at 4 uSec + zcut_max = 0.95*det_edge; + + + if Kr_events < 30000 %then create a 10x10 grid. Otherwise 25x25. Want about 30 evts per bin + + S1xybinsize = sqrt((50*50)/(Kr_events/150)); + S1_xbin_min = -25; + S1_xbin_max = 25; + S1_ybin_min = -25; + S1_ybin_max = 25; + SE_ybin_min = -25; + SE_ybin_max = 25; + + S2xybinsize = sqrt((50*50)/(Kr_events/150));%cm +% SExybinsize = 5; DEFINED LATER, based on number of SE events + S2_xbin_min = -25; + S2_xbin_max = 25; + S2_ybin_min = -25; + S2_ybin_max = 25; + SE_xbin_min = -25; + SE_xbin_max = 25; + + + end + + s1_xbins = (S1_xbin_max-S1_xbin_min)./S1xybinsize; + s1_ybins = (S1_ybin_max-S1_ybin_min)./S1xybinsize; + + s2_xbins = (S2_xbin_max-S2_xbin_min)./S2xybinsize; + s2_ybins = (S2_ybin_max-S2_ybin_min)./S2xybinsize; + + %% Kr S1a/S2b map + +%Set up cuts and variables + s1ab_cut=logical(sum(s1_single_cut(:,:),1)); + s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); + s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); + s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); + s1ab_x=d.x_cm(s2_single_cut); + s1ab_y=d.y_cm(s2_single_cut); + s1ab_z=d.z_drift_samples(s2_single_cut)/100; + s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); + s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<25; + + s1ab_x=s1ab_x(s1ab_timing_cut); + s1ab_y=s1ab_y(s1ab_timing_cut); + s1ab_z=s1ab_z(s1ab_timing_cut); + s1a_phe_both=s1a_phe_both(s1ab_timing_cut); + s1b_phe_both=s1b_phe_both(s1ab_timing_cut); + s1ab_radius=s1ab_radius(s1ab_timing_cut); + + %fidicual Z cut for s1ab_xy measurement + [s1ab_z_hist s1ab_z_hist_bins]=hist(s1ab_z(inrange(s1ab_z,[0,400])),[0:1:400]); + frac_hist=cumsum(s1ab_z_hist)./sum(s1ab_z_hist); + s1ab_z_cut_lower= min(s1ab_z_hist_bins(frac_hist>.10)); + s1ab_z_cut_upper= max(s1ab_z_hist_bins(frac_hist<.90)); + s1ab_z_cut=inrange(s1ab_z,[s1ab_z_cut_lower,s1ab_z_cut_upper]); + + %R cut for s1ab_Z measurement + [upperz_r_hist upperz_r_hist_bins]=hist(s1ab_radius(s1ab_z>s1ab_z_cut_upper & s1ab_radius<=26),[0:1:26]); + [lowerz_r_hist lowerz_r_hist_bins]=hist(s1ab_radius(s1ab_z0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:400]).','gauss1'); + s1b_fit=fit([0:2:300].',hist(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:300]).','gauss1'); + s1a_z_means(i)=s1a_fit.b1; + s1a_z_means_err(i)=s1a_fit.c1/sqrt(2)/sqrt(length(s1a_phe_both(s1ab_r_cut.' & s1a_phe_both>0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1b_z_means(i)=s1b_fit.b1; + s1b_z_means_err(i)=s1b_fit.c1/sqrt(2)/sqrt(length(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1ab_bincenters(i)=z_max-dT_step/2; + Kr_count_1D(i)=length(s1_phe_both(inrange(drift_time,[z_max-dT_step,z_max]) & kr_r_cut)); + i=i+1; + end + +s1ab_z_means=s1a_z_means./s1b_z_means; +s1ab_z_means_err=sqrt( (s1b_z_means_err.*s1a_z_means./(s1b_z_means.^2)).^2 + (s1a_z_means_err./s1b_z_means).^2); + +%fit polynomial to s1az and s1bz, to remove z dependence later in xy fit +[s1a_P, s1a_S]=polyfit(s1ab_bincenters,s1a_z_means,3); +[s1b_P, s1b_S]=polyfit(s1ab_bincenters,s1b_z_means,3); +[s1ab_P, s1ab_S]=polyfit(s1ab_bincenters,s1ab_z_means,3); + +%S1a z dependence plot +s1az_plot=figure; +errorbar(s1ab_bincenters,s1a_z_means,s1a_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a Mean (phe)'); title('S1a Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1a_P,[10:1:320]),'-r','LineWidth',2) + + +%S1b z dependence plot +s1bz_plot=figure; +errorbar(s1ab_bincenters,s1b_z_means,s1b_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1b Mean (phe)'); title('S1b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1b_P,[10:1:320]),'-r','LineWidth',2) + + +%S1a/b z dependence plot +s1a_over_bz_plot=figure; +errorbar(s1ab_bincenters,s1ab_z_means,s1ab_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a/b'); title('S1 a/b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1ab_P,[10:1:320]),'-r','LineWidth',2) + + +%Correcting z dependence to get XY dependence in same manner that Kr/CH3T +%map does + s1a_phe_both_z=s1a_phe_both.'.*polyval(s1a_P,z_center)./polyval(s1a_P,s1ab_z); + s1b_phe_both_z=s1b_phe_both.'.*polyval(s1b_P,z_center)./polyval(s1b_P,s1ab_z); + + + + +%% 3D Kr s1a/s1b map + +if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +s1ab_xyz_numbins=floor((length(s1ab_z)/200)^(1/3)); %number of bins in one direction +s1ab_xyz_zstep=det_edge/s1ab_xyz_numbins; +s1ab_xyz_xstep=50/s1ab_xyz_numbins; +s1ab_xyz_ystep=50/s1ab_xyz_numbins; +s1ab_xyz_xmax=25; +r_max=25; + +s1ab_xyz_zbins=10+s1ab_xyz_zstep/2:s1ab_xyz_zstep:10+s1ab_xyz_zstep/2+s1ab_xyz_zstep*s1ab_xyz_numbins; %20 us +s1ab_xyz_xbins=(-r_max+s1ab_xyz_xstep/2):s1ab_xyz_xstep:r_max; +s1ab_xyz_ybins=(-r_max+s1ab_xyz_ystep/2):s1ab_xyz_ystep:r_max; + +s1a_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +Kr_count_3D=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + + kr_q=s2x(j-s1ab_xyz_xstep) & s2y(i-s1ab_xyz_ystep) & inrange(drift_time,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + + %Count the number of events per bin + Count_S1ab_3D(l,m,n)=length(s1a_phe_both(q)); + Kr_count_3D(l,m,n)=length(s1_phe_both(kr_q)); + + if (Count_S1ab_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_xyz_mean(l,m,n)=s1a_z_fit.b1; + s1a_xyz_mean_err(l,m,n)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]) ),[0:2:300]).','gauss1'); + s1b_xyz_mean(l,m,n)=s1b_z_fit.b1; + s1b_xyz_mean_err(l,m,n)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); + else %not enough stats to do the fit + s1a_xyz_mean(l,m,n)=0; + s1a_xyz_mean_err(l,m,n)=0; + s1b_xyz_mean(l,m,n)=0; + s1b_xyz_mean_err(l,m,n)=0; + end + + end + end +k +end + + s1ab_xyz_mean=s1a_xyz_mean./s1b_xyz_mean; + s1ab_xyz_mean_err=sqrt( (s1b_xyz_mean_err.*s1a_xyz_mean./(s1b_xyz_mean.^2)).^2 + (s1a_xyz_mean_err./s1b_xyz_mean).^2); + + + %Save ER Band fits + save('Sep2014_S1aS1b','s1ab_xyz_mean','s1ab_xyz_xbins','s1ab_xyz_ybins','s1ab_xyz_zbins','s1ab_P','s1ab_z_means','s1ab_bincenters','Kr_count_3D','Kr_count_1D'); + +else + %Save ER Band fits + save('Sep2014_S1aS1b','s1ab_P','s1ab_z_means','s1ab_bincenters','Kr_count_1D'); + +end + + diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/MakeS1aS1bMap_Sep2015.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/MakeS1aS1bMap_Sep2015.m new file mode 100644 index 0000000..cdbf9f4 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/MakeS1aS1bMap_Sep2015.m @@ -0,0 +1,384 @@ +%% Make corrections with the chosen polynomial +path='C:\Users\Richard\Desktop\LUX Analysis\lux10_20150929T1905_cp18197'; + + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +delay_min=0; +file_id_cp='test'; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 32000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + + + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + + zcut_min = 10; %field changes at 4 uSec + zcut_max = 0.95*det_edge; + + + if Kr_events < 30000 %then create a 10x10 grid. Otherwise 25x25. Want about 30 evts per bin + + S1xybinsize = sqrt((50*50)/(Kr_events/150)); + S1_xbin_min = -25; + S1_xbin_max = 25; + S1_ybin_min = -25; + S1_ybin_max = 25; + SE_ybin_min = -25; + SE_ybin_max = 25; + + S2xybinsize = sqrt((50*50)/(Kr_events/150));%cm +% SExybinsize = 5; DEFINED LATER, based on number of SE events + S2_xbin_min = -25; + S2_xbin_max = 25; + S2_ybin_min = -25; + S2_ybin_max = 25; + SE_xbin_min = -25; + SE_xbin_max = 25; + + + end + + s1_xbins = (S1_xbin_max-S1_xbin_min)./S1xybinsize; + s1_ybins = (S1_ybin_max-S1_ybin_min)./S1xybinsize; + + s2_xbins = (S2_xbin_max-S2_xbin_min)./S2xybinsize; + s2_ybins = (S2_ybin_max-S2_ybin_min)./S2xybinsize; + + %% Kr S1a/S2b map + +%Set up cuts and variables + s1ab_cut=logical(sum(s1_single_cut(:,:),1)); + s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); + s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); + s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); + s1ab_x=d.x_cm(s2_single_cut); + s1ab_y=d.y_cm(s2_single_cut); + s1ab_z=d.z_drift_samples(s2_single_cut)/100; + s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); + s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<25; + + s1ab_x=s1ab_x(s1ab_timing_cut); + s1ab_y=s1ab_y(s1ab_timing_cut); + s1ab_z=s1ab_z(s1ab_timing_cut); + s1a_phe_both=s1a_phe_both(s1ab_timing_cut); + s1b_phe_both=s1b_phe_both(s1ab_timing_cut); + s1ab_radius=s1ab_radius(s1ab_timing_cut); + + %fidicual Z cut for s1ab_xy measurement + [s1ab_z_hist s1ab_z_hist_bins]=hist(s1ab_z(inrange(s1ab_z,[0,400])),[0:1:400]); + frac_hist=cumsum(s1ab_z_hist)./sum(s1ab_z_hist); + s1ab_z_cut_lower= min(s1ab_z_hist_bins(frac_hist>.10)); + s1ab_z_cut_upper= max(s1ab_z_hist_bins(frac_hist<.90)); + s1ab_z_cut=inrange(s1ab_z,[s1ab_z_cut_lower,s1ab_z_cut_upper]); + + %R cut for s1ab_Z measurement + [upperz_r_hist upperz_r_hist_bins]=hist(s1ab_radius(s1ab_z>s1ab_z_cut_upper & s1ab_radius<=26),[0:1:26]); + [lowerz_r_hist lowerz_r_hist_bins]=hist(s1ab_radius(s1ab_z0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:400]).','gauss1'); + s1b_fit=fit([0:2:300].',hist(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:300]).','gauss1'); + s1a_z_means(i)=s1a_fit.b1; + s1a_z_means_err(i)=s1a_fit.c1/sqrt(2)/sqrt(length(s1a_phe_both(s1ab_r_cut.' & s1a_phe_both>0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1b_z_means(i)=s1b_fit.b1; + s1b_z_means_err(i)=s1b_fit.c1/sqrt(2)/sqrt(length(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1ab_bincenters(i)=z_max-dT_step/2; + Kr_count_1D(i)=length(s1_phe_both(inrange(drift_time,[z_max-dT_step,z_max]) & kr_r_cut)); + + i=i+1; + end + +s1ab_z_means=s1a_z_means./s1b_z_means; +s1ab_z_means_err=sqrt( (s1b_z_means_err.*s1a_z_means./(s1b_z_means.^2)).^2 + (s1a_z_means_err./s1b_z_means).^2); + +%fit polynomial to s1az and s1bz, to remove z dependence later in xy fit +[s1a_P, s1a_S]=polyfit(s1ab_bincenters,s1a_z_means,3); +[s1b_P, s1b_S]=polyfit(s1ab_bincenters,s1b_z_means,3); +[s1ab_P, s1ab_S]=polyfit(s1ab_bincenters,s1ab_z_means,3); + +%S1a z dependence plot +s1az_plot=figure; +errorbar(s1ab_bincenters,s1a_z_means,s1a_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a Mean (phe)'); title('S1a Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1a_P,[10:1:320]),'-r','LineWidth',2) + + +%S1b z dependence plot +s1bz_plot=figure; +errorbar(s1ab_bincenters,s1b_z_means,s1b_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1b Mean (phe)'); title('S1b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1b_P,[10:1:320]),'-r','LineWidth',2) + + +%S1a/b z dependence plot +s1a_over_bz_plot=figure; +errorbar(s1ab_bincenters,s1ab_z_means,s1ab_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a/b'); title('S1 a/b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1ab_P,[10:1:320]),'-r','LineWidth',2) + + +%Correcting z dependence to get XY dependence in same manner that Kr/CH3T +%map does + s1a_phe_both_z=s1a_phe_both.'.*polyval(s1a_P,z_center)./polyval(s1a_P,s1ab_z); + s1b_phe_both_z=s1b_phe_both.'.*polyval(s1b_P,z_center)./polyval(s1b_P,s1ab_z); + + + %% S1a/b R^2 v Z map +s1ab_r2bin_min=0; +s1ab_r2bin_max=25*25; +s1ab_zbin_min=10; +s1ab_zbin_max=330; + +s1ab_r2z_binnum=(length(s1ab_z))/3000; %10k based on CH3T stats for ER band +s1ab_r2_binnum=floor(sqrt(s1ab_r2z_binnum)); +s1ab_z_binnum=floor(sqrt(s1ab_r2z_binnum)); + +s1ab_r2_binsize=(s1ab_r2bin_max-s1ab_r2bin_min)/s1ab_r2_binnum; +s1ab_z_binsize=(s1ab_zbin_max-s1ab_zbin_min)/s1ab_z_binnum; + +s1ab_r2bins=s1ab_r2bin_min+s1ab_r2_binsize/2:s1ab_r2_binsize:s1ab_r2bin_max; +s1ab_zbins=s1ab_zbin_min+s1ab_z_binsize/2:s1ab_z_binsize:s1ab_zbin_max; + +s1a_r2z_mean=zeros(length(s1ab_zbins),length(s1ab_r2bins)); +s1b_r2z_mean=zeros(length(s1ab_zbins),length(s1ab_r2bins)); +s1a_r2z_mean_err=zeros(length(s1ab_zbins),length(s1ab_r2bins)); +s1b_r2z_mean_err=zeros(length(s1ab_zbins),length(s1ab_r2bins)); +field_map_2014=zeros(length(s1ab_zbins),length(s1ab_r2bins)); +field_map_2015=zeros(length(s1ab_zbins),length(s1ab_r2bins)); +field_map_error=zeros(length(s1ab_zbins),length(s1ab_r2bins)); +Kr_count_2D=zeros(length(s1ab_zbins),length(s1ab_r2bins)); + +r2_counter=1; + for r2_bin_max=s1ab_r2bin_min+s1ab_r2_binsize:s1ab_r2_binsize:s1ab_r2bin_max; + z_counter=1; + for z_bin_max=s1ab_zbin_min+s1ab_z_binsize:s1ab_z_binsize:s1ab_zbin_max; + + bin_cut = s1a_phe_both>0 & s1b_phe_both>0 & inrange(s1ab_radius.^2,[r2_bin_max-s1ab_r2_binsize,r2_bin_max]).' & inrange(s1ab_z,[z_bin_max-s1ab_z_binsize,z_bin_max]).'; + kr_cut =inrange(s2radius.^2,[r2_bin_max-s1ab_r2_binsize,r2_bin_max]).' & inrange(drift_time,[z_bin_max-s1ab_z_binsize,z_bin_max]).'; + + Kr_count_2D(z_counter,r2_counter)=length(s1_phe_both(kr_cut)); + + if length(s1a_phe_both(bin_cut))>100; + clear s1a_confint s1b_confint + s1a_r2z_fit=fit([0:2:400].',hist(s1a_phe_both(bin_cut & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_r2z_mean(z_counter,r2_counter)=s1a_r2z_fit.b1; + s1a_confint=confint(s1a_r2z_fit,0.68); +% s1a_r2z_mean_err(z_counter,r2_counter)=s1a_r2z_fit.c1/sqrt(2)/length(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400]))); + s1a_r2z_mean_err(z_counter,r2_counter)=abs(s1a_confint(1,2)-s1a_r2z_fit.b1); + s1b_r2z_fit=fit([0:2:300].',hist(s1b_phe_both(bin_cut & inrange(s1b_phe_both,[0 300])),[0:2:300]).','gauss1'); + s1b_r2z_mean(z_counter,r2_counter)=s1b_r2z_fit.b1; + s1b_confint=confint(s1b_r2z_fit,0.68); +% s1b_xy_mean_err(y_count,x_count)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300]))); + s1b_r2z_mean_err(z_counter,r2_counter)=abs(s1b_confint(1,2)-s1b_r2z_fit.b1); + else + s1a_r2z_mean(z_counter,r2_counter)=0; + s1a_r2z_mean_err(z_counter,r2_counter)=0; + s1b_r2z_mean(z_counter,r2_counter)=0; + s1b_r2z_mean_err(z_counter,r2_counter)=0; + + end + z_counter=z_counter+1; + end + r2_counter=r2_counter+1; + end + s1ab_r2z_mean=s1a_r2z_mean./s1b_r2z_mean; + s1ab_r2z_mean_err=sqrt( (s1b_r2z_mean_err.*s1a_r2z_mean./(s1b_r2z_mean.^2)).^2 + (s1a_r2z_mean_err./s1b_r2z_mean).^2); + + + +%% 3D Kr s1a/s1b map + +if length(s1ab_z)>90000; %require 100,000 events to do 3D binning - CHANGED TO 90k TO FORCE THIS TO HAPPEN FOR TESTING +s1ab_xyz_numbins=floor((length(s1ab_z)/200)^(1/3)); %number of bins in one direction +s1ab_xyz_zstep=det_edge/s1ab_xyz_numbins; +s1ab_xyz_xstep=50/s1ab_xyz_numbins; +s1ab_xyz_ystep=50/s1ab_xyz_numbins; +s1ab_xyz_xmax=25; +r_max=25; + +s1ab_xyz_zbins=10+s1ab_xyz_zstep/2:s1ab_xyz_zstep:10+s1ab_xyz_zstep/2+s1ab_xyz_zstep*s1ab_xyz_numbins; %20 us +s1ab_xyz_xbins=(-r_max+s1ab_xyz_xstep/2):s1ab_xyz_xstep:r_max; +s1ab_xyz_ybins=(-r_max+s1ab_xyz_ystep/2):s1ab_xyz_ystep:r_max; + +s1a_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +Kr_count_3D=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + kr_q=s2x(j-s1ab_xyz_xstep) & s2y(i-s1ab_xyz_ystep) & inrange(drift_time,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + + %Count the number of events per bin + Count_S1ab_3D(l,m,n)=length(s1a_phe_both(q)); + Kr_count_3D(l,m,n)=length(s1_phe_both(kr_q)); + + if (Count_S1ab_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_xyz_mean(l,m,n)=s1a_z_fit.b1; + s1a_xyz_mean_err(l,m,n)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]) ),[0:2:300]).','gauss1'); + s1b_xyz_mean(l,m,n)=s1b_z_fit.b1; + s1b_xyz_mean_err(l,m,n)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); + else %not enough stats to do the fit + s1a_xyz_mean(l,m,n)=0; + s1a_xyz_mean_err(l,m,n)=0; + s1b_xyz_mean(l,m,n)=0; + s1b_xyz_mean_err(l,m,n)=0; + end + + end + end +k +end + + s1ab_xyz_mean=s1a_xyz_mean./s1b_xyz_mean; + s1ab_xyz_mean_err=sqrt( (s1b_xyz_mean_err.*s1a_xyz_mean./(s1b_xyz_mean.^2)).^2 + (s1a_xyz_mean_err./s1b_xyz_mean).^2); + + + %Save ER Band fits + save('Sep2015_S1aS1b','s1ab_r2z_mean','Kr_count_2D','s1ab_xyz_mean','s1ab_xyz_xbins','s1ab_xyz_ybins','s1ab_xyz_zbins','s1ab_P','s1ab_z_means','s1ab_bincenters','Kr_count_3D','Kr_count_1D'); + +else + %Save ER Band fits + save('Sep2015_S1aS1b','s1ab_r2z_mean','Kr_count_2D','s1ab_P','s1ab_z_means','s1ab_bincenters','Kr_count_1D'); + +end + + diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/Nov2014_ER_Band.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/Nov2014_ER_Band.m new file mode 100644 index 0000000..fbfd7b0 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/Nov2014_ER_Band.m @@ -0,0 +1,1296 @@ +%% Make corrections with the chosen polynomial +path='C:\Users\Richard\Desktop\LUX Analysis\lux10_20141104T1748_cp18524'; + + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +delay_min=0; +file_id_cp='test'; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 32000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + + + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + + zcut_min = 10; %field changes at 4 uSec + zcut_max = 0.95*det_edge; + + + if Kr_events < 30000 %then create a 10x10 grid. Otherwise 25x25. Want about 30 evts per bin + + S1xybinsize = sqrt((50*50)/(Kr_events/150)); + S1_xbin_min = -25; + S1_xbin_max = 25; + S1_ybin_min = -25; + S1_ybin_max = 25; + SE_ybin_min = -25; + SE_ybin_max = 25; + + S2xybinsize = sqrt((50*50)/(Kr_events/150));%cm +% SExybinsize = 5; DEFINED LATER, based on number of SE events + S2_xbin_min = -25; + S2_xbin_max = 25; + S2_ybin_min = -25; + S2_ybin_max = 25; + SE_xbin_min = -25; + SE_xbin_max = 25; + + + end + + s1_xbins = (S1_xbin_max-S1_xbin_min)./S1xybinsize; + s1_ybins = (S1_ybin_max-S1_ybin_min)./S1xybinsize; + + s2_xbins = (S2_xbin_max-S2_xbin_min)./S2xybinsize; + s2_ybins = (S2_ybin_max-S2_ybin_min)./S2xybinsize; + + %% Kr S1a/S2b map + +%Set up cuts and variables + s1ab_cut=logical(sum(s1_single_cut(:,:),1)); + s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); + s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); + s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); + s1ab_x=d.x_cm(s2_single_cut); + s1ab_y=d.y_cm(s2_single_cut); + s1ab_z=d.z_drift_samples(s2_single_cut)/100; + s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); + s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<25; + + s1ab_x=s1ab_x(s1ab_timing_cut); + s1ab_y=s1ab_y(s1ab_timing_cut); + s1ab_z=s1ab_z(s1ab_timing_cut); + s1a_phe_both=s1a_phe_both(s1ab_timing_cut); + s1b_phe_both=s1b_phe_both(s1ab_timing_cut); + s1ab_radius=s1ab_radius(s1ab_timing_cut); + + %fidicual Z cut for s1ab_xy measurement + [s1ab_z_hist s1ab_z_hist_bins]=hist(s1ab_z(inrange(s1ab_z,[0,400])),[0:1:400]); + frac_hist=cumsum(s1ab_z_hist)./sum(s1ab_z_hist); + s1ab_z_cut_lower= min(s1ab_z_hist_bins(frac_hist>.10)); + s1ab_z_cut_upper= max(s1ab_z_hist_bins(frac_hist<.90)); + s1ab_z_cut=inrange(s1ab_z,[s1ab_z_cut_lower,s1ab_z_cut_upper]); + + %R cut for s1ab_Z measurement + [upperz_r_hist upperz_r_hist_bins]=hist(s1ab_radius(s1ab_z>s1ab_z_cut_upper & s1ab_radius<=26),[0:1:26]); + [lowerz_r_hist lowerz_r_hist_bins]=hist(s1ab_radius(s1ab_z0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:400]).','gauss1'); + s1b_fit=fit([0:2:300].',hist(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:300]).','gauss1'); + s1a_z_means(i)=s1a_fit.b1; + s1a_z_means_err(i)=s1a_fit.c1/sqrt(2)/sqrt(length(s1a_phe_both(s1ab_r_cut.' & s1a_phe_both>0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1b_z_means(i)=s1b_fit.b1; + s1b_z_means_err(i)=s1b_fit.c1/sqrt(2)/sqrt(length(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1ab_bincenters(i)=z_max-dT_step/2; + i=i+1; + end + +s1ab_z_means=s1a_z_means./s1b_z_means; +s1ab_z_means_err=sqrt( (s1b_z_means_err.*s1a_z_means./(s1b_z_means.^2)).^2 + (s1a_z_means_err./s1b_z_means).^2); + +%fit polynomial to s1az and s1bz, to remove z dependence later in xy fit +[s1a_P, s1a_S]=polyfit(s1ab_bincenters,s1a_z_means,3); +[s1b_P, s1b_S]=polyfit(s1ab_bincenters,s1b_z_means,3); +[s1ab_P, s1ab_S]=polyfit(s1ab_bincenters,s1ab_z_means,3); + +%S1a z dependence plot +s1az_plot=figure; +errorbar(s1ab_bincenters,s1a_z_means,s1a_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a Mean (phe)'); title('S1a Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1a_P,[10:1:320]),'-r','LineWidth',2) + + +%S1b z dependence plot +s1bz_plot=figure; +errorbar(s1ab_bincenters,s1b_z_means,s1b_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1b Mean (phe)'); title('S1b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1b_P,[10:1:320]),'-r','LineWidth',2) + + +%S1a/b z dependence plot +s1a_over_bz_plot=figure; +errorbar(s1ab_bincenters,s1ab_z_means,s1ab_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a/b'); title('S1 a/b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1ab_P,[10:1:320]),'-r','LineWidth',2) + + +%Correcting z dependence to get XY dependence in same manner that Kr/CH3T +%map does + s1a_phe_both_z=s1a_phe_both.'.*polyval(s1a_P,z_center)./polyval(s1a_P,s1ab_z); + s1b_phe_both_z=s1b_phe_both.'.*polyval(s1b_P,z_center)./polyval(s1b_P,s1ab_z); + +%% S1a/b XY map (after z correction) +s1ab_xbin_min=-25; +s1ab_ybin_min=-25; +s1ab_xbin_max=25; +s1ab_ybin_max=25; +s1ab_xybinsize=sqrt((50*50)/(length(s1ab_z)/300)); +clear s1a_xy_mean s1a_xy_mean_err s1b_xy_mean s1b_xy_mean_err + +s1ab_xbins=s1ab_xbin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_xbin_max; +s1ab_ybins=s1ab_ybin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_ybin_max; + +s1a_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); +s1b_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); + + for x_bin=s1ab_xbin_min:s1ab_xybinsize:(s1ab_xbin_max-s1ab_xybinsize/2); + for y_bin=s1ab_ybin_min:s1ab_xybinsize:(s1ab_ybin_max-s1ab_xybinsize/2); + x_min = x_bin; x_max = x_bin+s1ab_xybinsize; + y_min = y_bin; y_max = y_bin+s1ab_xybinsize; + + x_count=int32(1+x_bin/s1ab_xybinsize+s1ab_xbin_max/s1ab_xybinsize); + y_count=int32(1+y_bin/s1ab_xybinsize+s1ab_ybin_max/s1ab_xybinsize); + + bin_cut = s1ab_z_cut.' & inrange(s1ab_z,[10 330]).' & s1a_phe_both>0 & s1b_phe_both>0 & inrange(s1ab_x,[x_min,x_max]).' & inrange(s1ab_y,[y_min,y_max]).'; + if length(s1a_phe_both_z(bin_cut))>100; + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400])),[0:2:400]).','gauss1'); + s1a_xy_mean(y_count,x_count)=s1a_z_fit.b1; + s1a_xy_mean_err(y_count,x_count)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300])),[0:2:300]).','gauss1'); + s1b_xy_mean(y_count,x_count)=s1b_z_fit.b1; + s1b_xy_mean_err(y_count,x_count)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300]))); + else + s1a_xy_mean(y_count,x_count)=0; + s1a_xy_mean_err(y_count,x_count)=0; + s1b_xy_mean(y_count,x_count)=0; + s1b_xy_mean_err(y_count,x_count)=0; + end + + end + end + s1ab_xy_mean=s1a_xy_mean./s1b_xy_mean; + s1ab_xy_mean_err=sqrt( (s1b_xy_mean_err.*s1a_xy_mean./(s1b_xy_mean.^2)).^2 + (s1a_xy_mean_err./s1b_xy_mean).^2); + + + %Plot s1a XY means + color_range_max=max(max(s1a_xy_mean)); + color_range_min=min(min(s1a_xy_mean(s1a_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1a_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1a_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %Plot s1a XY means + color_range_max=max(max(s1b_xy_mean)); + color_range_min=min(min(s1b_xy_mean(s1b_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1b_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1b_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1b Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1b Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %s1a/b XY Ratio + color_range_max=max(max(s1ab_xy_mean)); + color_range_min=min(min(s1ab_xy_mean(s1ab_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1ab_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a/b Ratio vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a/b Ratio','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + +%% 3D Kr s1a/s1b map + +if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +s1ab_xyz_numbins=floor((length(s1ab_z)/200)^(1/3)); %number of bins in one direction +s1ab_xyz_zstep=det_edge/s1ab_xyz_numbins; +s1ab_xyz_xstep=50/s1ab_xyz_numbins; +s1ab_xyz_ystep=50/s1ab_xyz_numbins; +s1ab_xyz_xmax=25; +r_max=25; + +s1ab_xyz_zbins=10+s1ab_xyz_zstep/2:s1ab_xyz_zstep:10+s1ab_xyz_zstep/2+s1ab_xyz_zstep*s1ab_xyz_numbins; %20 us +s1ab_xyz_xbins=(-r_max+s1ab_xyz_xstep/2):s1ab_xyz_xstep:r_max; +s1ab_xyz_ybins=(-r_max+s1ab_xyz_ystep/2):s1ab_xyz_ystep:r_max; + +s1a_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + + %Count the number of events per bin + Count_S1ab_3D(l,m,n)=length(s1a_phe_both(q)); + + if (Count_S1ab_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_xyz_mean(l,m,n)=s1a_z_fit.b1; + s1a_xyz_mean_err(l,m,n)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]) ),[0:2:300]).','gauss1'); + s1b_xyz_mean(l,m,n)=s1b_z_fit.b1; + s1b_xyz_mean_err(l,m,n)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); + else %not enough stats to do the fit + s1a_xyz_mean(l,m,n)=0; + s1a_xyz_mean_err(l,m,n)=0; + s1b_xyz_mean(l,m,n)=0; + s1b_xyz_mean_err(l,m,n)=0; + end + + end + end +k +end + + s1ab_xyz_mean=s1a_xyz_mean./s1b_xyz_mean; + s1ab_xyz_mean_err=sqrt( (s1b_xyz_mean_err.*s1a_xyz_mean./(s1b_xyz_mean.^2)).^2 + (s1a_xyz_mean_err./s1b_xyz_mean).^2); + +end + %% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % Removing field dependence from S1 and S2 + % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + %Hardcoded numbers from Energy Chi2 Fit + + +s1ab_s2_xyz_fit_map.p1=-0.0097; +s1ab_s2_xyz_fit_map.p2=-1.7; +s1ab_s2_xyz_fit_map.p3=5.7225; + + +s1ab_s1_xyz_fit_map.p1=0.0025; +s1ab_s1_xyz_fit_map.p2=0.4424; +s1ab_s1_xyz_fit_map.p3=-0.2289; + + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + figure + plot(drift_time,s1_3Dfieldremoval,'.k') + hold on; + plot(drift_time,s2_3Dfieldremoval,'.r') + + else +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval.*s2_xyfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval.*s2_xyfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval.*s1_xyfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval.*s1_xyfieldremoval); + + + figure + plot(drift_time,(s1_zfieldremoval.*s1_xyfieldremoval),'.k') + hold on; + plot(drift_time,(s2_zfieldremoval.*s2_xyfieldremoval),'.r') + + + end + + + %% Calculate Single Electron Size + + s4_class=(d.pulse_classification==4) ; %Use or class=2 to fix 33 phe cut off... have to edit se_wrt_first_s1_func tho + d = se_wrt_first_s1_func(d); + cut_se_s1_z = d.t_btw_se_first_s1 > 100*10; + + SE_good_cut =logical( cut_se_s1_z & s4_class & ( cumsum(s1_single_cut)-cumsum(s2_single_cut) ) ); % only events between good S1 and S2s + + SE_phe_both=d.pulse_area_phe(SE_good_cut); + SE_phe_bot=d.phe_bottom(SE_good_cut); + SE_phe_top=SE_phe_both-SE_phe_bot; + + SE_x=d.x_cm(SE_good_cut); + SE_y=d.y_cm(SE_good_cut); + SE_radius=(SE_x.^2+SE_y.^2).^(1/2); + + %Both PMT first fit + SE_fit=fit([0:1:60]',hist(SE_phe_both(SE_radius<17 & inrange(SE_phe_both,[0 60])),[0:1:60])','gauss1'); %normally is 17 + SE_Size=SE_fit.b1; + SE_sig=SE_fit.c1/sqrt(2); + SE_both_conf=confint(SE_fit,0.683); + SE_sig_mu_both=abs(SE_Size-SE_both_conf(1,2)); % one sigma + SE_sig_sig_both=abs(SE_sig-SE_both_conf(1,3)/sqrt(2)); % one sigma + + %Both PMT Second fit + n_sig_fit=2; + + fit_start=SE_Size-n_sig_fit*SE_sig; + fit_end=SE_Size+n_sig_fit*SE_sig; + xfit=fit_start:0.1:fit_end; + + SE_cut=SE_phe_both(SE_radius<17); + [xxo, yyo, xo, no] = step(SE_cut(inrange(SE_cut,[fit_start fit_end])),[0:0.2:60]); + s = fitoptions('Method','NonlinearLeastSquares','Robust','On','Algorithm','Trust-Region','Lower',[-5,0,0,0],'Upper',[5,Inf,Inf,Inf],... + 'Startpoint',[1,max(no),10,5]); + skewGauss1 = fittype('a1/c1*exp(-((x-b1)/c1)^2)*(1+erf(a*(x-b1)/c1))','options',s); + + [f_both,g_both] = fit(xo',no',skewGauss1); + delta_both = f_both.a/sqrt(1+f_both.a^2); + SE_mu_both = f_both.b1 + f_both.c1/sqrt(2)*delta_both*sqrt(2/pi); + SE_sig_both = sqrt((f_both.c1/sqrt(2))^2 * (1 - 2 * (delta_both)^2/pi)); + skew_both = (4-pi)/2 * (delta_both * sqrt(2/pi))^3 / (1 - 2 * delta_both^2/pi)^(3/2); + kurt_both = 2*(pi-3) * (delta_both * sqrt(2/pi))^3 / (1 - 2 * delta_both^2/pi)^2; + ci_both = confint(f_both,0.683); + y_fit_both = f_both(xfit); + + both_SE_fig=figure; + hold on; + step(SE_cut,[0:0.2:60],'k'); + h_fit=plot(xfit,y_fit_both,'-r','linewidth',2); + box on; + myfigview(18); + xlabel('Pulse Area Phe (Phe) '); ylabel('Count/Phe '); + legend([h_fit],strcat('\mu = ',num2str(SE_mu_both,'%2.2f'),'\newline \sigma= ',num2str(SE_sig_both,'%2.2f'),'\newline skew=', num2str(skew_both,'%2.2f') ), 'location','northeast'); + + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S1 Z-dependence (Both PMT arrays) +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + light_correction_fig = figure; + errorbar(mean_index,means,means_error,'.k'); + hold on + [yplot_s1_both] = polyval(P_s1_both,dT_fit); + [center_s1_both, center_s1_both_err] = polyval(P_s1_both,z_center, S); %160[us]*1.51[\mus/us] + plot(dT_fit,yplot_s1_both,'-r','LineWidth',1); + xlabel('Depth (\mus)', 'FontSize',16); ylabel('Mean (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S1 Mean vs. Z'), 'FontSize', 16,'Interpreter','none'); + line([0 det_edge],[center_s1_both center_s1_both],'linestyle','--'); + line([z_center; z_center;],[min(means) max(means)],'linestyle','--'); + legend('S1\_both Mean', strcat('y=', num2str(P_s1_both(1),'%10.2e'), '*Z^2 + ', num2str(P_s1_both(2),'%10.2e')... + , '*Z + ', num2str(P_s1_both(3),4)),strcat('Det center = ',num2str(center_s1_both,4), ' [Phe]'),'location','northwest') + + box on; + myfigview(16); + xlim([0 det_edge]); + ylim([0.8*min(means) 1.15*max(means)]); + + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + + + + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + + %%calculate S2/S1 also, just to double check the lifetime from S2 only + % hist_s2_both_s1(:,bin)= hist(s2_phe_both(time_cut)./s1_phe_both_z(time_cut),x3)'; + % temp_hist=hist_s2_both_s1(:,bin); + %Fit_s2_both_s1{bin}=fit(x3(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + % means_s2_s1(bin)=Fit_s2_both_s1{bin}.b1; + % means_error_s2_s1(bin) = Fit_s2_both_s1{bin}.c1/2/sqrt(sum(hist_s2_both_s1(:,bin))); % == sigma/sqrt(N); + % mean_index_s2_s1(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + + dT_range= inrange( mean_index,[5+bin_size,500] );%from 50 to 300us for the fit + + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + %%Tracker for pseudo-lifetime + s2_at_bottom_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_both=-320/log(s2_at_bottom_both/s2_at_top_both); + + dT_fit=0:1:det_edge; + + Fit_EL= fit(mean_index(dT_range),means(dT_range),'exp1'); + yfitEL = Fit_EL.a.*exp(Fit_EL.b.*dT_fit); + + e_lifetime_both=-1/Fit_EL.b; + s2_z0_both=Fit_EL.a; + + b=confint(Fit_EL, 0.683);%1 sigma matrix + sigma_e_lifetime_both=(1/b(1,2)-1/b(2,2))/2; + sigma_s2_z0_both=(b(2,1)-b(1,1))/2; + + lifetime_fig_both = figure; + errorbar(mean_index(2:end),means(2:end),means_error(2:end),'.k'); %first bin is anode, skip it + hold on + plot(dT_fit,yfitEL,'-r','LineWidth',1); + xlabel('Time (\mus)', 'FontSize',16); ylabel('Mean S2 (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S2_both Electron Lifetime'), 'FontSize', 16,'Interpreter','none'); + legend('S2\_both Mean', strcat( '\lambda= ', num2str(e_lifetime_both,4), ' \pm ', num2str(sigma_e_lifetime_both,2), ' \mus' )... + ,'location','northeast'); + myfigview(16); + xlim([0 det_edge]); + + + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_ybins),floor(s2_xbins)); +Sigma_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); +Count_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + +color_range_max=max(max(mean_S2_both_xy)); +color_range_min=min(min(mean_S2_both_xy(mean_S2_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + +s2_xy_both_fig = figure; +contourf(s2xbins,s2ybins,mean_S2_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. S2 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_ybins),floor(s1_xbins)); +Sigma_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); +Count_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +color_range_max=max(max(mean_S1_both_xy)); +color_range_min=min(min(mean_S1_both_xy(mean_S1_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + +s1_xy_both_fig = figure; +contourf(s1xbins,s1ybins,mean_S1_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp,'. S1 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%% Apply corrections to CH3T and calculate the ER band + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\Run04_CH3T\KrypCal2p18_IQs\MakePlots\CH3T_Nov2014_Kr2p18.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'spline',1); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'spline',1); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +%% Make ER Band + +s1_min=0; +s1_max=50; + +%% First make plot of CH3T selection + +figure +density(log10(s2_phe_both_xyz),log10(s1_phe_both_xyz),[2.5:0.01:5],[0:0.01:3]) +cc=colorbar; +ylabel(cc,'Count','FontSize',16); +caxis +hold on; +xlabel('log10(Corrected S2)'); ylabel ('log10(Corrected S1)'); myfigview(16) +x=[3.629:0.001:4.185]; +y=-0.7.*x+4.8; +plot(x,y,'-r','LineWidth',2); +x=[2.703:0.001:3.26]; +y=-0.7.*x+2.3; +plot(x,y,'-r','LineWidth',2); +x=[2.703:0.001:3.629]; +y=2.*x-5; +plot(x,y,'-r','LineWidth',2); +x=[3.26:0.001:4.185]; +y=2.*x-6.5; +plot(x,y,'-r','LineWidth',2); +title('Feb2015 CH3T'); + +%% First figure out where the outliers are in space + +pulse_area_cut= (log10(s1_phe_both_xyz)+0.7*log10(s2_phe_both_xyz)<4.8) & (log10(s1_phe_both_xyz)+0.7*log10(s2_phe_both_xyz)>2.3) & ... + (log10(s1_phe_both_xyz)-2*log10(s2_phe_both_xyz)<-5) & (log10(s1_phe_both_xyz)-2*log10(s2_phe_both_xyz)>-6.5); + + +max_r=21; +fiducial_cut=inrange(drift_time,[40 300]) & inrange(s2radius_del,[0,max_r]); + +tritium_cut= clean_cut & pulse_area_cut & fiducial_cut; + +%% Next, make plot of fiducial cut + +figure +density(s2radius_del.^2,drift_time,[0:10:1000],[0:2:450]) +cc=colorbar; +ylabel(cc,'Count','FontSize',16); +set(gca,'Ydir','reverse') +hold on; +line([441 441],[40 300],'Color','r','LineWidth',2) +line([0 441],[300 300],'Color','r','LineWidth',2) +line([0 441],[40 40],'Color','r','LineWidth',2) +xlabel('Delensed Radius^2 (cm^2)'); ylabel('Drift Time (uSec)'); myfigview(16); +title('Feb2015 CH3T') +% plot(s2radius_del(~fiducial_cut).^2,drift_time(~fiducial_cut),'.k','MarkerSize',2) + + + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:.05:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=tritium_cut & inrange(s1_phe_both_xyz,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); + %ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + b=confint(ER_mean_power_fit,.68); + sigma_a_ER_mean=(b(2,1)-b(1,1))/2; + sigma_b_ER_mean=(b(2,2)-b(1,2))/2; + + ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + b=confint(ER_lower_power_fit,.68); + sigma_a_ER_lower=(b(2,1)-b(1,1))/2; + sigma_b_ER_lower=(b(2,2)-b(1,2))/2; + + ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + b=confint(ER_upper_power_fit,.68); + sigma_a_ER_upper=(b(2,1)-b(1,1))/2; + sigma_b_ER_upper=(b(2,2)-b(1,2))/2; + + + %Make Plot + + no_fid_new=figure; + hold on + %plot(s1_phe_both_xyz(tritium_cut),log10(s2_phe_both_xyz(tritium_cut)./s1_phe_both_xyz(tritium_cut)),'ok','markersize',2) + density(s1_phe_both_xyz(tritium_cut),log10(s2_phe_both_xyz(tritium_cut)./s1_phe_both_xyz(tritium_cut)),[0:.5:100],[0:.05:4]); +% densityplot(s1_phe_both_xyz(tritium_cut),log10(s2_phe_both_xyz(tritium_cut)./s1_phe_both_xyz(tritium_cut)),'rectangle',[.5 .05],'lin'); + cc=colorbar; + ylabel(cc,'Count','FontSize',16); + colormap; + ylabel('Corrected log10(S2/S1)'); xlabel('S1 corrected (Pulse Area Phe)'); + title(sprintf('Run 04 CH3T, R<%d cm',max_r),'fontsize',16,'Interpreter','none'); + myfigview(16); + ylim([0 3.5]);xlim([0 s1_max]); +% plot(ER_bins,lower_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_lower_fit,'--k','markersize',14,'linewidth',2) +% plot(ER_bins,mean_ER_band,'ok','markersize',6,'linewidth',2)%plot mean of ER band + plot(ER_bins,ER_mean_fit,'-k','markersize',20,'linewidth',2) +% plot(ER_bins,upper_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_upper_fit,'--k','markersize',14,'linewidth',2) + + + bin_step=2; + + total_count=length(log10(s2_phe_both_xyz(tritium_cut))); + + + box; + text(10,2.8,strcat('Total Count= ',num2str(total_count)),'fontsize',16); + %text(5,.7,strcat('NEST\_SE_{bot} Fit=',num2str(ER_mean_NEST_fit.SE_ER_fit*73/64*27/max_r,3),'\pm ', num2str(sigma_SE_ER_fit*73/64*27/max_r,2),'[Phe]'),'fontsize',16,'color','m','interpreter','tex'); + %text(5,.8,'NEST Platinum V4-b', 'fontsize',16,'color','m','interpreter','tex' ); + text(5,.55,strcat('+',num2str(band_sigma),'\sigma = (',num2str(ER_upper_power_fit.a,3),'\pm', num2str(sigma_a_ER_upper,1) ,')\times S1_c ^{', num2str(ER_upper_power_fit.b,3),'\pm',num2str(sigma_b_ER_upper,1),'}'),'fontsize',16,'interpreter','tex'); + text(5,.3,strcat('Mean=(',num2str(ER_mean_power_fit.a,3),'\pm', num2str(sigma_a_ER_mean,1),')\times S1_c ^{', num2str(ER_mean_power_fit.b,3),'\pm', num2str(sigma_b_ER_mean,1),'}'),'fontsize',16,'interpreter','tex'); + text(5,.05,strcat('-',num2str(band_sigma),'\sigma = (',num2str(ER_lower_power_fit.a,3),'\pm', num2str(sigma_a_ER_lower,1),')\times S1_c ^{', num2str(ER_lower_power_fit.b,3),'\pm', num2str(sigma_b_ER_lower,1),'}'),'fontsize',16,'interpreter','tex'); + title('feb2015 CH3T') + + s1_phe_both_xyz_all=s1_phe_both_xyz(tritium_cut & inrange(drift_time,[0,110])); + log10_s2s1_xyz_all=log10(s2_phe_both_xyz(tritium_cut & inrange(drift_time,[0,110]))./s1_phe_both_xyz(tritium_cut & inrange(drift_time,[0,110]))); + ER_lower_fit_all=ER_lower_fit; + ER_upper_fit_all=ER_upper_fit; + ER_mean_fit_all=ER_mean_fit; + + + + %Save ER Band fits + save('Nov2014_ERFit','ER_bins','mean_ER_band','ER_sigma','ER_lower_power_fit','ER_upper_power_fit','ER_mean_power_fit','ER_lower_fit','ER_upper_fit','ER_mean_fit'); + \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/Sep2014_ER_Band.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/Sep2014_ER_Band.m new file mode 100644 index 0000000..5de78db --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/Sep2014_ER_Band.m @@ -0,0 +1,1290 @@ +%% Make corrections with the chosen polynomial +path='C:\Users\Richard\Desktop\LUX Analysis\lux10_20140903T1918_cp17059'; + + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +delay_min=0; +file_id_cp='test'; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 32000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + + + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + + zcut_min = 10; %field changes at 4 uSec + zcut_max = 0.95*det_edge; + + + if Kr_events < 30000 %then create a 10x10 grid. Otherwise 25x25. Want about 30 evts per bin + + S1xybinsize = sqrt((50*50)/(Kr_events/150)); + S1_xbin_min = -25; + S1_xbin_max = 25; + S1_ybin_min = -25; + S1_ybin_max = 25; + SE_ybin_min = -25; + SE_ybin_max = 25; + + S2xybinsize = sqrt((50*50)/(Kr_events/150));%cm +% SExybinsize = 5; DEFINED LATER, based on number of SE events + S2_xbin_min = -25; + S2_xbin_max = 25; + S2_ybin_min = -25; + S2_ybin_max = 25; + SE_xbin_min = -25; + SE_xbin_max = 25; + + + end + + s1_xbins = (S1_xbin_max-S1_xbin_min)./S1xybinsize; + s1_ybins = (S1_ybin_max-S1_ybin_min)./S1xybinsize; + + s2_xbins = (S2_xbin_max-S2_xbin_min)./S2xybinsize; + s2_ybins = (S2_ybin_max-S2_ybin_min)./S2xybinsize; + + %% Kr S1a/S2b map + +%Set up cuts and variables + s1ab_cut=logical(sum(s1_single_cut(:,:),1)); + s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); + s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); + s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); + s1ab_x=d.x_cm(s2_single_cut); + s1ab_y=d.y_cm(s2_single_cut); + s1ab_z=d.z_drift_samples(s2_single_cut)/100; + s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); + s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<25; + + s1ab_x=s1ab_x(s1ab_timing_cut); + s1ab_y=s1ab_y(s1ab_timing_cut); + s1ab_z=s1ab_z(s1ab_timing_cut); + s1a_phe_both=s1a_phe_both(s1ab_timing_cut); + s1b_phe_both=s1b_phe_both(s1ab_timing_cut); + s1ab_radius=s1ab_radius(s1ab_timing_cut); + + %fidicual Z cut for s1ab_xy measurement + [s1ab_z_hist s1ab_z_hist_bins]=hist(s1ab_z(inrange(s1ab_z,[0,400])),[0:1:400]); + frac_hist=cumsum(s1ab_z_hist)./sum(s1ab_z_hist); + s1ab_z_cut_lower= min(s1ab_z_hist_bins(frac_hist>.10)); + s1ab_z_cut_upper= max(s1ab_z_hist_bins(frac_hist<.90)); + s1ab_z_cut=inrange(s1ab_z,[s1ab_z_cut_lower,s1ab_z_cut_upper]); + + %R cut for s1ab_Z measurement + [upperz_r_hist upperz_r_hist_bins]=hist(s1ab_radius(s1ab_z>s1ab_z_cut_upper & s1ab_radius<=26),[0:1:26]); + [lowerz_r_hist lowerz_r_hist_bins]=hist(s1ab_radius(s1ab_z0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:400]).','gauss1'); + s1b_fit=fit([0:2:300].',hist(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:300]).','gauss1'); + s1a_z_means(i)=s1a_fit.b1; + s1a_z_means_err(i)=s1a_fit.c1/sqrt(2)/sqrt(length(s1a_phe_both(s1ab_r_cut.' & s1a_phe_both>0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1b_z_means(i)=s1b_fit.b1; + s1b_z_means_err(i)=s1b_fit.c1/sqrt(2)/sqrt(length(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1ab_bincenters(i)=z_max-dT_step/2; + i=i+1; + end + +s1ab_z_means=s1a_z_means./s1b_z_means; +s1ab_z_means_err=sqrt( (s1b_z_means_err.*s1a_z_means./(s1b_z_means.^2)).^2 + (s1a_z_means_err./s1b_z_means).^2); + +%fit polynomial to s1az and s1bz, to remove z dependence later in xy fit +[s1a_P, s1a_S]=polyfit(s1ab_bincenters,s1a_z_means,3); +[s1b_P, s1b_S]=polyfit(s1ab_bincenters,s1b_z_means,3); +[s1ab_P, s1ab_S]=polyfit(s1ab_bincenters,s1ab_z_means,3); + +%S1a z dependence plot +s1az_plot=figure; +errorbar(s1ab_bincenters,s1a_z_means,s1a_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a Mean (phe)'); title('S1a Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1a_P,[10:1:320]),'-r','LineWidth',2) + + +%S1b z dependence plot +s1bz_plot=figure; +errorbar(s1ab_bincenters,s1b_z_means,s1b_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1b Mean (phe)'); title('S1b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1b_P,[10:1:320]),'-r','LineWidth',2) + + +%S1a/b z dependence plot +s1a_over_bz_plot=figure; +errorbar(s1ab_bincenters,s1ab_z_means,s1ab_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a/b'); title('S1 a/b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1ab_P,[10:1:320]),'-r','LineWidth',2) + + +%Correcting z dependence to get XY dependence in same manner that Kr/CH3T +%map does + s1a_phe_both_z=s1a_phe_both.'.*polyval(s1a_P,z_center)./polyval(s1a_P,s1ab_z); + s1b_phe_both_z=s1b_phe_both.'.*polyval(s1b_P,z_center)./polyval(s1b_P,s1ab_z); + +%% S1a/b XY map (after z correction) +s1ab_xbin_min=-25; +s1ab_ybin_min=-25; +s1ab_xbin_max=25; +s1ab_ybin_max=25; +s1ab_xybinsize=sqrt((50*50)/(length(s1ab_z)/300)); +clear s1a_xy_mean s1a_xy_mean_err s1b_xy_mean s1b_xy_mean_err + +s1ab_xbins=s1ab_xbin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_xbin_max; +s1ab_ybins=s1ab_ybin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_ybin_max; + +s1a_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); +s1b_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); + + for x_bin=s1ab_xbin_min:s1ab_xybinsize:(s1ab_xbin_max-s1ab_xybinsize/2); + for y_bin=s1ab_ybin_min:s1ab_xybinsize:(s1ab_ybin_max-s1ab_xybinsize/2); + x_min = x_bin; x_max = x_bin+s1ab_xybinsize; + y_min = y_bin; y_max = y_bin+s1ab_xybinsize; + + x_count=int32(1+x_bin/s1ab_xybinsize+s1ab_xbin_max/s1ab_xybinsize); + y_count=int32(1+y_bin/s1ab_xybinsize+s1ab_ybin_max/s1ab_xybinsize); + + bin_cut = s1ab_z_cut.' & inrange(s1ab_z,[10 330]).' & s1a_phe_both>0 & s1b_phe_both>0 & inrange(s1ab_x,[x_min,x_max]).' & inrange(s1ab_y,[y_min,y_max]).'; + if length(s1a_phe_both_z(bin_cut))>100; + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400])),[0:2:400]).','gauss1'); + s1a_xy_mean(y_count,x_count)=s1a_z_fit.b1; + s1a_xy_mean_err(y_count,x_count)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300])),[0:2:300]).','gauss1'); + s1b_xy_mean(y_count,x_count)=s1b_z_fit.b1; + s1b_xy_mean_err(y_count,x_count)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300]))); + else + s1a_xy_mean(y_count,x_count)=0; + s1a_xy_mean_err(y_count,x_count)=0; + s1b_xy_mean(y_count,x_count)=0; + s1b_xy_mean_err(y_count,x_count)=0; + end + + end + end + s1ab_xy_mean=s1a_xy_mean./s1b_xy_mean; + s1ab_xy_mean_err=sqrt( (s1b_xy_mean_err.*s1a_xy_mean./(s1b_xy_mean.^2)).^2 + (s1a_xy_mean_err./s1b_xy_mean).^2); + + + %Plot s1a XY means + color_range_max=max(max(s1a_xy_mean)); + color_range_min=min(min(s1a_xy_mean(s1a_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1a_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1a_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %Plot s1a XY means + color_range_max=max(max(s1b_xy_mean)); + color_range_min=min(min(s1b_xy_mean(s1b_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1b_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1b_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1b Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1b Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %s1a/b XY Ratio + color_range_max=max(max(s1ab_xy_mean)); + color_range_min=min(min(s1ab_xy_mean(s1ab_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1ab_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a/b Ratio vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a/b Ratio','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + +%% 3D Kr s1a/s1b map + +if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +s1ab_xyz_numbins=floor((length(s1ab_z)/200)^(1/3)); %number of bins in one direction +s1ab_xyz_zstep=det_edge/s1ab_xyz_numbins; +s1ab_xyz_xstep=50/s1ab_xyz_numbins; +s1ab_xyz_ystep=50/s1ab_xyz_numbins; +s1ab_xyz_xmax=25; +r_max=25; + +s1ab_xyz_zbins=10+s1ab_xyz_zstep/2:s1ab_xyz_zstep:10+s1ab_xyz_zstep/2+s1ab_xyz_zstep*s1ab_xyz_numbins; %20 us +s1ab_xyz_xbins=(-r_max+s1ab_xyz_xstep/2):s1ab_xyz_xstep:r_max; +s1ab_xyz_ybins=(-r_max+s1ab_xyz_ystep/2):s1ab_xyz_ystep:r_max; + +s1a_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + + %Count the number of events per bin + Count_S1ab_3D(l,m,n)=length(s1a_phe_both(q)); + + if (Count_S1ab_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_xyz_mean(l,m,n)=s1a_z_fit.b1; + s1a_xyz_mean_err(l,m,n)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]) ),[0:2:300]).','gauss1'); + s1b_xyz_mean(l,m,n)=s1b_z_fit.b1; + s1b_xyz_mean_err(l,m,n)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); + else %not enough stats to do the fit + s1a_xyz_mean(l,m,n)=0; + s1a_xyz_mean_err(l,m,n)=0; + s1b_xyz_mean(l,m,n)=0; + s1b_xyz_mean_err(l,m,n)=0; + end + + end + end +k +end + + s1ab_xyz_mean=s1a_xyz_mean./s1b_xyz_mean; + s1ab_xyz_mean_err=sqrt( (s1b_xyz_mean_err.*s1a_xyz_mean./(s1b_xyz_mean.^2)).^2 + (s1a_xyz_mean_err./s1b_xyz_mean).^2); + +end + %% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % Removing field dependence from S1 and S2 + % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + %Hardcoded numbers from Energy Chi2 Fit + + +s1ab_s2_xyz_fit_map.p1=-0.0097; +s1ab_s2_xyz_fit_map.p2=-1.7; +s1ab_s2_xyz_fit_map.p3=5.7225; + + +s1ab_s1_xyz_fit_map.p1=0.0025; +s1ab_s1_xyz_fit_map.p2=0.4424; +s1ab_s1_xyz_fit_map.p3=-0.2289; + + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval.*s2_xyfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval.*s2_xyfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval.*s1_xyfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval.*s1_xyfieldremoval); + + + + end + + + figure + plot(drift_time,s1_3Dfieldremoval,'.k') + hold on; + plot(drift_time,s2_3Dfieldremoval,'.r') + %% Calculate Single Electron Size + + s4_class=(d.pulse_classification==4) ; %Use or class=2 to fix 33 phe cut off... have to edit se_wrt_first_s1_func tho + d = se_wrt_first_s1_func(d); + cut_se_s1_z = d.t_btw_se_first_s1 > 100*10; + + SE_good_cut =logical( cut_se_s1_z & s4_class & ( cumsum(s1_single_cut)-cumsum(s2_single_cut) ) ); % only events between good S1 and S2s + + SE_phe_both=d.pulse_area_phe(SE_good_cut); + SE_phe_bot=d.phe_bottom(SE_good_cut); + SE_phe_top=SE_phe_both-SE_phe_bot; + + SE_x=d.x_cm(SE_good_cut); + SE_y=d.y_cm(SE_good_cut); + SE_radius=(SE_x.^2+SE_y.^2).^(1/2); + + %Both PMT first fit + SE_fit=fit([0:1:60]',hist(SE_phe_both(SE_radius<17 & inrange(SE_phe_both,[0 60])),[0:1:60])','gauss1'); %normally is 17 + SE_Size=SE_fit.b1; + SE_sig=SE_fit.c1/sqrt(2); + SE_both_conf=confint(SE_fit,0.683); + SE_sig_mu_both=abs(SE_Size-SE_both_conf(1,2)); % one sigma + SE_sig_sig_both=abs(SE_sig-SE_both_conf(1,3)/sqrt(2)); % one sigma + + %Both PMT Second fit + n_sig_fit=2; + + fit_start=SE_Size-n_sig_fit*SE_sig; + fit_end=SE_Size+n_sig_fit*SE_sig; + xfit=fit_start:0.1:fit_end; + + SE_cut=SE_phe_both(SE_radius<17); + [xxo, yyo, xo, no] = step(SE_cut(inrange(SE_cut,[fit_start fit_end])),[0:0.2:60]); + s = fitoptions('Method','NonlinearLeastSquares','Robust','On','Algorithm','Trust-Region','Lower',[-5,0,0,0],'Upper',[5,Inf,Inf,Inf],... + 'Startpoint',[1,max(no),10,5]); + skewGauss1 = fittype('a1/c1*exp(-((x-b1)/c1)^2)*(1+erf(a*(x-b1)/c1))','options',s); + + [f_both,g_both] = fit(xo',no',skewGauss1); + delta_both = f_both.a/sqrt(1+f_both.a^2); + SE_mu_both = f_both.b1 + f_both.c1/sqrt(2)*delta_both*sqrt(2/pi); + SE_sig_both = sqrt((f_both.c1/sqrt(2))^2 * (1 - 2 * (delta_both)^2/pi)); + skew_both = (4-pi)/2 * (delta_both * sqrt(2/pi))^3 / (1 - 2 * delta_both^2/pi)^(3/2); + kurt_both = 2*(pi-3) * (delta_both * sqrt(2/pi))^3 / (1 - 2 * delta_both^2/pi)^2; + ci_both = confint(f_both,0.683); + y_fit_both = f_both(xfit); + + both_SE_fig=figure; + hold on; + step(SE_cut,[0:0.2:60],'k'); + h_fit=plot(xfit,y_fit_both,'-r','linewidth',2); + box on; + myfigview(18); + xlabel('Pulse Area Phe (Phe) '); ylabel('Count/Phe '); + legend([h_fit],strcat('\mu = ',num2str(SE_mu_both,'%2.2f'),'\newline \sigma= ',num2str(SE_sig_both,'%2.2f'),'\newline skew=', num2str(skew_both,'%2.2f') ), 'location','northeast'); + + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S1 Z-dependence (Both PMT arrays) +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + light_correction_fig = figure; + errorbar(mean_index,means,means_error,'.k'); + hold on + [yplot_s1_both] = polyval(P_s1_both,dT_fit); + [center_s1_both, center_s1_both_err] = polyval(P_s1_both,z_center, S); %160[us]*1.51[\mus/us] + plot(dT_fit,yplot_s1_both,'-r','LineWidth',1); + xlabel('Depth (\mus)', 'FontSize',16); ylabel('Mean (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S1 Mean vs. Z'), 'FontSize', 16,'Interpreter','none'); + line([0 det_edge],[center_s1_both center_s1_both],'linestyle','--'); + line([z_center; z_center;],[min(means) max(means)],'linestyle','--'); + legend('S1\_both Mean', strcat('y=', num2str(P_s1_both(1),'%10.2e'), '*Z^2 + ', num2str(P_s1_both(2),'%10.2e')... + , '*Z + ', num2str(P_s1_both(3),4)),strcat('Det center = ',num2str(center_s1_both,4), ' [Phe]'),'location','northwest') + + box on; + myfigview(16); + xlim([0 det_edge]); + ylim([0.8*min(means) 1.15*max(means)]); + + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + + + + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + + %%calculate S2/S1 also, just to double check the lifetime from S2 only + % hist_s2_both_s1(:,bin)= hist(s2_phe_both(time_cut)./s1_phe_both_z(time_cut),x3)'; + % temp_hist=hist_s2_both_s1(:,bin); + %Fit_s2_both_s1{bin}=fit(x3(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + % means_s2_s1(bin)=Fit_s2_both_s1{bin}.b1; + % means_error_s2_s1(bin) = Fit_s2_both_s1{bin}.c1/2/sqrt(sum(hist_s2_both_s1(:,bin))); % == sigma/sqrt(N); + % mean_index_s2_s1(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + + dT_range= inrange( mean_index,[5+bin_size,500] );%from 50 to 300us for the fit + + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + %%Tracker for pseudo-lifetime + s2_at_bottom_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_both=-320/log(s2_at_bottom_both/s2_at_top_both); + + dT_fit=0:1:det_edge; + + Fit_EL= fit(mean_index(dT_range),means(dT_range),'exp1'); + yfitEL = Fit_EL.a.*exp(Fit_EL.b.*dT_fit); + + e_lifetime_both=-1/Fit_EL.b; + s2_z0_both=Fit_EL.a; + + b=confint(Fit_EL, 0.683);%1 sigma matrix + sigma_e_lifetime_both=(1/b(1,2)-1/b(2,2))/2; + sigma_s2_z0_both=(b(2,1)-b(1,1))/2; + + lifetime_fig_both = figure; + errorbar(mean_index(2:end),means(2:end),means_error(2:end),'.k'); %first bin is anode, skip it + hold on + plot(dT_fit,yfitEL,'-r','LineWidth',1); + xlabel('Time (\mus)', 'FontSize',16); ylabel('Mean S2 (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S2_both Electron Lifetime'), 'FontSize', 16,'Interpreter','none'); + legend('S2\_both Mean', strcat( '\lambda= ', num2str(e_lifetime_both,4), ' \pm ', num2str(sigma_e_lifetime_both,2), ' \mus' )... + ,'location','northeast'); + myfigview(16); + xlim([0 det_edge]); + + + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_ybins),floor(s2_xbins)); +Sigma_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); +Count_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + +color_range_max=max(max(mean_S2_both_xy)); +color_range_min=min(min(mean_S2_both_xy(mean_S2_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + +s2_xy_both_fig = figure; +contourf(s2xbins,s2ybins,mean_S2_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. S2 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_ybins),floor(s1_xbins)); +Sigma_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); +Count_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +color_range_max=max(max(mean_S1_both_xy)); +color_range_min=min(min(mean_S1_both_xy(mean_S1_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + +s1_xy_both_fig = figure; +contourf(s1xbins,s1ybins,mean_S1_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp,'. S1 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%% Apply corrections to CH3T and calculate the ER band + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\Run04_CH3T\KrypCal2p18_IQs\MakePlots\CH3T_Sep2014_Kr2p18.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'spline',1); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'spline',1); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +%% Make ER Band + +s1_min=0; +s1_max=50; + +%% First make plot of CH3T selection + +figure +density(log10(s2_phe_both_xyz),log10(s1_phe_both_xyz),[2.5:0.01:5],[0:0.01:3]) +cc=colorbar; +ylabel(cc,'Count','FontSize',16); +caxis +hold on; +xlabel('log10(Corrected S2)'); ylabel ('log10(Corrected S1)'); myfigview(16) +x=[3.629:0.001:4.185]; +y=-0.7.*x+4.8; +plot(x,y,'-r','LineWidth',2); +x=[2.703:0.001:3.26]; +y=-0.7.*x+2.3; +plot(x,y,'-r','LineWidth',2); +x=[2.703:0.001:3.629]; +y=2.*x-5; +plot(x,y,'-r','LineWidth',2); +x=[3.26:0.001:4.185]; +y=2.*x-6.5; +plot(x,y,'-r','LineWidth',2); +title('Feb2015 CH3T'); + +%% First figure out where the outliers are in space + +pulse_area_cut= (log10(s1_phe_both_xyz)+0.7*log10(s2_phe_both_xyz)<4.8) & (log10(s1_phe_both_xyz)+0.7*log10(s2_phe_both_xyz)>2.3) & ... + (log10(s1_phe_both_xyz)-2*log10(s2_phe_both_xyz)<-5) & (log10(s1_phe_both_xyz)-2*log10(s2_phe_both_xyz)>-6.5); + + +max_r=21; +fiducial_cut=inrange(drift_time,[40 300]) & inrange(s2radius_del,[0,max_r]); + +tritium_cut= clean_cut & pulse_area_cut & fiducial_cut; + +%% Next, make plot of fiducial cut + +figure +density(s2radius_del.^2,drift_time,[0:10:1000],[0:2:450]) +cc=colorbar; +ylabel(cc,'Count','FontSize',16); +set(gca,'Ydir','reverse') +hold on; +line([441 441],[40 300],'Color','r','LineWidth',2) +line([0 441],[300 300],'Color','r','LineWidth',2) +line([0 441],[40 40],'Color','r','LineWidth',2) +xlabel('Delensed Radius^2 (cm^2)'); ylabel('Drift Time (uSec)'); myfigview(16); +title('Feb2015 CH3T') +% plot(s2radius_del(~fiducial_cut).^2,drift_time(~fiducial_cut),'.k','MarkerSize',2) + + + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:.05:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=tritium_cut & inrange(s1_phe_both_xyz,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); + %ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + b=confint(ER_mean_power_fit,.68); + sigma_a_ER_mean=(b(2,1)-b(1,1))/2; + sigma_b_ER_mean=(b(2,2)-b(1,2))/2; + + ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + b=confint(ER_lower_power_fit,.68); + sigma_a_ER_lower=(b(2,1)-b(1,1))/2; + sigma_b_ER_lower=(b(2,2)-b(1,2))/2; + + ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + b=confint(ER_upper_power_fit,.68); + sigma_a_ER_upper=(b(2,1)-b(1,1))/2; + sigma_b_ER_upper=(b(2,2)-b(1,2))/2; + + + %Make Plot + + no_fid_new=figure; + hold on + %plot(s1_phe_both_xyz(tritium_cut),log10(s2_phe_both_xyz(tritium_cut)./s1_phe_both_xyz(tritium_cut)),'ok','markersize',2) + density(s1_phe_both_xyz(tritium_cut),log10(s2_phe_both_xyz(tritium_cut)./s1_phe_both_xyz(tritium_cut)),[0:.5:100],[0:.05:4]); +% densityplot(s1_phe_both_xyz(tritium_cut),log10(s2_phe_both_xyz(tritium_cut)./s1_phe_both_xyz(tritium_cut)),'rectangle',[.5 .05],'lin'); + cc=colorbar; + ylabel(cc,'Count','FontSize',16); + colormap; + ylabel('Corrected log10(S2/S1)'); xlabel('S1 corrected (Pulse Area Phe)'); + title(sprintf('Run 04 CH3T, R<%d cm',max_r),'fontsize',16,'Interpreter','none'); + myfigview(16); + ylim([0 3.5]);xlim([0 s1_max]); +% plot(ER_bins,lower_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_lower_fit,'--k','markersize',14,'linewidth',2) +% plot(ER_bins,mean_ER_band,'ok','markersize',6,'linewidth',2)%plot mean of ER band + plot(ER_bins,ER_mean_fit,'-k','markersize',20,'linewidth',2) +% plot(ER_bins,upper_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_upper_fit,'--k','markersize',14,'linewidth',2) + + + bin_step=2; + + total_count=length(log10(s2_phe_both_xyz(tritium_cut))); + + + box; + text(10,2.8,strcat('Total Count= ',num2str(total_count)),'fontsize',16); + %text(5,.7,strcat('NEST\_SE_{bot} Fit=',num2str(ER_mean_NEST_fit.SE_ER_fit*73/64*27/max_r,3),'\pm ', num2str(sigma_SE_ER_fit*73/64*27/max_r,2),'[Phe]'),'fontsize',16,'color','m','interpreter','tex'); + %text(5,.8,'NEST Platinum V4-b', 'fontsize',16,'color','m','interpreter','tex' ); + text(5,.55,strcat('+',num2str(band_sigma),'\sigma = (',num2str(ER_upper_power_fit.a,3),'\pm', num2str(sigma_a_ER_upper,1) ,')\times S1_c ^{', num2str(ER_upper_power_fit.b,3),'\pm',num2str(sigma_b_ER_upper,1),'}'),'fontsize',16,'interpreter','tex'); + text(5,.3,strcat('Mean=(',num2str(ER_mean_power_fit.a,3),'\pm', num2str(sigma_a_ER_mean,1),')\times S1_c ^{', num2str(ER_mean_power_fit.b,3),'\pm', num2str(sigma_b_ER_mean,1),'}'),'fontsize',16,'interpreter','tex'); + text(5,.05,strcat('-',num2str(band_sigma),'\sigma = (',num2str(ER_lower_power_fit.a,3),'\pm', num2str(sigma_a_ER_lower,1),')\times S1_c ^{', num2str(ER_lower_power_fit.b,3),'\pm', num2str(sigma_b_ER_lower,1),'}'),'fontsize',16,'interpreter','tex'); + title('feb2015 CH3T') + + s1_phe_both_xyz_all=s1_phe_both_xyz(tritium_cut & inrange(drift_time,[0,110])); + log10_s2s1_xyz_all=log10(s2_phe_both_xyz(tritium_cut & inrange(drift_time,[0,110]))./s1_phe_both_xyz(tritium_cut & inrange(drift_time,[0,110]))); + ER_lower_fit_all=ER_lower_fit; + ER_upper_fit_all=ER_upper_fit; + ER_mean_fit_all=ER_mean_fit; + + + + %Save ER Band fits + save('Sep2014_ERFit','ER_bins','mean_ER_band','ER_sigma','ER_lower_power_fit','ER_upper_power_fit','ER_mean_power_fit','ER_lower_fit','ER_upper_fit','ER_mean_fit'); + \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/Sep2015_ERBand_RelatedToS1aS1b_RZ.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/Sep2015_ERBand_RelatedToS1aS1b_RZ.m new file mode 100644 index 0000000..0c1f3f7 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/Sep2015_ERBand_RelatedToS1aS1b_RZ.m @@ -0,0 +1,1483 @@ +%% Make corrections with the chosen polynomial +path='C:\Users\Richard\Desktop\LUX Analysis\lux10_20150929T1905_cp18197'; + + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +delay_min=0; +file_id_cp='test'; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 32000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + + + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + + zcut_min = 10; %field changes at 4 uSec + zcut_max = 0.95*det_edge; + + + if Kr_events < 30000 %then create a 10x10 grid. Otherwise 25x25. Want about 30 evts per bin + + S1xybinsize = sqrt((50*50)/(Kr_events/150)); + S1_xbin_min = -25; + S1_xbin_max = 25; + S1_ybin_min = -25; + S1_ybin_max = 25; + SE_ybin_min = -25; + SE_ybin_max = 25; + + S2xybinsize = sqrt((50*50)/(Kr_events/150));%cm +% SExybinsize = 5; DEFINED LATER, based on number of SE events + S2_xbin_min = -25; + S2_xbin_max = 25; + S2_ybin_min = -25; + S2_ybin_max = 25; + SE_xbin_min = -25; + SE_xbin_max = 25; + + + end + + s1_xbins = (S1_xbin_max-S1_xbin_min)./S1xybinsize; + s1_ybins = (S1_ybin_max-S1_ybin_min)./S1xybinsize; + + s2_xbins = (S2_xbin_max-S2_xbin_min)./S2xybinsize; + s2_ybins = (S2_ybin_max-S2_ybin_min)./S2xybinsize; + + %% Kr S1a/S2b map + +%Set up cuts and variables + s1ab_cut=logical(sum(s1_single_cut(:,:),1)); + s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); + s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); + s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); + s1ab_x=d.x_cm(s2_single_cut); + s1ab_y=d.y_cm(s2_single_cut); + s1ab_z=d.z_drift_samples(s2_single_cut)/100; + s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); + s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<25; + + s1ab_x=s1ab_x(s1ab_timing_cut); + s1ab_y=s1ab_y(s1ab_timing_cut); + s1ab_z=s1ab_z(s1ab_timing_cut); + s1a_phe_both=s1a_phe_both(s1ab_timing_cut); + s1b_phe_both=s1b_phe_both(s1ab_timing_cut); + s1ab_radius=s1ab_radius(s1ab_timing_cut); + + %fidicual Z cut for s1ab_xy measurement + [s1ab_z_hist s1ab_z_hist_bins]=hist(s1ab_z(inrange(s1ab_z,[0,400])),[0:1:400]); + frac_hist=cumsum(s1ab_z_hist)./sum(s1ab_z_hist); + s1ab_z_cut_lower= min(s1ab_z_hist_bins(frac_hist>.10)); + s1ab_z_cut_upper= max(s1ab_z_hist_bins(frac_hist<.90)); + s1ab_z_cut=inrange(s1ab_z,[s1ab_z_cut_lower,s1ab_z_cut_upper]); + + %R cut for s1ab_Z measurement + [upperz_r_hist upperz_r_hist_bins]=hist(s1ab_radius(s1ab_z>s1ab_z_cut_upper & s1ab_radius<=26),[0:1:26]); + [lowerz_r_hist lowerz_r_hist_bins]=hist(s1ab_radius(s1ab_z0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:400]).','gauss1'); + s1b_fit=fit([0:2:300].',hist(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:300]).','gauss1'); + s1a_z_means(i)=s1a_fit.b1; + s1a_z_means_err(i)=s1a_fit.c1/sqrt(2)/sqrt(length(s1a_phe_both(s1ab_r_cut.' & s1a_phe_both>0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1b_z_means(i)=s1b_fit.b1; + s1b_z_means_err(i)=s1b_fit.c1/sqrt(2)/sqrt(length(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1ab_bincenters(i)=z_max-dT_step/2; + i=i+1; + end + +s1ab_z_means=s1a_z_means./s1b_z_means; +s1ab_z_means_err=sqrt( (s1b_z_means_err.*s1a_z_means./(s1b_z_means.^2)).^2 + (s1a_z_means_err./s1b_z_means).^2); + +%fit polynomial to s1az and s1bz, to remove z dependence later in xy fit +[s1a_P, s1a_S]=polyfit(s1ab_bincenters,s1a_z_means,3); +[s1b_P, s1b_S]=polyfit(s1ab_bincenters,s1b_z_means,3); +[s1ab_P, s1ab_S]=polyfit(s1ab_bincenters,s1ab_z_means,3); + +%S1a z dependence plot +s1az_plot=figure; +errorbar(s1ab_bincenters,s1a_z_means,s1a_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a Mean (phe)'); title('S1a Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1a_P,[10:1:320]),'-r','LineWidth',2) + + +%S1b z dependence plot +s1bz_plot=figure; +errorbar(s1ab_bincenters,s1b_z_means,s1b_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1b Mean (phe)'); title('S1b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1b_P,[10:1:320]),'-r','LineWidth',2) + + +%S1a/b z dependence plot +s1a_over_bz_plot=figure; +errorbar(s1ab_bincenters,s1ab_z_means,s1ab_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a/b'); title('S1 a/b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1ab_P,[10:1:320]),'-r','LineWidth',2) + + +%Correcting z dependence to get XY dependence in same manner that Kr/CH3T +%map does + s1a_phe_both_z=s1a_phe_both.'.*polyval(s1a_P,z_center)./polyval(s1a_P,s1ab_z); + s1b_phe_both_z=s1b_phe_both.'.*polyval(s1b_P,z_center)./polyval(s1b_P,s1ab_z); + +%% S1a/b XY map (after z correction) +s1ab_xbin_min=-25; +s1ab_ybin_min=-25; +s1ab_xbin_max=25; +s1ab_ybin_max=25; +s1ab_xybinsize=sqrt((50*50)/(length(s1ab_z)/300)); +clear s1a_xy_mean s1a_xy_mean_err s1b_xy_mean s1b_xy_mean_err + +s1ab_xbins=s1ab_xbin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_xbin_max; +s1ab_ybins=s1ab_ybin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_ybin_max; + +s1a_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); +s1b_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); + + for x_bin=s1ab_xbin_min:s1ab_xybinsize:(s1ab_xbin_max-s1ab_xybinsize/2); + for y_bin=s1ab_ybin_min:s1ab_xybinsize:(s1ab_ybin_max-s1ab_xybinsize/2); + x_min = x_bin; x_max = x_bin+s1ab_xybinsize; + y_min = y_bin; y_max = y_bin+s1ab_xybinsize; + + x_count=int32(1+x_bin/s1ab_xybinsize+s1ab_xbin_max/s1ab_xybinsize); + y_count=int32(1+y_bin/s1ab_xybinsize+s1ab_ybin_max/s1ab_xybinsize); + + bin_cut = s1ab_z_cut.' & inrange(s1ab_z,[10 330]).' & s1a_phe_both>0 & s1b_phe_both>0 & inrange(s1ab_x,[x_min,x_max]).' & inrange(s1ab_y,[y_min,y_max]).'; + if length(s1a_phe_both_z(bin_cut))>100; + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400])),[0:2:400]).','gauss1'); + s1a_xy_mean(y_count,x_count)=s1a_z_fit.b1; + s1a_xy_mean_err(y_count,x_count)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300])),[0:2:300]).','gauss1'); + s1b_xy_mean(y_count,x_count)=s1b_z_fit.b1; + s1b_xy_mean_err(y_count,x_count)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300]))); + else + s1a_xy_mean(y_count,x_count)=0; + s1a_xy_mean_err(y_count,x_count)=0; + s1b_xy_mean(y_count,x_count)=0; + s1b_xy_mean_err(y_count,x_count)=0; + end + + end + end + s1ab_xy_mean=s1a_xy_mean./s1b_xy_mean; + s1ab_xy_mean_err=sqrt( (s1b_xy_mean_err.*s1a_xy_mean./(s1b_xy_mean.^2)).^2 + (s1a_xy_mean_err./s1b_xy_mean).^2); + + + %Plot s1a XY means + color_range_max=max(max(s1a_xy_mean)); + color_range_min=min(min(s1a_xy_mean(s1a_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1a_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1a_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %Plot s1a XY means + color_range_max=max(max(s1b_xy_mean)); + color_range_min=min(min(s1b_xy_mean(s1b_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1b_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1b_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1b Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1b Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %s1a/b XY Ratio + color_range_max=max(max(s1ab_xy_mean)); + color_range_min=min(min(s1ab_xy_mean(s1ab_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1ab_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a/b Ratio vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a/b Ratio','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + +%% 3D Kr s1a/s1b map + +if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +s1ab_xyz_numbins=floor((length(s1ab_z)/200)^(1/3)); %number of bins in one direction +s1ab_xyz_zstep=det_edge/s1ab_xyz_numbins; +s1ab_xyz_xstep=50/s1ab_xyz_numbins; +s1ab_xyz_ystep=50/s1ab_xyz_numbins; +s1ab_xyz_xmax=25; +r_max=25; + +s1ab_xyz_zbins=10+s1ab_xyz_zstep/2:s1ab_xyz_zstep:10+s1ab_xyz_zstep/2+s1ab_xyz_zstep*s1ab_xyz_numbins; %20 us +s1ab_xyz_xbins=(-r_max+s1ab_xyz_xstep/2):s1ab_xyz_xstep:r_max; +s1ab_xyz_ybins=(-r_max+s1ab_xyz_ystep/2):s1ab_xyz_ystep:r_max; + +s1a_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + + %Count the number of events per bin + Count_S1ab_3D(l,m,n)=length(s1a_phe_both(q)); + + if (Count_S1ab_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_xyz_mean(l,m,n)=s1a_z_fit.b1; + s1a_xyz_mean_err(l,m,n)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]) ),[0:2:300]).','gauss1'); + s1b_xyz_mean(l,m,n)=s1b_z_fit.b1; + s1b_xyz_mean_err(l,m,n)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); + else %not enough stats to do the fit + s1a_xyz_mean(l,m,n)=0; + s1a_xyz_mean_err(l,m,n)=0; + s1b_xyz_mean(l,m,n)=0; + s1b_xyz_mean_err(l,m,n)=0; + end + + end + end +k +end + + s1ab_xyz_mean=s1a_xyz_mean./s1b_xyz_mean; + s1ab_xyz_mean_err=sqrt( (s1b_xyz_mean_err.*s1a_xyz_mean./(s1b_xyz_mean.^2)).^2 + (s1a_xyz_mean_err./s1b_xyz_mean).^2); + +end + %% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % Removing field dependence from S1 and S2 + % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + %Hardcoded numbers from Energy Chi2 Fit + + +s1ab_s2_xyz_fit_map.p1=-0.0097; +s1ab_s2_xyz_fit_map.p2=-1.7; +s1ab_s2_xyz_fit_map.p3=5.7225; + + +s1ab_s1_xyz_fit_map.p1=0.0025; +s1ab_s1_xyz_fit_map.p2=0.4424; +s1ab_s1_xyz_fit_map.p3=-0.2289; + + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + figure + plot(drift_time,s1_3Dfieldremoval,'.k') + hold on; + plot(drift_time,s2_3Dfieldremoval,'.r') + + else +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval.*s2_xyfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval.*s2_xyfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval.*s1_xyfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval.*s1_xyfieldremoval); + + figure + plot(drift_time,(s1_zfieldremoval.*s1_xyfieldremoval),'.k') + hold on; + plot(drift_time,(s2_zfieldremoval.*s2_xyfieldremoval),'.r') + + + end + + + %% Calculate Single Electron Size + + s4_class=(d.pulse_classification==4) ; %Use or class=2 to fix 33 phe cut off... have to edit se_wrt_first_s1_func tho + d = se_wrt_first_s1_func(d); + cut_se_s1_z = d.t_btw_se_first_s1 > 100*10; + + SE_good_cut =logical( cut_se_s1_z & s4_class & ( cumsum(s1_single_cut)-cumsum(s2_single_cut) ) ); % only events between good S1 and S2s + + SE_phe_both=d.pulse_area_phe(SE_good_cut); + SE_phe_bot=d.phe_bottom(SE_good_cut); + SE_phe_top=SE_phe_both-SE_phe_bot; + + SE_x=d.x_cm(SE_good_cut); + SE_y=d.y_cm(SE_good_cut); + SE_radius=(SE_x.^2+SE_y.^2).^(1/2); + + %Both PMT first fit + SE_fit=fit([0:1:60]',hist(SE_phe_both(SE_radius<17 & inrange(SE_phe_both,[0 60])),[0:1:60])','gauss1'); %normally is 17 + SE_Size=SE_fit.b1; + SE_sig=SE_fit.c1/sqrt(2); + SE_both_conf=confint(SE_fit,0.683); + SE_sig_mu_both=abs(SE_Size-SE_both_conf(1,2)); % one sigma + SE_sig_sig_both=abs(SE_sig-SE_both_conf(1,3)/sqrt(2)); % one sigma + + %Both PMT Second fit + n_sig_fit=2; + + fit_start=SE_Size-n_sig_fit*SE_sig; + fit_end=SE_Size+n_sig_fit*SE_sig; + xfit=fit_start:0.1:fit_end; + + SE_cut=SE_phe_both(SE_radius<17); + [xxo, yyo, xo, no] = step(SE_cut(inrange(SE_cut,[fit_start fit_end])),[0:0.2:60]); + s = fitoptions('Method','NonlinearLeastSquares','Robust','On','Algorithm','Trust-Region','Lower',[-5,0,0,0],'Upper',[5,Inf,Inf,Inf],... + 'Startpoint',[1,max(no),10,5]); + skewGauss1 = fittype('a1/c1*exp(-((x-b1)/c1)^2)*(1+erf(a*(x-b1)/c1))','options',s); + + [f_both,g_both] = fit(xo',no',skewGauss1); + delta_both = f_both.a/sqrt(1+f_both.a^2); + SE_mu_both = f_both.b1 + f_both.c1/sqrt(2)*delta_both*sqrt(2/pi); + SE_sig_both = sqrt((f_both.c1/sqrt(2))^2 * (1 - 2 * (delta_both)^2/pi)); + skew_both = (4-pi)/2 * (delta_both * sqrt(2/pi))^3 / (1 - 2 * delta_both^2/pi)^(3/2); + kurt_both = 2*(pi-3) * (delta_both * sqrt(2/pi))^3 / (1 - 2 * delta_both^2/pi)^2; + ci_both = confint(f_both,0.683); + y_fit_both = f_both(xfit); + + both_SE_fig=figure; + hold on; + step(SE_cut,[0:0.2:60],'k'); + h_fit=plot(xfit,y_fit_both,'-r','linewidth',2); + box on; + myfigview(18); + xlabel('Pulse Area Phe (Phe) '); ylabel('Count/Phe '); + legend([h_fit],strcat('\mu = ',num2str(SE_mu_both,'%2.2f'),'\newline \sigma= ',num2str(SE_sig_both,'%2.2f'),'\newline skew=', num2str(skew_both,'%2.2f') ), 'location','northeast'); + + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S1 Z-dependence (Both PMT arrays) +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + light_correction_fig = figure; + errorbar(mean_index,means,means_error,'.k'); + hold on + [yplot_s1_both] = polyval(P_s1_both,dT_fit); + [center_s1_both, center_s1_both_err] = polyval(P_s1_both,z_center, S); %160[us]*1.51[\mus/us] + plot(dT_fit,yplot_s1_both,'-r','LineWidth',1); + xlabel('Depth (\mus)', 'FontSize',16); ylabel('Mean (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S1 Mean vs. Z'), 'FontSize', 16,'Interpreter','none'); + line([0 det_edge],[center_s1_both center_s1_both],'linestyle','--'); + line([z_center; z_center;],[min(means) max(means)],'linestyle','--'); + legend('S1\_both Mean', strcat('y=', num2str(P_s1_both(1),'%10.2e'), '*Z^2 + ', num2str(P_s1_both(2),'%10.2e')... + , '*Z + ', num2str(P_s1_both(3),4)),strcat('Det center = ',num2str(center_s1_both,4), ' [Phe]'),'location','northwest') + + box on; + myfigview(16); + xlim([0 det_edge]); + ylim([0.8*min(means) 1.15*max(means)]); + + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + + + + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + + %%calculate S2/S1 also, just to double check the lifetime from S2 only + % hist_s2_both_s1(:,bin)= hist(s2_phe_both(time_cut)./s1_phe_both_z(time_cut),x3)'; + % temp_hist=hist_s2_both_s1(:,bin); + %Fit_s2_both_s1{bin}=fit(x3(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + % means_s2_s1(bin)=Fit_s2_both_s1{bin}.b1; + % means_error_s2_s1(bin) = Fit_s2_both_s1{bin}.c1/2/sqrt(sum(hist_s2_both_s1(:,bin))); % == sigma/sqrt(N); + % mean_index_s2_s1(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + + dT_range= inrange( mean_index,[5+bin_size,500] );%from 50 to 300us for the fit + + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + %%Tracker for pseudo-lifetime + s2_at_bottom_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_both=-320/log(s2_at_bottom_both/s2_at_top_both); + + dT_fit=0:1:det_edge; + + Fit_EL= fit(mean_index(dT_range),means(dT_range),'exp1'); + yfitEL = Fit_EL.a.*exp(Fit_EL.b.*dT_fit); + + e_lifetime_both=-1/Fit_EL.b; + s2_z0_both=Fit_EL.a; + + b=confint(Fit_EL, 0.683);%1 sigma matrix + sigma_e_lifetime_both=(1/b(1,2)-1/b(2,2))/2; + sigma_s2_z0_both=(b(2,1)-b(1,1))/2; + + lifetime_fig_both = figure; + errorbar(mean_index(2:end),means(2:end),means_error(2:end),'.k'); %first bin is anode, skip it + hold on + plot(dT_fit,yfitEL,'-r','LineWidth',1); + xlabel('Time (\mus)', 'FontSize',16); ylabel('Mean S2 (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S2_both Electron Lifetime'), 'FontSize', 16,'Interpreter','none'); + legend('S2\_both Mean', strcat( '\lambda= ', num2str(e_lifetime_both,4), ' \pm ', num2str(sigma_e_lifetime_both,2), ' \mus' )... + ,'location','northeast'); + myfigview(16); + xlim([0 det_edge]); + + + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_ybins),floor(s2_xbins)); +Sigma_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); +Count_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + +color_range_max=max(max(mean_S2_both_xy)); +color_range_min=min(min(mean_S2_both_xy(mean_S2_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + +s2_xy_both_fig = figure; +contourf(s2xbins,s2ybins,mean_S2_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. S2 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_ybins),floor(s1_xbins)); +Sigma_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); +Count_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +color_range_max=max(max(mean_S1_both_xy)); +color_range_min=min(min(mean_S1_both_xy(mean_S1_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + +s1_xy_both_fig = figure; +contourf(s1xbins,s1ybins,mean_S1_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp,'. S1 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + + + +%% S1a/b R^2 v Z map +s1ab_r2bin_min=0; +s1ab_r2bin_max=25*25; +s1ab_zbin_min=10; +s1ab_zbin_max=330; + +s1ab_r2z_binnum=(length(s1ab_z))/3000; %10k based on CH3T stats for ER band +s1ab_r2_binnum=floor(sqrt(s1ab_r2z_binnum)); +s1ab_z_binnum=floor(sqrt(s1ab_r2z_binnum)); + +s1ab_r2_binsize=(s1ab_r2bin_max-s1ab_r2bin_min)/s1ab_r2_binnum; +s1ab_z_binsize=(s1ab_zbin_max-s1ab_zbin_min)/s1ab_z_binnum; + +s1ab_r2bins=s1ab_r2bin_min+s1ab_r2_binsize/2:s1ab_r2_binsize:s1ab_r2bin_max; +s1ab_zbins=s1ab_zbin_min+s1ab_z_binsize/2:s1ab_z_binsize:s1ab_zbin_max; + +s1a_r2z_mean=zeros(length(s1ab_zbins),length(s1ab_r2bins)); +s1b_r2z_mean=zeros(length(s1ab_zbins),length(s1ab_r2bins)); +s1a_r2z_mean_err=zeros(length(s1ab_zbins),length(s1ab_r2bins)); +s1b_r2z_mean_err=zeros(length(s1ab_zbins),length(s1ab_r2bins)); +field_map_2014=zeros(length(s1ab_zbins),length(s1ab_r2bins)); +field_map_2015=zeros(length(s1ab_zbins),length(s1ab_r2bins)); +field_map_error=zeros(length(s1ab_zbins),length(s1ab_r2bins)); + +r2_counter=1; + for r2_bin_max=s1ab_r2bin_min+s1ab_r2_binsize:s1ab_r2_binsize:s1ab_r2bin_max; + z_counter=1; + for z_bin_max=s1ab_zbin_min+s1ab_z_binsize:s1ab_z_binsize:s1ab_zbin_max; + + bin_cut = s1a_phe_both>0 & s1b_phe_both>0 & inrange(s1ab_radius.^2,[r2_bin_max-s1ab_r2_binsize,r2_bin_max]).' & inrange(s1ab_z,[z_bin_max-s1ab_z_binsize,z_bin_max]).'; + if length(s1a_phe_both(bin_cut))>100; + clear s1a_confint s1b_confint + s1a_r2z_fit=fit([0:2:400].',hist(s1a_phe_both(bin_cut & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_r2z_mean(z_counter,r2_counter)=s1a_r2z_fit.b1; + s1a_confint=confint(s1a_r2z_fit,0.68); +% s1a_r2z_mean_err(z_counter,r2_counter)=s1a_r2z_fit.c1/sqrt(2)/length(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400]))); + s1a_r2z_mean_err(z_counter,r2_counter)=abs(s1a_confint(1,2)-s1a_r2z_fit.b1); + s1b_r2z_fit=fit([0:2:300].',hist(s1b_phe_both(bin_cut & inrange(s1b_phe_both,[0 300])),[0:2:300]).','gauss1'); + s1b_r2z_mean(z_counter,r2_counter)=s1b_r2z_fit.b1; + s1b_confint=confint(s1b_r2z_fit,0.68); +% s1b_xy_mean_err(y_count,x_count)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300]))); + s1b_r2z_mean_err(z_counter,r2_counter)=abs(s1b_confint(1,2)-s1b_r2z_fit.b1); + else + s1a_r2z_mean(z_counter,r2_counter)=0; + s1a_r2z_mean_err(z_counter,r2_counter)=0; + s1b_r2z_mean(z_counter,r2_counter)=0; + s1b_r2z_mean_err(z_counter,r2_counter)=0; + + end + z_counter=z_counter+1; + end + r2_counter=r2_counter+1; + end + s1ab_r2z_mean=s1a_r2z_mean./s1b_r2z_mean; + s1ab_r2z_mean_err=sqrt( (s1b_r2z_mean_err.*s1a_r2z_mean./(s1b_r2z_mean.^2)).^2 + (s1a_r2z_mean_err./s1b_r2z_mean).^2); + + %Plot s1a R2Z means + color_range_max=max(max(s1a_r2z_mean)); + color_range_min=min(min(s1a_r2z_mean(s1a_r2z_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + + s1a_r2z_fig = figure; + contourf(s1ab_r2bins,s1ab_zbins,s1a_r2z_mean,vc,'LineColor','none'); + xlabel('R^2 (cm^2)','fontsize', 18); + ylabel('Z (uSec)','fontsize', 18); + title(strcat(file_id_cp, '. S1a Mean vs. R^2 v Z.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + axis([0 625 0 330]) + myfigview(16); + set(gca,'Ydir','reverse') + + + %Plot s1a R2Z means + color_range_max=max(max(s1b_r2z_mean)); + color_range_min=min(min(s1b_r2z_mean(s1b_r2z_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1b_r2z_fig = figure; + contourf(s1ab_r2bins,s1ab_zbins,s1b_r2z_mean,vc,'LineColor','none'); + xlabel('R^2 (cm^2)','fontsize', 18); + ylabel('Z (uSec)','fontsize', 18); + title(strcat(file_id_cp, '. S1b Mean vs. R^2 v Z.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1b Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + axis([0 625 0 330]) + myfigview(16); + set(gca,'Ydir','reverse') + + + %s1a/b R2Z Ratio + color_range_max=max(max(s1ab_r2z_mean)); + color_range_min=min(min(s1ab_r2z_mean(s1ab_r2z_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1ab_r2z_fig = figure; + contourf(s1ab_r2bins,s1ab_zbins,s1ab_r2z_mean,vc,'LineColor','none'); + xlabel('R^2 (cm^2)','fontsize', 18); + ylabel('Z (uSec)','fontsize', 18); + title(strcat(file_id_cp, '. S1a/S1b Mean vs. R^2 v Z.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a/b Ratio','FontSize',16) + set(g,'FontSize',18) + hold on + axis([0 625 0 330]) + myfigview(16); + set(gca,'Ydir','reverse') + + +%% Apply corrections to CH3T and calculate the ER band + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\Run04_CH3T\KrypCal2p18_IQs\MakePlots\CH3T_Sep2015_Kr2p18.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'spline',1); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'spline',1); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + + + +s1_min=0; +s1_max=50; + +%% First figure out where the outliers are in space + +pulse_area_cut= (log10(s1_phe_both_xyz)+0.7*log10(s2_phe_both_xyz)<4.8) & (log10(s1_phe_both_xyz)+0.7*log10(s2_phe_both_xyz)>2.3) & ... + (log10(s1_phe_both_xyz)-2*log10(s2_phe_both_xyz)<-5) & (log10(s1_phe_both_xyz)-2*log10(s2_phe_both_xyz)>-6.5); + + +max_r=25; + +%% REDO THIS WITH SAME BINNING AS FIELD MAP + +voxel_counter=1; + + ER_lower_power_fit_vox={}; + ER_upper_power_fit_vox={}; + ER_mean_power_fit_vox={}; + + + + + for r2_max=s1ab_r2bin_min+s1ab_r2_binsize:s1ab_r2_binsize:s1ab_r2bin_max; + for z_max=s1ab_zbin_min+s1ab_z_binsize:s1ab_z_binsize:s1ab_zbin_max; + %note: voxels index in z, then y, then x + +fiducial_cut=inrange(s2radius.^2,[r2_max-s1ab_r2_binsize,r2_max]) & inrange(drift_time,[z_max-s1ab_z_binsize z_max]); +tritium_cut= clean_cut & pulse_area_cut & fiducial_cut; + +if length(s1_phe_both_xyz(tritium_cut))>5000 + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:.05:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=tritium_cut & inrange(s1_phe_both_xyz,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); + %ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + b=confint(ER_mean_power_fit,.68); + sigma_a_ER_mean=(b(2,1)-b(1,1))/2; + sigma_b_ER_mean=(b(2,2)-b(1,2))/2; + + ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + b=confint(ER_lower_power_fit,.68); + sigma_a_ER_lower=(b(2,1)-b(1,1))/2; + sigma_b_ER_lower=(b(2,2)-b(1,2))/2; + + ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + b=confint(ER_upper_power_fit,.68); + sigma_a_ER_upper=(b(2,1)-b(1,1))/2; + sigma_b_ER_upper=(b(2,2)-b(1,2))/2; + + + ER_lower_power_fit_vox{voxel_counter}=ER_lower_power_fit; + ER_upper_power_fit_vox{voxel_counter}=ER_upper_power_fit; + ER_mean_power_fit_vox{voxel_counter}=ER_mean_power_fit; + + ER_lower_power_fit_vox_aerr{voxel_counter}=sigma_a_ER_lower; + ER_upper_power_fit_vox_aerr{voxel_counter}=sigma_a_ER_upper; + ER_mean_power_fit_vox_aerr{voxel_counter}=sigma_a_ER_mean; + + ER_lower_power_fit_vox_berr{voxel_counter}=sigma_b_ER_lower; + ER_upper_power_fit_vox_berr{voxel_counter}=sigma_b_ER_upper; + ER_mean_power_fit_vox_berr{voxel_counter}=sigma_b_ER_mean; + + r2_centers(voxel_counter)=r2_max-s1ab_r2_binsize/2; + z_centers(voxel_counter)=z_max-s1ab_z_binsize/2; + skipflag(voxel_counter)=0; + +else + ER_lower_power_fit_vox{voxel_counter}=0; + ER_upper_power_fit_vox{voxel_counter}=0; + ER_mean_power_fit_vox{voxel_counter}=0; + + ER_lower_power_fit_vox_aerr{voxel_counter}=0; + ER_upper_power_fit_vox_aerr{voxel_counter}=0; + ER_mean_power_fit_vox_aerr{voxel_counter}=0; + + ER_lower_power_fit_vox_berr{voxel_counter}=0; + ER_upper_power_fit_vox_berr{voxel_counter}=0; + ER_mean_power_fit_vox_berr{voxel_counter}=0; + + r2_centers(voxel_counter)=0; + z_centers(voxel_counter)=0; + + skipflag(voxel_counter)=1; +end + voxel_counter=voxel_counter+1; + + + end + end + + + +%% Now relate the field to the ER band parameters + +%Relating parameter a to S1aS1b +temp_mean_s1as1b_map=s1ab_r2z_mean(:); +temp_mean_s1as1b_map_totalerr=s1ab_r2z_mean_err(:); + +for i=1:length(ER_mean_power_fit_vox) + + if skipflag(i)==0 +temp_ER_mean_a(i)=ER_mean_power_fit_vox{i}.a; +temp_ER_mean_a_err(i)=ER_mean_power_fit_vox_aerr{i}; + +temp_ER_mean_b(i)=ER_mean_power_fit_vox{i}.b; +temp_ER_mean_b_err(i)=ER_mean_power_fit_vox_berr{i}; + +temp_ER_lower_a(i)=ER_lower_power_fit_vox{i}.a; +temp_ER_lower_a_err(i)=ER_lower_power_fit_vox_aerr{i}; + +temp_ER_lower_b(i)=ER_lower_power_fit_vox{i}.b; +temp_ER_lower_b_err(i)=ER_lower_power_fit_vox_berr{i}; + +temp_ER_upper_a(i)=ER_upper_power_fit_vox{i}.a; +temp_ER_upper_a_err(i)=ER_upper_power_fit_vox_aerr{i}; + +temp_ER_upper_b(i)=ER_upper_power_fit_vox{i}.b; +temp_ER_upper_b_err(i)=ER_upper_power_fit_vox_berr{i}; + else +temp_ER_mean_a(i)=0; +temp_ER_mean_a_err(i)=0; + +temp_ER_mean_b(i)=0; +temp_ER_mean_b_err(i)=0; + +temp_ER_lower_a(i)=0; +temp_ER_lower_a_err(i)=0; + +temp_ER_lower_b(i)=0; +temp_ER_lower_b_err(i)=0; + +temp_ER_upper_a(i)=0; +temp_ER_upper_a_err(i)=0; + +temp_ER_upper_b(i)=0; +temp_ER_upper_b_err(i)=0; + end +end + +nancut=~isnan(temp_mean_s1as1b_map).' & ~isnan(temp_ER_mean_a) & temp_ER_mean_a~=0; + +[S1aS1b_to_mean_a_fit S1aS1b_to_mean_a_fit_err]=polyfit(temp_mean_s1as1b_map(nancut),temp_ER_mean_a(nancut).',2); +[S1aS1b_to_mean_b_fit S1aS1b_to_mean_b_fit_err]=polyfit(temp_mean_s1as1b_map(nancut),temp_ER_mean_b(nancut).',2); +[S1aS1b_to_lower_a_fit S1aS1b_to_lower_a_fit_err]=polyfit(temp_mean_s1as1b_map(nancut),temp_ER_lower_a(nancut).',2); +[S1aS1b_to_lower_b_fit S1aS1b_to_lower_b_fit_err]=polyfit(temp_mean_s1as1b_map(nancut),temp_ER_lower_b(nancut).',2); +[S1aS1b_to_upper_a_fit S1aS1b_to_upper_a_fit_err]=polyfit(temp_mean_s1as1b_map(nancut),temp_ER_upper_a(nancut).',2); +[S1aS1b_to_upper_b_fit S1aS1b_to_upper_b_fit_err]=polyfit(temp_mean_s1as1b_map(nancut),temp_ER_upper_b(nancut).',2); + +%% Plot coefficient relationship +figure +hold on; +xlabel('S1a/S1b'); ylabel('Power Law Coefficient'); +myfigview(16); + +[tempy tempyerr]=polyval(S1aS1b_to_mean_a_fit,[0:0.005:4],S1aS1b_to_mean_a_fit_err); +count=1; +clear tempfill +for i=length(tempy):-1:1; + tempfill(count)=tempy(i)-tempyerr(i); + count=count+1; +end +fill([0:.005:4,4:-0.005:0],[tempy+tempyerr,tempfill],[0.6 0.6 1],'EdgeColor',[0.6 0.6 1]) +plot([0:0.005:4],tempy,'-b','LineWidth',2); +xlim([2.3 3]) +rkploterr(temp_mean_s1as1b_map(nancut),temp_ER_mean_a(nancut),temp_mean_s1as1b_map_totalerr(nancut),temp_ER_mean_a_err(nancut),[0 0 0],[],[],2) + +%% Plot exponent relationship +figure +hold on; +xlabel('S1a/S1b'); ylabel('Power Law Exponent'); +myfigview(16); + +clear tempy tempyerr tempfill +[tempy tempyerr]=polyval(S1aS1b_to_mean_b_fit,[0:0.005:4],S1aS1b_to_mean_b_fit_err); +count=1; +for i=length(tempy):-1:1; + tempfill(count)=tempy(i)-tempyerr(i); + count=count+1; +end +fill([0:.005:4,4:-0.005:0],[tempy+tempyerr,tempfill],[0.6 0.6 1],'EdgeColor',[0.6 0.6 1]) +plot([0:0.005:4],tempy,'-b','LineWidth',2); +xlim([2.3 3]) +rkploterr(temp_mean_s1as1b_map(nancut),temp_ER_mean_b(nancut),temp_mean_s1as1b_map_totalerr(nancut),temp_ER_mean_b_err(nancut),[0 0 0],[],[],2) + + +save('S1aS1b_To_ERBand_RZVoxels','S1aS1b_to_mean_a_fit','S1aS1b_to_mean_b_fit','S1aS1b_to_lower_a_fit','S1aS1b_to_lower_b_fit','S1aS1b_to_upper_a_fit','S1aS1b_to_upper_b_fit',... + 'S1aS1b_to_mean_a_fit_err','S1aS1b_to_mean_b_fit_err','S1aS1b_to_lower_a_fit_err','S1aS1b_to_lower_b_fit_err','S1aS1b_to_upper_a_fit_err','S1aS1b_to_upper_b_fit_err'); \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/Sep2015_ERBand_RelatedToS1aS1b_Z.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/Sep2015_ERBand_RelatedToS1aS1b_Z.m new file mode 100644 index 0000000..c7aa516 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/Sep2015_ERBand_RelatedToS1aS1b_Z.m @@ -0,0 +1,1487 @@ +%% Make corrections with the chosen polynomial +path='C:\Users\Richard\Desktop\LUX Analysis\lux10_20150929T1905_cp18197'; + + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +delay_min=0; +file_id_cp='test'; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 32000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + + + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + + zcut_min = 10; %field changes at 4 uSec + zcut_max = 0.95*det_edge; + + + if Kr_events < 30000 %then create a 10x10 grid. Otherwise 25x25. Want about 30 evts per bin + + S1xybinsize = sqrt((50*50)/(Kr_events/150)); + S1_xbin_min = -25; + S1_xbin_max = 25; + S1_ybin_min = -25; + S1_ybin_max = 25; + SE_ybin_min = -25; + SE_ybin_max = 25; + + S2xybinsize = sqrt((50*50)/(Kr_events/150));%cm +% SExybinsize = 5; DEFINED LATER, based on number of SE events + S2_xbin_min = -25; + S2_xbin_max = 25; + S2_ybin_min = -25; + S2_ybin_max = 25; + SE_xbin_min = -25; + SE_xbin_max = 25; + + + end + + s1_xbins = (S1_xbin_max-S1_xbin_min)./S1xybinsize; + s1_ybins = (S1_ybin_max-S1_ybin_min)./S1xybinsize; + + s2_xbins = (S2_xbin_max-S2_xbin_min)./S2xybinsize; + s2_ybins = (S2_ybin_max-S2_ybin_min)./S2xybinsize; + + %% Kr S1a/S2b map + +%Set up cuts and variables + s1ab_cut=logical(sum(s1_single_cut(:,:),1)); + s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); + s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); + s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); + s1ab_x=d.x_cm(s2_single_cut); + s1ab_y=d.y_cm(s2_single_cut); + s1ab_z=d.z_drift_samples(s2_single_cut)/100; + s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); + s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<25; + + s1ab_x=s1ab_x(s1ab_timing_cut); + s1ab_y=s1ab_y(s1ab_timing_cut); + s1ab_z=s1ab_z(s1ab_timing_cut); + s1a_phe_both=s1a_phe_both(s1ab_timing_cut); + s1b_phe_both=s1b_phe_both(s1ab_timing_cut); + s1ab_radius=s1ab_radius(s1ab_timing_cut); + + %fidicual Z cut for s1ab_xy measurement + [s1ab_z_hist s1ab_z_hist_bins]=hist(s1ab_z(inrange(s1ab_z,[0,400])),[0:1:400]); + frac_hist=cumsum(s1ab_z_hist)./sum(s1ab_z_hist); + s1ab_z_cut_lower= min(s1ab_z_hist_bins(frac_hist>.10)); + s1ab_z_cut_upper= max(s1ab_z_hist_bins(frac_hist<.90)); + s1ab_z_cut=inrange(s1ab_z,[s1ab_z_cut_lower,s1ab_z_cut_upper]); + + %R cut for s1ab_Z measurement + [upperz_r_hist upperz_r_hist_bins]=hist(s1ab_radius(s1ab_z>s1ab_z_cut_upper & s1ab_radius<=26),[0:1:26]); + [lowerz_r_hist lowerz_r_hist_bins]=hist(s1ab_radius(s1ab_z0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:400]).','gauss1'); + s1b_fit=fit([0:2:300].',hist(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:300]).','gauss1'); + s1a_z_means(i)=s1a_fit.b1; + s1a_z_means_err(i)=s1a_fit.c1/sqrt(2)/sqrt(length(s1a_phe_both(s1ab_r_cut.' & s1a_phe_both>0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1b_z_means(i)=s1b_fit.b1; + s1b_z_means_err(i)=s1b_fit.c1/sqrt(2)/sqrt(length(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1ab_bincenters(i)=z_max-dT_step/2; + i=i+1; + end + +s1ab_z_means=s1a_z_means./s1b_z_means; +s1ab_z_means_err=sqrt( (s1b_z_means_err.*s1a_z_means./(s1b_z_means.^2)).^2 + (s1a_z_means_err./s1b_z_means).^2); + +%fit polynomial to s1az and s1bz, to remove z dependence later in xy fit +[s1a_P, s1a_S]=polyfit(s1ab_bincenters,s1a_z_means,3); +[s1b_P, s1b_S]=polyfit(s1ab_bincenters,s1b_z_means,3); +[s1ab_P, s1ab_S]=polyfit(s1ab_bincenters,s1ab_z_means,3); + +%S1a z dependence plot +s1az_plot=figure; +errorbar(s1ab_bincenters,s1a_z_means,s1a_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a Mean (phe)'); title('S1a Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1a_P,[10:1:320]),'-r','LineWidth',2) + + +%S1b z dependence plot +s1bz_plot=figure; +errorbar(s1ab_bincenters,s1b_z_means,s1b_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1b Mean (phe)'); title('S1b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1b_P,[10:1:320]),'-r','LineWidth',2) + + +%S1a/b z dependence plot +s1a_over_bz_plot=figure; +errorbar(s1ab_bincenters,s1ab_z_means,s1ab_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a/b'); title('S1 a/b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1ab_P,[10:1:320]),'-r','LineWidth',2) + + +%Correcting z dependence to get XY dependence in same manner that Kr/CH3T +%map does + s1a_phe_both_z=s1a_phe_both.'.*polyval(s1a_P,z_center)./polyval(s1a_P,s1ab_z); + s1b_phe_both_z=s1b_phe_both.'.*polyval(s1b_P,z_center)./polyval(s1b_P,s1ab_z); + +%% S1a/b XY map (after z correction) +s1ab_xbin_min=-25; +s1ab_ybin_min=-25; +s1ab_xbin_max=25; +s1ab_ybin_max=25; +s1ab_xybinsize=sqrt((50*50)/(length(s1ab_z)/300)); +clear s1a_xy_mean s1a_xy_mean_err s1b_xy_mean s1b_xy_mean_err + +s1ab_xbins=s1ab_xbin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_xbin_max; +s1ab_ybins=s1ab_ybin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_ybin_max; + +s1a_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); +s1b_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); + + for x_bin=s1ab_xbin_min:s1ab_xybinsize:(s1ab_xbin_max-s1ab_xybinsize/2); + for y_bin=s1ab_ybin_min:s1ab_xybinsize:(s1ab_ybin_max-s1ab_xybinsize/2); + x_min = x_bin; x_max = x_bin+s1ab_xybinsize; + y_min = y_bin; y_max = y_bin+s1ab_xybinsize; + + x_count=int32(1+x_bin/s1ab_xybinsize+s1ab_xbin_max/s1ab_xybinsize); + y_count=int32(1+y_bin/s1ab_xybinsize+s1ab_ybin_max/s1ab_xybinsize); + + bin_cut = s1ab_z_cut.' & inrange(s1ab_z,[10 330]).' & s1a_phe_both>0 & s1b_phe_both>0 & inrange(s1ab_x,[x_min,x_max]).' & inrange(s1ab_y,[y_min,y_max]).'; + if length(s1a_phe_both_z(bin_cut))>100; + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400])),[0:2:400]).','gauss1'); + s1a_xy_mean(y_count,x_count)=s1a_z_fit.b1; + s1a_xy_mean_err(y_count,x_count)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300])),[0:2:300]).','gauss1'); + s1b_xy_mean(y_count,x_count)=s1b_z_fit.b1; + s1b_xy_mean_err(y_count,x_count)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300]))); + else + s1a_xy_mean(y_count,x_count)=0; + s1a_xy_mean_err(y_count,x_count)=0; + s1b_xy_mean(y_count,x_count)=0; + s1b_xy_mean_err(y_count,x_count)=0; + end + + end + end + s1ab_xy_mean=s1a_xy_mean./s1b_xy_mean; + s1ab_xy_mean_err=sqrt( (s1b_xy_mean_err.*s1a_xy_mean./(s1b_xy_mean.^2)).^2 + (s1a_xy_mean_err./s1b_xy_mean).^2); + + + %Plot s1a XY means + color_range_max=max(max(s1a_xy_mean)); + color_range_min=min(min(s1a_xy_mean(s1a_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1a_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1a_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %Plot s1a XY means + color_range_max=max(max(s1b_xy_mean)); + color_range_min=min(min(s1b_xy_mean(s1b_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1b_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1b_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1b Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1b Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %s1a/b XY Ratio + color_range_max=max(max(s1ab_xy_mean)); + color_range_min=min(min(s1ab_xy_mean(s1ab_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1ab_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a/b Ratio vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a/b Ratio','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + +%% 3D Kr s1a/s1b map + +if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +s1ab_xyz_numbins=floor((length(s1ab_z)/200)^(1/3)); %number of bins in one direction +s1ab_xyz_zstep=det_edge/s1ab_xyz_numbins; +s1ab_xyz_xstep=50/s1ab_xyz_numbins; +s1ab_xyz_ystep=50/s1ab_xyz_numbins; +s1ab_xyz_xmax=25; +r_max=25; + +s1ab_xyz_zbins=10+s1ab_xyz_zstep/2:s1ab_xyz_zstep:10+s1ab_xyz_zstep/2+s1ab_xyz_zstep*s1ab_xyz_numbins; %20 us +s1ab_xyz_xbins=(-r_max+s1ab_xyz_xstep/2):s1ab_xyz_xstep:r_max; +s1ab_xyz_ybins=(-r_max+s1ab_xyz_ystep/2):s1ab_xyz_ystep:r_max; + +s1a_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + + %Count the number of events per bin + Count_S1ab_3D(l,m,n)=length(s1a_phe_both(q)); + + if (Count_S1ab_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_xyz_mean(l,m,n)=s1a_z_fit.b1; + s1a_xyz_mean_err(l,m,n)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]) ),[0:2:300]).','gauss1'); + s1b_xyz_mean(l,m,n)=s1b_z_fit.b1; + s1b_xyz_mean_err(l,m,n)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); + else %not enough stats to do the fit + s1a_xyz_mean(l,m,n)=0; + s1a_xyz_mean_err(l,m,n)=0; + s1b_xyz_mean(l,m,n)=0; + s1b_xyz_mean_err(l,m,n)=0; + end + + end + end +k +end + + s1ab_xyz_mean=s1a_xyz_mean./s1b_xyz_mean; + s1ab_xyz_mean_err=sqrt( (s1b_xyz_mean_err.*s1a_xyz_mean./(s1b_xyz_mean.^2)).^2 + (s1a_xyz_mean_err./s1b_xyz_mean).^2); + +end + %% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % Removing field dependence from S1 and S2 + % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + %Hardcoded numbers from Energy Chi2 Fit + + +s1ab_s2_xyz_fit_map.p1=-0.0097; +s1ab_s2_xyz_fit_map.p2=-1.7; +s1ab_s2_xyz_fit_map.p3=5.7225; + + +s1ab_s1_xyz_fit_map.p1=0.0025; +s1ab_s1_xyz_fit_map.p2=0.4424; +s1ab_s1_xyz_fit_map.p3=-0.2289; + + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + figure + plot(drift_time,s1_3Dfieldremoval,'.k') + hold on; + plot(drift_time,s2_3Dfieldremoval,'.r') + + else +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval.*s2_xyfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval.*s2_xyfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval.*s1_xyfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval.*s1_xyfieldremoval); + + figure + plot(drift_time,(s1_zfieldremoval.*s1_xyfieldremoval),'.k') + hold on; + plot(drift_time,(s2_zfieldremoval.*s2_xyfieldremoval),'.r') + + + end + + + %% Calculate Single Electron Size + + s4_class=(d.pulse_classification==4) ; %Use or class=2 to fix 33 phe cut off... have to edit se_wrt_first_s1_func tho + d = se_wrt_first_s1_func(d); + cut_se_s1_z = d.t_btw_se_first_s1 > 100*10; + + SE_good_cut =logical( cut_se_s1_z & s4_class & ( cumsum(s1_single_cut)-cumsum(s2_single_cut) ) ); % only events between good S1 and S2s + + SE_phe_both=d.pulse_area_phe(SE_good_cut); + SE_phe_bot=d.phe_bottom(SE_good_cut); + SE_phe_top=SE_phe_both-SE_phe_bot; + + SE_x=d.x_cm(SE_good_cut); + SE_y=d.y_cm(SE_good_cut); + SE_radius=(SE_x.^2+SE_y.^2).^(1/2); + + %Both PMT first fit + SE_fit=fit([0:1:60]',hist(SE_phe_both(SE_radius<17 & inrange(SE_phe_both,[0 60])),[0:1:60])','gauss1'); %normally is 17 + SE_Size=SE_fit.b1; + SE_sig=SE_fit.c1/sqrt(2); + SE_both_conf=confint(SE_fit,0.683); + SE_sig_mu_both=abs(SE_Size-SE_both_conf(1,2)); % one sigma + SE_sig_sig_both=abs(SE_sig-SE_both_conf(1,3)/sqrt(2)); % one sigma + + %Both PMT Second fit + n_sig_fit=2; + + fit_start=SE_Size-n_sig_fit*SE_sig; + fit_end=SE_Size+n_sig_fit*SE_sig; + xfit=fit_start:0.1:fit_end; + + SE_cut=SE_phe_both(SE_radius<17); + [xxo, yyo, xo, no] = step(SE_cut(inrange(SE_cut,[fit_start fit_end])),[0:0.2:60]); + s = fitoptions('Method','NonlinearLeastSquares','Robust','On','Algorithm','Trust-Region','Lower',[-5,0,0,0],'Upper',[5,Inf,Inf,Inf],... + 'Startpoint',[1,max(no),10,5]); + skewGauss1 = fittype('a1/c1*exp(-((x-b1)/c1)^2)*(1+erf(a*(x-b1)/c1))','options',s); + + [f_both,g_both] = fit(xo',no',skewGauss1); + delta_both = f_both.a/sqrt(1+f_both.a^2); + SE_mu_both = f_both.b1 + f_both.c1/sqrt(2)*delta_both*sqrt(2/pi); + SE_sig_both = sqrt((f_both.c1/sqrt(2))^2 * (1 - 2 * (delta_both)^2/pi)); + skew_both = (4-pi)/2 * (delta_both * sqrt(2/pi))^3 / (1 - 2 * delta_both^2/pi)^(3/2); + kurt_both = 2*(pi-3) * (delta_both * sqrt(2/pi))^3 / (1 - 2 * delta_both^2/pi)^2; + ci_both = confint(f_both,0.683); + y_fit_both = f_both(xfit); + + both_SE_fig=figure; + hold on; + step(SE_cut,[0:0.2:60],'k'); + h_fit=plot(xfit,y_fit_both,'-r','linewidth',2); + box on; + myfigview(18); + xlabel('Pulse Area Phe (Phe) '); ylabel('Count/Phe '); + legend([h_fit],strcat('\mu = ',num2str(SE_mu_both,'%2.2f'),'\newline \sigma= ',num2str(SE_sig_both,'%2.2f'),'\newline skew=', num2str(skew_both,'%2.2f') ), 'location','northeast'); + + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S1 Z-dependence (Both PMT arrays) +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + light_correction_fig = figure; + errorbar(mean_index,means,means_error,'.k'); + hold on + [yplot_s1_both] = polyval(P_s1_both,dT_fit); + [center_s1_both, center_s1_both_err] = polyval(P_s1_both,z_center, S); %160[us]*1.51[\mus/us] + plot(dT_fit,yplot_s1_both,'-r','LineWidth',1); + xlabel('Depth (\mus)', 'FontSize',16); ylabel('Mean (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S1 Mean vs. Z'), 'FontSize', 16,'Interpreter','none'); + line([0 det_edge],[center_s1_both center_s1_both],'linestyle','--'); + line([z_center; z_center;],[min(means) max(means)],'linestyle','--'); + legend('S1\_both Mean', strcat('y=', num2str(P_s1_both(1),'%10.2e'), '*Z^2 + ', num2str(P_s1_both(2),'%10.2e')... + , '*Z + ', num2str(P_s1_both(3),4)),strcat('Det center = ',num2str(center_s1_both,4), ' [Phe]'),'location','northwest') + + box on; + myfigview(16); + xlim([0 det_edge]); + ylim([0.8*min(means) 1.15*max(means)]); + + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + + + + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + + %%calculate S2/S1 also, just to double check the lifetime from S2 only + % hist_s2_both_s1(:,bin)= hist(s2_phe_both(time_cut)./s1_phe_both_z(time_cut),x3)'; + % temp_hist=hist_s2_both_s1(:,bin); + %Fit_s2_both_s1{bin}=fit(x3(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + % means_s2_s1(bin)=Fit_s2_both_s1{bin}.b1; + % means_error_s2_s1(bin) = Fit_s2_both_s1{bin}.c1/2/sqrt(sum(hist_s2_both_s1(:,bin))); % == sigma/sqrt(N); + % mean_index_s2_s1(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + + dT_range= inrange( mean_index,[5+bin_size,500] );%from 50 to 300us for the fit + + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + %%Tracker for pseudo-lifetime + s2_at_bottom_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_both=-320/log(s2_at_bottom_both/s2_at_top_both); + + dT_fit=0:1:det_edge; + + Fit_EL= fit(mean_index(dT_range),means(dT_range),'exp1'); + yfitEL = Fit_EL.a.*exp(Fit_EL.b.*dT_fit); + + e_lifetime_both=-1/Fit_EL.b; + s2_z0_both=Fit_EL.a; + + b=confint(Fit_EL, 0.683);%1 sigma matrix + sigma_e_lifetime_both=(1/b(1,2)-1/b(2,2))/2; + sigma_s2_z0_both=(b(2,1)-b(1,1))/2; + + lifetime_fig_both = figure; + errorbar(mean_index(2:end),means(2:end),means_error(2:end),'.k'); %first bin is anode, skip it + hold on + plot(dT_fit,yfitEL,'-r','LineWidth',1); + xlabel('Time (\mus)', 'FontSize',16); ylabel('Mean S2 (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S2_both Electron Lifetime'), 'FontSize', 16,'Interpreter','none'); + legend('S2\_both Mean', strcat( '\lambda= ', num2str(e_lifetime_both,4), ' \pm ', num2str(sigma_e_lifetime_both,2), ' \mus' )... + ,'location','northeast'); + myfigview(16); + xlim([0 det_edge]); + + + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_ybins),floor(s2_xbins)); +Sigma_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); +Count_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + +color_range_max=max(max(mean_S2_both_xy)); +color_range_min=min(min(mean_S2_both_xy(mean_S2_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + +s2_xy_both_fig = figure; +contourf(s2xbins,s2ybins,mean_S2_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. S2 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_ybins),floor(s1_xbins)); +Sigma_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); +Count_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +color_range_max=max(max(mean_S1_both_xy)); +color_range_min=min(min(mean_S1_both_xy(mean_S1_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + +s1_xy_both_fig = figure; +contourf(s1xbins,s1ybins,mean_S1_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp,'. S1 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + + + +%% S1a/b R^2 v Z map +s1ab_r2bin_min=0; +s1ab_r2bin_max=25*25; +s1ab_zbin_min=10; +s1ab_zbin_max=330; + +s1ab_r2z_binnum=(length(s1ab_z))/3000; %10k based on CH3T stats for ER band +s1ab_r2_binnum=floor(sqrt(s1ab_r2z_binnum)); +s1ab_z_binnum=floor(sqrt(s1ab_r2z_binnum)); + +s1ab_r2_binsize=(s1ab_r2bin_max-s1ab_r2bin_min)/s1ab_r2_binnum; +s1ab_z_binsize=(s1ab_zbin_max-s1ab_zbin_min)/s1ab_z_binnum; + +s1ab_r2bins=s1ab_r2bin_min+s1ab_r2_binsize/2:s1ab_r2_binsize:s1ab_r2bin_max; +s1ab_zbins=s1ab_zbin_min+s1ab_z_binsize/2:s1ab_z_binsize:s1ab_zbin_max; + +s1a_r2z_mean=zeros(length(s1ab_zbins),length(s1ab_r2bins)); +s1b_r2z_mean=zeros(length(s1ab_zbins),length(s1ab_r2bins)); +s1a_r2z_mean_err=zeros(length(s1ab_zbins),length(s1ab_r2bins)); +s1b_r2z_mean_err=zeros(length(s1ab_zbins),length(s1ab_r2bins)); +field_map_2014=zeros(length(s1ab_zbins),length(s1ab_r2bins)); +field_map_2015=zeros(length(s1ab_zbins),length(s1ab_r2bins)); +field_map_error=zeros(length(s1ab_zbins),length(s1ab_r2bins)); + +r2_counter=1; + for r2_bin_max=s1ab_r2bin_min+s1ab_r2_binsize:s1ab_r2_binsize:s1ab_r2bin_max; + z_counter=1; + for z_bin_max=s1ab_zbin_min+s1ab_z_binsize:s1ab_z_binsize:s1ab_zbin_max; + + bin_cut = s1a_phe_both>0 & s1b_phe_both>0 & inrange(s1ab_radius.^2,[r2_bin_max-s1ab_r2_binsize,r2_bin_max]).' & inrange(s1ab_z,[z_bin_max-s1ab_z_binsize,z_bin_max]).'; + if length(s1a_phe_both(bin_cut))>100; + clear s1a_confint s1b_confint + s1a_r2z_fit=fit([0:2:400].',hist(s1a_phe_both(bin_cut & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_r2z_mean(z_counter,r2_counter)=s1a_r2z_fit.b1; + s1a_confint=confint(s1a_r2z_fit,0.68); +% s1a_r2z_mean_err(z_counter,r2_counter)=s1a_r2z_fit.c1/sqrt(2)/length(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400]))); + s1a_r2z_mean_err(z_counter,r2_counter)=abs(s1a_confint(1,2)-s1a_r2z_fit.b1); + s1b_r2z_fit=fit([0:2:300].',hist(s1b_phe_both(bin_cut & inrange(s1b_phe_both,[0 300])),[0:2:300]).','gauss1'); + s1b_r2z_mean(z_counter,r2_counter)=s1b_r2z_fit.b1; + s1b_confint=confint(s1b_r2z_fit,0.68); +% s1b_xy_mean_err(y_count,x_count)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300]))); + s1b_r2z_mean_err(z_counter,r2_counter)=abs(s1b_confint(1,2)-s1b_r2z_fit.b1); + else + s1a_r2z_mean(z_counter,r2_counter)=0; + s1a_r2z_mean_err(z_counter,r2_counter)=0; + s1b_r2z_mean(z_counter,r2_counter)=0; + s1b_r2z_mean_err(z_counter,r2_counter)=0; + + end + z_counter=z_counter+1; + end + r2_counter=r2_counter+1; + end + s1ab_r2z_mean=s1a_r2z_mean./s1b_r2z_mean; + s1ab_r2z_mean_err=sqrt( (s1b_r2z_mean_err.*s1a_r2z_mean./(s1b_r2z_mean.^2)).^2 + (s1a_r2z_mean_err./s1b_r2z_mean).^2); + + %Plot s1a R2Z means + color_range_max=max(max(s1a_r2z_mean)); + color_range_min=min(min(s1a_r2z_mean(s1a_r2z_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + + s1a_r2z_fig = figure; + contourf(s1ab_r2bins,s1ab_zbins,s1a_r2z_mean,vc,'LineColor','none'); + xlabel('R^2 (cm^2)','fontsize', 18); + ylabel('Z (uSec)','fontsize', 18); + title(strcat(file_id_cp, '. S1a Mean vs. R^2 v Z.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + axis([0 625 0 330]) + myfigview(16); + set(gca,'Ydir','reverse') + + + %Plot s1a R2Z means + color_range_max=max(max(s1b_r2z_mean)); + color_range_min=min(min(s1b_r2z_mean(s1b_r2z_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1b_r2z_fig = figure; + contourf(s1ab_r2bins,s1ab_zbins,s1b_r2z_mean,vc,'LineColor','none'); + xlabel('R^2 (cm^2)','fontsize', 18); + ylabel('Z (uSec)','fontsize', 18); + title(strcat(file_id_cp, '. S1b Mean vs. R^2 v Z.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1b Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + axis([0 625 0 330]) + myfigview(16); + set(gca,'Ydir','reverse') + + + %s1a/b R2Z Ratio + color_range_max=max(max(s1ab_r2z_mean)); + color_range_min=min(min(s1ab_r2z_mean(s1ab_r2z_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1ab_r2z_fig = figure; + contourf(s1ab_r2bins,s1ab_zbins,s1ab_r2z_mean,vc,'LineColor','none'); + xlabel('R^2 (cm^2)','fontsize', 18); + ylabel('Z (uSec)','fontsize', 18); + title(strcat(file_id_cp, '. S1a/S1b Mean vs. R^2 v Z.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a/b Ratio','FontSize',16) + set(g,'FontSize',18) + hold on + axis([0 625 0 330]) + myfigview(16); + set(gca,'Ydir','reverse') + + +%% Apply corrections to CH3T and calculate the ER band + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\Run04_CH3T\KrypCal2p18_IQs\MakePlots\CH3T_Sep2015_Kr2p18.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'spline',1); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'spline',1); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + + + +s1_min=0; +s1_max=50; + +%% First figure out where the outliers are in space + +pulse_area_cut= (log10(s1_phe_both_xyz)+0.7*log10(s2_phe_both_xyz)<4.8) & (log10(s1_phe_both_xyz)+0.7*log10(s2_phe_both_xyz)>2.3) & ... + (log10(s1_phe_both_xyz)-2*log10(s2_phe_both_xyz)<-5) & (log10(s1_phe_both_xyz)-2*log10(s2_phe_both_xyz)>-6.5); + + +max_r=25; + +%% REDO THIS WITH SAME BINNING AS FIELD MAP + +voxel_counter=1; + + ER_lower_power_fit_vox={}; + ER_upper_power_fit_vox={}; + ER_mean_power_fit_vox={}; + + + + dT_step=det_edge/(length(s1ab_z)/2000); %2000 events per z bin + + + h3_r_cut=(drift_time-rslope.*s2radius)5000 + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:.05:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=tritium_cut & inrange(s1_phe_both_xyz,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); + %ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + b=confint(ER_mean_power_fit,.68); + sigma_a_ER_mean=(b(2,1)-b(1,1))/2; + sigma_b_ER_mean=(b(2,2)-b(1,2))/2; + + ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + b=confint(ER_lower_power_fit,.68); + sigma_a_ER_lower=(b(2,1)-b(1,1))/2; + sigma_b_ER_lower=(b(2,2)-b(1,2))/2; + + ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + b=confint(ER_upper_power_fit,.68); + sigma_a_ER_upper=(b(2,1)-b(1,1))/2; + sigma_b_ER_upper=(b(2,2)-b(1,2))/2; + + + ER_lower_power_fit_vox{voxel_counter}=ER_lower_power_fit; + ER_upper_power_fit_vox{voxel_counter}=ER_upper_power_fit; + ER_mean_power_fit_vox{voxel_counter}=ER_mean_power_fit; + + ER_lower_power_fit_vox_aerr{voxel_counter}=sigma_a_ER_lower; + ER_upper_power_fit_vox_aerr{voxel_counter}=sigma_a_ER_upper; + ER_mean_power_fit_vox_aerr{voxel_counter}=sigma_a_ER_mean; + + ER_lower_power_fit_vox_berr{voxel_counter}=sigma_b_ER_lower; + ER_upper_power_fit_vox_berr{voxel_counter}=sigma_b_ER_upper; + ER_mean_power_fit_vox_berr{voxel_counter}=sigma_b_ER_mean; + + z_centers(voxel_counter)=z_max-dT_step/2; + skipflag(voxel_counter)=0; + +else + ER_lower_power_fit_vox{voxel_counter}=0; + ER_upper_power_fit_vox{voxel_counter}=0; + ER_mean_power_fit_vox{voxel_counter}=0; + + ER_lower_power_fit_vox_aerr{voxel_counter}=0; + ER_upper_power_fit_vox_aerr{voxel_counter}=0; + ER_mean_power_fit_vox_aerr{voxel_counter}=0; + + ER_lower_power_fit_vox_berr{voxel_counter}=0; + ER_upper_power_fit_vox_berr{voxel_counter}=0; + ER_mean_power_fit_vox_berr{voxel_counter}=0; + + z_centers(voxel_counter)=0; + + skipflag(voxel_counter)=1; +end + voxel_counter=voxel_counter+1; + + +end + + + + +%% Now relate the field to the ER band parameters + +%Relating parameter a to S1aS1b +temp_mean_s1as1b_map=s1ab_z_means(:); +temp_mean_s1as1b_map_totalerr=s1ab_z_means_err(:); + +for i=1:length(ER_mean_power_fit_vox) + + if skipflag(i)==0 +temp_ER_mean_a(i)=ER_mean_power_fit_vox{i}.a; +temp_ER_mean_a_err(i)=ER_mean_power_fit_vox_aerr{i}; + +temp_ER_mean_b(i)=ER_mean_power_fit_vox{i}.b; +temp_ER_mean_b_err(i)=ER_mean_power_fit_vox_berr{i}; + +temp_ER_lower_a(i)=ER_lower_power_fit_vox{i}.a; +temp_ER_lower_a_err(i)=ER_lower_power_fit_vox_aerr{i}; + +temp_ER_lower_b(i)=ER_lower_power_fit_vox{i}.b; +temp_ER_lower_b_err(i)=ER_lower_power_fit_vox_berr{i}; + +temp_ER_upper_a(i)=ER_upper_power_fit_vox{i}.a; +temp_ER_upper_a_err(i)=ER_upper_power_fit_vox_aerr{i}; + +temp_ER_upper_b(i)=ER_upper_power_fit_vox{i}.b; +temp_ER_upper_b_err(i)=ER_upper_power_fit_vox_berr{i}; + else +temp_ER_mean_a(i)=0; +temp_ER_mean_a_err(i)=0; + +temp_ER_mean_b(i)=0; +temp_ER_mean_b_err(i)=0; + +temp_ER_lower_a(i)=0; +temp_ER_lower_a_err(i)=0; + +temp_ER_lower_b(i)=0; +temp_ER_lower_b_err(i)=0; + +temp_ER_upper_a(i)=0; +temp_ER_upper_a_err(i)=0; + +temp_ER_upper_b(i)=0; +temp_ER_upper_b_err(i)=0; + end +end + +nancut=~isnan(temp_mean_s1as1b_map).' & ~isnan(temp_ER_mean_a) & temp_ER_mean_a~=0; + +[S1aS1b_to_mean_a_fit S1aS1b_to_mean_a_fit_err]=polyfit(temp_mean_s1as1b_map(nancut),temp_ER_mean_a(nancut).',2); +[S1aS1b_to_mean_b_fit S1aS1b_to_mean_b_fit_err]=polyfit(temp_mean_s1as1b_map(nancut),temp_ER_mean_b(nancut).',2); +[S1aS1b_to_lower_a_fit S1aS1b_to_lower_a_fit_err]=polyfit(temp_mean_s1as1b_map(nancut),temp_ER_lower_a(nancut).',2); +[S1aS1b_to_lower_b_fit S1aS1b_to_lower_b_fit_err]=polyfit(temp_mean_s1as1b_map(nancut),temp_ER_lower_b(nancut).',2); +[S1aS1b_to_upper_a_fit S1aS1b_to_upper_a_fit_err]=polyfit(temp_mean_s1as1b_map(nancut),temp_ER_upper_a(nancut).',2); +[S1aS1b_to_upper_b_fit S1aS1b_to_upper_b_fit_err]=polyfit(temp_mean_s1as1b_map(nancut),temp_ER_upper_b(nancut).',2); + +%% Plot coefficient relationship +figure +hold on; +xlabel('S1a/S1b'); ylabel('Power Law Coefficient'); +myfigview(16); + +[tempy tempyerr]=polyval(S1aS1b_to_mean_a_fit,[0:0.005:4],S1aS1b_to_mean_a_fit_err); +count=1; +clear tempfill +for i=length(tempy):-1:1; + tempfill(count)=tempy(i)-tempyerr(i); + count=count+1; +end +fill([0:.005:4,4:-0.005:0],[tempy+tempyerr,tempfill],[0.6 0.6 1],'EdgeColor',[0.6 0.6 1]) +plot([0:0.005:4],tempy,'-b','LineWidth',2); +xlim([2.3 3]) +rkploterr(temp_mean_s1as1b_map(nancut),temp_ER_mean_a(nancut),temp_mean_s1as1b_map_totalerr(nancut),temp_ER_mean_a_err(nancut),[0 0 0],[],[],2) + +%% Plot exponent relationship +figure +hold on; +xlabel('S1a/S1b'); ylabel('Power Law Exponent'); +myfigview(16); + +clear tempy tempyerr tempfill +[tempy tempyerr]=polyval(S1aS1b_to_mean_b_fit,[0:0.005:4],S1aS1b_to_mean_b_fit_err); +count=1; +for i=length(tempy):-1:1; + tempfill(count)=tempy(i)-tempyerr(i); + count=count+1; +end +fill([0:.005:4,4:-0.005:0],[tempy+tempyerr,tempfill],[0.6 0.6 1],'EdgeColor',[0.6 0.6 1]) +plot([0:0.005:4],tempy,'-b','LineWidth',2); +xlim([2.3 3]) +rkploterr(temp_mean_s1as1b_map(nancut),temp_ER_mean_b(nancut),temp_mean_s1as1b_map_totalerr(nancut),temp_ER_mean_b_err(nancut),[0 0 0],[],[],2) + + +save('S1aS1b_To_ERBand_ZVoxels','S1aS1b_to_mean_a_fit','S1aS1b_to_mean_b_fit','S1aS1b_to_lower_a_fit','S1aS1b_to_lower_b_fit','S1aS1b_to_upper_a_fit','S1aS1b_to_upper_b_fit',... + 'S1aS1b_to_mean_a_fit_err','S1aS1b_to_mean_b_fit_err','S1aS1b_to_lower_a_fit_err','S1aS1b_to_lower_b_fit_err','S1aS1b_to_upper_a_fit_err','S1aS1b_to_upper_b_fit_err'); \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/Sep2015_ER_Band.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/Sep2015_ER_Band.m new file mode 100644 index 0000000..5c324e2 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/ERBandPrediction/Sep2015_ER_Band.m @@ -0,0 +1,1294 @@ +%% Make corrections with the chosen polynomial +path='C:\Users\Richard\Desktop\LUX Analysis\lux10_20150929T1905_cp18197'; + + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +delay_min=0; +file_id_cp='test'; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 32000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + + + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + + zcut_min = 10; %field changes at 4 uSec + zcut_max = 0.95*det_edge; + + + if Kr_events < 30000 %then create a 10x10 grid. Otherwise 25x25. Want about 30 evts per bin + + S1xybinsize = sqrt((50*50)/(Kr_events/150)); + S1_xbin_min = -25; + S1_xbin_max = 25; + S1_ybin_min = -25; + S1_ybin_max = 25; + SE_ybin_min = -25; + SE_ybin_max = 25; + + S2xybinsize = sqrt((50*50)/(Kr_events/150));%cm +% SExybinsize = 5; DEFINED LATER, based on number of SE events + S2_xbin_min = -25; + S2_xbin_max = 25; + S2_ybin_min = -25; + S2_ybin_max = 25; + SE_xbin_min = -25; + SE_xbin_max = 25; + + + end + + s1_xbins = (S1_xbin_max-S1_xbin_min)./S1xybinsize; + s1_ybins = (S1_ybin_max-S1_ybin_min)./S1xybinsize; + + s2_xbins = (S2_xbin_max-S2_xbin_min)./S2xybinsize; + s2_ybins = (S2_ybin_max-S2_ybin_min)./S2xybinsize; + + %% Kr S1a/S2b map + +%Set up cuts and variables + s1ab_cut=logical(sum(s1_single_cut(:,:),1)); + s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); + s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); + s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); + s1ab_x=d.x_cm(s2_single_cut); + s1ab_y=d.y_cm(s2_single_cut); + s1ab_z=d.z_drift_samples(s2_single_cut)/100; + s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); + s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<25; + + s1ab_x=s1ab_x(s1ab_timing_cut); + s1ab_y=s1ab_y(s1ab_timing_cut); + s1ab_z=s1ab_z(s1ab_timing_cut); + s1a_phe_both=s1a_phe_both(s1ab_timing_cut); + s1b_phe_both=s1b_phe_both(s1ab_timing_cut); + s1ab_radius=s1ab_radius(s1ab_timing_cut); + + %fidicual Z cut for s1ab_xy measurement + [s1ab_z_hist s1ab_z_hist_bins]=hist(s1ab_z(inrange(s1ab_z,[0,400])),[0:1:400]); + frac_hist=cumsum(s1ab_z_hist)./sum(s1ab_z_hist); + s1ab_z_cut_lower= min(s1ab_z_hist_bins(frac_hist>.10)); + s1ab_z_cut_upper= max(s1ab_z_hist_bins(frac_hist<.90)); + s1ab_z_cut=inrange(s1ab_z,[s1ab_z_cut_lower,s1ab_z_cut_upper]); + + %R cut for s1ab_Z measurement + [upperz_r_hist upperz_r_hist_bins]=hist(s1ab_radius(s1ab_z>s1ab_z_cut_upper & s1ab_radius<=26),[0:1:26]); + [lowerz_r_hist lowerz_r_hist_bins]=hist(s1ab_radius(s1ab_z0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:400]).','gauss1'); + s1b_fit=fit([0:2:300].',hist(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:300]).','gauss1'); + s1a_z_means(i)=s1a_fit.b1; + s1a_z_means_err(i)=s1a_fit.c1/sqrt(2)/sqrt(length(s1a_phe_both(s1ab_r_cut.' & s1a_phe_both>0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1b_z_means(i)=s1b_fit.b1; + s1b_z_means_err(i)=s1b_fit.c1/sqrt(2)/sqrt(length(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1ab_bincenters(i)=z_max-dT_step/2; + i=i+1; + end + +s1ab_z_means=s1a_z_means./s1b_z_means; +s1ab_z_means_err=sqrt( (s1b_z_means_err.*s1a_z_means./(s1b_z_means.^2)).^2 + (s1a_z_means_err./s1b_z_means).^2); + +%fit polynomial to s1az and s1bz, to remove z dependence later in xy fit +[s1a_P, s1a_S]=polyfit(s1ab_bincenters,s1a_z_means,3); +[s1b_P, s1b_S]=polyfit(s1ab_bincenters,s1b_z_means,3); +[s1ab_P, s1ab_S]=polyfit(s1ab_bincenters,s1ab_z_means,3); + +%S1a z dependence plot +s1az_plot=figure; +errorbar(s1ab_bincenters,s1a_z_means,s1a_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a Mean (phe)'); title('S1a Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1a_P,[10:1:320]),'-r','LineWidth',2) + + +%S1b z dependence plot +s1bz_plot=figure; +errorbar(s1ab_bincenters,s1b_z_means,s1b_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1b Mean (phe)'); title('S1b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1b_P,[10:1:320]),'-r','LineWidth',2) + + +%S1a/b z dependence plot +s1a_over_bz_plot=figure; +errorbar(s1ab_bincenters,s1ab_z_means,s1ab_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a/b'); title('S1 a/b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1ab_P,[10:1:320]),'-r','LineWidth',2) + + +%Correcting z dependence to get XY dependence in same manner that Kr/CH3T +%map does + s1a_phe_both_z=s1a_phe_both.'.*polyval(s1a_P,z_center)./polyval(s1a_P,s1ab_z); + s1b_phe_both_z=s1b_phe_both.'.*polyval(s1b_P,z_center)./polyval(s1b_P,s1ab_z); + +%% S1a/b XY map (after z correction) +s1ab_xbin_min=-25; +s1ab_ybin_min=-25; +s1ab_xbin_max=25; +s1ab_ybin_max=25; +s1ab_xybinsize=sqrt((50*50)/(length(s1ab_z)/300)); +clear s1a_xy_mean s1a_xy_mean_err s1b_xy_mean s1b_xy_mean_err + +s1ab_xbins=s1ab_xbin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_xbin_max; +s1ab_ybins=s1ab_ybin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_ybin_max; + +s1a_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); +s1b_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); + + for x_bin=s1ab_xbin_min:s1ab_xybinsize:(s1ab_xbin_max-s1ab_xybinsize/2); + for y_bin=s1ab_ybin_min:s1ab_xybinsize:(s1ab_ybin_max-s1ab_xybinsize/2); + x_min = x_bin; x_max = x_bin+s1ab_xybinsize; + y_min = y_bin; y_max = y_bin+s1ab_xybinsize; + + x_count=int32(1+x_bin/s1ab_xybinsize+s1ab_xbin_max/s1ab_xybinsize); + y_count=int32(1+y_bin/s1ab_xybinsize+s1ab_ybin_max/s1ab_xybinsize); + + bin_cut = s1ab_z_cut.' & inrange(s1ab_z,[10 330]).' & s1a_phe_both>0 & s1b_phe_both>0 & inrange(s1ab_x,[x_min,x_max]).' & inrange(s1ab_y,[y_min,y_max]).'; + if length(s1a_phe_both_z(bin_cut))>100; + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400])),[0:2:400]).','gauss1'); + s1a_xy_mean(y_count,x_count)=s1a_z_fit.b1; + s1a_xy_mean_err(y_count,x_count)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300])),[0:2:300]).','gauss1'); + s1b_xy_mean(y_count,x_count)=s1b_z_fit.b1; + s1b_xy_mean_err(y_count,x_count)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300]))); + else + s1a_xy_mean(y_count,x_count)=0; + s1a_xy_mean_err(y_count,x_count)=0; + s1b_xy_mean(y_count,x_count)=0; + s1b_xy_mean_err(y_count,x_count)=0; + end + + end + end + s1ab_xy_mean=s1a_xy_mean./s1b_xy_mean; + s1ab_xy_mean_err=sqrt( (s1b_xy_mean_err.*s1a_xy_mean./(s1b_xy_mean.^2)).^2 + (s1a_xy_mean_err./s1b_xy_mean).^2); + + + %Plot s1a XY means + color_range_max=max(max(s1a_xy_mean)); + color_range_min=min(min(s1a_xy_mean(s1a_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1a_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1a_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %Plot s1a XY means + color_range_max=max(max(s1b_xy_mean)); + color_range_min=min(min(s1b_xy_mean(s1b_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1b_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1b_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1b Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1b Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %s1a/b XY Ratio + color_range_max=max(max(s1ab_xy_mean)); + color_range_min=min(min(s1ab_xy_mean(s1ab_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1ab_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a/b Ratio vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a/b Ratio','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + +%% 3D Kr s1a/s1b map + +if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +s1ab_xyz_numbins=floor((length(s1ab_z)/200)^(1/3)); %number of bins in one direction +s1ab_xyz_zstep=det_edge/s1ab_xyz_numbins; +s1ab_xyz_xstep=50/s1ab_xyz_numbins; +s1ab_xyz_ystep=50/s1ab_xyz_numbins; +s1ab_xyz_xmax=25; +r_max=25; + +s1ab_xyz_zbins=10+s1ab_xyz_zstep/2:s1ab_xyz_zstep:10+s1ab_xyz_zstep/2+s1ab_xyz_zstep*s1ab_xyz_numbins; %20 us +s1ab_xyz_xbins=(-r_max+s1ab_xyz_xstep/2):s1ab_xyz_xstep:r_max; +s1ab_xyz_ybins=(-r_max+s1ab_xyz_ystep/2):s1ab_xyz_ystep:r_max; + +s1a_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + + %Count the number of events per bin + Count_S1ab_3D(l,m,n)=length(s1a_phe_both(q)); + + if (Count_S1ab_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_xyz_mean(l,m,n)=s1a_z_fit.b1; + s1a_xyz_mean_err(l,m,n)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]) ),[0:2:300]).','gauss1'); + s1b_xyz_mean(l,m,n)=s1b_z_fit.b1; + s1b_xyz_mean_err(l,m,n)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); + else %not enough stats to do the fit + s1a_xyz_mean(l,m,n)=0; + s1a_xyz_mean_err(l,m,n)=0; + s1b_xyz_mean(l,m,n)=0; + s1b_xyz_mean_err(l,m,n)=0; + end + + end + end +k +end + + s1ab_xyz_mean=s1a_xyz_mean./s1b_xyz_mean; + s1ab_xyz_mean_err=sqrt( (s1b_xyz_mean_err.*s1a_xyz_mean./(s1b_xyz_mean.^2)).^2 + (s1a_xyz_mean_err./s1b_xyz_mean).^2); + +end + %% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % Removing field dependence from S1 and S2 + % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + %Hardcoded numbers from Energy Chi2 Fit + + +s1ab_s2_xyz_fit_map.p1=-0.0097; +s1ab_s2_xyz_fit_map.p2=-1.7; +s1ab_s2_xyz_fit_map.p3=5.7225; + + +s1ab_s1_xyz_fit_map.p1=0.0025; +s1ab_s1_xyz_fit_map.p2=0.4424; +s1ab_s1_xyz_fit_map.p3=-0.2289; + + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + figure + plot(drift_time,s1_3Dfieldremoval,'.k') + hold on; + plot(drift_time,s2_3Dfieldremoval,'.r') + + else +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval.*s2_xyfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval.*s2_xyfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval.*s1_xyfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval.*s1_xyfieldremoval); + + figure + plot(drift_time,(s1_zfieldremoval.*s1_xyfieldremoval),'.k') + hold on; + plot(drift_time,(s2_zfieldremoval.*s2_xyfieldremoval),'.r') + + end + + + %% Calculate Single Electron Size + + s4_class=(d.pulse_classification==4) ; %Use or class=2 to fix 33 phe cut off... have to edit se_wrt_first_s1_func tho + d = se_wrt_first_s1_func(d); + cut_se_s1_z = d.t_btw_se_first_s1 > 100*10; + + SE_good_cut =logical( cut_se_s1_z & s4_class & ( cumsum(s1_single_cut)-cumsum(s2_single_cut) ) ); % only events between good S1 and S2s + + SE_phe_both=d.pulse_area_phe(SE_good_cut); + SE_phe_bot=d.phe_bottom(SE_good_cut); + SE_phe_top=SE_phe_both-SE_phe_bot; + + SE_x=d.x_cm(SE_good_cut); + SE_y=d.y_cm(SE_good_cut); + SE_radius=(SE_x.^2+SE_y.^2).^(1/2); + + %Both PMT first fit + SE_fit=fit([0:1:60]',hist(SE_phe_both(SE_radius<17 & inrange(SE_phe_both,[0 60])),[0:1:60])','gauss1'); %normally is 17 + SE_Size=SE_fit.b1; + SE_sig=SE_fit.c1/sqrt(2); + SE_both_conf=confint(SE_fit,0.683); + SE_sig_mu_both=abs(SE_Size-SE_both_conf(1,2)); % one sigma + SE_sig_sig_both=abs(SE_sig-SE_both_conf(1,3)/sqrt(2)); % one sigma + + %Both PMT Second fit + n_sig_fit=2; + + fit_start=SE_Size-n_sig_fit*SE_sig; + fit_end=SE_Size+n_sig_fit*SE_sig; + xfit=fit_start:0.1:fit_end; + + SE_cut=SE_phe_both(SE_radius<17); + [xxo, yyo, xo, no] = step(SE_cut(inrange(SE_cut,[fit_start fit_end])),[0:0.2:60]); + s = fitoptions('Method','NonlinearLeastSquares','Robust','On','Algorithm','Trust-Region','Lower',[-5,0,0,0],'Upper',[5,Inf,Inf,Inf],... + 'Startpoint',[1,max(no),10,5]); + skewGauss1 = fittype('a1/c1*exp(-((x-b1)/c1)^2)*(1+erf(a*(x-b1)/c1))','options',s); + + [f_both,g_both] = fit(xo',no',skewGauss1); + delta_both = f_both.a/sqrt(1+f_both.a^2); + SE_mu_both = f_both.b1 + f_both.c1/sqrt(2)*delta_both*sqrt(2/pi); + SE_sig_both = sqrt((f_both.c1/sqrt(2))^2 * (1 - 2 * (delta_both)^2/pi)); + skew_both = (4-pi)/2 * (delta_both * sqrt(2/pi))^3 / (1 - 2 * delta_both^2/pi)^(3/2); + kurt_both = 2*(pi-3) * (delta_both * sqrt(2/pi))^3 / (1 - 2 * delta_both^2/pi)^2; + ci_both = confint(f_both,0.683); + y_fit_both = f_both(xfit); + + both_SE_fig=figure; + hold on; + step(SE_cut,[0:0.2:60],'k'); + h_fit=plot(xfit,y_fit_both,'-r','linewidth',2); + box on; + myfigview(18); + xlabel('Pulse Area Phe (Phe) '); ylabel('Count/Phe '); + legend([h_fit],strcat('\mu = ',num2str(SE_mu_both,'%2.2f'),'\newline \sigma= ',num2str(SE_sig_both,'%2.2f'),'\newline skew=', num2str(skew_both,'%2.2f') ), 'location','northeast'); + + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S1 Z-dependence (Both PMT arrays) +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + light_correction_fig = figure; + errorbar(mean_index,means,means_error,'.k'); + hold on + [yplot_s1_both] = polyval(P_s1_both,dT_fit); + [center_s1_both, center_s1_both_err] = polyval(P_s1_both,z_center, S); %160[us]*1.51[\mus/us] + plot(dT_fit,yplot_s1_both,'-r','LineWidth',1); + xlabel('Depth (\mus)', 'FontSize',16); ylabel('Mean (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S1 Mean vs. Z'), 'FontSize', 16,'Interpreter','none'); + line([0 det_edge],[center_s1_both center_s1_both],'linestyle','--'); + line([z_center; z_center;],[min(means) max(means)],'linestyle','--'); + legend('S1\_both Mean', strcat('y=', num2str(P_s1_both(1),'%10.2e'), '*Z^2 + ', num2str(P_s1_both(2),'%10.2e')... + , '*Z + ', num2str(P_s1_both(3),4)),strcat('Det center = ',num2str(center_s1_both,4), ' [Phe]'),'location','northwest') + + box on; + myfigview(16); + xlim([0 det_edge]); + ylim([0.8*min(means) 1.15*max(means)]); + + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + + + + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + + %%calculate S2/S1 also, just to double check the lifetime from S2 only + % hist_s2_both_s1(:,bin)= hist(s2_phe_both(time_cut)./s1_phe_both_z(time_cut),x3)'; + % temp_hist=hist_s2_both_s1(:,bin); + %Fit_s2_both_s1{bin}=fit(x3(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + % means_s2_s1(bin)=Fit_s2_both_s1{bin}.b1; + % means_error_s2_s1(bin) = Fit_s2_both_s1{bin}.c1/2/sqrt(sum(hist_s2_both_s1(:,bin))); % == sigma/sqrt(N); + % mean_index_s2_s1(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + + dT_range= inrange( mean_index,[5+bin_size,500] );%from 50 to 300us for the fit + + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + %%Tracker for pseudo-lifetime + s2_at_bottom_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_both=-320/log(s2_at_bottom_both/s2_at_top_both); + + dT_fit=0:1:det_edge; + + Fit_EL= fit(mean_index(dT_range),means(dT_range),'exp1'); + yfitEL = Fit_EL.a.*exp(Fit_EL.b.*dT_fit); + + e_lifetime_both=-1/Fit_EL.b; + s2_z0_both=Fit_EL.a; + + b=confint(Fit_EL, 0.683);%1 sigma matrix + sigma_e_lifetime_both=(1/b(1,2)-1/b(2,2))/2; + sigma_s2_z0_both=(b(2,1)-b(1,1))/2; + + lifetime_fig_both = figure; + errorbar(mean_index(2:end),means(2:end),means_error(2:end),'.k'); %first bin is anode, skip it + hold on + plot(dT_fit,yfitEL,'-r','LineWidth',1); + xlabel('Time (\mus)', 'FontSize',16); ylabel('Mean S2 (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S2_both Electron Lifetime'), 'FontSize', 16,'Interpreter','none'); + legend('S2\_both Mean', strcat( '\lambda= ', num2str(e_lifetime_both,4), ' \pm ', num2str(sigma_e_lifetime_both,2), ' \mus' )... + ,'location','northeast'); + myfigview(16); + xlim([0 det_edge]); + + + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_ybins),floor(s2_xbins)); +Sigma_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); +Count_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + +color_range_max=max(max(mean_S2_both_xy)); +color_range_min=min(min(mean_S2_both_xy(mean_S2_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + +s2_xy_both_fig = figure; +contourf(s2xbins,s2ybins,mean_S2_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. S2 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_ybins),floor(s1_xbins)); +Sigma_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); +Count_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +color_range_max=max(max(mean_S1_both_xy)); +color_range_min=min(min(mean_S1_both_xy(mean_S1_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + +s1_xy_both_fig = figure; +contourf(s1xbins,s1ybins,mean_S1_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp,'. S1 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%% Apply corrections to CH3T and calculate the ER band + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\Run04_CH3T\KrypCal2p18_IQs\MakePlots\CH3T_Sep2015_Kr2p18.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'spline',1); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'spline',1); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +%% Make ER Band + +s1_min=0; +s1_max=50; + +%% First make plot of CH3T selection + +figure +density(log10(s2_phe_both_xyz),log10(s1_phe_both_xyz),[2.5:0.01:5],[0:0.01:3]) +cc=colorbar; +ylabel(cc,'Count','FontSize',16); +caxis +hold on; +xlabel('log10(Corrected S2)'); ylabel ('log10(Corrected S1)'); myfigview(16) +x=[3.629:0.001:4.185]; +y=-0.7.*x+4.8; +plot(x,y,'-r','LineWidth',2); +x=[2.703:0.001:3.26]; +y=-0.7.*x+2.3; +plot(x,y,'-r','LineWidth',2); +x=[2.703:0.001:3.629]; +y=2.*x-5; +plot(x,y,'-r','LineWidth',2); +x=[3.26:0.001:4.185]; +y=2.*x-6.5; +plot(x,y,'-r','LineWidth',2); +title('Feb2015 CH3T'); + +%% First figure out where the outliers are in space + +pulse_area_cut= (log10(s1_phe_both_xyz)+0.7*log10(s2_phe_both_xyz)<4.8) & (log10(s1_phe_both_xyz)+0.7*log10(s2_phe_both_xyz)>2.3) & ... + (log10(s1_phe_both_xyz)-2*log10(s2_phe_both_xyz)<-5) & (log10(s1_phe_both_xyz)-2*log10(s2_phe_both_xyz)>-6.5); + + +max_r=21; +fiducial_cut=inrange(drift_time,[40 300]) & inrange(s2radius_del,[0,max_r]); + +tritium_cut= clean_cut & pulse_area_cut & fiducial_cut; + +%% Next, make plot of fiducial cut + +figure +density(s2radius_del.^2,drift_time,[0:10:1000],[0:2:450]) +cc=colorbar; +ylabel(cc,'Count','FontSize',16); +set(gca,'Ydir','reverse') +hold on; +line([441 441],[40 300],'Color','r','LineWidth',2) +line([0 441],[300 300],'Color','r','LineWidth',2) +line([0 441],[40 40],'Color','r','LineWidth',2) +xlabel('Delensed Radius^2 (cm^2)'); ylabel('Drift Time (uSec)'); myfigview(16); +title('Feb2015 CH3T') +% plot(s2radius_del(~fiducial_cut).^2,drift_time(~fiducial_cut),'.k','MarkerSize',2) + + + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:.05:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=tritium_cut & inrange(s1_phe_both_xyz,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); + %ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + b=confint(ER_mean_power_fit,.68); + sigma_a_ER_mean=(b(2,1)-b(1,1))/2; + sigma_b_ER_mean=(b(2,2)-b(1,2))/2; + + ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + b=confint(ER_lower_power_fit,.68); + sigma_a_ER_lower=(b(2,1)-b(1,1))/2; + sigma_b_ER_lower=(b(2,2)-b(1,2))/2; + + ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + b=confint(ER_upper_power_fit,.68); + sigma_a_ER_upper=(b(2,1)-b(1,1))/2; + sigma_b_ER_upper=(b(2,2)-b(1,2))/2; + + + %Make Plot + + no_fid_new=figure; + hold on + %plot(s1_phe_both_xyz(tritium_cut),log10(s2_phe_both_xyz(tritium_cut)./s1_phe_both_xyz(tritium_cut)),'ok','markersize',2) + density(s1_phe_both_xyz(tritium_cut),log10(s2_phe_both_xyz(tritium_cut)./s1_phe_both_xyz(tritium_cut)),[0:.5:100],[0:.05:4]); +% densityplot(s1_phe_both_xyz(tritium_cut),log10(s2_phe_both_xyz(tritium_cut)./s1_phe_both_xyz(tritium_cut)),'rectangle',[.5 .05],'lin'); + cc=colorbar; + ylabel(cc,'Count','FontSize',16); + colormap; + ylabel('Corrected log10(S2/S1)'); xlabel('S1 corrected (Pulse Area Phe)'); + title(sprintf('Run 04 CH3T, R<%d cm',max_r),'fontsize',16,'Interpreter','none'); + myfigview(16); + ylim([0 3.5]);xlim([0 s1_max]); +% plot(ER_bins,lower_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_lower_fit,'--k','markersize',14,'linewidth',2) +% plot(ER_bins,mean_ER_band,'ok','markersize',6,'linewidth',2)%plot mean of ER band + plot(ER_bins,ER_mean_fit,'-k','markersize',20,'linewidth',2) +% plot(ER_bins,upper_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_upper_fit,'--k','markersize',14,'linewidth',2) + + + bin_step=2; + + total_count=length(log10(s2_phe_both_xyz(tritium_cut))); + + + box; + text(10,2.8,strcat('Total Count= ',num2str(total_count)),'fontsize',16); + %text(5,.7,strcat('NEST\_SE_{bot} Fit=',num2str(ER_mean_NEST_fit.SE_ER_fit*73/64*27/max_r,3),'\pm ', num2str(sigma_SE_ER_fit*73/64*27/max_r,2),'[Phe]'),'fontsize',16,'color','m','interpreter','tex'); + %text(5,.8,'NEST Platinum V4-b', 'fontsize',16,'color','m','interpreter','tex' ); + text(5,.55,strcat('+',num2str(band_sigma),'\sigma = (',num2str(ER_upper_power_fit.a,3),'\pm', num2str(sigma_a_ER_upper,1) ,')\times S1_c ^{', num2str(ER_upper_power_fit.b,3),'\pm',num2str(sigma_b_ER_upper,1),'}'),'fontsize',16,'interpreter','tex'); + text(5,.3,strcat('Mean=(',num2str(ER_mean_power_fit.a,3),'\pm', num2str(sigma_a_ER_mean,1),')\times S1_c ^{', num2str(ER_mean_power_fit.b,3),'\pm', num2str(sigma_b_ER_mean,1),'}'),'fontsize',16,'interpreter','tex'); + text(5,.05,strcat('-',num2str(band_sigma),'\sigma = (',num2str(ER_lower_power_fit.a,3),'\pm', num2str(sigma_a_ER_lower,1),')\times S1_c ^{', num2str(ER_lower_power_fit.b,3),'\pm', num2str(sigma_b_ER_lower,1),'}'),'fontsize',16,'interpreter','tex'); + title('feb2015 CH3T') + + s1_phe_both_xyz_all=s1_phe_both_xyz(tritium_cut & inrange(drift_time,[0,110])); + log10_s2s1_xyz_all=log10(s2_phe_both_xyz(tritium_cut & inrange(drift_time,[0,110]))./s1_phe_both_xyz(tritium_cut & inrange(drift_time,[0,110]))); + ER_lower_fit_all=ER_lower_fit; + ER_upper_fit_all=ER_upper_fit; + ER_mean_fit_all=ER_mean_fit; + + + + %Save ER Band fits + save('Sep2015_ERFit','ER_bins','mean_ER_band','ER_sigma','ER_lower_power_fit','ER_upper_power_fit','ER_mean_power_fit','ER_lower_fit','ER_upper_fit','ER_mean_fit'); + \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/EnergySpectra/AverageWidthOfERBands.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/EnergySpectra/AverageWidthOfERBands.m new file mode 100644 index 0000000..4d77de8 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/EnergySpectra/AverageWidthOfERBands.m @@ -0,0 +1,56 @@ +%% Sep 2014 Bands + +%Field Neglected Band +x=[1:0.1:50]; +band_mean_fieldneg=3.17.*x.^-0.101; +band_upper_fieldneg=3.37.*x.^-0.103; +band_width_fieldneg=(band_upper_fieldneg-band_mean_fieldneg)./(1.28); +% average_band_width_fieldneg=mean(band_width_fieldneg); + +%KrypCal Band - uses slightly different ER band than the one in the figures +band_mean_kr=2.99.*x.^-0.11; +band_upper_kr=3.19.*x.^-0.11; +% band_width_kr=(10.^band_upper_kr-10.^band_mean_kr)./(10.^band_mean_kr); +% band_width_kr=(10.^band_mean_kr-10.^band_lower_kr)./(10.^band_mean_kr); +% band_width_kr=(band_mean_kr-band_lower_kr)./(band_mean_kr); +band_width_kr=(band_upper_kr-band_mean_kr)./(1.28); + +% average_band_width_kr=mean(band_width_kr); + +%Improvement in bands: Negative is worse resolution +% kr_width_improvement=(average_band_width_fieldneg-average_band_width_kr)/(average_band_width_fieldneg) +kr_width_improvement=(band_width_fieldneg-band_width_kr)/(band_width_fieldneg); + +mean(kr_width_improvement) + +%Shift in bands: Negative is upward shift +kr_shift=(band_mean_fieldneg-band_mean_kr)/(band_mean_fieldneg) + +%% Sep 2015 Bands +clear all +x=[1:0.1:50]; + +%Field Neglected Band - Mean: 3.23*s1^-0.101, +1.28sig: 3.43*s1^-0.101 + +band_mean_fieldneg=3.23.*x.^-0.101; +band_upper_fieldneg=3.43.*x.^-0.101; +band_width_fieldneg=(band_upper_fieldneg-band_mean_fieldneg)./(1.28); + +%kr Band - Mean: + +band_mean_kr=2.99.*x.^-0.113; +band_upper_kr=3.16.*x.^-0.108; +% band_width_kr=(10.^band_upper_kr-10.^band_mean_kr)./(10.^band_mean_kr); +% band_width_kr=(10.^band_mean_kr-10.^band_lower_kr)./(10.^band_mean_kr); +% band_width_kr=(band_mean_kr-band_lower_kr)./(band_mean_kr); +band_width_kr=(band_upper_kr-band_mean_kr)./(1.28); + +average_band_width_kr=mean(band_width_kr); + +%Improvement in bands: Negative is worse resolution +kr_width_improvement=(band_width_fieldneg-band_width_kr)/(band_width_fieldneg); + +mean(kr_width_improvement) + +%Shift in bands: Negative is upward shift +kr_shift=(band_mean_fieldneg-band_mean_kr)/(band_mean_fieldneg) diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/EnergySpectra/MakeDDEnergySpectra_WithChosenParams.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/EnergySpectra/MakeDDEnergySpectra_WithChosenParams.m new file mode 100644 index 0000000..b228389 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/EnergySpectra/MakeDDEnergySpectra_WithChosenParams.m @@ -0,0 +1,733 @@ +% NEED TO UPDATE THESE POLYNOMIALS AND G1 AND G2 + +s1ab_s2_xyz_fit_map.p1=-0.0097; +s1ab_s2_xyz_fit_map.p2=-1.7; +s1ab_s2_xyz_fit_map.p3=5.7225; + + +s1ab_s1_xyz_fit_map.p1=0.0025; +s1ab_s1_xyz_fit_map.p2=0.4424; +s1ab_s1_xyz_fit_map.p3=-0.2289; + +inpaint_on=1; + +%HAVE TO MAKE THIS .MAT FILE STILL FROM THE DD KR DATASET +load('C:\Program Files\MATLAB\R2012a\bin\Run04_ERBand\Kr2p14_FixedZHisto\MappingParametersFit_Start_Oct2015DDKr.mat') + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Calculate 2015 DD Corrections +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval.*s2_xyfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval.*s2_xyfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval.*s1_xyfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval.*s1_xyfieldremoval); + + + + end + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=1000; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1500]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[5+bin_size, 500] );%from 50 to 300us for the fit, based on when s1as1b values get strange + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + %%Tracker for pseudo-lifetime + s2_at_bottom=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_2015=-320/log(s2_at_bottom/s2_at_top); + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_xbins),floor(s2_ybins)); +Sigma_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); +Count_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>30; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_xbins),floor(s1_ybins)); +Sigma_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); +Count_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>30; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XYZ. 3D Map, caluculate and Submit IQ +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% if Kr_events>150000 +% +% % LUXkrypCal_S1_3D(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_distance_\mus,user_name,file_id_cp,dp_version,submit); +% LUXkrypCal_S1_3D_Run04_local_2p14FixedZHisto(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_time,x_center,y_center,z_center,det_edge,inpaint_on,user_name,file_id_cp,dp_version, algorithm_name, submit); +% +% +% end +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%Apply Corrections to 2015 DD Data +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +% NEED TO LOAD THE DD DATA .MAT FILE HERE +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\Run04_ERBand\Kr2p14_FixedZHisto\Oct2015_DD.mat'); + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'spline',1); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'spline',1); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + %% Redo with r<10 cm + +fid_cut=(drift_time< -s2radius.^2+280) & drift_time>50 & drift_time<250; + +DD_s1_2015=s1_phe_both_xyz(fid_cut); +DD_s2_2015=s2_phe_both_xyz(fid_cut); + +%% NEED TO COME UP WITH CUTS TO SELECT NON DD DATA... FOR INSTANCE, NR CUT? Also a slopped radial cut to cut out wall + +%% Make the plots + + +g1=0.10; ee=0.69; +% g2_sep2014=27.21*ee; %converting to g2 with SE size + g2=25.28*ee; +%Kr 2014 data + +DD_E_2015=(1/73).*(DD_s1_2015./g1+DD_s2_2015./g2); + + +figure +step(DD_E_2015,[0:3:500],'k') +hold on; +line([163.9 163.9],[0 length(DD_E_2015)],'Color','r','LineWidth',2) %Xe131 +% line([236.1 236.1],[0 length(DD_E_2015)],'Color','r','LineWidth',2) %Xe129 +% % line([280 280],[0 length(DD_E_2015)],'Color','r','LineWidth',2) %Xe125? +% line([40 40],[0 length(DD_E_2015)],'Color','r','LineWidth',2) +% line([80 80],[0 length(DD_E_2015)],'Color','r','LineWidth',2) +% % line([33.2 33.2],[0 length(DD_E_2015)],'Color','r','LineWidth',2) %Xray (127?) +% % line([5.3 5.3],[0 length(DD_E_2015)],'Color','r','LineWidth',2) %xray (127?) +% line([275 275],[0 length(DD_E_2015)],'Color','r','LineWidth',2) +ylim([0 100]); +xlim([20 400]); +xlabel('Energy (keV)'); ylabel('Counts'); myfigview(16); +legend('Data','Expected'); + +ht=text(0,0,'Xe125 (275 keV)'); +set(ht,'FontSize',18) +set(ht,'Rotation',90) +set(ht,'Color',[1 0 0]) + +ht=text(0,0,'Xe129 (236 keV)'); +set(ht,'FontSize',18) +set(ht,'Rotation',90) +set(ht,'Color',[1 0 0]) + +ht=text(0,0,'Xe 131 (163.9 keV)'); +set(ht,'FontSize',18) +set(ht,'Rotation',90) +set(ht,'Color',[1 0 0]) + +ht=text(0,0,'Xe 129 (40 keV)'); +set(ht,'FontSize',18) +set(ht,'Rotation',90) +set(ht,'Color',[1 0 0]) + +ht=text(0,0,'Xe 131 (80 keV)'); +set(ht,'FontSize',18) +set(ht,'Rotation',90) +set(ht,'Color',[1 0 0]) + +%% Fit to the mose distinguishable DD peaks + +cut_40kev=inrange(DD_E_2015,[30 60]); +cut_80kev=inrange(DD_E_2015,[70 95]); +cut_164kev=inrange(DD_E_2015,[140 180]); +cut_236kev=inrange(DD_E_2015,[210,250]); +cut_275kev=inrange(DD_E_2015,[265,285]); + +fit_40kev=fit([30:3:60].',hist(DD_E_2015(cut_40kev),[30:3:60]).','gauss1'); +fit_80kev=fit([70:3:95].',hist(DD_E_2015(cut_80kev),[70:3:95]).','gauss1'); +fit_164kev=fit([140:3:180].',hist(DD_E_2015(cut_164kev),[140:3:180]).','gauss1'); +fit_236kev=fit([210:3:250].',hist(DD_E_2015(cut_236kev),[210:3:250]).','gauss1'); +fit_275kev=fit([265:3:285].',hist(DD_E_2015(cut_275kev),[265:3:285]).','gauss1'); + +resolution_40keV=(fit_40kev.c1/sqrt(2))/fit_40kev.b1 +resolution_80keV=(fit_80kev.c1/sqrt(2))/fit_80kev.b1 +resolution_164keV=(fit_164kev.c1/sqrt(2))/fit_164kev.b1 +resolution_236keV=(fit_236kev.c1/sqrt(2))/fit_236kev.b1 +resolution_275keV=(fit_275kev.c1/sqrt(2))/fit_275kev.b1 + +%show the fits +% figure +% step(DD_E_2015,[0:3:500],'-k'); +hold on; +x=[25:1:60]; y=fit_40kev.a1.*exp(-((x-fit_40kev.b1)./fit_40kev.c1).^2); +plot(x,y,'-b','LineWidth',2); +x=[60:3:120]; y=fit_80kev.a1.*exp(-((x-fit_80kev.b1)./fit_80kev.c1).^2); +plot(x,y,'-b','LineWidth',2); +x=[130:3:190]; y=fit_164kev.a1.*exp(-((x-fit_164kev.b1)./fit_164kev.c1).^2); +plot(x,y,'-b','LineWidth',2); +x=[200:3:260]; y=fit_236kev.a1.*exp(-((x-fit_236kev.b1)./fit_236kev.c1).^2); +plot(x,y,'-b','LineWidth',2); +x=[260:3:295]; y=fit_275kev.a1.*exp(-((x-fit_275kev.b1)./fit_275kev.c1).^2); +plot(x,y,'-b','LineWidth',2); +line([236.1 236.1],[0 length(DD_E_2015)],'Color','r','LineWidth',2) %Xe129 +line([40 40],[0 length(DD_E_2015)],'Color','r','LineWidth',2) +line([80 80],[0 length(DD_E_2015)],'Color','r','LineWidth',2) +line([275 275],[0 length(DD_E_2015)],'Color','r','LineWidth',2) +ylim([0 100]); +xlim([20 400]); +legend('Data','Expected','Fits'); + +fit_40kev.b1 +fit_40kev.c1/sqrt(2) +temp=confint(fit_40kev,0.68); +abs(fit_40kev.b1-temp(1,2)) +abs(fit_40kev.c1-temp(1,3))/sqrt(2) + +fit_80kev.b1 +fit_80kev.c1/sqrt(2) +temp=confint(fit_80kev,0.68); +abs(fit_80kev.b1-temp(1,2)) +abs(fit_80kev.c1-temp(1,3))/sqrt(2) + +fit_164kev.b1 +fit_164kev.c1/sqrt(2) +temp=confint(fit_164kev,0.68); +abs(fit_164kev.b1-temp(1,2)) +abs(fit_164kev.c1-temp(1,3))/sqrt(2) + + +fit_236kev.b1 +fit_236kev.c1/sqrt(2) +temp=confint(fit_236kev,0.68); +abs(fit_236kev.b1-temp(1,2)) +abs(fit_236kev.c1-temp(1,3))/sqrt(2) + +fit_275kev.b1 +fit_275kev.c1/sqrt(2) +temp=confint(fit_275kev,0.68); +abs(fit_275kev.b1-temp(1,2)) +abs(fit_275kev.c1-temp(1,3))/sqrt(2) \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/EnergySpectra/MakeERBand_WithChosenParams.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/EnergySpectra/MakeERBand_WithChosenParams.m new file mode 100644 index 0000000..186dce3 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/EnergySpectra/MakeERBand_WithChosenParams.m @@ -0,0 +1,1735 @@ +% NEED TO UPDATE THESE POLYNOMIALS AND G1/G2 + +s1ab_s2_xyz_fit_map.p1=-0.0097; +s1ab_s2_xyz_fit_map.p2=-1.7; +s1ab_s2_xyz_fit_map.p3=5.7225; + + +s1ab_s1_xyz_fit_map.p1=0.0025; +s1ab_s1_xyz_fit_map.p2=0.4424; +s1ab_s1_xyz_fit_map.p3=-0.2289; + +inpaint_on=1; + +%HAVE TO MAKE THIS .MAT FILE STILL - USE class 1 and class 9 for S1 +load('C:\Program Files\MATLAB\R2012a\bin\Run04_ERBand\Kr2p20\MappingParametersFit_Start_2015_CutDown.mat') + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Calculate 2015 Corrections +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval.*s2_xyfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval.*s2_xyfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval.*s1_xyfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval.*s1_xyfieldremoval); + + + + end + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=1000; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1500]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + + % % Making a plot of the S2 Z dependence +% figure +colors={'r','b','g'}; +colors2={[1 0.6 0.6],[0.6 0.6 1],[0.6 1 0.6]}; +hold on; +i=1; +for dT_max=90:60:210; +s2z_fit_temp=fit(x,hist(s1_phe_both(cut==1 & inrange(drift_time,[dT_max-60 dT_max])),x)','gauss1'); +step(s1_phe_both(cut==1 & inrange(drift_time,[dT_max-60 dT_max])),x.',colors2{i}); +xx=[0:1:400]; y=s2z_fit_temp.a1.*exp(-((xx-s2z_fit_temp.b1)./s2z_fit_temp.c1).^2); +i=i+1; +end +legend('30-90 uSec','90-150 uSec','150-210 uSec'); +myfigview(16); +xlabel('S1_F (phe)'); ylabel('Counts'); +i=1; +for dT_max=90:60:210; +s2z_fit_temp=fit(x,hist(s1_phe_both(cut==1 & inrange(drift_time,[dT_max-60 dT_max])),x)','gauss1'); +xx=[0:1:400]; y=s2z_fit_temp.a1.*exp(-((xx-s2z_fit_temp.b1)./s2z_fit_temp.c1).^2); plot(xx,y,'LineWidth',2,'Color',colors{i}); +i=i+1; +end +xlim([100 350]) + + + +% Plot s1 z dep + + light_correction_fig = figure; + errorbar(mean_index,means,means_error,'.k'); + hold on + [yplot_s1_both] = polyval(P_s1_both,dT_fit); + [center_s1_both, center_s1_both_err] = polyval(P_s1_both,z_center, S); %160[us]*1.51[\mus/us] + plot(dT_fit,yplot_s1_both,'-r','LineWidth',1); + xlabel('Drift Time(\mus)', 'FontSize',16); ylabel('S1_F (phe)', 'FontSize', 16); +% title(strcat(file_id_cp,'.Kr83m. S1 Mean vs. Z'), 'FontSize', 16,'Interpreter','none'); + line([0 det_edge],[center_s1_both center_s1_both],'linestyle','--'); + line([z_center; z_center;],[min(means) max(means)],'linestyle','--'); + legend('S1\_both Mean', strcat('y=', num2str(P_s1_both(1),'%10.2e'), '*Z^2 + ', num2str(P_s1_both(2),'%10.2e')... + , '*Z + ', num2str(P_s1_both(3),4)),strcat('Det center = ',num2str(center_s1_both,4), ' [Phe]'),'location','northwest') + + box on; + myfigview(16); + xlim([0 det_edge]); + ylim([0.8*min(means) 1.15*max(means)]); +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[5+bin_size, 500] );%from 50 to 300us for the fit, based on when s1as1b values get strange + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + %%Tracker for pseudo-lifetime + s2_at_bottom=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_2015=-320/log(s2_at_bottom/s2_at_top); + + % % Making a plot of the S2 Z dependence +% figure +colors={'r','b','g'}; +colors2={[1 0.6 0.6],[0.6 0.6 1],[0.6 1 0.6]}; +hold on; +i=1; +for dT_max=90:60:210; +s2z_fit_temp=fit(x2,hist(s2_phe_both(cut==1 & inrange(drift_time,[dT_max-60 dT_max])),x2)','gauss1'); +step(s2_phe_both(cut==1 & inrange(drift_time,[dT_max-60 dT_max])),x2.',colors2{i}); +xx=[0:10:50000]; y=s2z_fit_temp.a1.*exp(-((xx-s2z_fit_temp.b1)./s2z_fit_temp.c1).^2); +i=i+1; +end +legend('30-90 uSec','90-150 uSec','150-210 uSec'); +myfigview(16); +xlabel('S2_F (phe)'); ylabel('Counts'); +i=1; +for dT_max=90:60:210; +s2z_fit_temp=fit(x2,hist(s2_phe_both(cut==1 & inrange(drift_time,[dT_max-60 dT_max])),x2)','gauss1'); +xx=[0:10:50000]; y=s2z_fit_temp.a1.*exp(-((xx-s2z_fit_temp.b1)./s2z_fit_temp.c1).^2); plot(xx,y,'LineWidth',2,'Color',colors{i}); +i=i+1; +end +xlim([5000 30000]) + +% S2_E Z dep figure + + lifetime_fig_both = figure; + errorbar(mean_index(2:end),means(2:end),means_error(2:end),'.k'); %first bin is anode, skip it + hold on + plot([0:0.1:350],RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,[0:0.1:350]),'-r','LineWidth',1); + xlabel('Drift Time (\mus)', 'FontSize',16); ylabel('S2_F (phe)', 'FontSize', 16); +% title(strcat(file_id_cp,'.Kr83m. S2_both Electron Lifetime'), 'FontSize', 16,'Interpreter','none'); + myfigview(16); + xlim([0 det_edge]); + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_xbins),floor(s2_ybins)); +Sigma_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); +Count_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>30; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + + + %centerS2b= 1; %interp2(s2xbins,s2ybins,mean_S2_bottom_xy,x_center,y_center,'spline'); + + color_range_max= max(max(mean_S2_both_xy)) ; + color_range_min= min(min(mean_S2_both_xy(mean_S2_both_xy>0))) ; + vc_step=(color_range_max-color_range_min)/50; + + vc=color_range_min:vc_step:color_range_max; + + s2_xy_both_fig = figure; + contourf(s2xbins,s2ybins,mean_S2_both_xy,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S2_F (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_xbins),floor(s1_ybins)); +Sigma_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); +Count_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>30; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +%plot + +color_range_max=max(max(mean_S1_both_xy)); +color_range_min=min(min(mean_S1_both_xy(mean_S1_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + +s1_xy_both_fig = figure; +contourf(s1xbins,s1ybins,mean_S1_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'S1_F (phe)','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XYZ. 3D Map, caluculate and Submit IQ +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% if Kr_events>150000 +% +% % LUXkrypCal_S1_3D(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_distance_\mus,user_name,file_id_cp,dp_version,submit); +% LUXkrypCal_S1_3D_Run04_local_2p14FixedZHisto(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_time,x_center,y_center,z_center,det_edge,inpaint_on,user_name,file_id_cp,dp_version, algorithm_name, submit); +% +% +% end + + +%% Apply corrections to CH3T and calculate the ER band shift + +%First load the data + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\Run04_ERBand\Kr2p20\CH3T_Sep2015_NoCorrections.mat'); + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = S2_x; +s1_y_cm = S2_y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'spline',1); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,S2_x,S2_y,'spline',1); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +%% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + h3_cut= inrange(drift_time,[40 300]) & inrange(s2radius_c,[0,18]) & inrange(s1_phe_both,[0 120]) ... + & (log10(s1_phe_both)+0.5*log10(s2_phe_both_xyz)<4) & s2_phe_both>100 & s2_phe_both<16000 ... + & drift_time<-2.*s2radius.^2+380; %used to be drift time 100 to 250 + +h3_s1_c_2015=s1_phe_both_xyz(h3_cut); +h3_s2_c_2015=s2_phe_both_xyz(h3_cut); +drift_time_2015=drift_time(h3_cut); +s2radius_2015=s2radius(h3_cut); + + kr_cut= inrange(drift_time,[40 300]) & inrange(s2radius_c,[0,18]) & inrange(s1_phe_both,[30 1000]) ... + & (log10(s1_phe_both)+0.5*log10(s2_phe_both_xyz)>4) & s2_phe_both>3000 & s2_phe_both<60000 ... + & drift_time<-2.*s2radius.^2+380; %used to be drift time 100 to 250 + + +kr_s1_c_2015=s1_phe_both_xyz(kr_cut); +kr_s2_c_2015=s2_phe_both_xyz(kr_cut); +kr_2015_drift_time=drift_time(kr_cut); +kr_2015_s2x=S2_x(kr_cut); +kr_2015_s2y=S2_y(kr_cut); + + clearvars -except param_counter a1_list b1_list a2_list b2_list total_chi2_list h3_chi2_list kr_chi2_list g1_list g2_list total_chi2_map h3_chi2_map kr_chi2_map chi2_midtobot_list... + best_chi2_midtotop besta1_midtotop besta2_midtotop bestb1_midtotop bestb2_midtotop best_chi2_midtobot... + besta1_midtobot besta1_midtotop bestb1_midtobot bestb1_midtotop a1 b1 a2 b2 chi2_midtotop_map chi2_midtobot_map b_counter a_counter... + besta1_combined bestb1_combined besta2_combined bestb2_combined best_chi2_combined chi2_combined_map chi2_combined_list b1_counter a1_counter a2_counter b2_counter... + a1_counter b1_counter a2_counter b2_counter c1_list c2_list bestc1_midtobot bestc2_midtobot bestc1_midtotop bestc2_midtotop bestc1_combined bestc2_combined... + besta1_combined besta2_combined bestb1_combined bestb2_combined besta1 bestb1 bestc1 besta2 bestb2 bestc2 bestg1 bestg2 best_total_chi2 NEST_CH3T_Spectrum inpaint_on... + best_kr_chi2 best_h3_chi2 electron_lifetime_list electron_lifetime_map a2_start a1_start b1_start b2_start ... + total_h3_chi2_list total_kr_chi2_list total_chi2_list h3_chi2_2014_list h3_chi2_2015_list kr_chi2_2014_list kr_chi2_2015_list ... + electron_lifetime_2014_list electron_lifetime_2015_list total_h3_chi2_map total_kr_chi2_map total_chi2_map h3_chi2_2014_map h3_chi2_2015_map ... + kr_chi2_2014_map kr_chi2_2015_map electron_lifetime_2014_map electron_lifetime_2015_map NEST_CH3T_Spectrum g1 g2 bestg1 bestg2 g1_counter g2_counter ... + firsta1 firstb1 firsta2 firstb2 firstg1 firstg2 kr_means_2015_map kr_means_2014_map kr_sigma_2015_map kr_sigma_2014_map kr_staterr_2015_map kr_staterr_2014_map ... + kr_means_2015_list kr_means_2014_list kr_2015_num_events kr_2014_num_events kr_sigma_2015_list kr_sigma_2014_list kr_staterr_2015_list kr_staterr_2014_list ... + pseudo_lifetime_2014 pseudo_lifetime_2015 kr_s1_c_2015 kr_s2_c_2015 h3_s1_c_2015 h3_s2_c_2015 s1ab_s2_xyz_fit_map s1ab_s1_xyz_fit_map ... + kr_2015_drift_time kr_2015_s2x kr_2015_s2y kr_chi2_2014_zslice_list kr_chi2_2015_zslice_list kr_chi2_zslice_zcenter_list ... + full_kr_chi2_2014_list full_kr_chi2_2015_list best_total_kr_chi2 best_total_h3_chi2 drift_time_2015 s2radius_2015 drift_time_2014 s2radius_2014 + + + + +%%%%%%%%%%%%%%%%%%%%% +%% REPEAT FOR 2014 DATA +%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\Run04_ERBand\Kr2p20\MappingParametersFit_Start_2014_CutDown.mat') + + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval.*s2_xyfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval.*s2_xyfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval.*s1_xyfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval.*s1_xyfieldremoval); + + + + end + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[5+bin_size, 500] );%from 50 to 300us for the fit, based on when s1as1b values get strange + +s2_both_norm_z_index=mean_index(dT_range); +s2_both_norm_z_means=means(dT_range); + s2_at_top=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + %%Tracker for pseudo-lifetime + s2_at_bottom=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_2014=-320/log(s2_at_bottom/s2_at_top); +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_xbins),floor(s2_ybins)); +Sigma_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); +Count_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>30; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_xbins),floor(s1_ybins)); +Sigma_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); +Count_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>30; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Apply corrections to 2014 Kr data +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\Run04_ERBand\Kr2p20\MappingParametersFit_Start_2014_CutDown.mat') + + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; +% +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'spline',1); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'spline',1); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate ER Band shift +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + liquid_cut= inrange(drift_time,[40 300]) & inrange(s2radius,[0,18]) & inrange(s1_phe_both_xyz,[30 1000]) ... + & (log10(s1_phe_both_xyz)+0.5*log10(s2_phe_both_xyz)>4.2) & s2_phe_both>3000 & s2_phe_both<60000 ... ;%used to be drift time 100 to 250 + & drift_time<-1.4.*s2radius.^2+400; + + +kr_s1_c_2014=s1_phe_both_xyz(liquid_cut); +kr_s2_c_2014=s2_phe_both_xyz(liquid_cut); +kr_2014_drift_time=drift_time(liquid_cut); +kr_2014_s2x=s2x(liquid_cut); +kr_2014_s2y=s2y(liquid_cut); + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%Apply Corrections to 2014 CH3T Data +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\Run04_ERBand\Kr2p20\CH3T_Sep2014_NoCorrections.mat'); + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +% electron_lifetime_2014=e_lifetime_both; +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = S2_x; +s1_y_cm = S2_y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'spline',1); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,S2_x,S2_y,'spline',1); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate ER Band shift +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +s1_min=0; +s1_max=120; + + %% Redo with r<10 cm + + liquid_cut= clean_cut & inrange(drift_time,[40 300]) & inrange(s2radius_c,[0,18]) & inrange(s1_phe_both_xyz,[s1_min s1_max]) ... + & (log10(s1_phe_both_xyz)+0.5*log10(s2_phe_both_xyz)<4.2) & s2_phe_both>100 & s2_phe_both<16000 ... ;%used to be drift time 100 to 250 + & drift_time<-1.4.*s2radius.^2+400; + +h3_s1_c_2014=s1_phe_both_xyz(liquid_cut); +h3_s2_c_2014=s2_phe_both_xyz(liquid_cut); +drift_time_2014=drift_time(liquid_cut); +s2radius_2014=s2radius(liquid_cut); + + clearvars -except param_counter a1_list b1_list a2_list b2_list total_chi2_list h3_chi2_list kr_chi2_list g1_list g2_list total_chi2_map h3_chi2_map kr_chi2_map chi2_midtobot_list... + best_chi2_midtotop besta1_midtotop besta2_midtotop bestb1_midtotop bestb2_midtotop best_chi2_midtobot... + besta1_midtobot besta1_midtotop bestb1_midtobot bestb1_midtotop a1 b1 a2 b2 chi2_midtotop_map chi2_midtobot_map b_counter a_counter... + besta1_combined bestb1_combined besta2_combined bestb2_combined best_chi2_combined chi2_combined_map chi2_combined_list b1_counter a1_counter a2_counter b2_counter... + a1_counter b1_counter a2_counter b2_counter c1_list c2_list bestc1_midtobot bestc2_midtobot bestc1_midtotop bestc2_midtotop bestc1_combined bestc2_combined... + besta1_combined besta2_combined bestb1_combined bestb2_combined besta1 bestb1 bestc1 besta2 bestb2 bestc2 bestg1 bestg2 best_total_chi2 NEST_CH3T_Spectrum inpaint_on... + best_kr_chi2 best_h3_chi2 electron_lifetime_list electron_lifetime_map a2_start a1_start b1_start b2_start ... + total_h3_chi2_list total_kr_chi2_list total_chi2_list h3_chi2_2014_list h3_chi2_2015_list kr_chi2_2014_list kr_chi2_2015_list ... + electron_lifetime_2014_list electron_lifetime_2015_list total_h3_chi2_map total_kr_chi2_map total_chi2_map h3_chi2_2014_map h3_chi2_2015_map ... + kr_chi2_2014_map kr_chi2_2015_map electron_lifetime_2014_map electron_lifetime_2015_map NEST_CH3T_Spectrum g1 g2 bestg1 bestg2 g1_counter g2_counter ... + firsta1 firstb1 firsta2 firstb2 firstg1 firstg2 kr_means_2015_map kr_means_2014_map kr_sigma_2015_map kr_sigma_2014_map kr_staterr_2015_map kr_staterr_2014_map ... + kr_means_2015_list kr_means_2014_list kr_2015_num_events kr_2014_num_events kr_sigma_2015_list kr_sigma_2014_list kr_staterr_2015_list kr_staterr_2014_list ... + pseudo_lifetime_2014 pseudo_lifetime_2015 kr_s1_c_2015 kr_s2_c_2015 h3_s1_c_2015 h3_s2_c_2015 kr_s1_c_2014 kr_s2_c_2014 h3_s1_c_2014 h3_s2_c_2014 ... + kr_2015_drift_time kr_2015_s2x kr_2015_s2y kr_2014_drift_time kr_2014_s2x kr_2014_s2y ... + kr_chi2_2014_zslice_list kr_chi2_2015_zslice_list kr_chi2_zslice_zcenter_list ... + full_kr_chi2_2014_list full_kr_chi2_2015_list best_total_kr_chi2 best_total_h3_chi2 drift_time_2015 s2radius_2015 drift_time_2014 s2radius_2014 + +%% Make 2015 plots + +s1_min=0; +s1_max=50; + + +%% reset fiducial for ER band plots +max_r=21; +fiducial_cut=inrange(drift_time_2015,[40 300]) & inrange(s2radius_2015,[0,max_r]); +tritium_cut= inrange(h3_s1_c_2015,[0 50]) & fiducial_cut; + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:.05:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=tritium_cut & inrange(h3_s1_c_2015,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(h3_s2_c_2015(ER_fit_cut)./h3_s1_c_2015(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(h3_s2_c_2015(ER_fit_cut)./h3_s1_c_2015(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); + %ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + b=confint(ER_mean_power_fit,.68); + sigma_a_ER_mean=(b(2,1)-b(1,1))/2; + sigma_b_ER_mean=(b(2,2)-b(1,2))/2; + + ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + b=confint(ER_lower_power_fit,.68); + sigma_a_ER_lower=(b(2,1)-b(1,1))/2; + sigma_b_ER_lower=(b(2,2)-b(1,2))/2; + + ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + b=confint(ER_upper_power_fit,.68); + sigma_a_ER_upper=(b(2,1)-b(1,1))/2; + sigma_b_ER_upper=(b(2,2)-b(1,2))/2; + + + %Make Plot + + no_fid_new=figure; + hold on + %plot(s1_phe_both_xyz(tritium_cut),log10(s2_phe_both_xyz(tritium_cut)./s1_phe_both_xyz(tritium_cut)),'ok','markersize',2) + density(h3_s1_c_2015(tritium_cut),log10(h3_s2_c_2015(tritium_cut)./h3_s1_c_2015(tritium_cut)),[0:.2:100],[0:.02:4]); +% densityplot(s1_phe_both_xyz(tritium_cut),log10(s2_phe_both_xyz(tritium_cut)./s1_phe_both_xyz(tritium_cut)),'rectangle',[.5 .05],'lin'); + cc=colorbar; + ylabel(cc,'Count','FontSize',16); + colormap; + ylabel('Corrected log10(S2_E/S1_E)'); xlabel('S1_E corrected (Pulse Area Phe)'); + title(sprintf('Sep 2015 Run 04 CH3T ',max_r),'fontsize',16,'Interpreter','none'); + myfigview(16); + ylim([0 3.5]);xlim([0 s1_max]); +% plot(ER_bins,lower_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_lower_fit,'--k','markersize',14,'linewidth',2) +% plot(ER_bins,mean_ER_band,'ok','markersize',6,'linewidth',2)%plot mean of ER band + plot(ER_bins,ER_mean_fit,'-k','markersize',20,'linewidth',2) +% plot(ER_bins,upper_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_upper_fit,'--k','markersize',14,'linewidth',2) + + + bin_step=2; + + total_count=length(log10(h3_s2_c_2015(tritium_cut))); + + + box; + text(10,2.8,strcat('Total Count= ',num2str(total_count)),'fontsize',16); + %text(5,.7,strcat('NEST\_SE_{bot} Fit=',num2str(ER_mean_NEST_fit.SE_ER_fit*73/64*27/max_r,3),'\pm ', num2str(sigma_SE_ER_fit*73/64*27/max_r,2),'[Phe]'),'fontsize',16,'color','m','interpreter','tex'); + %text(5,.8,'NEST Platinum V4-b', 'fontsize',16,'color','m','interpreter','tex' ); + text(5,.55,strcat('+',num2str(band_sigma),'\sigma = (',num2str(ER_upper_power_fit.a,3),'\pm', num2str(sigma_a_ER_upper,1) ,')\times S1_c ^{', num2str(ER_upper_power_fit.b,3),'\pm',num2str(sigma_b_ER_upper,1),'}'),'fontsize',16,'interpreter','tex'); + text(5,.3,strcat('Mean=(',num2str(ER_mean_power_fit.a,3),'\pm', num2str(sigma_a_ER_mean,1),')\times S1_c ^{', num2str(ER_mean_power_fit.b,3),'\pm', num2str(sigma_b_ER_mean,1),'}'),'fontsize',16,'interpreter','tex'); + text(5,.05,strcat('-',num2str(band_sigma),'\sigma = (',num2str(ER_lower_power_fit.a,3),'\pm', num2str(sigma_a_ER_lower,1),')\times S1_c ^{', num2str(ER_lower_power_fit.b,3),'\pm', num2str(sigma_b_ER_lower,1),'}'),'fontsize',16,'interpreter','tex'); + + + +%% Make 2014 plots + +s1_min=0; +s1_max=50; + + +%% reset fiducial for ER band plots +max_r=21; +fiducial_cut=inrange(drift_time_2014,[40 300]) & inrange(s2radius_2014,[0,max_r]); +tritium_cut= inrange(h3_s1_c_2014,[0 50]) & fiducial_cut; + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:.05:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=tritium_cut & inrange(h3_s1_c_2014,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(h3_s2_c_2014(ER_fit_cut)./h3_s1_c_2014(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(h3_s2_c_2014(ER_fit_cut)./h3_s1_c_2014(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); + %ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + b=confint(ER_mean_power_fit,.68); + sigma_a_ER_mean=(b(2,1)-b(1,1))/2; + sigma_b_ER_mean=(b(2,2)-b(1,2))/2; + + ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + b=confint(ER_lower_power_fit,.68); + sigma_a_ER_lower=(b(2,1)-b(1,1))/2; + sigma_b_ER_lower=(b(2,2)-b(1,2))/2; + + ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + b=confint(ER_upper_power_fit,.68); + sigma_a_ER_upper=(b(2,1)-b(1,1))/2; + sigma_b_ER_upper=(b(2,2)-b(1,2))/2; + + + %Make Plot + + no_fid_new=figure; + hold on + %plot(s1_phe_both_xyz(tritium_cut),log10(s2_phe_both_xyz(tritium_cut)./s1_phe_both_xyz(tritium_cut)),'ok','markersize',2) + density(h3_s1_c_2014(tritium_cut),log10(h3_s2_c_2014(tritium_cut)./h3_s1_c_2014(tritium_cut)),[0:.2:100],[0:.02:4]); +% densityplot(s1_phe_both_xyz(tritium_cut),log10(s2_phe_both_xyz(tritium_cut)./s1_phe_both_xyz(tritium_cut)),'rectangle',[.5 .05],'lin'); + cc=colorbar; + ylabel(cc,'Count','FontSize',16); + colormap; + ylabel('Corrected log10(S2_E/S1_E)'); xlabel('S1_E corrected (Pulse Area Phe)'); + title(sprintf('Sep 2014 Run 04 CH3T ',max_r),'fontsize',16,'Interpreter','none'); + myfigview(16); + ylim([0 3.5]);xlim([0 s1_max]); +% plot(ER_bins,lower_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_lower_fit,'--k','markersize',14,'linewidth',2) +% plot(ER_bins,mean_ER_band,'ok','markersize',6,'linewidth',2)%plot mean of ER band + plot(ER_bins,ER_mean_fit,'-k','markersize',20,'linewidth',2) +% plot(ER_bins,upper_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_upper_fit,'--k','markersize',14,'linewidth',2) + + + bin_step=2; + + total_count=length(log10(h3_s2_c_2014(tritium_cut))); + + + box; + text(10,2.8,strcat('Total Count= ',num2str(total_count)),'fontsize',16); + %text(5,.7,strcat('NEST\_SE_{bot} Fit=',num2str(ER_mean_NEST_fit.SE_ER_fit*73/64*27/max_r,3),'\pm ', num2str(sigma_SE_ER_fit*73/64*27/max_r,2),'[Phe]'),'fontsize',16,'color','m','interpreter','tex'); + %text(5,.8,'NEST Platinum V4-b', 'fontsize',16,'color','m','interpreter','tex' ); + text(5,.55,strcat('+',num2str(band_sigma),'\sigma = (',num2str(ER_upper_power_fit.a,3),'\pm', num2str(sigma_a_ER_upper,1) ,')\times S1_c ^{', num2str(ER_upper_power_fit.b,3),'\pm',num2str(sigma_b_ER_upper,1),'}'),'fontsize',16,'interpreter','tex'); + text(5,.3,strcat('Mean=(',num2str(ER_mean_power_fit.a,3),'\pm', num2str(sigma_a_ER_mean,1),')\times S1_c ^{', num2str(ER_mean_power_fit.b,3),'\pm', num2str(sigma_b_ER_mean,1),'}'),'fontsize',16,'interpreter','tex'); + text(5,.05,strcat('-',num2str(band_sigma),'\sigma = (',num2str(ER_lower_power_fit.a,3),'\pm', num2str(sigma_a_ER_lower,1),')\times S1_c ^{', num2str(ER_lower_power_fit.b,3),'\pm', num2str(sigma_b_ER_lower,1),'}'),'fontsize',16,'interpreter','tex'); + + + + \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/EnergySpectra/MakeEnergySpectra_WithChosenParams_Slices.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/EnergySpectra/MakeEnergySpectra_WithChosenParams_Slices.m new file mode 100644 index 0000000..66f677f --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/RecombPhysicsResult/EnergySpectra/MakeEnergySpectra_WithChosenParams_Slices.m @@ -0,0 +1,1691 @@ +% NEED TO UPDATE THESE POLYNOMIALS AND G1/G2 + +s1ab_s2_xyz_fit_map.p1=-0.0097; +s1ab_s2_xyz_fit_map.p2=-1.7; +s1ab_s2_xyz_fit_map.p3=5.7225; + + +s1ab_s1_xyz_fit_map.p1=0.0025; +s1ab_s1_xyz_fit_map.p2=0.4424; +s1ab_s1_xyz_fit_map.p3=-0.2289; + +inpaint_on=1; + +%HAVE TO MAKE THIS .MAT FILE STILL - USE class 1 and class 9 for S1 +load('C:\Program Files\MATLAB\R2012a\bin\Run04_ERBand\Kr2p20\MappingParametersFit_Start_2015_CutDown.mat') + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Calculate 2015 Corrections +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval.*s2_xyfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval.*s2_xyfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval.*s1_xyfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval.*s1_xyfieldremoval); + + + + end + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=1000; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1500]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + + % % Making a plot of the S2 Z dependence +% figure +colors={'r','b','g'}; +colors2={[1 0.6 0.6],[0.6 0.6 1],[0.6 1 0.6]}; +hold on; +i=1; +for dT_max=90:60:210; +s2z_fit_temp=fit(x,hist(s1_phe_both(cut==1 & inrange(drift_time,[dT_max-60 dT_max])),x)','gauss1'); +step(s1_phe_both(cut==1 & inrange(drift_time,[dT_max-60 dT_max])),x.',colors2{i}); +xx=[0:1:400]; y=s2z_fit_temp.a1.*exp(-((xx-s2z_fit_temp.b1)./s2z_fit_temp.c1).^2); +i=i+1; +end +legend('30-90 uSec','90-150 uSec','150-210 uSec'); +myfigview(16); +xlabel('S1_F (phe)'); ylabel('Counts'); +i=1; +for dT_max=90:60:210; +s2z_fit_temp=fit(x,hist(s1_phe_both(cut==1 & inrange(drift_time,[dT_max-60 dT_max])),x)','gauss1'); +xx=[0:1:400]; y=s2z_fit_temp.a1.*exp(-((xx-s2z_fit_temp.b1)./s2z_fit_temp.c1).^2); plot(xx,y,'LineWidth',2,'Color',colors{i}); +i=i+1; +end +xlim([100 350]) + + + +% Plot s1 z dep + + light_correction_fig = figure; + errorbar(mean_index,means,means_error,'.k'); + hold on + [yplot_s1_both] = polyval(P_s1_both,dT_fit); + [center_s1_both, center_s1_both_err] = polyval(P_s1_both,z_center, S); %160[us]*1.51[\mus/us] + plot(dT_fit,yplot_s1_both,'-r','LineWidth',1); + xlabel('Drift Time(\mus)', 'FontSize',16); ylabel('S1_F (phe)', 'FontSize', 16); +% title(strcat(file_id_cp,'.Kr83m. S1 Mean vs. Z'), 'FontSize', 16,'Interpreter','none'); + line([0 det_edge],[center_s1_both center_s1_both],'linestyle','--'); + line([z_center; z_center;],[min(means) max(means)],'linestyle','--'); + legend('S1\_both Mean', strcat('y=', num2str(P_s1_both(1),'%10.2e'), '*Z^2 + ', num2str(P_s1_both(2),'%10.2e')... + , '*Z + ', num2str(P_s1_both(3),4)),strcat('Det center = ',num2str(center_s1_both,4), ' [Phe]'),'location','northwest') + + box on; + myfigview(16); + xlim([0 det_edge]); + ylim([0.8*min(means) 1.15*max(means)]); +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[5+bin_size, 500] );%from 50 to 300us for the fit, based on when s1as1b values get strange + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + %%Tracker for pseudo-lifetime + s2_at_bottom=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_2015=-320/log(s2_at_bottom/s2_at_top); + + % % Making a plot of the S2 Z dependence +% figure +colors={'r','b','g'}; +colors2={[1 0.6 0.6],[0.6 0.6 1],[0.6 1 0.6]}; +hold on; +i=1; +for dT_max=90:60:210; +s2z_fit_temp=fit(x2,hist(s2_phe_both(cut==1 & inrange(drift_time,[dT_max-60 dT_max])),x2)','gauss1'); +step(s2_phe_both(cut==1 & inrange(drift_time,[dT_max-60 dT_max])),x2.',colors2{i}); +xx=[0:10:50000]; y=s2z_fit_temp.a1.*exp(-((xx-s2z_fit_temp.b1)./s2z_fit_temp.c1).^2); +i=i+1; +end +legend('30-90 uSec','90-150 uSec','150-210 uSec'); +myfigview(16); +xlabel('S2_F (phe)'); ylabel('Counts'); +i=1; +for dT_max=90:60:210; +s2z_fit_temp=fit(x2,hist(s2_phe_both(cut==1 & inrange(drift_time,[dT_max-60 dT_max])),x2)','gauss1'); +xx=[0:10:50000]; y=s2z_fit_temp.a1.*exp(-((xx-s2z_fit_temp.b1)./s2z_fit_temp.c1).^2); plot(xx,y,'LineWidth',2,'Color',colors{i}); +i=i+1; +end +xlim([5000 30000]) + +% S2_E Z dep figure + + lifetime_fig_both = figure; + errorbar(mean_index(2:end),means(2:end),means_error(2:end),'.k'); %first bin is anode, skip it + hold on + plot([0:0.1:350],RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,[0:0.1:350]),'-r','LineWidth',1); + xlabel('Drift Time (\mus)', 'FontSize',16); ylabel('S2_F (phe)', 'FontSize', 16); +% title(strcat(file_id_cp,'.Kr83m. S2_both Electron Lifetime'), 'FontSize', 16,'Interpreter','none'); + myfigview(16); + xlim([0 det_edge]); + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_xbins),floor(s2_ybins)); +Sigma_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); +Count_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>30; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + + + %centerS2b= 1; %interp2(s2xbins,s2ybins,mean_S2_bottom_xy,x_center,y_center,'spline'); + + color_range_max= max(max(mean_S2_both_xy)) ; + color_range_min= min(min(mean_S2_both_xy(mean_S2_both_xy>0))) ; + vc_step=(color_range_max-color_range_min)/50; + + vc=color_range_min:vc_step:color_range_max; + + s2_xy_both_fig = figure; + contourf(s2xbins,s2ybins,mean_S2_both_xy,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S2_F (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_xbins),floor(s1_ybins)); +Sigma_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); +Count_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>30; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +%plot + +color_range_max=max(max(mean_S1_both_xy)); +color_range_min=min(min(mean_S1_both_xy(mean_S1_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + +s1_xy_both_fig = figure; +contourf(s1xbins,s1ybins,mean_S1_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'S1_F (phe)','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XYZ. 3D Map, caluculate and Submit IQ +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% if Kr_events>150000 +% +% % LUXkrypCal_S1_3D(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_distance_\mus,user_name,file_id_cp,dp_version,submit); +% LUXkrypCal_S1_3D_Run04_local_2p14FixedZHisto(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_time,x_center,y_center,z_center,det_edge,inpaint_on,user_name,file_id_cp,dp_version, algorithm_name, submit); +% +% +% end + + +%% Apply corrections to CH3T and calculate the ER band shift + +%First load the data + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\Run04_ERBand\Kr2p20\CH3T_Sep2015_NoCorrections.mat'); + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = S2_x; +s1_y_cm = S2_y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'spline',1); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,S2_x,S2_y,'spline',1); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +%% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + h3_cut= inrange(drift_time,[40 300]) & inrange(s2radius_c,[0,18]) & inrange(s1_phe_both,[0 120]) ... + & (log10(s1_phe_both)+0.5*log10(s2_phe_both_xyz)<4) & s2_phe_both>100 & s2_phe_both<16000 ... + & drift_time<-2.*s2radius.^2+380; %used to be drift time 100 to 250 + +h3_s1_c_2015=s1_phe_both_xyz(h3_cut); +h3_s2_c_2015=s2_phe_both_xyz(h3_cut); + + kr_cut= inrange(drift_time,[40 300]) & inrange(s2radius_c,[0,18]) & inrange(s1_phe_both,[30 1000]) ... + & (log10(s1_phe_both)+0.5*log10(s2_phe_both_xyz)>4) & s2_phe_both>3000 & s2_phe_both<60000 ... + & drift_time<-2.*s2radius.^2+380; %used to be drift time 100 to 250 + + +kr_s1_c_2015=s1_phe_both_xyz(kr_cut); +kr_s2_c_2015=s2_phe_both_xyz(kr_cut); +kr_2015_drift_time=drift_time(kr_cut); +kr_2015_s2x=S2_x(kr_cut); +kr_2015_s2y=S2_y(kr_cut); + + clearvars -except param_counter a1_list b1_list a2_list b2_list total_chi2_list h3_chi2_list kr_chi2_list g1_list g2_list total_chi2_map h3_chi2_map kr_chi2_map chi2_midtobot_list... + best_chi2_midtotop besta1_midtotop besta2_midtotop bestb1_midtotop bestb2_midtotop best_chi2_midtobot... + besta1_midtobot besta1_midtotop bestb1_midtobot bestb1_midtotop a1 b1 a2 b2 chi2_midtotop_map chi2_midtobot_map b_counter a_counter... + besta1_combined bestb1_combined besta2_combined bestb2_combined best_chi2_combined chi2_combined_map chi2_combined_list b1_counter a1_counter a2_counter b2_counter... + a1_counter b1_counter a2_counter b2_counter c1_list c2_list bestc1_midtobot bestc2_midtobot bestc1_midtotop bestc2_midtotop bestc1_combined bestc2_combined... + besta1_combined besta2_combined bestb1_combined bestb2_combined besta1 bestb1 bestc1 besta2 bestb2 bestc2 bestg1 bestg2 best_total_chi2 NEST_CH3T_Spectrum inpaint_on... + best_kr_chi2 best_h3_chi2 electron_lifetime_list electron_lifetime_map a2_start a1_start b1_start b2_start ... + total_h3_chi2_list total_kr_chi2_list total_chi2_list h3_chi2_2014_list h3_chi2_2015_list kr_chi2_2014_list kr_chi2_2015_list ... + electron_lifetime_2014_list electron_lifetime_2015_list total_h3_chi2_map total_kr_chi2_map total_chi2_map h3_chi2_2014_map h3_chi2_2015_map ... + kr_chi2_2014_map kr_chi2_2015_map electron_lifetime_2014_map electron_lifetime_2015_map NEST_CH3T_Spectrum g1 g2 bestg1 bestg2 g1_counter g2_counter ... + firsta1 firstb1 firsta2 firstb2 firstg1 firstg2 kr_means_2015_map kr_means_2014_map kr_sigma_2015_map kr_sigma_2014_map kr_staterr_2015_map kr_staterr_2014_map ... + kr_means_2015_list kr_means_2014_list kr_2015_num_events kr_2014_num_events kr_sigma_2015_list kr_sigma_2014_list kr_staterr_2015_list kr_staterr_2014_list ... + pseudo_lifetime_2014 pseudo_lifetime_2015 kr_s1_c_2015 kr_s2_c_2015 h3_s1_c_2015 h3_s2_c_2015 s1ab_s2_xyz_fit_map s1ab_s1_xyz_fit_map ... + kr_2015_drift_time kr_2015_s2x kr_2015_s2y kr_chi2_2014_zslice_list kr_chi2_2015_zslice_list kr_chi2_zslice_zcenter_list ... + full_kr_chi2_2014_list full_kr_chi2_2015_list best_total_kr_chi2 best_total_h3_chi2 + + + + +%%%%%%%%%%%%%%%%%%%%% +%% REPEAT FOR 2014 DATA +%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\Run04_ERBand\Kr2p20\MappingParametersFit_Start_2014_CutDown.mat') + + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval.*s2_xyfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval.*s2_xyfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval.*s1_xyfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval.*s1_xyfieldremoval); + + + + end + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[5+bin_size, 500] );%from 50 to 300us for the fit, based on when s1as1b values get strange + +s2_both_norm_z_index=mean_index(dT_range); +s2_both_norm_z_means=means(dT_range); + s2_at_top=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + %%Tracker for pseudo-lifetime + s2_at_bottom=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_2014=-320/log(s2_at_bottom/s2_at_top); +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_xbins),floor(s2_ybins)); +Sigma_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); +Count_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>30; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_xbins),floor(s1_ybins)); +Sigma_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); +Count_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>30; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Apply corrections to 2014 Kr data +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\Run04_ERBand\Kr2p20\MappingParametersFit_Start_2014_CutDown.mat') + + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; +% +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'spline',1); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'spline',1); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate ER Band shift +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + liquid_cut= inrange(drift_time,[40 300]) & inrange(s2radius,[0,18]) & inrange(s1_phe_both_xyz,[30 1000]) ... + & (log10(s1_phe_both_xyz)+0.5*log10(s2_phe_both_xyz)>4.2) & s2_phe_both>3000 & s2_phe_both<60000 ... ;%used to be drift time 100 to 250 + & drift_time<-1.4.*s2radius.^2+400; + + +kr_s1_c_2014=s1_phe_both_xyz(liquid_cut); +kr_s2_c_2014=s2_phe_both_xyz(liquid_cut); +kr_2014_drift_time=drift_time(liquid_cut); +kr_2014_s2x=s2x(liquid_cut); +kr_2014_s2y=s2y(liquid_cut); + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%Apply Corrections to 2014 CH3T Data +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\Run04_ERBand\Kr2p20\CH3T_Sep2014_NoCorrections.mat'); + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +% electron_lifetime_2014=e_lifetime_both; +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = S2_x; +s1_y_cm = S2_y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'spline',1); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,S2_x,S2_y,'spline',1); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate ER Band shift +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +s1_min=0; +s1_max=120; + + %% Redo with r<10 cm + + liquid_cut= clean_cut & inrange(drift_time,[40 300]) & inrange(s2radius_c,[0,18]) & inrange(s1_phe_both_xyz,[s1_min s1_max]) ... + & (log10(s1_phe_both_xyz)+0.5*log10(s2_phe_both_xyz)<4.2) & s2_phe_both>100 & s2_phe_both<16000 ... ;%used to be drift time 100 to 250 + & drift_time<-1.4.*s2radius.^2+400; + +h3_s1_c_2014=s1_phe_both_xyz(liquid_cut); +h3_s2_c_2014=s2_phe_both_xyz(liquid_cut); + + clearvars -except param_counter a1_list b1_list a2_list b2_list total_chi2_list h3_chi2_list kr_chi2_list g1_list g2_list total_chi2_map h3_chi2_map kr_chi2_map chi2_midtobot_list... + best_chi2_midtotop besta1_midtotop besta2_midtotop bestb1_midtotop bestb2_midtotop best_chi2_midtobot... + besta1_midtobot besta1_midtotop bestb1_midtobot bestb1_midtotop a1 b1 a2 b2 chi2_midtotop_map chi2_midtobot_map b_counter a_counter... + besta1_combined bestb1_combined besta2_combined bestb2_combined best_chi2_combined chi2_combined_map chi2_combined_list b1_counter a1_counter a2_counter b2_counter... + a1_counter b1_counter a2_counter b2_counter c1_list c2_list bestc1_midtobot bestc2_midtobot bestc1_midtotop bestc2_midtotop bestc1_combined bestc2_combined... + besta1_combined besta2_combined bestb1_combined bestb2_combined besta1 bestb1 bestc1 besta2 bestb2 bestc2 bestg1 bestg2 best_total_chi2 NEST_CH3T_Spectrum inpaint_on... + best_kr_chi2 best_h3_chi2 electron_lifetime_list electron_lifetime_map a2_start a1_start b1_start b2_start ... + total_h3_chi2_list total_kr_chi2_list total_chi2_list h3_chi2_2014_list h3_chi2_2015_list kr_chi2_2014_list kr_chi2_2015_list ... + electron_lifetime_2014_list electron_lifetime_2015_list total_h3_chi2_map total_kr_chi2_map total_chi2_map h3_chi2_2014_map h3_chi2_2015_map ... + kr_chi2_2014_map kr_chi2_2015_map electron_lifetime_2014_map electron_lifetime_2015_map NEST_CH3T_Spectrum g1 g2 bestg1 bestg2 g1_counter g2_counter ... + firsta1 firstb1 firsta2 firstb2 firstg1 firstg2 kr_means_2015_map kr_means_2014_map kr_sigma_2015_map kr_sigma_2014_map kr_staterr_2015_map kr_staterr_2014_map ... + kr_means_2015_list kr_means_2014_list kr_2015_num_events kr_2014_num_events kr_sigma_2015_list kr_sigma_2014_list kr_staterr_2015_list kr_staterr_2014_list ... + pseudo_lifetime_2014 pseudo_lifetime_2015 kr_s1_c_2015 kr_s2_c_2015 h3_s1_c_2015 h3_s2_c_2015 kr_s1_c_2014 kr_s2_c_2014 h3_s1_c_2014 h3_s2_c_2014 ... + kr_2015_drift_time kr_2015_s2x kr_2015_s2y kr_2014_drift_time kr_2014_s2x kr_2014_s2y ... + kr_chi2_2014_zslice_list kr_chi2_2015_zslice_list kr_chi2_zslice_zcenter_list ... + full_kr_chi2_2014_list full_kr_chi2_2015_list best_total_kr_chi2 best_total_h3_chi2 +%% Make plots + + + +load('C:\Program Files\MATLAB\R2012a\bin\Run04_ERBand\Kr2p20\NEST_CH3T_Spectrum_Sep2014_Kr2p20.mat') +load('C:\Program Files\MATLAB\R2012a\bin\Run04_ERBand\Kr2p20\NEST_CH3T_Spectrum_Sep2015_Kr2p20.mat') + + +best_total_chi2=100000000; +for g1=0.09:0.005:0.125; + for ee=0.55:0.01:1.0; + +% g1=0.1025; ee=0.76; + g2_sep2014=27.21*ee; %converting to g2 with SE size + g2_sep2015=25.8536*ee; +%Kr 2014 data + +Kr_E_2014=(1/73).*(kr_s1_c_2014./g1+kr_s2_c_2014./g2_sep2014); +H3_E_2014=(1/73).*(h3_s1_c_2014./g1+h3_s2_c_2014./g2_sep2014); + +Kr_E_2015=(1/73).*(kr_s1_c_2015./g1+kr_s2_c_2015./g2_sep2015); +H3_E_2015=(1/73).*(h3_s1_c_2015./g1+h3_s2_c_2015./g2_sep2015); + +i=1; +for dT_max=40+20/2:20:300-20/2; + temp_fit_2014=fit([0:1:100].',hist(Kr_E_2014(inrange(kr_2014_drift_time,[dT_max-20 dT_max])),[0:1:100]).','gauss1'); + kr_2014_means(i)=temp_fit_2014.b1; + kr_2014_means_err(i)=temp_fit_2014.c1/sqrt(2)/length(Kr_E_2014(inrange(kr_2014_drift_time,[dT_max-20 dT_max]))); + + temp_fit_2015=fit([0:1:100].',hist(Kr_E_2015(inrange(kr_2015_drift_time,[dT_max-20 dT_max])),[0:1:100]).','gauss1'); + kr_2015_means(i)=temp_fit_2015.b1; + kr_2015_means_err(i)=temp_fit_2015.c1/sqrt(2)/length(Kr_E_2015(inrange(kr_2015_drift_time,[dT_max-20 dT_max]))); + + dT_centers(i)=dT_max-10; + i=i+1; +end + +kr_2014_chi2_slices=((41.55-kr_2014_means)./0.2395).^2; +kr_2015_chi2_slices=((41.55-kr_2015_means)./0.2395).^2; + +% figure +% errorbar(dT_centers,kr_2014_means,kr_2014_means_err,'.k'); +% xlabel('Drift Time (uSec)'); ylabel('Kr Energy Mean (phd)'); +% title('2014 Data'); +% myfigview(16); +% +% figure +% errorbar(dT_centers,kr_2015_means,kr_2015_means_err,'.k'); +% xlabel('Drift Time (uSec)'); ylabel('Kr Energy Mean (phd)'); +% title('2015 Data'); +% myfigview(16); +% +% figure +% errorbar(dT_centers,kr_2014_means,kr_2014_means_err,'.k'); +% hold on; +% errorbar(dT_centers,kr_2015_means,kr_2015_means_err,'.r'); +% xlabel('Drift Time (uSec)'); ylabel('Kr Energy Mean (phd)'); +% legend('2014','2015'); +% myfigview(16); + + + %make CH3T data spectrum + [h3_hist_sep2014,h3_hist_bin_sep2014]=hist(H3_E_2014,NEST_CH3T_Spectrum_Sep2014(1,:)); + [h3_hist_sep2015,h3_hist_bin_sep2015]=hist(H3_E_2015,NEST_CH3T_Spectrum_Sep2015(1,:)); + + %scale the simulation to the data + scale_factor_sep2014=sum(h3_hist_sep2014)./sum(NEST_CH3T_Spectrum_Sep2014(2,:)); + scale_factor_sep2015=sum(h3_hist_sep2015)./sum(NEST_CH3T_Spectrum_Sep2015(2,:)); + h3_scaled_sim_sep2014=NEST_CH3T_Spectrum_Sep2014(2,:).*scale_factor_sep2014; + h3_scaled_sim_sep2015=NEST_CH3T_Spectrum_Sep2015(2,:).*scale_factor_sep2015; + + h3_chi2_Sep2014=(1/63).*sum( (h3_scaled_sim_sep2014(15:80) - h3_hist_sep2014(15:80)).^2 ./(h3_hist_sep2014(15:80))); + h3_chi2_Sep2015=(1/63).*sum( (h3_scaled_sim_sep2015(15:80) - h3_hist_sep2015(15:80)).^2 ./(h3_hist_sep2015(15:80))); + + + total_h3_chi2=(h3_chi2_Sep2014+h3_chi2_Sep2015)/2; + total_kr_chi2=(mean(kr_2014_chi2_slices)+mean(kr_2015_chi2_slices))/2; + total_chi2=(total_h3_chi2+total_kr_chi2)/2; + + if total_chi2 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + clean_cut = (log10(s1_phe_both)+0.6*log10(s2_phe_both)>4.5) & s2radius<25; + + s1_phe_bottom=s1_phe_bottom(clean_cut); + s1_phe_both=s1_phe_both(clean_cut); + s2_phe_bottom=s2_phe_bottom(clean_cut); + s2_phe_both=s2_phe_both(clean_cut); + drift_time=drift_time(clean_cut); + s2x=s2x(clean_cut); + s2y=s2y(clean_cut); + s2radius = (s2x.^2+s2y.^2).^(0.5); + event_timestamp_samples=event_timestamp_samples(clean_cut); + s2_width=s2_width(clean_cut); + s1_width=s1_width(clean_cut); + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + +%% + zcut_min = 10; %field changes at 4 uSec + zcut_max = 0.95*det_edge; + + + if Kr_events < 30000 %then create a 10x10 grid. Otherwise 25x25. Want about 30 evts per bin + + S1xybinsize = sqrt((50*50)/(Kr_events/150)); + S1_xbin_min = -25; + S1_xbin_max = 25; + S1_ybin_min = -25; + S1_ybin_max = 25; + SE_ybin_min = -25; + SE_ybin_max = 25; + + S2xybinsize = sqrt((50*50)/(Kr_events/150));%cm +% SExybinsize = 5; DEFINED LATER, based on number of SE events + S2_xbin_min = -25; + S2_xbin_max = 25; + S2_ybin_min = -25; + S2_ybin_max = 25; + SE_xbin_min = -25; + SE_xbin_max = 25; + + + end + + s1_xbins = (S1_xbin_max-S1_xbin_min)./S1xybinsize; + s1_ybins = (S1_ybin_max-S1_ybin_min)./S1xybinsize; + + s2_xbins = (S2_xbin_max-S2_xbin_min)./S2xybinsize; + s2_ybins = (S2_ybin_max-S2_ybin_min)./S2xybinsize; + + + if Kr_events < 4000; % skip krpCal if less than 4000 events + calibrations=zeros(6,1); + end + %% +%Set up cuts and variables + s1ab_cut=logical(sum(s1_single_cut(:,:),1)); + s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); + s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); + s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); + s1ab_x=d.x_cm(s2_single_cut); + s1ab_y=d.y_cm(s2_single_cut); + s1ab_z=d.z_drift_samples(s2_single_cut)/100; + s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); + + s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<=25; + %plotting x=s1a v y=s1a/s1b cuts: y<0.035x-1, y>-0.035.*x+5; y>0.01.*x; %y<4.2; x<255 +% s1ab_areacut= (s1a_phe_both./s1b_phe_both-0.035.*s1a_phe_both<-1) & (s1a_phe_both./s1b_phe_both+0.035.*s1a_phe_both>5)... +% & (s1a_phe_both./s1b_phe_both > 0.01.* s1a_phe_both) & (s1a_phe_both./s1b_phe_both<4.2) & (s1a_phe_both<255); + + s1ab_x=s1ab_x(s1ab_timing_cut); + s1ab_y=s1ab_y(s1ab_timing_cut); + s1ab_z=s1ab_z(s1ab_timing_cut); + s1a_phe_both=s1a_phe_both(s1ab_timing_cut); + s1b_phe_both=s1b_phe_both(s1ab_timing_cut); + s1ab_radius=s1ab_radius(s1ab_timing_cut); + + dT_step=det_edge/(length(s1ab_z)/1000); %2000 events per z bin + +%% load lucie's sep 2015 field map + + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\LucieSep2015_Map_v1p0'); +field_s2x=LucieSep2015_Map_v1p0(:,5); +field_s2y=LucieSep2015_Map_v1p0(:,6); +field_drift_time=LucieSep2015_Map_v1p0(:,7); +field_values=0.01.*LucieSep2015_Map_v1p0(:,4); + +field_cut=~isnan(field_s2x) & ~isnan(field_s2y) & ~isnan(field_drift_time) & ~isnan(field_values); + +field_s2x=field_s2x(field_cut); +field_s2y=field_s2y(field_cut); +field_drift_time=field_drift_time(field_cut); +field_values=field_values(field_cut); + + + +%% 3D Kr s1a, s1b, and field map + +s1ab_xyz_numbins=floor((length(s1ab_z)/250)^(1/3)); %number of bins in one direction +s1ab_xyz_zstep=det_edge/s1ab_xyz_numbins; +s1ab_xyz_xstep=50/s1ab_xyz_numbins; +s1ab_xyz_ystep=50/s1ab_xyz_numbins; +s1ab_xyz_xmax=25; +r_max=25; + +s1ab_xyz_zbins=10+s1ab_xyz_zstep/2:s1ab_xyz_zstep:10+s1ab_xyz_zstep/2+s1ab_xyz_zstep*s1ab_xyz_numbins; %20 us +s1ab_xyz_xbins=(-r_max+s1ab_xyz_xstep/2):s1ab_xyz_xstep:r_max; +s1ab_xyz_ybins=(-r_max+s1ab_xyz_ystep/2):s1ab_xyz_ystep:r_max; + +s1a_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +field_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +field_xyz_mean_error=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + q_field = field_s2x(j-s1ab_xyz_xstep) & field_s2y(i-s1ab_xyz_ystep) & inrange(field_drift_time,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + + %Count the number of events per bin + Count_S1ab_3D(l,m,n)=length(s1a_phe_both(q)); + + if length(field_values(q_field)) >=10 + field_xyz_mean(l,m,n)=mean(field_values(q_field)); + field_xyz_mean_error(l,m,n)=std(field_values(q_field)); + else + field_xyz_mean(l,m,n)=nan; + field_xyz_mean_error(l,m,n)=nan; + end + + if (Count_S1ab_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_xyz_mean(l,m,n)=s1a_z_fit.b1; + s1a_xyz_mean_err(l,m,n)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]) ),[0:2:300]).','gauss1'); + s1b_xyz_mean(l,m,n)=s1b_z_fit.b1; + s1b_xyz_mean_err(l,m,n)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); + else %not enough stats to do the fit + s1a_xyz_mean(l,m,n)=0; + s1a_xyz_mean_err(l,m,n)=0; + s1b_xyz_mean(l,m,n)=0; + s1b_xyz_mean_err(l,m,n)=0; + end + + end + end +k +end + + s1ab_xyz_mean=s1a_xyz_mean./s1b_xyz_mean; + s1ab_xyz_mean_err=sqrt( (s1b_xyz_mean_err.*s1a_xyz_mean./(s1b_xyz_mean.^2)).^2 + (s1a_xyz_mean_err./s1b_xyz_mean).^2); + + +% %Removing zeros from the maps with nearest neighbor. +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + + +s1a_xyz_mean_old=s1a_xyz_mean; +temp_map=s1a_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1a_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1a_xyz_mean(~q)=temp_mapQ(r);s1a_xyz_mean=reshape(s1a_xyz_mean,size(s1a_xyz_mean_old,1),size(s1a_xyz_mean_old,2),size(s1a_xyz_mean_old,3)); + +s1b_xyz_mean_old=s1b_xyz_mean; +temp_map=s1b_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1b_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1b_xyz_mean(~q)=temp_mapQ(r);s1b_xyz_mean=reshape(s1b_xyz_mean,size(s1b_xyz_mean_old,1),size(s1b_xyz_mean_old,2),size(s1b_xyz_mean_old,3)); + +field_xyz_mean_old=field_xyz_mean; +temp_map=field_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +field_xyz_mean=temp_map; temp_mapQ=temp_map(q); field_xyz_mean(~q)=temp_mapQ(r);field_xyz_mean=reshape(field_xyz_mean,size(field_xyz_mean_old,1),size(field_xyz_mean_old,2),size(field_xyz_mean_old,3)); + +field_xyz_mean_error_old=field_xyz_mean_error; +temp_map=field_xyz_mean_error; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +field_xyz_mean_error=temp_map; temp_mapQ=temp_map(q); field_xyz_mean_error(~q)=temp_mapQ(r);field_xyz_mean_error=reshape(field_xyz_mean_error,size(field_xyz_mean_error_old,1),size(field_xyz_mean_error_old,2),size(field_xyz_mean_error_old,3)); + + +%% Estimate the field throughout the detector using S1a/S1b r^2vZ maps + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal\KrypCal_2p20_Code\2015_Field_to_S1aS1b.mat'); +[field_map_2015, field_map_2015_staterr]=polyval(S1aS1b_fit_2015,s1ab_xyz_mean,S1aS1b_fit_2015_error); + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal\KrypCal_2p20_Code\2014_Field_to_S1aS1b.mat'); +[field_map_2014, field_map_2014_staterr]=polyval(S1aS1b_fit_2014,s1ab_xyz_mean,S1aS1b_fit_2014_error); + +field_map_lucie=field_xyz_mean; +field_map_lucie_err=field_xyz_mean_error; +field_map_syserr=((field_map_2015-(field_map_2014+field_map_2015+field_map_lucie)/3).^2 + (field_map_2014-(field_map_2014+field_map_2015+field_map_lucie)/3).^2 + (field_map_lucie-(field_map_2014+field_map_2015+field_map_lucie)/3).^2).^(1/2); + +%field_map_syserr is ~16.5% +mean_field_map=(field_map_2014+field_map_2015+field_map_lucie)/3; +mean_field_map_totalerr=sqrt(field_map_syserr.^2+((field_map_2014_staterr.^2+field_map_2015_staterr.^2+field_map_lucie_err.^2)/(3^2))); + + +%% Use the field map to determine number of S1 photons in XYZ +%photons per keV = 118.90 * [electric field in V/cm] ^ -0.15626 + +% num_phot=118.9.*mean_field_map.^-0.15626; %num_phot/keV +num_phot=(-0.0004895.*mean_field_map.*log(1 + 1/((8.9e-4).*mean_field_map)) + 1).*55.2; + +%errors 118.9 +/- 4.14, -0.15626 +/- 0.006 +% num_phot_stat_err=sqrt( (4.14.*mean_field_map.^-0.15626).^2 + (118.9.*(mean_field_map.^-0.15626).*log(mean_field_map).*0.006).^2 + (118.9.*(-0.15626).*(mean_field_map.^(-0.15626-1)).*mean_field_map_totalerr).^2); +% num_phot_err=sqrt( num_phot_stat_err.^2 + (0.02.*num_phot).^2); %adding 2% systematic error from Matthew + +a1=-0.55; del_a1=0.03; +a2=(8.9e-4); del_a2=(1.6e-4); +c=55.2; del_c=1.4904; + +dphot_dc=a1.*a2.*mean_field_map.*log(1+1./(a2.*mean_field_map))+1; +dphot_da1=a2.*c.*mean_field_map.*log(1+1./(a2.*mean_field_map)); +dphot_da2=a1.*c.*mean_field_map.*( ((mean_field_map.*a2+1).*log(1./(mean_field_map.*a2)+1)-1)./(mean_field_map.*a2+1)); +dphot_df=a1.*a2.*c.*( ((mean_field_map.*a2+1).*log(1./(mean_field_map.*a2)+1)-1)./(mean_field_map.*a2+1)); + +num_phot_err=sqrt( (dphot_dc.*del_c).^2 + (dphot_da1.*del_a1).^2+(dphot_da2.*del_a2).^2+(dphot_df.*mean_field_map_totalerr).^2); + +%% We have an estimate of the expected number of photons v XYZ based on field strength alone. FOR 3D Map +% Therefore, num_phot(xyz)/num_phot(center) tells us the strength of the field effect in S1a data +num_phot_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,num_phot,x_center,y_center,z_center,'cubic'); +num_phot_center_err=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,num_phot_err,x_center,y_center,z_center,'cubic'); + + +S1fieldeffect=num_phot./num_phot_center; +S1fieldeffect_err=sqrt( (num_phot_err./num_phot_center).^2 + ( (num_phot.*num_phot_center_err)/(num_phot_center.^2)).^2 ); + +s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + +% % Plot S1fieldeffect versus S1a/S1b... hopefully it's similar to what KrypCal measures +% figure +% rkploterr(s1ab_xyz_mean,S1fieldeffect,s1ab_xyz_mean_err,S1fieldeffect_err,[0 0 0],'.',100,1); +% xlabel('S1a/S1b'); +% ylabel('Number of S1a photons (xyz) / Number of S1a photons (center)'); +% myfigview(16); +% +% %Overlay Kr2.20 result, renormalized to the new S1aS1b center value +% s1ab_s1_xyz_fit_map.p1=0.34; +% s1ab_s1_xyz_fit_map.p2=-1.4; +% s1ab_s1_xyz_fit_map.p3=2.2874; +% x=[2.2:0.1:3.1]; +% y= (s1ab_s1_xyz_fit_map.p1.*x.^2+s1ab_s1_xyz_fit_map.p2.*x+s1ab_s1_xyz_fit_map.p3)./(s1ab_s1_xyz_fit_map.p1.*s1as1b_at_center.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_at_center+s1ab_s1_xyz_fit_map.p3); +% plot(x,y,'-b','LineWidth',3); +% +% +% %Overlay Kr2.18 Result +% s1ab_s1_xyz_fit_map.p1=0.46; +% b2=1-2.7347.*s1ab_s1_xyz_fit_map.p1; +% s1ab_s1_xyz_fit_map.p2=b2; +% x=[2.2:0.1:3.1]; +% y= (s1ab_s1_xyz_fit_map.p1.*x+s1ab_s1_xyz_fit_map.p2)./(s1ab_s1_xyz_fit_map.p1.*s1as1b_at_center+s1ab_s1_xyz_fit_map.p2); +% plot(x,y,'-r','LineWidth',3); +% ylim([0.5 2]); +% xlim([2.2 3.1]); +% +% % Fit a polynomial to the s1 field effect result +% S1fieldpoly=polyfit(s1ab_xyz_mean(S1fieldeffect~=0 & s1ab_xyz_mean~=0),S1fieldeffect(S1fieldeffect~=0 & s1ab_xyz_mean~=0),3); +% plot(x,polyval(S1fieldpoly,x),'Color',[0.7 0.7 0.7],'LineWidth',3); +% title('These shouldnt necessarily be the same, Grey is S1a(XYZ)/S1(C), and others are (S1(XYZ)/S1(center))') +% %SHOULD SWITCH TO A SPLINE FIT!! + + +%% estimate g1 from S1a at center and field at center. Since S1 is normalized to the center, detector inefficiency correction=1 here + +s1a_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1a_xyz_mean,x_center,y_center,z_center,'cubic'); +s1a_center_err=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1a_xyz_mean_err,x_center,y_center,z_center,'cubic'); + +g1_interp_measurement=s1a_center./(32.1.*num_phot_center); +g1_interp_measurement_err=sqrt( (s1a_center_err./(32.1.*num_phot_center)).^2 + ( (s1a_center.*num_phot_center_err)/(32.1.*num_phot_center.^2)).^2); + + +%% Now remove the field effect from raw S1a data, and measure the residual detector inefficency variation -- THIS SHOULD BE THE SAME AS THE ONE MEASURED FROM S1_E +% +% s1ab_x=s1ab_x(s1ab_timing_cut); +% s1ab_y=s1ab_y(s1ab_timing_cut); +% s1ab_z=s1ab_z(s1ab_timing_cut); +% s1a_phe_both=s1a_phe_both(s1ab_timing_cut); +% s1b_phe_both=s1b_phe_both(s1ab_timing_cut); +% s1ab_radius=s1ab_radius(s1ab_timing_cut); +% + + + +%Normalization of S1a field effect to center: S1fieldeffect(xyz/c) is equivalent to 1/norm_s1_both_xyz in KrypCal +S1fieldeffect_norm=1./S1fieldeffect; %This is really s1a field effect +S1fieldeffect_norm(isinf(S1fieldeffect_norm))=1;%remove infinity. no correction outside 25cm +S1fieldeffect_norm(isnan(S1fieldeffect_norm))=1;%remove nan. no correction outside 25cm +S1fieldeffect_norm_err=S1fieldeffect_err./(S1fieldeffect.^2); +%Removing field effect from raw S1a data + +s1a_phe_both_f=s1a_phe_both.*interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,S1fieldeffect_norm,s1ab_x,s1ab_y,s1ab_z,'spline').'; +s1a_phe_both_f_err=s1a_phe_both.*interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,S1fieldeffect_norm_err,s1ab_x,s1ab_y,s1ab_z,'cubic').'; + +%% S1a_f Z dep + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=50; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s1ab_radius,[rcut_min,rcut_max]) & inrange(s1a_phe_both_f,[s1_bin_min,s1_bin_max]).'; + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + sys_error_z=zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(s1ab_z,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1a_phe_both_f(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + sys_error_z(bin)=mean(s1a_phe_both_f_err(time_cut)); %average systematic error for the bin + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[0, 350] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + light_correction_fig = figure; + errorbar(mean_index,means,means_error,'.k'); + hold on + [yplot_s1_both] = polyval(P_s1_both,dT_fit); + [center_s1_both, center_s1_both_err] = polyval(P_s1_both,z_center, S); %160[us]*1.51[\mus/us] + plot(dT_fit,yplot_s1_both,'-r','LineWidth',1); + xlabel('Depth (\mus)', 'FontSize',16); ylabel('Mean (Pulse Area Phe)', 'FontSize', 16); + line([0 det_edge],[center_s1_both center_s1_both],'linestyle','--'); + line([z_center; z_center;],[min(means) max(means)],'linestyle','--'); + legend('S1\_both Mean', strcat('y=', num2str(P_s1_both(1),'%10.2e'), '*Z^2 + ', num2str(P_s1_both(2),'%10.2e')... + , '*Z + ', num2str(P_s1_both(3),4)),strcat('Det center = ',num2str(center_s1_both,4), ' [Phe]'),'location','northwest') + + box on; + myfigview(16); + xlim([0 det_edge]); + ylim([0.8*min(means) 1.15*max(means)]); + + +%% Measuring the residual S1a_F XYZ variation to get efficiency corrections - use same binning as S1a/S1b 3D map + +s1a_f_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_f_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_f_xyz_sys_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + + %Count the number of events per bin + Count_S1a_f_3D(l,m,n)=length(s1a_phe_both_f(q)); + + + if (Count_S1a_f_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_f_z_fit=fit([0:2:400].',hist(s1a_phe_both_f(q.' & inrange(s1a_phe_both_f,[0 400])),[0:2:400]).','gauss1'); + s1a_f_xyz_mean(l,m,n)=s1a_f_z_fit.b1; + s1a_f_xyz_mean_err(l,m,n)=s1a_f_z_fit.c1/sqrt(2)/length(s1a_phe_both_f(q.' & inrange(s1a_phe_both_f,[0 400]))); + s1a_f_xyz_sys_err(l,m,n)=mean(s1a_phe_both_f_err(q.' & inrange(s1a_phe_both_f,[0 400]))); %average systematic error for the bin + else %not enough stats to do the fit + s1a_f_xyz_mean(l,m,n)=0; + s1a_f_xyz_mean_err(l,m,n)=0; + s1a_f_xyz_sys_err(l,m,n)=0; + end + + end + end +k +end + +total_xyz_err=sqrt(s1a_f_xyz_sys_err.^2 + s1a_f_xyz_mean_err.^2); + +%Producing S1 detector inefficiency correction fro S1a_f map +center_s1a_f=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1a_f_xyz_mean,x_center,y_center,z_center,'spline');%Normalize to the center (x=y=0. dT=160us) +center_s1a_f_staterr=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1a_f_xyz_mean_err,x_center,y_center,z_center,'spline'); +center_s1a_f_syserr=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1a_f_xyz_sys_err,x_center,y_center,z_center,'spline'); +center_s1a_f_totalerr=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,total_xyz_err,x_center,y_center,z_center,'spline'); + +norm_s1_both_xyz=center_s1a_f./s1a_f_xyz_mean; %Normalize to center (x=y=0. dT=160) +norm_s1_both_xyz(isinf(norm_s1_both_xyz))=1;%remove infinity. no correction outside 25cm +norm_s1_both_xyz(isnan(norm_s1_both_xyz))=1;%remove nan. no correction outside 25cm +norm_s1_both_xyz_staterr=sqrt( (center_s1a_f_staterr./s1a_f_xyz_mean).^2 + ((center_s1a_f.*s1a_f_xyz_mean_err)./(s1a_f_xyz_mean.^2)).^2); +norm_s1_both_xyz_totalerr=sqrt( (center_s1a_f_totalerr./s1a_f_xyz_mean).^2 + ((center_s1a_f.*total_xyz_err)./(s1a_f_xyz_mean.^2)).^2); + +%Fill in NaN errors with nearest neighbors +norm_s1_both_xyz_staterr_old=norm_s1_both_xyz_staterr; +temp_map=norm_s1_both_xyz_staterr; +q= ~isnan(norm_s1_both_xyz_staterr); +r=nearestpoint(find(~q),find(q)); +norm_s1_both_xyz_staterr=temp_map; temp_mapQ=temp_map(q); norm_s1_both_xyz_staterr(~q)=temp_mapQ(r);norm_s1_both_xyz_staterr=reshape(norm_s1_both_xyz_staterr,size(norm_s1_both_xyz_staterr_old,1),size(norm_s1_both_xyz_staterr_old,2),size(norm_s1_both_xyz_staterr_old,3)); + +norm_s1_both_xyz_totalerr_old=norm_s1_both_xyz_totalerr; +temp_map=norm_s1_both_xyz_totalerr; +q= ~isnan(norm_s1_both_xyz_totalerr); +r=nearestpoint(find(~q),find(q)); +norm_s1_both_xyz_totalerr=temp_map; temp_mapQ=temp_map(q); norm_s1_both_xyz_totalerr(~q)=temp_mapQ(r);norm_s1_both_xyz_totalerr=reshape(norm_s1_both_xyz_totalerr,size(norm_s1_both_xyz_totalerr_old,1),size(norm_s1_both_xyz_totalerr_old,2),size(norm_s1_both_xyz_totalerr_old,3)); + + + +%% Now remove the detector inefficiency variation from the raw S1a data and determine g1 using total g1=S1a_E/(num_phot_center*keV). CROSS CHECK OF KRYPCAL G1 +s1a_phe_both_e=s1a_phe_both.*interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,norm_s1_both_xyz,s1ab_x,s1ab_y,s1ab_z,'spline').'; %this is s1a_E +s1a_phe_both_e_totalerr=s1a_phe_both.*interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,norm_s1_both_xyz_totalerr,s1ab_x,s1ab_y,s1ab_z,'cubic').'; %this is s1a_E +s1a_phe_both_e_staterr=s1a_phe_both.*interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,norm_s1_both_xyz_staterr,s1ab_x,s1ab_y,s1ab_z,'cubic').'; %this is s1a_E + +s1a_e_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_e_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + + %Count the number of events per bin + Count_S1a_e_3D(l,m,n)=length(s1a_phe_both_e(q)); + + + if (Count_S1a_e_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_e_z_fit=fit([0:2:400].',hist(s1a_phe_both_e(q.' & inrange(s1a_phe_both_e,[0 400])),[0:2:400]).','gauss1'); + s1a_e_xyz_mean(l,m,n)=s1a_e_z_fit.b1; + s1a_e_xyz_mean_err(l,m,n)=s1a_e_z_fit.c1/sqrt(2)/length(s1a_phe_both_e(q.' & inrange(s1a_phe_both_e,[0 400]))); + s1a_e_xyz_stat_err(l,m,n)=mean(s1a_phe_both_e_staterr(q.')); + s1a_e_xyz_total_err(l,m,n)=mean(s1a_phe_both_e_totalerr(q.')); + else %not enough stats to do the fit + s1a_e_xyz_mean(l,m,n)=0; + s1a_e_xyz_mean_err(l,m,n)=0; + s1a_e_xyz_stat_err(l,m,n)=0; + s1a_e_xyz_total_err(l,m,n)=0; + end + + end + end +k +end + +%Producing S1 detector inefficiency correction fro S1a_f map +center_s1a_e=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1a_e_xyz_mean,x_center,y_center,z_center,'spline');%Normalize to the center (x=y=0. dT=160us) +center_s1a_e_err=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1a_e_xyz_mean_err,x_center,y_center,z_center,'spline');%Normalize to the center (x=y=0. dT=160us) +center_s1a_e_statsyserr=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1a_e_xyz_stat_err,x_center,y_center,z_center,'spline'); +center_s1a_e_totalstaterr=sqrt(center_s1a_e_statsyserr.^2 + center_s1a_e_err.^2); +center_s1a_e_totalerr=sqrt(center_s1a_e_err.^2 + interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1a_e_xyz_total_err,x_center,y_center,z_center,'spline').^2); + + +%total signal fits, to see if it is consistent with center_s1a_e +% s1a_E_fit=fit([0:1:400].',hist(s1a_phe_both_e,[0:1:400]).','gauss1'); +% s1a_E_fit_err=confint(s1a_E_fit,0.68); +% s1a_E_mean=s1a_E_fit.b1; +% s1a_E_mean_err=abs(s1a_E_fit.b1-s1a_E_fit_err(1,2)); + +% g1_measurement=s1a_E_mean./(32.1.*num_phot_center) +% g1_measurement_err=sqrt( (s1a_E_mean_err./(32.1.*num_phot_center)).^2 + ( (s1a_E_mean.*num_phot_center_err)/(32.1.*num_phot_center.^2)).^2); + +g1_measurement=center_s1a_e./(32.1.*num_phot_center) +g1_measurement_err=sqrt( (center_s1a_e_totalerr./(32.1.*num_phot_center)).^2 + ( (center_s1a_e.*num_phot_center_err)/(32.1.*num_phot_center.^2)).^2); %was just _err before, not _totalerr + +%% Now remove the detector inefficency variation from the raw S1 (not S1a) data, and determine the field effect in S1 data. Compare to KrypCal results. CROSS CHECK OF KRYPCAL S1 RELATIONSHIP + +s1_phe_both_xyz=s1_phe_both.*interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,norm_s1_both_xyz,s2x,s2y,drift_time,'spline'); +s1_phe_both_xyz_staterr=s1_phe_both.*interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,norm_s1_both_xyz_staterr,s2x,s2y,drift_time,'spline',mean(norm_s1_both_xyz_staterr(:))); +s1_phe_both_xyz_totalerr=s1_phe_both.*interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,norm_s1_both_xyz_totalerr,s2x,s2y,drift_time,'spline',mean(norm_s1_both_xyz_totalerr(:))); + +s1_phe_both_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1_phe_both_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s2x(j-s1ab_xyz_xstep) & s2y(i-s1ab_xyz_ystep) & inrange(drift_time,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + + %Count the number of events per bin + Count_3D(l,m,n)=length(s1_phe_both_xyz(q)); + + + if (Count_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1_phe_both_xyz_fit=fit([0:2:400].',hist(s1_phe_both_xyz(q & inrange(s1_phe_both_xyz,[0 400])),[0:2:400]).','gauss1'); + s1_phe_both_xyz_mean(l,m,n)=s1_phe_both_xyz_fit.b1; + s1_phe_both_xyz_mean_err(l,m,n)=s1_phe_both_xyz_fit.c1/sqrt(2)/length(s1_phe_both_xyz(q & inrange(s1_phe_both_xyz,[0 400]))); + s1_phe_both_xyz_stat_err(l,m,n)=mean(s1_phe_both_xyz_staterr(q)); + s1_phe_both_xyz_total_err(l,m,n)=mean(s1_phe_both_xyz_totalerr(q)); + + else %not enough stats to do the fit + s1_phe_both_xyz_mean(l,m,n)=0; + s1_phe_both_xyz_mean_err(l,m,n)=0; + s1_phe_both_xyz_stat_err(l,m,n)=0; + s1_phe_both_xyz_total_err(l,m,n)=0; + + end + + end + end +k +end + +s1xyz_total_stat_err=sqrt(s1_phe_both_xyz_mean_err.^2 + s1_phe_both_xyz_stat_err.^2); +s1xyz_total_err=sqrt( s1_phe_both_xyz_mean_err.^2 + s1_phe_both_xyz_total_err.^2); + +%CHANGE THIS TO BE BASED OFF TOTAL FROM ABOVE!? +%Producing S1 detector inefficiency correction fro S1a_f map - ERROR DOES NOT TAKE INTO ACCOUNT THE UNCERTAINITY ON THE S1 EFFICIENCY CORRECTION! +center_s1E_phe_both=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1_phe_both_xyz_mean,x_center,y_center,z_center,'spline'); +center_s1E_phe_both_err=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1_phe_both_xyz_mean_err,x_center,y_center,z_center,'spline'); +center_s1E_phe_both_statsyserr=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1_phe_both_xyz_stat_err,x_center,y_center,z_center,'spline'); +center_s1E_phe_both_totalstaterr=sqrt(center_s1E_phe_both_err.^2 + center_s1E_phe_both_statsyserr.^2); +center_s1E_phe_both_totalerr=sqrt(center_s1E_phe_both_err.^2 + interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1_phe_both_xyz_total_err,x_center,y_center,z_center,'spline').^2); + +CombinedS1FieldEffect=s1_phe_both_xyz_mean./center_s1E_phe_both; +CombinedS1FieldEffect_err=sqrt ( (s1_phe_both_xyz_mean_err./center_s1E_phe_both).^2 + ( (s1_phe_both_xyz_mean.*center_s1E_phe_both_err)./(center_s1E_phe_both.^2)).^2); +CombinedS1FieldEffect_totalstaterr=sqrt ( (s1xyz_total_stat_err./center_s1E_phe_both).^2 + ( (s1_phe_both_xyz_mean.*center_s1E_phe_both_totalstaterr)./(center_s1E_phe_both.^2)).^2); +CombinedS1FieldEffect_totalerr=sqrt ( (s1xyz_total_err./center_s1E_phe_both).^2 + ( (s1_phe_both_xyz_mean.*center_s1E_phe_both_totalerr)./(center_s1E_phe_both.^2)).^2); + +%Make S1a/S1b v S1 field effect plot +figure +rkploterr(s1ab_xyz_mean,CombinedS1FieldEffect,s1ab_xyz_mean_err,CombinedS1FieldEffect_totalerr,[0 0 0],'.',100,1); +xlabel('S1a/S1b'); +ylabel('S1_E(XYZ)/S1_E(C)'); +myfigview(16); + +%Overlay Kr2.20 result, renormalized to the new S1aS1b center value +s1ab_s1_xyz_fit_map.p1=0.34; +s1ab_s1_xyz_fit_map.p2=-1.4; +s1ab_s1_xyz_fit_map.p3=2.2874; +x=[2.2:0.1:3.1]; +y= (s1ab_s1_xyz_fit_map.p1.*x.^2+s1ab_s1_xyz_fit_map.p2.*x+s1ab_s1_xyz_fit_map.p3)./(s1ab_s1_xyz_fit_map.p1.*s1as1b_at_center.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_at_center+s1ab_s1_xyz_fit_map.p3); +plot(x,y,'-b','LineWidth',3); + + +%Overlay Kr2.18 Result +s1ab_s1_xyz_fit_map.p1=0.46; +b2=1-2.7347.*s1ab_s1_xyz_fit_map.p1; +s1ab_s1_xyz_fit_map.p2=b2; +x=[2.2:0.1:3.1]; +y= (s1ab_s1_xyz_fit_map.p1.*x+s1ab_s1_xyz_fit_map.p2)./(s1ab_s1_xyz_fit_map.p1.*s1as1b_at_center+s1ab_s1_xyz_fit_map.p2); +plot(x,y,'-r','LineWidth',3); +ylim([0.5 1.6]); +xlim([2.2 3.1]); + +% Fit a polynomial to the s1 field effect result +S1fieldpoly=polyfit(s1ab_xyz_mean(CombinedS1FieldEffect~=0 & s1ab_xyz_mean~=0),CombinedS1FieldEffect(CombinedS1FieldEffect~=0 & s1ab_xyz_mean~=0),2); +plot(x,polyval(S1fieldpoly,x),'Color',[0.7 0.7 0.7],'LineWidth',3); +%SHOULD SWITCH TO A SPLINE FIT!! + + +%% Use recomb physics to determine S2 relation from this direct measurement +alpha=0.11; +Rkr_center=0.7708; %from S2 measurement code +s2_field_effect=( 1 - ( alpha + Rkr_center)*polyval(S1fieldpoly,[2:0.01:3]) + alpha)/(1 - Rkr_center); + +S2fieldpoly=polyfit([2:0.01:3],s2_field_effect,2); + +figure +x=[2.2:0.01:3]; +y=polyval(S1fieldpoly,x); +plot(x,y,'-r','LineWidth',2); +hold on; +y=polyval(S2fieldpoly,x); +plot(x,y,'-k','LineWidth',2); +xlabel('S1a/S1b'); +ylabel('S1_E(XYZ)/S1_E(C) or S2_E(XYZ)/S2_E(C)'); +legend('S1','S2'); +myfigview(16); + +save('S1FieldPolynomial','S1fieldpoly','S2fieldpoly'); diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/S1FieldEffect_to_S1a_3D_LucieMaps.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/S1FieldEffect_to_S1a_3D_LucieMaps.m new file mode 100644 index 0000000..f874d5d --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/S1FieldEffect_to_S1a_3D_LucieMaps.m @@ -0,0 +1,758 @@ +path='C:\Users\Richard\Desktop\LUX Analysis\lux10_20150929T1905_cp18197'; + + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +distinguish_string='test'; + +%Hardcoding inputs for ease of use during testing +user_name='RichardKnoche'; +dp_version='2.15_test'; +algorithm_name='test_KrypCal'; +submit=0; +delay_min=0; +inpaint_on=1; + + file=char(d.files_loaded(1)); + file_id=file(1:19); + cp_start=strfind(file,'cp')+2;%find location of 'cp' in string + cp=file(cp_start:cp_start+4);%cp number has four digits + file_id_cp = [file_id '_cp' cp '_' distinguish_string]; + + + gs=0; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 70000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + clean_cut = (log10(s1_phe_both)+0.6*log10(s2_phe_both)>4.5) & s2radius<25; + + s1_phe_bottom=s1_phe_bottom(clean_cut); + s1_phe_both=s1_phe_both(clean_cut); + s2_phe_bottom=s2_phe_bottom(clean_cut); + s2_phe_both=s2_phe_both(clean_cut); + drift_time=drift_time(clean_cut); + s2x=s2x(clean_cut); + s2y=s2y(clean_cut); + s2radius = (s2x.^2+s2y.^2).^(0.5); + event_timestamp_samples=event_timestamp_samples(clean_cut); + s2_width=s2_width(clean_cut); + s1_width=s1_width(clean_cut); + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + +%% + zcut_min = 10; %field changes at 4 uSec + zcut_max = 0.95*det_edge; + + + if Kr_events < 30000 %then create a 10x10 grid. Otherwise 25x25. Want about 30 evts per bin + + S1xybinsize = sqrt((50*50)/(Kr_events/150)); + S1_xbin_min = -25; + S1_xbin_max = 25; + S1_ybin_min = -25; + S1_ybin_max = 25; + SE_ybin_min = -25; + SE_ybin_max = 25; + + S2xybinsize = sqrt((50*50)/(Kr_events/150));%cm +% SExybinsize = 5; DEFINED LATER, based on number of SE events + S2_xbin_min = -25; + S2_xbin_max = 25; + S2_ybin_min = -25; + S2_ybin_max = 25; + SE_xbin_min = -25; + SE_xbin_max = 25; + + + end + + s1_xbins = (S1_xbin_max-S1_xbin_min)./S1xybinsize; + s1_ybins = (S1_ybin_max-S1_ybin_min)./S1xybinsize; + + s2_xbins = (S2_xbin_max-S2_xbin_min)./S2xybinsize; + s2_ybins = (S2_ybin_max-S2_ybin_min)./S2xybinsize; + + + if Kr_events < 4000; % skip krpCal if less than 4000 events + calibrations=zeros(6,1); + end + %% +%Set up cuts and variables + s1ab_cut=logical(sum(s1_single_cut(:,:),1)); + s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); + s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); + s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); + s1ab_x=d.x_cm(s2_single_cut); + s1ab_y=d.y_cm(s2_single_cut); + s1ab_z=d.z_drift_samples(s2_single_cut)/100; + s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); + + s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<=25; + %plotting x=s1a v y=s1a/s1b cuts: y<0.035x-1, y>-0.035.*x+5; y>0.01.*x; %y<4.2; x<255 +% s1ab_areacut= (s1a_phe_both./s1b_phe_both-0.035.*s1a_phe_both<-1) & (s1a_phe_both./s1b_phe_both+0.035.*s1a_phe_both>5)... +% & (s1a_phe_both./s1b_phe_both > 0.01.* s1a_phe_both) & (s1a_phe_both./s1b_phe_both<4.2) & (s1a_phe_both<255); + + s1ab_x=s1ab_x(s1ab_timing_cut); + s1ab_y=s1ab_y(s1ab_timing_cut); + s1ab_z=s1ab_z(s1ab_timing_cut); + s1a_phe_both=s1a_phe_both(s1ab_timing_cut); + s1b_phe_both=s1b_phe_both(s1ab_timing_cut); + s1ab_radius=s1ab_radius(s1ab_timing_cut); + + dT_step=det_edge/(length(s1ab_z)/1000); %2000 events per z bin + +%% load lucie's sep 2015 field map + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\LucieSep2015_Map_v1p0'); +field_s2x=LucieSep2015_Map_v1p0(:,5); +field_s2y=LucieSep2015_Map_v1p0(:,6); +field_drift_time=LucieSep2015_Map_v1p0(:,7); +field_values=0.01.*LucieSep2015_Map_v1p0(:,4); + +field_cut=~isnan(field_s2x) & ~isnan(field_s2y) & ~isnan(field_drift_time) & ~isnan(field_values); + +field_s2x=field_s2x(field_cut); +field_s2y=field_s2y(field_cut); +field_drift_time=field_drift_time(field_cut); +field_values=field_values(field_cut); + + +%% 3D Kr s1a, s1b, and field map + +s1ab_xyz_numbins=floor((length(s1ab_z)/250)^(1/3)); %number of bins in one direction +s1ab_xyz_zstep=det_edge/s1ab_xyz_numbins; +s1ab_xyz_xstep=50/s1ab_xyz_numbins; +s1ab_xyz_ystep=50/s1ab_xyz_numbins; +s1ab_xyz_xmax=25; +r_max=25; + +s1ab_xyz_zbins=10+s1ab_xyz_zstep/2:s1ab_xyz_zstep:10+s1ab_xyz_zstep/2+s1ab_xyz_zstep*s1ab_xyz_numbins; %20 us +s1ab_xyz_xbins=(-r_max+s1ab_xyz_xstep/2):s1ab_xyz_xstep:r_max; +s1ab_xyz_ybins=(-r_max+s1ab_xyz_ystep/2):s1ab_xyz_ystep:r_max; + +s1a_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +field_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +field_xyz_mean_error=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + q_field = field_s2x(j-s1ab_xyz_xstep) & field_s2y(i-s1ab_xyz_ystep) & inrange(field_drift_time,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + + %Count the number of events per bin + Count_S1ab_3D(l,m,n)=length(s1a_phe_both(q)); + + if length(field_values(q_field)) >=10 + field_xyz_mean(l,m,n)=mean(field_values(q_field)); + field_xyz_mean_error(l,m,n)=std(field_values(q_field)); + else + field_xyz_mean(l,m,n)=nan; + field_xyz_mean_error(l,m,n)=nan; + end + + if (Count_S1ab_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_xyz_mean(l,m,n)=s1a_z_fit.b1; + s1a_xyz_mean_err(l,m,n)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]) ),[0:2:300]).','gauss1'); + s1b_xyz_mean(l,m,n)=s1b_z_fit.b1; + s1b_xyz_mean_err(l,m,n)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); + else %not enough stats to do the fit + s1a_xyz_mean(l,m,n)=0; + s1a_xyz_mean_err(l,m,n)=0; + s1b_xyz_mean(l,m,n)=0; + s1b_xyz_mean_err(l,m,n)=0; + end + + end + end +k +end + + s1ab_xyz_mean=s1a_xyz_mean./s1b_xyz_mean; + s1ab_xyz_mean_err=sqrt( (s1b_xyz_mean_err.*s1a_xyz_mean./(s1b_xyz_mean.^2)).^2 + (s1a_xyz_mean_err./s1b_xyz_mean).^2); + + +% %Removing zeros from the maps with nearest neighbor. +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + + +s1a_xyz_mean_old=s1a_xyz_mean; +temp_map=s1a_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1a_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1a_xyz_mean(~q)=temp_mapQ(r);s1a_xyz_mean=reshape(s1a_xyz_mean,size(s1a_xyz_mean_old,1),size(s1a_xyz_mean_old,2),size(s1a_xyz_mean_old,3)); + +s1b_xyz_mean_old=s1b_xyz_mean; +temp_map=s1b_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1b_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1b_xyz_mean(~q)=temp_mapQ(r);s1b_xyz_mean=reshape(s1b_xyz_mean,size(s1b_xyz_mean_old,1),size(s1b_xyz_mean_old,2),size(s1b_xyz_mean_old,3)); + +field_xyz_mean_old=field_xyz_mean; +temp_map=field_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +field_xyz_mean=temp_map; temp_mapQ=temp_map(q); field_xyz_mean(~q)=temp_mapQ(r);field_xyz_mean=reshape(field_xyz_mean,size(field_xyz_mean_old,1),size(field_xyz_mean_old,2),size(field_xyz_mean_old,3)); + +field_xyz_mean_error_old=field_xyz_mean_error; +temp_map=field_xyz_mean_error; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +field_xyz_mean_error=temp_map; temp_mapQ=temp_map(q); field_xyz_mean_error(~q)=temp_mapQ(r);field_xyz_mean_error=reshape(field_xyz_mean_error,size(field_xyz_mean_error_old,1),size(field_xyz_mean_error_old,2),size(field_xyz_mean_error_old,3)); + + +%% Estimate the field throughout the detector using S1a/S1b r^2vZ maps + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal\KrypCal_2p20_Code\2015_Field_to_S1aS1b.mat'); +[field_map_2015, field_map_2015_staterr]=polyval(S1aS1b_fit_2015,s1ab_xyz_mean,S1aS1b_fit_2015_error); + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal\KrypCal_2p20_Code\2014_Field_to_S1aS1b.mat'); +[field_map_2014, field_map_2014_staterr]=polyval(S1aS1b_fit_2014,s1ab_xyz_mean,S1aS1b_fit_2014_error); + +field_map_lucie=field_xyz_mean; +field_map_lucie_err=field_xyz_mean_error; +field_map_syserr=((field_map_2015-(field_map_2014+field_map_2015+field_map_lucie)/3).^2 + (field_map_2014-(field_map_2014+field_map_2015+field_map_lucie)/3).^2 + (field_map_lucie-(field_map_2014+field_map_2015+field_map_lucie)/3).^2).^(1/2); + +%field_map_syserr is ~16.5% +mean_field_map=field_map_lucie; %(field_map_2014+field_map_2015+field_map_lucie)/3; +mean_field_map_totalerr=sqrt(field_map_syserr.^2+((field_map_2014_staterr.^2+field_map_2015_staterr.^2+field_map_lucie_err.^2)/(3^2))); + + +%% Use the field map to determine number of S1 photons in XYZ +%photons per keV = 118.90 * [electric field in V/cm] ^ -0.15626 + +% num_phot=118.9.*mean_field_map.^-0.15626; %num_phot/keV +num_phot=(-0.0004895.*mean_field_map.*log(1 + 1/((8.9e-4).*mean_field_map)) + 1).*55.2; + +%errors 118.9 +/- 4.14, -0.15626 +/- 0.006 +% num_phot_stat_err=sqrt( (4.14.*mean_field_map.^-0.15626).^2 + (118.9.*(mean_field_map.^-0.15626).*log(mean_field_map).*0.006).^2 + (118.9.*(-0.15626).*(mean_field_map.^(-0.15626-1)).*mean_field_map_totalerr).^2); +% num_phot_err=sqrt( num_phot_stat_err.^2 + (0.02.*num_phot).^2); %adding 2% systematic error from Matthew + +a1=-0.55; del_a1=0.03; +a2=(8.9e-4); del_a2=(1.6e-4); +c=55.2; del_c=1.4904; + +dphot_dc=a1.*a2.*mean_field_map.*log(1+1./(a2.*mean_field_map))+1; +dphot_da1=a2.*c.*mean_field_map.*log(1+1./(a2.*mean_field_map)); +dphot_da2=a1.*c.*mean_field_map.*( ((mean_field_map.*a2+1).*log(1./(mean_field_map.*a2)+1)-1)./(mean_field_map.*a2+1)); +dphot_df=a1.*a2.*c.*( ((mean_field_map.*a2+1).*log(1./(mean_field_map.*a2)+1)-1)./(mean_field_map.*a2+1)); + +num_phot_err=sqrt( (dphot_dc.*del_c).^2 + (dphot_da1.*del_a1).^2+(dphot_da2.*del_a2).^2+(dphot_df.*mean_field_map_totalerr).^2); + +%% We have an estimate of the expected number of photons v XYZ based on field strength alone. FOR 3D Map +% Therefore, num_phot(xyz)/num_phot(center) tells us the strength of the field effect in S1a data +num_phot_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,num_phot,x_center,y_center,z_center,'cubic'); +num_phot_center_err=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,num_phot_err,x_center,y_center,z_center,'cubic'); + + +S1fieldeffect=num_phot./num_phot_center; +S1fieldeffect_err=sqrt( (num_phot_err./num_phot_center).^2 + ( (num_phot.*num_phot_center_err)/(num_phot_center.^2)).^2 ); + +s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + +% % Plot S1fieldeffect versus S1a/S1b... hopefully it's similar to what KrypCal measures +% figure +% rkploterr(s1ab_xyz_mean,S1fieldeffect,s1ab_xyz_mean_err,S1fieldeffect_err,[0 0 0],'.',100,1); +% xlabel('S1a/S1b'); +% ylabel('Number of S1a photons (xyz) / Number of S1a photons (center)'); +% myfigview(16); +% +% %Overlay Kr2.20 result, renormalized to the new S1aS1b center value +% s1ab_s1_xyz_fit_map.p1=0.34; +% s1ab_s1_xyz_fit_map.p2=-1.4; +% s1ab_s1_xyz_fit_map.p3=2.2874; +% x=[2.2:0.1:3.1]; +% y= (s1ab_s1_xyz_fit_map.p1.*x.^2+s1ab_s1_xyz_fit_map.p2.*x+s1ab_s1_xyz_fit_map.p3)./(s1ab_s1_xyz_fit_map.p1.*s1as1b_at_center.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_at_center+s1ab_s1_xyz_fit_map.p3); +% plot(x,y,'-b','LineWidth',3); +% +% +% %Overlay Kr2.18 Result +% s1ab_s1_xyz_fit_map.p1=0.46; +% b2=1-2.7347.*s1ab_s1_xyz_fit_map.p1; +% s1ab_s1_xyz_fit_map.p2=b2; +% x=[2.2:0.1:3.1]; +% y= (s1ab_s1_xyz_fit_map.p1.*x+s1ab_s1_xyz_fit_map.p2)./(s1ab_s1_xyz_fit_map.p1.*s1as1b_at_center+s1ab_s1_xyz_fit_map.p2); +% plot(x,y,'-r','LineWidth',3); +% ylim([0.5 2]); +% xlim([2.2 3.1]); +% +% % Fit a polynomial to the s1 field effect result +% S1fieldpoly=polyfit(s1ab_xyz_mean(S1fieldeffect~=0 & s1ab_xyz_mean~=0),S1fieldeffect(S1fieldeffect~=0 & s1ab_xyz_mean~=0),3); +% plot(x,polyval(S1fieldpoly,x),'Color',[0.7 0.7 0.7],'LineWidth',3); +% title('These shouldnt necessarily be the same, Grey is S1a(XYZ)/S1(C), and others are (S1(XYZ)/S1(center))') +% %SHOULD SWITCH TO A SPLINE FIT!! + + +%% estimate g1 from S1a at center and field at center. Since S1 is normalized to the center, detector inefficiency correction=1 here + +s1a_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1a_xyz_mean,x_center,y_center,z_center,'cubic'); +s1a_center_err=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1a_xyz_mean_err,x_center,y_center,z_center,'cubic'); + +g1_interp_measurement=s1a_center./(32.1.*num_phot_center); +g1_interp_measurement_err=sqrt( (s1a_center_err./(32.1.*num_phot_center)).^2 + ( (s1a_center.*num_phot_center_err)/(32.1.*num_phot_center.^2)).^2); + + +%% Now remove the field effect from raw S1a data, and measure the residual detector inefficency variation -- THIS SHOULD BE THE SAME AS THE ONE MEASURED FROM S1_E +% +% s1ab_x=s1ab_x(s1ab_timing_cut); +% s1ab_y=s1ab_y(s1ab_timing_cut); +% s1ab_z=s1ab_z(s1ab_timing_cut); +% s1a_phe_both=s1a_phe_both(s1ab_timing_cut); +% s1b_phe_both=s1b_phe_both(s1ab_timing_cut); +% s1ab_radius=s1ab_radius(s1ab_timing_cut); +% + + + +%Normalization of S1a field effect to center: S1fieldeffect(xyz/c) is equivalent to 1/norm_s1_both_xyz in KrypCal +S1fieldeffect_norm=1./S1fieldeffect; %This is really s1a field effect +S1fieldeffect_norm(isinf(S1fieldeffect_norm))=1;%remove infinity. no correction outside 25cm +S1fieldeffect_norm(isnan(S1fieldeffect_norm))=1;%remove nan. no correction outside 25cm +S1fieldeffect_norm_err=S1fieldeffect_err./(S1fieldeffect.^2); +%Removing field effect from raw S1a data + +s1a_phe_both_f=s1a_phe_both.*interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,S1fieldeffect_norm,s1ab_x,s1ab_y,s1ab_z,'spline').'; +s1a_phe_both_f_err=s1a_phe_both.*interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,S1fieldeffect_norm_err,s1ab_x,s1ab_y,s1ab_z,'cubic').'; + +%% S1a_f Z dep + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=50; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s1ab_radius,[rcut_min,rcut_max]) & inrange(s1a_phe_both_f,[s1_bin_min,s1_bin_max]).'; + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + sys_error_z=zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(s1ab_z,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1a_phe_both_f(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + sys_error_z(bin)=mean(s1a_phe_both_f_err(time_cut)); %average systematic error for the bin + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[0, 350] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + light_correction_fig = figure; + errorbar(mean_index,means,means_error,'.k'); + hold on + [yplot_s1_both] = polyval(P_s1_both,dT_fit); + [center_s1_both, center_s1_both_err] = polyval(P_s1_both,z_center, S); %160[us]*1.51[\mus/us] + plot(dT_fit,yplot_s1_both,'-r','LineWidth',1); + xlabel('Depth (\mus)', 'FontSize',16); ylabel('Mean (Pulse Area Phe)', 'FontSize', 16); + line([0 det_edge],[center_s1_both center_s1_both],'linestyle','--'); + line([z_center; z_center;],[min(means) max(means)],'linestyle','--'); + legend('S1\_both Mean', strcat('y=', num2str(P_s1_both(1),'%10.2e'), '*Z^2 + ', num2str(P_s1_both(2),'%10.2e')... + , '*Z + ', num2str(P_s1_both(3),4)),strcat('Det center = ',num2str(center_s1_both,4), ' [Phe]'),'location','northwest') + + box on; + myfigview(16); + xlim([0 det_edge]); + ylim([0.8*min(means) 1.15*max(means)]); + + +%% Measuring the residual S1a_F XYZ variation to get efficiency corrections - use same binning as S1a/S1b 3D map + +s1a_f_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_f_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_f_xyz_sys_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + + %Count the number of events per bin + Count_S1a_f_3D(l,m,n)=length(s1a_phe_both_f(q)); + + + if (Count_S1a_f_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_f_z_fit=fit([0:2:400].',hist(s1a_phe_both_f(q.' & inrange(s1a_phe_both_f,[0 400])),[0:2:400]).','gauss1'); + s1a_f_xyz_mean(l,m,n)=s1a_f_z_fit.b1; + s1a_f_xyz_mean_err(l,m,n)=s1a_f_z_fit.c1/sqrt(2)/length(s1a_phe_both_f(q.' & inrange(s1a_phe_both_f,[0 400]))); + s1a_f_xyz_sys_err(l,m,n)=mean(s1a_phe_both_f_err(q.' & inrange(s1a_phe_both_f,[0 400]))); %average systematic error for the bin + else %not enough stats to do the fit + s1a_f_xyz_mean(l,m,n)=0; + s1a_f_xyz_mean_err(l,m,n)=0; + s1a_f_xyz_sys_err(l,m,n)=0; + end + + end + end +k +end + +total_xyz_err=sqrt(s1a_f_xyz_sys_err.^2 + s1a_f_xyz_mean_err.^2); + +%Producing S1 detector inefficiency correction fro S1a_f map +center_s1a_f=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1a_f_xyz_mean,x_center,y_center,z_center,'spline');%Normalize to the center (x=y=0. dT=160us) +center_s1a_f_staterr=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1a_f_xyz_mean_err,x_center,y_center,z_center,'spline'); +center_s1a_f_syserr=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1a_f_xyz_sys_err,x_center,y_center,z_center,'spline'); +center_s1a_f_totalerr=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,total_xyz_err,x_center,y_center,z_center,'spline'); + +norm_s1_both_xyz=center_s1a_f./s1a_f_xyz_mean; %Normalize to center (x=y=0. dT=160) +norm_s1_both_xyz(isinf(norm_s1_both_xyz))=1;%remove infinity. no correction outside 25cm +norm_s1_both_xyz(isnan(norm_s1_both_xyz))=1;%remove nan. no correction outside 25cm +norm_s1_both_xyz_staterr=sqrt( (center_s1a_f_staterr./s1a_f_xyz_mean).^2 + ((center_s1a_f.*s1a_f_xyz_mean_err)./(s1a_f_xyz_mean.^2)).^2); +norm_s1_both_xyz_totalerr=sqrt( (center_s1a_f_totalerr./s1a_f_xyz_mean).^2 + ((center_s1a_f.*total_xyz_err)./(s1a_f_xyz_mean.^2)).^2); + +%Fill in NaN errors with nearest neighbors +norm_s1_both_xyz_staterr_old=norm_s1_both_xyz_staterr; +temp_map=norm_s1_both_xyz_staterr; +q= ~isnan(norm_s1_both_xyz_staterr); +r=nearestpoint(find(~q),find(q)); +norm_s1_both_xyz_staterr=temp_map; temp_mapQ=temp_map(q); norm_s1_both_xyz_staterr(~q)=temp_mapQ(r);norm_s1_both_xyz_staterr=reshape(norm_s1_both_xyz_staterr,size(norm_s1_both_xyz_staterr_old,1),size(norm_s1_both_xyz_staterr_old,2),size(norm_s1_both_xyz_staterr_old,3)); + +norm_s1_both_xyz_totalerr_old=norm_s1_both_xyz_totalerr; +temp_map=norm_s1_both_xyz_totalerr; +q= ~isnan(norm_s1_both_xyz_totalerr); +r=nearestpoint(find(~q),find(q)); +norm_s1_both_xyz_totalerr=temp_map; temp_mapQ=temp_map(q); norm_s1_both_xyz_totalerr(~q)=temp_mapQ(r);norm_s1_both_xyz_totalerr=reshape(norm_s1_both_xyz_totalerr,size(norm_s1_both_xyz_totalerr_old,1),size(norm_s1_both_xyz_totalerr_old,2),size(norm_s1_both_xyz_totalerr_old,3)); + + + +%% Now remove the detector inefficiency variation from the raw S1a data and determine g1 using total g1=S1a_E/(num_phot_center*keV). CROSS CHECK OF KRYPCAL G1 +s1a_phe_both_e=s1a_phe_both.*interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,norm_s1_both_xyz,s1ab_x,s1ab_y,s1ab_z,'spline').'; %this is s1a_E +s1a_phe_both_e_totalerr=s1a_phe_both.*interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,norm_s1_both_xyz_totalerr,s1ab_x,s1ab_y,s1ab_z,'cubic').'; %this is s1a_E +s1a_phe_both_e_staterr=s1a_phe_both.*interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,norm_s1_both_xyz_staterr,s1ab_x,s1ab_y,s1ab_z,'cubic').'; %this is s1a_E + +s1a_e_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_e_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + + %Count the number of events per bin + Count_S1a_e_3D(l,m,n)=length(s1a_phe_both_e(q)); + + + if (Count_S1a_e_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_e_z_fit=fit([0:2:400].',hist(s1a_phe_both_e(q.' & inrange(s1a_phe_both_e,[0 400])),[0:2:400]).','gauss1'); + s1a_e_xyz_mean(l,m,n)=s1a_e_z_fit.b1; + s1a_e_xyz_mean_err(l,m,n)=s1a_e_z_fit.c1/sqrt(2)/length(s1a_phe_both_e(q.' & inrange(s1a_phe_both_e,[0 400]))); + s1a_e_xyz_stat_err(l,m,n)=mean(s1a_phe_both_e_staterr(q.')); + s1a_e_xyz_total_err(l,m,n)=mean(s1a_phe_both_e_totalerr(q.')); + else %not enough stats to do the fit + s1a_e_xyz_mean(l,m,n)=0; + s1a_e_xyz_mean_err(l,m,n)=0; + s1a_e_xyz_stat_err(l,m,n)=0; + s1a_e_xyz_total_err(l,m,n)=0; + end + + end + end +k +end + +%Producing S1 detector inefficiency correction fro S1a_f map +center_s1a_e=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1a_e_xyz_mean,x_center,y_center,z_center,'spline');%Normalize to the center (x=y=0. dT=160us) +center_s1a_e_err=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1a_e_xyz_mean_err,x_center,y_center,z_center,'spline');%Normalize to the center (x=y=0. dT=160us) +center_s1a_e_statsyserr=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1a_e_xyz_stat_err,x_center,y_center,z_center,'spline'); +center_s1a_e_totalstaterr=sqrt(center_s1a_e_statsyserr.^2 + center_s1a_e_err.^2); +center_s1a_e_totalerr=sqrt(center_s1a_e_err.^2 + interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1a_e_xyz_total_err,x_center,y_center,z_center,'spline').^2); + + +%total signal fits, to see if it is consistent with center_s1a_e +% s1a_E_fit=fit([0:1:400].',hist(s1a_phe_both_e,[0:1:400]).','gauss1'); +% s1a_E_fit_err=confint(s1a_E_fit,0.68); +% s1a_E_mean=s1a_E_fit.b1; +% s1a_E_mean_err=abs(s1a_E_fit.b1-s1a_E_fit_err(1,2)); + +% g1_measurement=s1a_E_mean./(32.1.*num_phot_center) +% g1_measurement_err=sqrt( (s1a_E_mean_err./(32.1.*num_phot_center)).^2 + ( (s1a_E_mean.*num_phot_center_err)/(32.1.*num_phot_center.^2)).^2); + +g1_measurement=center_s1a_e./(32.1.*num_phot_center) +g1_measurement_err=sqrt( (center_s1a_e_totalerr./(32.1.*num_phot_center)).^2 + ( (center_s1a_e.*num_phot_center_err)/(32.1.*num_phot_center.^2)).^2); %was just _err before, not _totalerr + +%% Now remove the detector inefficency variation from the raw S1 (not S1a) data, and determine the field effect in S1 data. Compare to KrypCal results. CROSS CHECK OF KRYPCAL S1 RELATIONSHIP + +s1_phe_both_xyz=s1_phe_both.*interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,norm_s1_both_xyz,s2x,s2y,drift_time,'spline'); +s1_phe_both_xyz_staterr=s1_phe_both.*interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,norm_s1_both_xyz_staterr,s2x,s2y,drift_time,'spline',mean(norm_s1_both_xyz_staterr(:))); +s1_phe_both_xyz_totalerr=s1_phe_both.*interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,norm_s1_both_xyz_totalerr,s2x,s2y,drift_time,'spline',mean(norm_s1_both_xyz_totalerr(:))); + +s1_phe_both_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1_phe_both_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s2x(j-s1ab_xyz_xstep) & s2y(i-s1ab_xyz_ystep) & inrange(drift_time,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + + %Count the number of events per bin + Count_3D(l,m,n)=length(s1_phe_both_xyz(q)); + + + if (Count_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1_phe_both_xyz_fit=fit([0:2:400].',hist(s1_phe_both_xyz(q & inrange(s1_phe_both_xyz,[0 400])),[0:2:400]).','gauss1'); + s1_phe_both_xyz_mean(l,m,n)=s1_phe_both_xyz_fit.b1; + s1_phe_both_xyz_mean_err(l,m,n)=s1_phe_both_xyz_fit.c1/sqrt(2)/length(s1_phe_both_xyz(q & inrange(s1_phe_both_xyz,[0 400]))); + s1_phe_both_xyz_stat_err(l,m,n)=mean(s1_phe_both_xyz_staterr(q)); + s1_phe_both_xyz_total_err(l,m,n)=mean(s1_phe_both_xyz_totalerr(q)); + + else %not enough stats to do the fit + s1_phe_both_xyz_mean(l,m,n)=0; + s1_phe_both_xyz_mean_err(l,m,n)=0; + s1_phe_both_xyz_stat_err(l,m,n)=0; + s1_phe_both_xyz_total_err(l,m,n)=0; + + end + + end + end +k +end + +s1xyz_total_stat_err=sqrt(s1_phe_both_xyz_mean_err.^2 + s1_phe_both_xyz_stat_err.^2); +s1xyz_total_err=sqrt( s1_phe_both_xyz_mean_err.^2 + s1_phe_both_xyz_total_err.^2); + +%CHANGE THIS TO BE BASED OFF TOTAL FROM ABOVE!? +%Producing S1 detector inefficiency correction fro S1a_f map - ERROR DOES NOT TAKE INTO ACCOUNT THE UNCERTAINITY ON THE S1 EFFICIENCY CORRECTION! +center_s1E_phe_both=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1_phe_both_xyz_mean,x_center,y_center,z_center,'spline'); +center_s1E_phe_both_err=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1_phe_both_xyz_mean_err,x_center,y_center,z_center,'spline'); +center_s1E_phe_both_statsyserr=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1_phe_both_xyz_stat_err,x_center,y_center,z_center,'spline'); +center_s1E_phe_both_totalstaterr=sqrt(center_s1E_phe_both_err.^2 + center_s1E_phe_both_statsyserr.^2); +center_s1E_phe_both_totalerr=sqrt(center_s1E_phe_both_err.^2 + interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1_phe_both_xyz_total_err,x_center,y_center,z_center,'spline').^2); + +CombinedS1FieldEffect=s1_phe_both_xyz_mean./center_s1E_phe_both; +CombinedS1FieldEffect_err=sqrt ( (s1_phe_both_xyz_mean_err./center_s1E_phe_both).^2 + ( (s1_phe_both_xyz_mean.*center_s1E_phe_both_err)./(center_s1E_phe_both.^2)).^2); +CombinedS1FieldEffect_totalstaterr=sqrt ( (s1xyz_total_stat_err./center_s1E_phe_both).^2 + ( (s1_phe_both_xyz_mean.*center_s1E_phe_both_totalstaterr)./(center_s1E_phe_both.^2)).^2); +CombinedS1FieldEffect_totalerr=sqrt ( (s1xyz_total_err./center_s1E_phe_both).^2 + ( (s1_phe_both_xyz_mean.*center_s1E_phe_both_totalerr)./(center_s1E_phe_both.^2)).^2); + +%Make S1a/S1b v S1 field effect plot +figure +rkploterr(s1ab_xyz_mean,CombinedS1FieldEffect,s1ab_xyz_mean_err,CombinedS1FieldEffect_totalerr,[0 0 0],'.',100,1); +xlabel('S1a/S1b'); +ylabel('S1_E(XYZ)/S1_E(C)'); +myfigview(16); + +%Overlay Kr2.20 result, renormalized to the new S1aS1b center value +s1ab_s1_xyz_fit_map.p1=0.34; +s1ab_s1_xyz_fit_map.p2=-1.4; +s1ab_s1_xyz_fit_map.p3=2.2874; +x=[2.2:0.1:3.1]; +y= (s1ab_s1_xyz_fit_map.p1.*x.^2+s1ab_s1_xyz_fit_map.p2.*x+s1ab_s1_xyz_fit_map.p3)./(s1ab_s1_xyz_fit_map.p1.*s1as1b_at_center.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_at_center+s1ab_s1_xyz_fit_map.p3); +plot(x,y,'-b','LineWidth',3); + + +%Overlay Kr2.18 Result +s1ab_s1_xyz_fit_map.p1=0.46; +b2=1-2.7347.*s1ab_s1_xyz_fit_map.p1; +s1ab_s1_xyz_fit_map.p2=b2; +x=[2.2:0.1:3.1]; +y= (s1ab_s1_xyz_fit_map.p1.*x+s1ab_s1_xyz_fit_map.p2)./(s1ab_s1_xyz_fit_map.p1.*s1as1b_at_center+s1ab_s1_xyz_fit_map.p2); +plot(x,y,'-r','LineWidth',3); +ylim([0.5 1.6]); +xlim([2.2 3.1]); + +% Fit a polynomial to the s1 field effect result +S1fieldpoly=polyfit(s1ab_xyz_mean(CombinedS1FieldEffect~=0 & s1ab_xyz_mean~=0),CombinedS1FieldEffect(CombinedS1FieldEffect~=0 & s1ab_xyz_mean~=0),2); +plot(x,polyval(S1fieldpoly,x),'Color',[0.7 0.7 0.7],'LineWidth',3); +%SHOULD SWITCH TO A SPLINE FIT!! + + +%% Use recomb physics to determine S2 relation from this direct measurement +alpha=0.11; +Rkr_center=0.7708; %from S2 measurement code +s2_field_effect=( 1 - ( alpha + Rkr_center)*polyval(S1fieldpoly,[2:0.01:3]) + alpha)/(1 - Rkr_center); + +S2fieldpoly=polyfit([2:0.01:3],s2_field_effect,2); + +figure +x=[2.2:0.01:3]; +y=polyval(S1fieldpoly,x); +plot(x,y,'-r','LineWidth',2); +hold on; +y=polyval(S2fieldpoly,x); +plot(x,y,'-k','LineWidth',2); +xlabel('S1a/S1b'); +ylabel('S1_E(XYZ)/S1_E(C) or S2_E(XYZ)/S2_E(C)'); +legend('S1','S2'); +myfigview(16); + +save('S1FieldPolynomial_LucieMaps','S1fieldpoly','S2fieldpoly'); diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/S1FieldEffect_to_S1a_3D_ScottMaps.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/S1FieldEffect_to_S1a_3D_ScottMaps.m new file mode 100644 index 0000000..41c06d7 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/S1aMethod/libNEST_CH3TModel/S1FieldEffect_to_S1a_3D_ScottMaps.m @@ -0,0 +1,758 @@ +path='C:\Users\Richard\Desktop\LUX Analysis\lux10_20150929T1905_cp18197'; + + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +distinguish_string='test'; + +%Hardcoding inputs for ease of use during testing +user_name='RichardKnoche'; +dp_version='2.15_test'; +algorithm_name='test_KrypCal'; +submit=0; +delay_min=0; +inpaint_on=1; + + file=char(d.files_loaded(1)); + file_id=file(1:19); + cp_start=strfind(file,'cp')+2;%find location of 'cp' in string + cp=file(cp_start:cp_start+4);%cp number has four digits + file_id_cp = [file_id '_cp' cp '_' distinguish_string]; + + + gs=0; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 70000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + clean_cut = (log10(s1_phe_both)+0.6*log10(s2_phe_both)>4.5) & s2radius<25; + + s1_phe_bottom=s1_phe_bottom(clean_cut); + s1_phe_both=s1_phe_both(clean_cut); + s2_phe_bottom=s2_phe_bottom(clean_cut); + s2_phe_both=s2_phe_both(clean_cut); + drift_time=drift_time(clean_cut); + s2x=s2x(clean_cut); + s2y=s2y(clean_cut); + s2radius = (s2x.^2+s2y.^2).^(0.5); + event_timestamp_samples=event_timestamp_samples(clean_cut); + s2_width=s2_width(clean_cut); + s1_width=s1_width(clean_cut); + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + +%% + zcut_min = 10; %field changes at 4 uSec + zcut_max = 0.95*det_edge; + + + if Kr_events < 30000 %then create a 10x10 grid. Otherwise 25x25. Want about 30 evts per bin + + S1xybinsize = sqrt((50*50)/(Kr_events/150)); + S1_xbin_min = -25; + S1_xbin_max = 25; + S1_ybin_min = -25; + S1_ybin_max = 25; + SE_ybin_min = -25; + SE_ybin_max = 25; + + S2xybinsize = sqrt((50*50)/(Kr_events/150));%cm +% SExybinsize = 5; DEFINED LATER, based on number of SE events + S2_xbin_min = -25; + S2_xbin_max = 25; + S2_ybin_min = -25; + S2_ybin_max = 25; + SE_xbin_min = -25; + SE_xbin_max = 25; + + + end + + s1_xbins = (S1_xbin_max-S1_xbin_min)./S1xybinsize; + s1_ybins = (S1_ybin_max-S1_ybin_min)./S1xybinsize; + + s2_xbins = (S2_xbin_max-S2_xbin_min)./S2xybinsize; + s2_ybins = (S2_ybin_max-S2_ybin_min)./S2xybinsize; + + + if Kr_events < 4000; % skip krpCal if less than 4000 events + calibrations=zeros(6,1); + end + %% +%Set up cuts and variables + s1ab_cut=logical(sum(s1_single_cut(:,:),1)); + s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); + s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); + s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); + s1ab_x=d.x_cm(s2_single_cut); + s1ab_y=d.y_cm(s2_single_cut); + s1ab_z=d.z_drift_samples(s2_single_cut)/100; + s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); + + s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<=25; + %plotting x=s1a v y=s1a/s1b cuts: y<0.035x-1, y>-0.035.*x+5; y>0.01.*x; %y<4.2; x<255 +% s1ab_areacut= (s1a_phe_both./s1b_phe_both-0.035.*s1a_phe_both<-1) & (s1a_phe_both./s1b_phe_both+0.035.*s1a_phe_both>5)... +% & (s1a_phe_both./s1b_phe_both > 0.01.* s1a_phe_both) & (s1a_phe_both./s1b_phe_both<4.2) & (s1a_phe_both<255); + + s1ab_x=s1ab_x(s1ab_timing_cut); + s1ab_y=s1ab_y(s1ab_timing_cut); + s1ab_z=s1ab_z(s1ab_timing_cut); + s1a_phe_both=s1a_phe_both(s1ab_timing_cut); + s1b_phe_both=s1b_phe_both(s1ab_timing_cut); + s1ab_radius=s1ab_radius(s1ab_timing_cut); + + dT_step=det_edge/(length(s1ab_z)/1000); %2000 events per z bin + +%% load lucie's sep 2015 field map + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\LucieSep2015_Map_v1p0'); +field_s2x=LucieSep2015_Map_v1p0(:,5); +field_s2y=LucieSep2015_Map_v1p0(:,6); +field_drift_time=LucieSep2015_Map_v1p0(:,7); +field_values=0.01.*LucieSep2015_Map_v1p0(:,4); + +field_cut=~isnan(field_s2x) & ~isnan(field_s2y) & ~isnan(field_drift_time) & ~isnan(field_values); + +field_s2x=field_s2x(field_cut); +field_s2y=field_s2y(field_cut); +field_drift_time=field_drift_time(field_cut); +field_values=field_values(field_cut); + + +%% 3D Kr s1a, s1b, and field map + +s1ab_xyz_numbins=floor((length(s1ab_z)/250)^(1/3)); %number of bins in one direction +s1ab_xyz_zstep=det_edge/s1ab_xyz_numbins; +s1ab_xyz_xstep=50/s1ab_xyz_numbins; +s1ab_xyz_ystep=50/s1ab_xyz_numbins; +s1ab_xyz_xmax=25; +r_max=25; + +s1ab_xyz_zbins=10+s1ab_xyz_zstep/2:s1ab_xyz_zstep:10+s1ab_xyz_zstep/2+s1ab_xyz_zstep*s1ab_xyz_numbins; %20 us +s1ab_xyz_xbins=(-r_max+s1ab_xyz_xstep/2):s1ab_xyz_xstep:r_max; +s1ab_xyz_ybins=(-r_max+s1ab_xyz_ystep/2):s1ab_xyz_ystep:r_max; + +s1a_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +field_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +field_xyz_mean_error=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + q_field = field_s2x(j-s1ab_xyz_xstep) & field_s2y(i-s1ab_xyz_ystep) & inrange(field_drift_time,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + + %Count the number of events per bin + Count_S1ab_3D(l,m,n)=length(s1a_phe_both(q)); + + if length(field_values(q_field)) >=10 + field_xyz_mean(l,m,n)=mean(field_values(q_field)); + field_xyz_mean_error(l,m,n)=std(field_values(q_field)); + else + field_xyz_mean(l,m,n)=nan; + field_xyz_mean_error(l,m,n)=nan; + end + + if (Count_S1ab_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_xyz_mean(l,m,n)=s1a_z_fit.b1; + s1a_xyz_mean_err(l,m,n)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]) ),[0:2:300]).','gauss1'); + s1b_xyz_mean(l,m,n)=s1b_z_fit.b1; + s1b_xyz_mean_err(l,m,n)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); + else %not enough stats to do the fit + s1a_xyz_mean(l,m,n)=0; + s1a_xyz_mean_err(l,m,n)=0; + s1b_xyz_mean(l,m,n)=0; + s1b_xyz_mean_err(l,m,n)=0; + end + + end + end +k +end + + s1ab_xyz_mean=s1a_xyz_mean./s1b_xyz_mean; + s1ab_xyz_mean_err=sqrt( (s1b_xyz_mean_err.*s1a_xyz_mean./(s1b_xyz_mean.^2)).^2 + (s1a_xyz_mean_err./s1b_xyz_mean).^2); + + +% %Removing zeros from the maps with nearest neighbor. +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + + +s1a_xyz_mean_old=s1a_xyz_mean; +temp_map=s1a_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1a_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1a_xyz_mean(~q)=temp_mapQ(r);s1a_xyz_mean=reshape(s1a_xyz_mean,size(s1a_xyz_mean_old,1),size(s1a_xyz_mean_old,2),size(s1a_xyz_mean_old,3)); + +s1b_xyz_mean_old=s1b_xyz_mean; +temp_map=s1b_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1b_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1b_xyz_mean(~q)=temp_mapQ(r);s1b_xyz_mean=reshape(s1b_xyz_mean,size(s1b_xyz_mean_old,1),size(s1b_xyz_mean_old,2),size(s1b_xyz_mean_old,3)); + +field_xyz_mean_old=field_xyz_mean; +temp_map=field_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +field_xyz_mean=temp_map; temp_mapQ=temp_map(q); field_xyz_mean(~q)=temp_mapQ(r);field_xyz_mean=reshape(field_xyz_mean,size(field_xyz_mean_old,1),size(field_xyz_mean_old,2),size(field_xyz_mean_old,3)); + +field_xyz_mean_error_old=field_xyz_mean_error; +temp_map=field_xyz_mean_error; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +field_xyz_mean_error=temp_map; temp_mapQ=temp_map(q); field_xyz_mean_error(~q)=temp_mapQ(r);field_xyz_mean_error=reshape(field_xyz_mean_error,size(field_xyz_mean_error_old,1),size(field_xyz_mean_error_old,2),size(field_xyz_mean_error_old,3)); + + +%% Estimate the field throughout the detector using S1a/S1b r^2vZ maps + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal\KrypCal_2p20_Code\2015_Field_to_S1aS1b.mat'); +[field_map_2015, field_map_2015_staterr]=polyval(S1aS1b_fit_2015,s1ab_xyz_mean,S1aS1b_fit_2015_error); + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal\KrypCal_2p20_Code\2014_Field_to_S1aS1b.mat'); +[field_map_2014, field_map_2014_staterr]=polyval(S1aS1b_fit_2014,s1ab_xyz_mean,S1aS1b_fit_2014_error); + +field_map_lucie=field_xyz_mean; +field_map_lucie_err=field_xyz_mean_error; +field_map_syserr=((field_map_2015-(field_map_2014+field_map_2015+field_map_lucie)/3).^2 + (field_map_2014-(field_map_2014+field_map_2015+field_map_lucie)/3).^2 + (field_map_lucie-(field_map_2014+field_map_2015+field_map_lucie)/3).^2).^(1/2); + +%field_map_syserr is ~16.5% +mean_field_map=field_map_2015; %(field_map_2014+field_map_2015+field_map_lucie)/3; +mean_field_map_totalerr=sqrt(field_map_syserr.^2+((field_map_2014_staterr.^2+field_map_2015_staterr.^2+field_map_lucie_err.^2)/(3^2))); + + +%% Use the field map to determine number of S1 photons in XYZ +%photons per keV = 118.90 * [electric field in V/cm] ^ -0.15626 + +% num_phot=118.9.*mean_field_map.^-0.15626; %num_phot/keV +num_phot=(-0.0004895.*mean_field_map.*log(1 + 1/((8.9e-4).*mean_field_map)) + 1).*55.2; + +%errors 118.9 +/- 4.14, -0.15626 +/- 0.006 +% num_phot_stat_err=sqrt( (4.14.*mean_field_map.^-0.15626).^2 + (118.9.*(mean_field_map.^-0.15626).*log(mean_field_map).*0.006).^2 + (118.9.*(-0.15626).*(mean_field_map.^(-0.15626-1)).*mean_field_map_totalerr).^2); +% num_phot_err=sqrt( num_phot_stat_err.^2 + (0.02.*num_phot).^2); %adding 2% systematic error from Matthew + +a1=-0.55; del_a1=0.03; +a2=(8.9e-4); del_a2=(1.6e-4); +c=55.2; del_c=1.4904; + +dphot_dc=a1.*a2.*mean_field_map.*log(1+1./(a2.*mean_field_map))+1; +dphot_da1=a2.*c.*mean_field_map.*log(1+1./(a2.*mean_field_map)); +dphot_da2=a1.*c.*mean_field_map.*( ((mean_field_map.*a2+1).*log(1./(mean_field_map.*a2)+1)-1)./(mean_field_map.*a2+1)); +dphot_df=a1.*a2.*c.*( ((mean_field_map.*a2+1).*log(1./(mean_field_map.*a2)+1)-1)./(mean_field_map.*a2+1)); + +num_phot_err=sqrt( (dphot_dc.*del_c).^2 + (dphot_da1.*del_a1).^2+(dphot_da2.*del_a2).^2+(dphot_df.*mean_field_map_totalerr).^2); + +%% We have an estimate of the expected number of photons v XYZ based on field strength alone. FOR 3D Map +% Therefore, num_phot(xyz)/num_phot(center) tells us the strength of the field effect in S1a data +num_phot_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,num_phot,x_center,y_center,z_center,'cubic'); +num_phot_center_err=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,num_phot_err,x_center,y_center,z_center,'cubic'); + + +S1fieldeffect=num_phot./num_phot_center; +S1fieldeffect_err=sqrt( (num_phot_err./num_phot_center).^2 + ( (num_phot.*num_phot_center_err)/(num_phot_center.^2)).^2 ); + +s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + +% % Plot S1fieldeffect versus S1a/S1b... hopefully it's similar to what KrypCal measures +% figure +% rkploterr(s1ab_xyz_mean,S1fieldeffect,s1ab_xyz_mean_err,S1fieldeffect_err,[0 0 0],'.',100,1); +% xlabel('S1a/S1b'); +% ylabel('Number of S1a photons (xyz) / Number of S1a photons (center)'); +% myfigview(16); +% +% %Overlay Kr2.20 result, renormalized to the new S1aS1b center value +% s1ab_s1_xyz_fit_map.p1=0.34; +% s1ab_s1_xyz_fit_map.p2=-1.4; +% s1ab_s1_xyz_fit_map.p3=2.2874; +% x=[2.2:0.1:3.1]; +% y= (s1ab_s1_xyz_fit_map.p1.*x.^2+s1ab_s1_xyz_fit_map.p2.*x+s1ab_s1_xyz_fit_map.p3)./(s1ab_s1_xyz_fit_map.p1.*s1as1b_at_center.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_at_center+s1ab_s1_xyz_fit_map.p3); +% plot(x,y,'-b','LineWidth',3); +% +% +% %Overlay Kr2.18 Result +% s1ab_s1_xyz_fit_map.p1=0.46; +% b2=1-2.7347.*s1ab_s1_xyz_fit_map.p1; +% s1ab_s1_xyz_fit_map.p2=b2; +% x=[2.2:0.1:3.1]; +% y= (s1ab_s1_xyz_fit_map.p1.*x+s1ab_s1_xyz_fit_map.p2)./(s1ab_s1_xyz_fit_map.p1.*s1as1b_at_center+s1ab_s1_xyz_fit_map.p2); +% plot(x,y,'-r','LineWidth',3); +% ylim([0.5 2]); +% xlim([2.2 3.1]); +% +% % Fit a polynomial to the s1 field effect result +% S1fieldpoly=polyfit(s1ab_xyz_mean(S1fieldeffect~=0 & s1ab_xyz_mean~=0),S1fieldeffect(S1fieldeffect~=0 & s1ab_xyz_mean~=0),3); +% plot(x,polyval(S1fieldpoly,x),'Color',[0.7 0.7 0.7],'LineWidth',3); +% title('These shouldnt necessarily be the same, Grey is S1a(XYZ)/S1(C), and others are (S1(XYZ)/S1(center))') +% %SHOULD SWITCH TO A SPLINE FIT!! + + +%% estimate g1 from S1a at center and field at center. Since S1 is normalized to the center, detector inefficiency correction=1 here + +s1a_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1a_xyz_mean,x_center,y_center,z_center,'cubic'); +s1a_center_err=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1a_xyz_mean_err,x_center,y_center,z_center,'cubic'); + +g1_interp_measurement=s1a_center./(32.1.*num_phot_center); +g1_interp_measurement_err=sqrt( (s1a_center_err./(32.1.*num_phot_center)).^2 + ( (s1a_center.*num_phot_center_err)/(32.1.*num_phot_center.^2)).^2); + + +%% Now remove the field effect from raw S1a data, and measure the residual detector inefficency variation -- THIS SHOULD BE THE SAME AS THE ONE MEASURED FROM S1_E +% +% s1ab_x=s1ab_x(s1ab_timing_cut); +% s1ab_y=s1ab_y(s1ab_timing_cut); +% s1ab_z=s1ab_z(s1ab_timing_cut); +% s1a_phe_both=s1a_phe_both(s1ab_timing_cut); +% s1b_phe_both=s1b_phe_both(s1ab_timing_cut); +% s1ab_radius=s1ab_radius(s1ab_timing_cut); +% + + + +%Normalization of S1a field effect to center: S1fieldeffect(xyz/c) is equivalent to 1/norm_s1_both_xyz in KrypCal +S1fieldeffect_norm=1./S1fieldeffect; %This is really s1a field effect +S1fieldeffect_norm(isinf(S1fieldeffect_norm))=1;%remove infinity. no correction outside 25cm +S1fieldeffect_norm(isnan(S1fieldeffect_norm))=1;%remove nan. no correction outside 25cm +S1fieldeffect_norm_err=S1fieldeffect_err./(S1fieldeffect.^2); +%Removing field effect from raw S1a data + +s1a_phe_both_f=s1a_phe_both.*interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,S1fieldeffect_norm,s1ab_x,s1ab_y,s1ab_z,'spline').'; +s1a_phe_both_f_err=s1a_phe_both.*interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,S1fieldeffect_norm_err,s1ab_x,s1ab_y,s1ab_z,'cubic').'; + +%% S1a_f Z dep + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=50; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s1ab_radius,[rcut_min,rcut_max]) & inrange(s1a_phe_both_f,[s1_bin_min,s1_bin_max]).'; + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + sys_error_z=zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(s1ab_z,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1a_phe_both_f(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + sys_error_z(bin)=mean(s1a_phe_both_f_err(time_cut)); %average systematic error for the bin + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[0, 350] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + light_correction_fig = figure; + errorbar(mean_index,means,means_error,'.k'); + hold on + [yplot_s1_both] = polyval(P_s1_both,dT_fit); + [center_s1_both, center_s1_both_err] = polyval(P_s1_both,z_center, S); %160[us]*1.51[\mus/us] + plot(dT_fit,yplot_s1_both,'-r','LineWidth',1); + xlabel('Depth (\mus)', 'FontSize',16); ylabel('Mean (Pulse Area Phe)', 'FontSize', 16); + line([0 det_edge],[center_s1_both center_s1_both],'linestyle','--'); + line([z_center; z_center;],[min(means) max(means)],'linestyle','--'); + legend('S1\_both Mean', strcat('y=', num2str(P_s1_both(1),'%10.2e'), '*Z^2 + ', num2str(P_s1_both(2),'%10.2e')... + , '*Z + ', num2str(P_s1_both(3),4)),strcat('Det center = ',num2str(center_s1_both,4), ' [Phe]'),'location','northwest') + + box on; + myfigview(16); + xlim([0 det_edge]); + ylim([0.8*min(means) 1.15*max(means)]); + + +%% Measuring the residual S1a_F XYZ variation to get efficiency corrections - use same binning as S1a/S1b 3D map + +s1a_f_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_f_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_f_xyz_sys_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + + %Count the number of events per bin + Count_S1a_f_3D(l,m,n)=length(s1a_phe_both_f(q)); + + + if (Count_S1a_f_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_f_z_fit=fit([0:2:400].',hist(s1a_phe_both_f(q.' & inrange(s1a_phe_both_f,[0 400])),[0:2:400]).','gauss1'); + s1a_f_xyz_mean(l,m,n)=s1a_f_z_fit.b1; + s1a_f_xyz_mean_err(l,m,n)=s1a_f_z_fit.c1/sqrt(2)/length(s1a_phe_both_f(q.' & inrange(s1a_phe_both_f,[0 400]))); + s1a_f_xyz_sys_err(l,m,n)=mean(s1a_phe_both_f_err(q.' & inrange(s1a_phe_both_f,[0 400]))); %average systematic error for the bin + else %not enough stats to do the fit + s1a_f_xyz_mean(l,m,n)=0; + s1a_f_xyz_mean_err(l,m,n)=0; + s1a_f_xyz_sys_err(l,m,n)=0; + end + + end + end +k +end + +total_xyz_err=sqrt(s1a_f_xyz_sys_err.^2 + s1a_f_xyz_mean_err.^2); + +%Producing S1 detector inefficiency correction fro S1a_f map +center_s1a_f=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1a_f_xyz_mean,x_center,y_center,z_center,'spline');%Normalize to the center (x=y=0. dT=160us) +center_s1a_f_staterr=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1a_f_xyz_mean_err,x_center,y_center,z_center,'spline'); +center_s1a_f_syserr=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1a_f_xyz_sys_err,x_center,y_center,z_center,'spline'); +center_s1a_f_totalerr=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,total_xyz_err,x_center,y_center,z_center,'spline'); + +norm_s1_both_xyz=center_s1a_f./s1a_f_xyz_mean; %Normalize to center (x=y=0. dT=160) +norm_s1_both_xyz(isinf(norm_s1_both_xyz))=1;%remove infinity. no correction outside 25cm +norm_s1_both_xyz(isnan(norm_s1_both_xyz))=1;%remove nan. no correction outside 25cm +norm_s1_both_xyz_staterr=sqrt( (center_s1a_f_staterr./s1a_f_xyz_mean).^2 + ((center_s1a_f.*s1a_f_xyz_mean_err)./(s1a_f_xyz_mean.^2)).^2); +norm_s1_both_xyz_totalerr=sqrt( (center_s1a_f_totalerr./s1a_f_xyz_mean).^2 + ((center_s1a_f.*total_xyz_err)./(s1a_f_xyz_mean.^2)).^2); + +%Fill in NaN errors with nearest neighbors +norm_s1_both_xyz_staterr_old=norm_s1_both_xyz_staterr; +temp_map=norm_s1_both_xyz_staterr; +q= ~isnan(norm_s1_both_xyz_staterr); +r=nearestpoint(find(~q),find(q)); +norm_s1_both_xyz_staterr=temp_map; temp_mapQ=temp_map(q); norm_s1_both_xyz_staterr(~q)=temp_mapQ(r);norm_s1_both_xyz_staterr=reshape(norm_s1_both_xyz_staterr,size(norm_s1_both_xyz_staterr_old,1),size(norm_s1_both_xyz_staterr_old,2),size(norm_s1_both_xyz_staterr_old,3)); + +norm_s1_both_xyz_totalerr_old=norm_s1_both_xyz_totalerr; +temp_map=norm_s1_both_xyz_totalerr; +q= ~isnan(norm_s1_both_xyz_totalerr); +r=nearestpoint(find(~q),find(q)); +norm_s1_both_xyz_totalerr=temp_map; temp_mapQ=temp_map(q); norm_s1_both_xyz_totalerr(~q)=temp_mapQ(r);norm_s1_both_xyz_totalerr=reshape(norm_s1_both_xyz_totalerr,size(norm_s1_both_xyz_totalerr_old,1),size(norm_s1_both_xyz_totalerr_old,2),size(norm_s1_both_xyz_totalerr_old,3)); + + + +%% Now remove the detector inefficiency variation from the raw S1a data and determine g1 using total g1=S1a_E/(num_phot_center*keV). CROSS CHECK OF KRYPCAL G1 +s1a_phe_both_e=s1a_phe_both.*interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,norm_s1_both_xyz,s1ab_x,s1ab_y,s1ab_z,'spline').'; %this is s1a_E +s1a_phe_both_e_totalerr=s1a_phe_both.*interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,norm_s1_both_xyz_totalerr,s1ab_x,s1ab_y,s1ab_z,'cubic').'; %this is s1a_E +s1a_phe_both_e_staterr=s1a_phe_both.*interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,norm_s1_both_xyz_staterr,s1ab_x,s1ab_y,s1ab_z,'cubic').'; %this is s1a_E + +s1a_e_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_e_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + + %Count the number of events per bin + Count_S1a_e_3D(l,m,n)=length(s1a_phe_both_e(q)); + + + if (Count_S1a_e_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_e_z_fit=fit([0:2:400].',hist(s1a_phe_both_e(q.' & inrange(s1a_phe_both_e,[0 400])),[0:2:400]).','gauss1'); + s1a_e_xyz_mean(l,m,n)=s1a_e_z_fit.b1; + s1a_e_xyz_mean_err(l,m,n)=s1a_e_z_fit.c1/sqrt(2)/length(s1a_phe_both_e(q.' & inrange(s1a_phe_both_e,[0 400]))); + s1a_e_xyz_stat_err(l,m,n)=mean(s1a_phe_both_e_staterr(q.')); + s1a_e_xyz_total_err(l,m,n)=mean(s1a_phe_both_e_totalerr(q.')); + else %not enough stats to do the fit + s1a_e_xyz_mean(l,m,n)=0; + s1a_e_xyz_mean_err(l,m,n)=0; + s1a_e_xyz_stat_err(l,m,n)=0; + s1a_e_xyz_total_err(l,m,n)=0; + end + + end + end +k +end + +%Producing S1 detector inefficiency correction fro S1a_f map +center_s1a_e=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1a_e_xyz_mean,x_center,y_center,z_center,'spline');%Normalize to the center (x=y=0. dT=160us) +center_s1a_e_err=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1a_e_xyz_mean_err,x_center,y_center,z_center,'spline');%Normalize to the center (x=y=0. dT=160us) +center_s1a_e_statsyserr=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1a_e_xyz_stat_err,x_center,y_center,z_center,'spline'); +center_s1a_e_totalstaterr=sqrt(center_s1a_e_statsyserr.^2 + center_s1a_e_err.^2); +center_s1a_e_totalerr=sqrt(center_s1a_e_err.^2 + interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1a_e_xyz_total_err,x_center,y_center,z_center,'spline').^2); + + +%total signal fits, to see if it is consistent with center_s1a_e +% s1a_E_fit=fit([0:1:400].',hist(s1a_phe_both_e,[0:1:400]).','gauss1'); +% s1a_E_fit_err=confint(s1a_E_fit,0.68); +% s1a_E_mean=s1a_E_fit.b1; +% s1a_E_mean_err=abs(s1a_E_fit.b1-s1a_E_fit_err(1,2)); + +% g1_measurement=s1a_E_mean./(32.1.*num_phot_center) +% g1_measurement_err=sqrt( (s1a_E_mean_err./(32.1.*num_phot_center)).^2 + ( (s1a_E_mean.*num_phot_center_err)/(32.1.*num_phot_center.^2)).^2); + +g1_measurement=center_s1a_e./(32.1.*num_phot_center) +g1_measurement_err=sqrt( (center_s1a_e_totalerr./(32.1.*num_phot_center)).^2 + ( (center_s1a_e.*num_phot_center_err)/(32.1.*num_phot_center.^2)).^2); %was just _err before, not _totalerr + +%% Now remove the detector inefficency variation from the raw S1 (not S1a) data, and determine the field effect in S1 data. Compare to KrypCal results. CROSS CHECK OF KRYPCAL S1 RELATIONSHIP + +s1_phe_both_xyz=s1_phe_both.*interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,norm_s1_both_xyz,s2x,s2y,drift_time,'spline'); +s1_phe_both_xyz_staterr=s1_phe_both.*interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,norm_s1_both_xyz_staterr,s2x,s2y,drift_time,'spline',mean(norm_s1_both_xyz_staterr(:))); +s1_phe_both_xyz_totalerr=s1_phe_both.*interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,norm_s1_both_xyz_totalerr,s2x,s2y,drift_time,'spline',mean(norm_s1_both_xyz_totalerr(:))); + +s1_phe_both_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1_phe_both_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s2x(j-s1ab_xyz_xstep) & s2y(i-s1ab_xyz_ystep) & inrange(drift_time,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + + %Count the number of events per bin + Count_3D(l,m,n)=length(s1_phe_both_xyz(q)); + + + if (Count_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1_phe_both_xyz_fit=fit([0:2:400].',hist(s1_phe_both_xyz(q & inrange(s1_phe_both_xyz,[0 400])),[0:2:400]).','gauss1'); + s1_phe_both_xyz_mean(l,m,n)=s1_phe_both_xyz_fit.b1; + s1_phe_both_xyz_mean_err(l,m,n)=s1_phe_both_xyz_fit.c1/sqrt(2)/length(s1_phe_both_xyz(q & inrange(s1_phe_both_xyz,[0 400]))); + s1_phe_both_xyz_stat_err(l,m,n)=mean(s1_phe_both_xyz_staterr(q)); + s1_phe_both_xyz_total_err(l,m,n)=mean(s1_phe_both_xyz_totalerr(q)); + + else %not enough stats to do the fit + s1_phe_both_xyz_mean(l,m,n)=0; + s1_phe_both_xyz_mean_err(l,m,n)=0; + s1_phe_both_xyz_stat_err(l,m,n)=0; + s1_phe_both_xyz_total_err(l,m,n)=0; + + end + + end + end +k +end + +s1xyz_total_stat_err=sqrt(s1_phe_both_xyz_mean_err.^2 + s1_phe_both_xyz_stat_err.^2); +s1xyz_total_err=sqrt( s1_phe_both_xyz_mean_err.^2 + s1_phe_both_xyz_total_err.^2); + +%CHANGE THIS TO BE BASED OFF TOTAL FROM ABOVE!? +%Producing S1 detector inefficiency correction fro S1a_f map - ERROR DOES NOT TAKE INTO ACCOUNT THE UNCERTAINITY ON THE S1 EFFICIENCY CORRECTION! +center_s1E_phe_both=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1_phe_both_xyz_mean,x_center,y_center,z_center,'spline'); +center_s1E_phe_both_err=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1_phe_both_xyz_mean_err,x_center,y_center,z_center,'spline'); +center_s1E_phe_both_statsyserr=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1_phe_both_xyz_stat_err,x_center,y_center,z_center,'spline'); +center_s1E_phe_both_totalstaterr=sqrt(center_s1E_phe_both_err.^2 + center_s1E_phe_both_statsyserr.^2); +center_s1E_phe_both_totalerr=sqrt(center_s1E_phe_both_err.^2 + interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1_phe_both_xyz_total_err,x_center,y_center,z_center,'spline').^2); + +CombinedS1FieldEffect=s1_phe_both_xyz_mean./center_s1E_phe_both; +CombinedS1FieldEffect_err=sqrt ( (s1_phe_both_xyz_mean_err./center_s1E_phe_both).^2 + ( (s1_phe_both_xyz_mean.*center_s1E_phe_both_err)./(center_s1E_phe_both.^2)).^2); +CombinedS1FieldEffect_totalstaterr=sqrt ( (s1xyz_total_stat_err./center_s1E_phe_both).^2 + ( (s1_phe_both_xyz_mean.*center_s1E_phe_both_totalstaterr)./(center_s1E_phe_both.^2)).^2); +CombinedS1FieldEffect_totalerr=sqrt ( (s1xyz_total_err./center_s1E_phe_both).^2 + ( (s1_phe_both_xyz_mean.*center_s1E_phe_both_totalerr)./(center_s1E_phe_both.^2)).^2); + +%Make S1a/S1b v S1 field effect plot +figure +rkploterr(s1ab_xyz_mean,CombinedS1FieldEffect,s1ab_xyz_mean_err,CombinedS1FieldEffect_totalerr,[0 0 0],'.',100,1); +xlabel('S1a/S1b'); +ylabel('S1_E(XYZ)/S1_E(C)'); +myfigview(16); + +%Overlay Kr2.20 result, renormalized to the new S1aS1b center value +s1ab_s1_xyz_fit_map.p1=0.34; +s1ab_s1_xyz_fit_map.p2=-1.4; +s1ab_s1_xyz_fit_map.p3=2.2874; +x=[2.2:0.1:3.1]; +y= (s1ab_s1_xyz_fit_map.p1.*x.^2+s1ab_s1_xyz_fit_map.p2.*x+s1ab_s1_xyz_fit_map.p3)./(s1ab_s1_xyz_fit_map.p1.*s1as1b_at_center.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_at_center+s1ab_s1_xyz_fit_map.p3); +plot(x,y,'-b','LineWidth',3); + + +%Overlay Kr2.18 Result +s1ab_s1_xyz_fit_map.p1=0.46; +b2=1-2.7347.*s1ab_s1_xyz_fit_map.p1; +s1ab_s1_xyz_fit_map.p2=b2; +x=[2.2:0.1:3.1]; +y= (s1ab_s1_xyz_fit_map.p1.*x+s1ab_s1_xyz_fit_map.p2)./(s1ab_s1_xyz_fit_map.p1.*s1as1b_at_center+s1ab_s1_xyz_fit_map.p2); +plot(x,y,'-r','LineWidth',3); +ylim([0.5 1.6]); +xlim([2.2 3.1]); + +% Fit a polynomial to the s1 field effect result +S1fieldpoly=polyfit(s1ab_xyz_mean(CombinedS1FieldEffect~=0 & s1ab_xyz_mean~=0),CombinedS1FieldEffect(CombinedS1FieldEffect~=0 & s1ab_xyz_mean~=0),2); +plot(x,polyval(S1fieldpoly,x),'Color',[0.7 0.7 0.7],'LineWidth',3); +%SHOULD SWITCH TO A SPLINE FIT!! + + +%% Use recomb physics to determine S2 relation from this direct measurement +alpha=0.11; +Rkr_center=0.7708; %from S2 measurement code +s2_field_effect=( 1 - ( alpha + Rkr_center)*polyval(S1fieldpoly,[2:0.01:3]) + alpha)/(1 - Rkr_center); + +S2fieldpoly=polyfit([2:0.01:3],s2_field_effect,2); + +figure +x=[2.2:0.01:3]; +y=polyval(S1fieldpoly,x); +plot(x,y,'-r','LineWidth',2); +hold on; +y=polyval(S2fieldpoly,x); +plot(x,y,'-k','LineWidth',2); +xlabel('S1a/S1b'); +ylabel('S1_E(XYZ)/S1_E(C) or S2_E(XYZ)/S2_E(C)'); +legend('S1','S2'); +myfigview(16); + +save('S1FieldPolynomial_ScottMaps','S1fieldpoly','S2fieldpoly'); diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/Make3DInterpMap_FromLucieMap_2015.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/Make3DInterpMap_FromLucieMap_2015.m new file mode 100644 index 0000000..5acec72 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/Make3DInterpMap_FromLucieMap_2015.m @@ -0,0 +1,58 @@ +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\LucieSep2015_Map_v1p0.mat'); +x= LucieSep2015_Map_v1p0(:,1); +y= LucieSep2015_Map_v1p0(:,2); +z = LucieSep2015_Map_v1p0(:,3); +field = LucieSep2015_Map_v1p0(:,4); %in V/cm +dT=LucieSep2015_Map_v1p0(:,7); +r=sqrt(x.^2+y.^2); +event_class=LucieSep2015_Map_v1p0(:,8); + + +%Convert z to cathode at 0, and in mm +% z=(z+34.175)*10; %This is using Lucie's v0.1 coordinates +z=(z-5.6)*10; + +%Spacing in Lucie's map +x_step=1; +y_step=1; +z_step=10; + +%Starting and end points in Lucie's map +x_start= -23.5; +y_start= -23.5; +z_start= 2; +x_end= 23.5; +y_end= 23.5; +z_end= 482; + +%Make a 3D map out of Lucie's map + +i=1; j=1; k=1; +for x_max=x_start+x_step/2:x_step:x_end+x_step/2 + j=1; + for y_max=y_start+y_step/2:y_step:y_end+y_step/2 + k=1; + for z_max=z_start+z_step/2:z_step:z_end+z_step/2 + cut=inrange(x,[x_max-x_step,x_max]) & inrange(y,[y_max-y_step,y_max]) & inrange(z,[z_max-z_step,z_max]); + FieldMap(i,j,k)=mean(field(cut)); %This is for python, so do not switch i,j index + DriftTimeMap(i,j,k)=mean(dT(cut)); + if length(field(cut)) ~= 1 + disp('Problem') + end + k=k+1; + end + j=j+1; + end + i=i+1; +end + +x_bins=x_start:x_step:x_end; +y_bins=y_start:y_step:y_end; +z_bins=z_start:z_step:z_end; + +save('Sep2015_3DFieldMap_ForPython_v1p0','DriftTimeMap','FieldMap','x_bins','y_bins','z_bins'); +% save('Sep2015_XYZ_to_XYdT_Map_Python','FieldMap','x_bins','y_bins','z_bins'); + +%To interpolate in python, do +%fn = RegularGridInterpolator((x_bins,y_bins,z_bins), FieldMap) +%interp_val = fn(xo,yo,zo) diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/Make3DInterpMap_FromLucieMap_2016.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/Make3DInterpMap_FromLucieMap_2016.m new file mode 100644 index 0000000..f1263b3 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/Make3DInterpMap_FromLucieMap_2016.m @@ -0,0 +1,58 @@ +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\LucieFeb2016_Map_v1p0.mat'); +x= LucieFeb2016_Map_v1p0(:,1); +y= LucieFeb2016_Map_v1p0(:,2); +z = LucieFeb2016_Map_v1p0(:,3); +field = LucieFeb2016_Map_v1p0(:,4); +dT=LucieFeb2016_Map_v1p0(:,7); +r=sqrt(x.^2+y.^2); +event_class=LucieFeb2016_Map_v1p0(:,8); + + +%Convert z to cathode at 0, and in mm +% z=(z+34.175)*10; %This is using Lucie's v0.1 coordinates +z=(z-5.6)*10; + +%Spacing in Lucie's map +x_step=1; +y_step=1; +z_step=10; + +%Starting and end points in Lucie's map +x_start= -23.5; +y_start= -23.5; +z_start= 2; +x_end= 23.5; +y_end= 23.5; +z_end= 482; + +%Make a 3D map out of Lucie's map + +i=1; j=1; k=1; +for x_max=x_start+x_step/2:x_step:x_end+x_step/2 + j=1; + for y_max=y_start+y_step/2:y_step:y_end+y_step/2 + k=1; + for z_max=z_start+z_step/2:z_step:z_end+z_step/2 + cut=inrange(x,[x_max-x_step,x_max]) & inrange(y,[y_max-y_step,y_max]) & inrange(z,[z_max-z_step,z_max]); + FieldMap(i,j,k)=mean(field(cut)); %This is for python, so do not switch i,j index + DriftTimeMap(i,j,k)=mean(dT(cut)); + if length(field(cut)) ~= 1 + disp('Problem') + end + k=k+1; + end + j=j+1; + end + i=i+1; +end + +x_bins=x_start:x_step:x_end; +y_bins=y_start:y_step:y_end; +z_bins=z_start:z_step:z_end; + +save('Feb2016_3DFieldMap_ForPython_v1p0','DriftTimeMap','FieldMap','x_bins','y_bins','z_bins'); +% save('Feb2016_XYZ_to_XYdT_Map_Python','FieldMap','x_bins','y_bins','z_bins'); + +%To interpolate in python, do +%fn = RegularGridInterpolator((x_bins,y_bins,z_bins), FieldMap) +%interp_val = fn(xo,yo,zo) diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/Run04_G1ZDep_Feb2016.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/Run04_G1ZDep_Feb2016.m new file mode 100644 index 0000000..9384e99 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/Run04_G1ZDep_Feb2016.m @@ -0,0 +1,69 @@ +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\LucieFeb2016_Map_v1p0'); +x= LucieFeb2016_Map_v1p0(:,1); +y= LucieFeb2016_Map_v1p0(:,2); +z = LucieFeb2016_Map_v1p0(:,3); +dT=LucieFeb2016_Map_v1p0(:,7); +r=sqrt(x.^2+y.^2); +event_class=LucieFeb2016_Map_v1p0(:,8); + +%Convert z units so that the Cathode is z=0 cm +% Starting units are +% Anode: 15.145 cm (49.32 cm) +% Liquid surface: 14.585 cm (48.76 cm) +% Gate: 14.145 cm (48.32 cm) +% Cathode: -34.175 cm (0 cm) +% The gas region starts 4.4 mm above the gate. + +z=(z-5.6); + +%convert z to mm +z=z*10; + +cut=(r<1 & event_class==1); + +%Figure for converting dT to z +figure +plot(dT(cut),z(cut)/10) +xlabel('Drift time at r=0 cm'); +ylabel('Z in cm'); +myfigview(16); +hold on; +line([0 400],[49.32 49.32],'Color','r') +line([0 400],[48.76 48.76],'Color','r') +line([0 400],[48.32 48.32],'Color','r') +line([0 400],[0 0],'Color','r') + +%Fit a 2nd order polynomial to convert dT to Z +dTtoZ=polyfit(dT(cut),z(cut),2); +ZtodT=polyfit(z(cut),dT(cut),2); + + +%% This shit is a little messed up in Feb2016 in Kr2p18, so just going to assume it's unchanged from Sep2015 + +%Convert KrypCal S1 v dT dependence to S1 v Z(cm) dependence, normalized to 1 at the center +%For 2015 S1=2.61e-04.*dT^2 + 1.26e-01.*dT + 193.6 (2015) EXACT VALUES 0.0002606983 0.1257715 193.569. Center: 221.0429 +%For 2014 S1=2.21e-04.*dT^2 + 1.65e-01.*dT + 196.7 EXACT VALUES 0.0002212944 0.1650304 196.7235 Center: 229.1392 +% x=[0:0.1:350]; +% conv_values=[0.0002606983 0.1257715 193.569]; +% conv_center=221.0429; +% S1vdT_norm=(conv_values(1).*x.^2+conv_values(2).*x+conv_values(3))/conv_center; +% %convert x in dT to x in Z(cm) +% z_mm=[0:1:550]; +% S1vZ_norm=(conv_values(1).*polyval(ZtodT,z_mm).^2+conv_values(2).*polyval(ZtodT,z_mm)+conv_values(3))/conv_center; +% +% libNEST_fit=polyfit([0:1:550],S1vZ_norm,2) +% +% figure +% plot(z_mm,S1vZ_norm,'-b'); +% xlabel('Z (mm)'); ylabel('G1 Dependence'); myfigview(16); +% +% %Plot Run03 value +% s1polA = 1.1583; +% s1polB = 0.00027956; +% s1polC =-6.3932e-6; +% s1polD = 1.6548e-8; +% s1polE =-1.4124e-11; +% xx=[0:10:550]; yy=s1polA+s1polB.*xx+s1polC.*xx.^2+s1polD.*xx.^3+s1polE.*xx.^4; +% figure +% plot(xx,yy,'-r'); +% xlabel('Z (mm)'); ylabel('Run03 G1 Dependence'); myfigview(16); diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/Run04_G1ZDep_Sep2015.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/Run04_G1ZDep_Sep2015.m new file mode 100644 index 0000000..5d4c398 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/Run04_G1ZDep_Sep2015.m @@ -0,0 +1,65 @@ +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\LucieSep2015_Map_v1p0'); +x= LucieSep2015_Map_v1p0(:,1); +y= LucieSep2015_Map_v1p0(:,2); +z = LucieSep2015_Map_v1p0(:,3); +dT=LucieSep2015_Map_v1p0(:,7); +r=sqrt(x.^2+y.^2); +event_class=LucieSep2015_Map_v1p0(:,8); + +%Convert z units so that the Cathode is z=0 cm +% Starting units are +% Anode: 15.145 cm (49.32 cm) +% Liquid surface: 14.585 cm (48.76 cm) +% Gate: 14.145 cm (48.32 cm) +% Cathode: -34.175 cm (0 cm) +% The gas region starts 4.4 mm above the gate. + +z=(z-5.6); + +%convert z to mm +z=z*10; + +cut=(r<1 & event_class==1); + +%Figure for converting dT to z +figure +plot(dT(cut),z(cut)/10) +xlabel('Drift time at r=0 cm'); +ylabel('Z in cm'); +myfigview(16); +hold on; +line([0 400],[49.32 49.32],'Color','r') +line([0 400],[48.76 48.76],'Color','r') +line([0 400],[48.32 48.32],'Color','r') +line([0 400],[0 0],'Color','r') + +%Fit a 2nd order polynomial to convert dT to Z +dTtoZ=polyfit(dT(cut),z(cut),2); +ZtodT=polyfit(z(cut),dT(cut),2); +%Convert KrypCal S1 v dT dependence to S1 v Z(cm) dependence, normalized to 1 at the center +%For 2015 S1=2.61e-04.*dT^2 + 1.26e-01.*dT + 193.6 (2015) EXACT VALUES 0.0002606983 0.1257715 193.569. Center: 221.0429 +%For 2014 S1=2.21e-04.*dT^2 + 1.65e-01.*dT + 196.7 EXACT VALUES 0.0002212944 0.1650304 196.7235 Center: 229.1392 +x=[0:0.1:350]; +conv_values=[0.0002606983 0.1257715 193.569]; +conv_center=221.0429; +S1vdT_norm=(conv_values(1).*x.^2+conv_values(2).*x+conv_values(3))/conv_center; +%convert x in dT to x in Z(cm) +z_mm=[0:1:550]; +S1vZ_norm=(conv_values(1).*polyval(ZtodT,z_mm).^2+conv_values(2).*polyval(ZtodT,z_mm)+conv_values(3))/conv_center; + +libNEST_fit=polyfit([0:1:550],S1vZ_norm,2) + +figure +plot(z_mm,S1vZ_norm,'-b'); +xlabel('Z (mm)'); ylabel('G1 Dependence'); myfigview(16); +% +% %Plot Run03 value +% s1polA = 1.1583; +% s1polB = 0.00027956; +% s1polC =-6.3932e-6; +% s1polD = 1.6548e-8; +% s1polE =-1.4124e-11; +% xx=[0:10:550]; yy=s1polA+s1polB.*xx+s1polC.*xx.^2+s1polD.*xx.^3+s1polE.*xx.^4; +% figure +% plot(xx,yy,'-r'); +% xlabel('Z (mm)'); ylabel('Run03 G1 Dependence'); myfigview(16); diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/EnergyChi2_S1LineFloatPoly_S2Poly2015_Iron56.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/EnergyChi2_S1LineFloatPoly_S2Poly2015_Iron56.m new file mode 100644 index 0000000..a4d4815 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/EnergyChi2_S1LineFloatPoly_S2Poly2015_Iron56.m @@ -0,0 +1,1819 @@ +param_counter=1; + best_chi2_midtobot=10^100; + best_chi2_midtotop=10^100; + best_chi2_combined=10^100; + + + %initialize matrices +a2_list=zeros(1,503316); +b2_list=zeros(1,503316); +c2_list=zeros(1,503316); +g1_list=zeros(1,503316); +g2_list=zeros(1,503316); +total_h3_chi2_list=zeros(1,503316); +total_kr_chi2_list=zeros(1,503316); +total_chi2_list=zeros(1,503316); +alternate_total_chi2_list=zeros(1,503316); +h3_chi2_2016_list=zeros(1,503316); +h3_chi2_2015_list=zeros(1,503316); +kr_chi2_2016_list=zeros(1,503316); +kr_chi2_2015_list=zeros(1,503316); +electron_lifetime_2016_list=zeros(1,503316); +electron_lifetime_2015_list=zeros(1,503316); +kr_staterr_2016_list=zeros(1,503316); +kr_staterr_2015_list=zeros(1,503316); +kr_sigma_2016_list=zeros(1,503316); +kr_sigma_2015_list=zeros(1,503316); +kr_2016_num_events=zeros(1,503316); +kr_2015_num_events=zeros(1,503316); +kr_means_2016_list=zeros(1,503316); +kr_means_2015_list=zeros(1,503316); +full_kr_chi2_2016_list=zeros(1,503316); +full_kr_chi2_2015_list=zeros(1,503316); +total_h3_chi2_nothresh_list=zeros(1,503316); +total_chi2_nothresh_list=zeros(1,503316); +alternate_total_chi2_nothresh_list=zeros(1,503316); +h3_chi2_2016_nothresh_list=zeros(1,503316); +h3_chi2_2015_nothresh_list=zeros(1,503316); +h3_chi2_2015_nothresh_separatescaling_list=zeros(1,503316); +h3_chi2_2016_nothresh_separatescaling_list=zeros(1,503316); + +total_h3_chi2_nothresh_separatescaling_list=zeros(1,503316); +total_chi2_nothresh_separatescaling_list=zeros(1,503316); + +ee_list=zeros(1,503316); + +kr_chi2_2016_zslice_list=zeros(503316,length(40+20/2:20:300-20/2)); +kr_chi2_2015_zslice_list=zeros(503316,length(40+20/2:20:300-20/2)); +kr_chi2_zslice_zcenter_list=zeros(503316,length(40+20/2:20:300-20/2)); +% +% total_h3_chi2_map=zeros(36,41,11,31); +% total_kr_chi2_map=zeros(36,41,11,31); +% total_chi2_map=zeros(36,41,11,31); +% alternate_total_chi2_map=zeros(36,41,11,31); +% h3_chi2_2016_map=zeros(36,41,11,31); +% kr_chi2_2016_map=zeros(36,41,11,31); +% h3_chi2_2015_map=zeros(36,41,11,31); +% kr_chi2_2015_map=zeros(36,41,11,31); +% electron_lifetime_2016_map=zeros(36,41,11,31); +% electron_lifetime_2015_map=zeros(36,41,11,31); +% total_h3_chi2_nothresh_map=zeros(36,41,11,31); +% total_chi2_nothresh_map=zeros(36,41,11,31); +% alternate_total_chi2_nothresh_map=zeros(36,41,11,31); +% h3_chi2_2016_nothresh_map=zeros(36,41,11,31); +% h3_chi2_2015_nothresh_map=zeros(36,41,11,31); +% total_h3_chi2_nothresh_separatescaling_map=zeros(36,41,11,31); +% total_chi2_nothresh_separatescaling_map=zeros(36,41,11,31); + +best_total_chi2=1000000000000000000; +best_total_alternate_chi2=1000000000000000000; +best_total_chi2_nothresh=1000000000000000000; +best_total_alternate_chi2_nothresh=1000000000000000000; +best_total_chi2_nothresh_separatescaling=1000000000000000000; + + +inpaint_on=1; +% Measurement is a1=-0.765; b1=2.939; a2=0.1934; b2=-0.744; + +load('/scratch4/UMDcode/EnergyChi2/KrypCal_2p21/TritiumMethod/libNEST_CH3TModel/NEST_CH3T_Spectrum_Sep2015_Kr2p21.mat') +load('/scratch4/UMDcode/EnergyChi2/KrypCal_2p21/TritiumMethod/libNEST_CH3TModel/NEST_CH3T_Spectrum_Feb2016_Kr2p21.mat') + +a2_counter=1; +for a2=0:0.02:0.7; %p1*x^2 coefficient for s1ab_s2_xyz_fit.p1 + b2_counter=1; + for b2=0:0.05:2; %p1*x^2 coefficient for s1ab_s2_xyz_fit.p1 + + + +g1_counter=1; +g2_counter=1; + + %%UPDATE THIS + +s1ab_s2_xyz_fit_map.p1=-0.4988; %these are slightly different than Kr2p20, prob just a resulting of the fitting +s1ab_s2_xyz_fit_map.p2=1.484; +c1=1-s1ab_s2_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s2_xyz_fit_map.p2; +s1ab_s2_xyz_fit_map.p3=c1; + +s1ab_s1_xyz_fit_map.p1=a2; +s1ab_s1_xyz_fit_map.p2=b2; +c2=1-a2.*2.7303.^2-2.7303.*b2; +s1ab_s1_xyz_fit_map.p3=c2; +%% Load the Uncorrected Sep 2015 Kr data + + +%HAVE TO MAKE THIS .MAT FILE STILL - USE class 1 and class 9 for S1 +load('/scratch4/UMDcode/EnergyChi2/KrypCal_2p21/TritiumMethod/libNEST_CH3TModel/MappingParametersFit_Start_2015_CutDown.mat') + + +%% Calculate 2015 Corrections + +try + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval.*s2_xyfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval.*s2_xyfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval.*s1_xyfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval.*s1_xyfieldremoval); + + + + end + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=1000; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1500]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[5+bin_size, 500] );%from 50 to 300us for the fit, based on when s1as1b values get strange + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + %%Tracker for pseudo-lifetime + s2_at_bottom=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_2015=-320/log(s2_at_bottom/s2_at_top); + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_xbins),floor(s2_ybins)); +Sigma_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); +Count_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_xbins),floor(s1_ybins)); +Sigma_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); +Count_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XYZ. 3D Map, caluculate and Submit IQ +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% if Kr_events>150000 +% +% % LUXkrypCal_S1_3D(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_distance_\mus,user_name,file_id_cp,dp_version,submit); +% LUXkrypCal_S1_3D_Run04_local_2p14FixedZHisto(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_time,x_center,y_center,z_center,det_edge,inpaint_on,user_name,file_id_cp,dp_version, algorithm_name, submit); +% +% +% end + + +%% Apply corrections to CH3T and calculate the ER band shift + +%First load the data + +clear s1_phe_both s2_phe_both +load('/scratch4/UMDcode/EnergyChi2/KrypCal_2p21/TritiumMethod/libNEST_CH3TModel/CH3T_Sep2015_NoCorrections.mat'); + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = S2_x; +s1_y_cm = S2_y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,S2_x,S2_y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + h3_cut= inrange(drift_time,[40 300]) & inrange(s1_phe_both,[0 120]) ... + & (log10(s1_phe_both)+0.8*log10(s2_phe_both)<5.2) .... + & (log10(s1_phe_both)-2*log10(s2_phe_both)>-6.8) & (log10(s1_phe_both)-2*log10(s2_phe_both)<-4.8)... + & s2_phe_both>100 & s2_phe_both<16000 & s2radius<25; %used to be drift time 100 to 250 + +h3_s1_c_2015=s1_phe_both_xyz(h3_cut); +h3_s2_c_2015=s2_phe_both_xyz(h3_cut); + + + kr_cut= inrange(drift_time,[40 300]) & inrange(s1_phe_both,[30 1000]) ... + & (log10(s1_phe_both)+0.6*log10(s2_phe_both)>4.5) & (log10(s1_phe_both)+0.6*log10(s2_phe_both)<5.05) ... + & (log10(s1_phe_both)-2*log10(s2_phe_both)>-7.6) & (log10(s1_phe_both)-2*log10(s2_phe_both)<-4.7) ... + & s2_phe_both>3000 & s2_phe_both<60000 & s2radius<25; %used to be drift time 100 to 250 + +kr_s1_c_2015=s1_phe_both_xyz(kr_cut); +kr_s2_c_2015=s2_phe_both_xyz(kr_cut); +kr_2015_drift_time=drift_time(kr_cut); +kr_2015_s2x=S2_x(kr_cut); +kr_2015_s2y=S2_y(kr_cut); + + clearvars -except param_counter a1_list b1_list a2_list b2_list total_chi2_list h3_chi2_list kr_chi2_list g1_list g2_list total_chi2_map h3_chi2_map kr_chi2_map chi2_midtobot_list... + best_chi2_midtotop besta1_midtotop besta2_midtotop bestb1_midtotop bestb2_midtotop best_chi2_midtobot... + besta1_midtobot besta1_midtotop bestb1_midtobot bestb1_midtotop a1 b1 a2 b2 c2 chi2_midtotop_map chi2_midtobot_map b_counter a_counter... + besta1_combined bestb1_combined besta2_combined bestb2_combined best_chi2_combined chi2_combined_map chi2_combined_list b1_counter a1_counter a2_counter b2_counter... + a1_counter b1_counter a2_counter b2_counter c1_list c2_list bestc1_midtobot bestc2_midtobot bestc1_midtotop bestc2_midtotop bestc1_combined bestc2_combined... + besta1_combined besta2_combined bestb1_combined bestb2_combined besta1 bestb1 bestc1 besta2 bestb2 bestc2 bestg1 bestg2 best_total_chi2 NEST_CH3T_Spectrum inpaint_on... + best_kr_chi2 best_h3_chi2 electron_lifetime_list electron_lifetime_map a2_start a1_start b1_start b2_start ... + total_h3_chi2_list total_kr_chi2_list total_chi2_list h3_chi2_2016_list h3_chi2_2015_list kr_chi2_2016_list kr_chi2_2015_list ... + electron_lifetime_2016_list electron_lifetime_2015_list total_h3_chi2_map total_kr_chi2_map total_chi2_map h3_chi2_2016_map h3_chi2_2015_map ... + kr_chi2_2016_map kr_chi2_2015_map electron_lifetime_2016_map electron_lifetime_2015_map NEST_CH3T_Spectrum_Sep2015 NEST_CH3T_Spectrum_Feb2016 g1 g2 bestg1 bestg2 g1_counter g2_counter ... + firsta1 firstb1 firsta2 firstb2 firstg1 firstg2 kr_means_2015_map kr_means_2016_map kr_sigma_2015_map kr_sigma_2016_map kr_staterr_2015_map kr_staterr_2016_map ... + kr_means_2015_list kr_means_2016_list kr_2015_num_events kr_2016_num_events kr_sigma_2015_list kr_sigma_2016_list kr_staterr_2015_list kr_staterr_2016_list ... + pseudo_lifetime_2016 pseudo_lifetime_2015 kr_s1_c_2015 kr_s2_c_2015 h3_s1_c_2015 h3_s2_c_2015 s1ab_s2_xyz_fit_map s1ab_s1_xyz_fit_map ... + kr_2015_drift_time kr_2015_s2x kr_2015_s2y kr_chi2_2016_zslice_list kr_chi2_2015_zslice_list kr_chi2_zslice_zcenter_list ... + full_kr_chi2_2016_list full_kr_chi2_2015_list best_total_kr_chi2 best_total_h3_chi2 alternate_total_chi2_map alternate_total_chi2_list ... + best_total_alternate_chi2 best_total_alternate_kr_chi2 best_total_alternate_h3_chi2 besta2_alternate bestb2_alternate bestg1_alternate bestg2_alternate bestc2_alternate ... + total_h3_chi2_nothresh_list total_chi2_nothresh_list alternate_total_chi2_nothresh_list h3_chi2_2015_nothresh_list h3_chi2_2016_nothresh_list ... + total_h3_chi2_nothresh_map total_chi2_nothresh_map alternate_total_chi2_nothresh_map h3_chi2_2016_nothresh_map h3_chi2_2015_nothresh_map ... + best_total_chi2_nothresh best_total_kr_chi2_nothresh best_total_h3_chi2_nothresh besta2_nothresh bestb2_nothresh bestc2_nothresh bestg1_nothresh bestEE_nothresh ... + best_total_alternate_chi2_nothresh best_total_alternate_kr_chi2_nothresh best_total_alternate_h3_chi2_nothresh besta2_alternate_nothresh bestb2_alternate_nothresh ... + bestc2_alternate_nothresh bestg1_alternate_nothresh bestEE_alternate_nothresh best_total_chi2_nothresh best_total_alternate_chi2_nothresh ee_list ... + total_h3_chi2_nothresh_separatescaling_list total_chi2_nothresh_separatescaling_list best_total_chi2_nothresh_separatescaling ... + best_total_kr_chi2_nothresh_separatescaling best_total_h3_chi2_nothresh_separatescaling besta2_nothresh_separatescaling ... + bestc2_nothresh_separatescaling bestg1_nothresh_separatescaling bestEE_nothresh_separatescaling ... + total_h3_chi2_nothresh_separatescaling_map total_chi2_nothresh_separatescaling_map bestEE_nothresh ... + h3_chi2_2015_nothresh_separatescaling_list h3_chi2_2016_nothresh_separatescaling_list ee_list + + + + + +%%%%%%%%%%%%%%%%%%%%% +%% REPEAT FOR 2016 DATA +%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('/scratch4/UMDcode/EnergyChi2/KrypCal_2p21/TritiumMethod/libNEST_CH3TModel/MappingParametersFit_Start_2016_CutDown.mat') + + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval.*s2_xyfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval.*s2_xyfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval.*s1_xyfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval.*s1_xyfieldremoval); + + + + end + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[5+bin_size, 500] );%from 50 to 300us for the fit, based on when s1as1b values get strange + +s2_both_norm_z_index=mean_index(dT_range); +s2_both_norm_z_means=means(dT_range); + s2_at_top=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + %%Tracker for pseudo-lifetime + s2_at_bottom=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_2016=-320/log(s2_at_bottom/s2_at_top); +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_xbins),floor(s2_ybins)); +Sigma_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); +Count_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_xbins),floor(s1_ybins)); +Sigma_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); +Count_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Apply corrections to 2016 Kr data +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('/scratch4/UMDcode/EnergyChi2/KrypCal_2p21/TritiumMethod/libNEST_CH3TModel/MappingParametersFit_Start_2016_CutDown.mat') + + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; +% +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate ER Band shift +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + liquid_cut= inrange(drift_time,[40 300]) ... + & (log10(s1_phe_both)+0.7*log10(s2_phe_both)>4.9) & (log10(s1_phe_both)+0.7*log10(s2_phe_both)<5.5) ... + & s2_phe_both>3000 & s2_phe_both<80000 & s2radius<25; %used to be drift time 100 to 250 + + +kr_s1_c_2016=s1_phe_both_xyz(liquid_cut); +kr_s2_c_2016=s2_phe_both_xyz(liquid_cut); +kr_2016_drift_time=drift_time(liquid_cut); +kr_2016_s2x=s2x(liquid_cut); +kr_2016_s2y=s2y(liquid_cut); + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%Apply Corrections to 2016 CH3T Data +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('/scratch4/UMDcode/EnergyChi2/KrypCal_2p21/TritiumMethod/libNEST_CH3TModel/CH3T_Feb2016_NoCorrections.mat'); + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +% electron_lifetime_2016=e_lifetime_both; +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate ER Band shift +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +s1_min=0; +s1_max=120; + + %% Redo with r<10 cm + + + liquid_cut= clean_cut & inrange(drift_time,[40 300]) ... + & (log10(s1_phe_both)+log10(s2_phe_both)<5.9) & (log10(s1_phe_both)-2.*log10(s2_phe_both)<-4.8) ... + & (log10(s1_phe_both)-2.*log10(s2_phe_both)>-6.8) ... + & s2_phe_both>600 & s2_phe_both<16000 & s2radius<25; %used to be drift time 100 to 250 + + + +h3_s1_c_2016=s1_phe_both_xyz(liquid_cut); +h3_s2_c_2016=s2_phe_both_xyz(liquid_cut); + + clearvars -except param_counter a1_list b1_list a2_list b2_list total_chi2_list h3_chi2_list kr_chi2_list g1_list g2_list total_chi2_map h3_chi2_map kr_chi2_map chi2_midtobot_list... + best_chi2_midtotop besta1_midtotop besta2_midtotop bestb1_midtotop bestb2_midtotop best_chi2_midtobot... + besta1_midtobot besta1_midtotop bestb1_midtobot bestb1_midtotop a1 b1 a2 b2 chi2_midtotop_map chi2_midtobot_map b_counter a_counter... + besta1_combined bestb1_combined besta2_combined bestb2_combined best_chi2_combined chi2_combined_map chi2_combined_list b1_counter a1_counter a2_counter b2_counter... + a1_counter b1_counter a2_counter b2_counter c1_list c2_list bestc1_midtobot bestc2_midtobot bestc1_midtotop bestc2_midtotop bestc1_combined bestc2_combined... + besta1_combined besta2_combined bestb1_combined bestb2_combined besta1 bestb1 bestc1 besta2 bestb2 bestc2 bestg1 bestg2 best_total_chi2 NEST_CH3T_Spectrum inpaint_on... + best_kr_chi2 best_h3_chi2 electron_lifetime_list electron_lifetime_map a2_start a1_start b1_start b2_start ... + total_h3_chi2_list total_kr_chi2_list total_chi2_list h3_chi2_2016_list h3_chi2_2015_list kr_chi2_2016_list kr_chi2_2015_list ... + electron_lifetime_2016_list electron_lifetime_2015_list total_h3_chi2_map total_kr_chi2_map total_chi2_map h3_chi2_2016_map h3_chi2_2015_map ... + kr_chi2_2016_map kr_chi2_2015_map electron_lifetime_2016_map electron_lifetime_2015_map NEST_CH3T_Spectrum_Sep2015 NEST_CH3T_Spectrum_Feb2016 g1 g2 bestg1 bestg2 g1_counter g2_counter ... + firsta1 firstb1 firsta2 firstb2 firstg1 firstg2 kr_means_2015_map kr_means_2016_map kr_sigma_2015_map kr_sigma_2016_map kr_staterr_2015_map kr_staterr_2016_map ... + kr_means_2015_list kr_means_2016_list kr_2015_num_events kr_2016_num_events kr_sigma_2015_list kr_sigma_2016_list kr_staterr_2015_list kr_staterr_2016_list ... + pseudo_lifetime_2016 pseudo_lifetime_2015 kr_s1_c_2015 kr_s2_c_2015 h3_s1_c_2015 h3_s2_c_2015 kr_s1_c_2016 kr_s2_c_2016 h3_s1_c_2016 h3_s2_c_2016 ... + kr_2015_drift_time kr_2015_s2x kr_2015_s2y kr_2016_drift_time kr_2016_s2x kr_2016_s2y ... + kr_chi2_2016_zslice_list kr_chi2_2015_zslice_list kr_chi2_zslice_zcenter_list ... + full_kr_chi2_2016_list full_kr_chi2_2015_list best_total_kr_chi2 best_total_h3_chi2 alternate_total_chi2_map alternate_total_chi2_list ... + best_total_alternate_chi2 best_total_alternate_kr_chi2 best_total_alternate_h3_chi2 besta2_alternate bestb2_alternate bestg1_alternate bestg2_alternate bestc2_alternate c2 ... + total_h3_chi2_nothresh_list total_chi2_nothresh_list alternate_total_chi2_nothresh_list h3_chi2_2015_nothresh_list h3_chi2_2016_nothresh_list ... + total_h3_chi2_nothresh_map total_chi2_nothresh_map alternate_total_chi2_nothresh_map h3_chi2_2016_nothresh_map h3_chi2_2015_nothresh_map ... + best_total_chi2_nothresh best_total_kr_chi2_nothresh best_total_h3_chi2_nothresh besta2_nothresh bestb2_nothresh bestc2_nothresh bestg1_nothresh bestEE_nothresh ... + best_total_alternate_chi2_nothresh best_total_alternate_kr_chi2_nothresh best_total_alternate_h3_chi2_nothresh besta2_alternate_nothresh bestb2_alternate_nothresh ... + bestc2_alternate_nothresh bestg1_alternate_nothresh bestEE_alternate_nothresh best_total_chi2_nothresh best_total_alternate_chi2_nothresh ee_list ... + total_h3_chi2_nothresh_separatescaling_list total_chi2_nothresh_separatescaling_list best_total_chi2_nothresh_separatescaling ... + best_total_kr_chi2_nothresh_separatescaling best_total_h3_chi2_nothresh_separatescaling besta2_nothresh_separatescaling ... + bestc2_nothresh_separatescaling bestg1_nothresh_separatescaling bestEE_nothresh_separatescaling ... + total_h3_chi2_nothresh_separatescaling_map total_chi2_nothresh_separatescaling_map bestEE_nothresh ... + h3_chi2_2015_nothresh_separatescaling_list h3_chi2_2016_nothresh_separatescaling_list ee_list + + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% DO CHI2 TO ENEGY SPECTRA +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +g1_counter=1; +for g1=0.09:0.002:0.11; + g2_counter=1; +% for g2=16.5:0.1:21; + for ee=0.6:0.01:0.9; + g2_Feb2016=25.05*ee; %converting to g2 with SE size + g2_sep2015=25.8536*ee; + + h3_energy_2016=(1/73).*(h3_s1_c_2016./g1 + h3_s2_c_2016./g2_Feb2016); + kr_energy_2016=(1/73).*(kr_s1_c_2016./g1 + kr_s2_c_2016./g2_Feb2016); + h3_energy_2015=(1/73).*(h3_s1_c_2015./g1 + h3_s2_c_2015./g2_sep2015); + kr_energy_2015=(1/73).*(kr_s1_c_2015./g1 + kr_s2_c_2015./g2_sep2015); + + + + %make CH3T data spectrum + [h3_hist_2016,h3_hist_bin_2016]=hist(h3_energy_2016,NEST_CH3T_Spectrum_Feb2016(1,:)); + [h3_hist_2015,h3_hist_bin_2015]=hist(h3_energy_2015,NEST_CH3T_Spectrum_Sep2015(1,:)); + + %scale the simulation to the data + scale_factor_2016=sum(h3_hist_2016)/sum(NEST_CH3T_Spectrum_Feb2016(2,:)); %sum(h3_hist_2016(17:80))./sum(NEST_CH3T_Spectrum(2,17:80)); - sims have an expected threshold now... so can ignore the bin cuts + h3_scaled_sim_2016=scale_factor_2016.*NEST_CH3T_Spectrum_Feb2016(2,:); + + scale_factor_2016_nothresh=sum(h3_hist_2016(11:80))/sum(NEST_CH3T_Spectrum_Feb2016(2,11:80)); %sum(h3_hist_2016(17:80))./sum(NEST_CH3T_Spectrum(2,17:80)); - sims have an expected threshold now... so can ignore the bin cuts + h3_scaled_sim_2016_nothresh=scale_factor_2016_nothresh.*NEST_CH3T_Spectrum_Feb2016(2,:); + + scale_factor_2015=sum(h3_hist_2015)/sum(NEST_CH3T_Spectrum_Sep2015(2,:)); %sum(h3_hist_2015(17:80))./sum(NEST_CH3T_Spectrum(2,17:80)); - sims have an expected threshold now... so can ignore the bin cuts + h3_scaled_sim_2015=scale_factor_2015.*NEST_CH3T_Spectrum_Sep2015(2,:); + + scale_factor_2015_nothresh=sum(h3_hist_2015(11:80))/sum(NEST_CH3T_Spectrum_Sep2015(2,11:80)); %sum(h3_hist_2015(17:80))./sum(NEST_CH3T_Spectrum(2,17:80)); - sims have an expected threshold now... so can ignore the bin cuts + h3_scaled_sim_2015_nothresh=scale_factor_2015_nothresh.*NEST_CH3T_Spectrum_Sep2015(2,:); + + %Calculate chi2 for h3 spectrum + h3_chi2_2016=(1/74).*sum( (h3_scaled_sim_2016(4:80) - h3_hist_2016(4:80)).^2 ./(h3_hist_2016(4:80))); %(4:80) is to avoid low stat areas in the simulation + h3_chi2_2015=(1/74).*sum( (h3_scaled_sim_2015(4:80) - h3_hist_2015(4:80)).^2 ./(h3_hist_2015(4:80))); + + %Calculate chi2 for h3 spectrum away from threshold + h3_chi2_2016_nothresh=(1/68).*sum( (h3_scaled_sim_2016(11:80) - h3_hist_2016(11:80)).^2 ./(h3_hist_2016(11:80))); %(4:80) is to avoid low stat areas in the simulation + h3_chi2_2015_nothresh=(1/68).*sum( (h3_scaled_sim_2015(11:80) - h3_hist_2015(11:80)).^2 ./(h3_hist_2015(11:80))); + + h3_chi2_2016_nothresh_separatescaling=(1/68).*sum( (h3_scaled_sim_2016_nothresh(11:80) - h3_hist_2016(11:80)).^2 ./(h3_hist_2016(11:80))); %(4:80) is to avoid low stat areas in the simulation + h3_chi2_2015_nothresh_separatescaling=(1/68).*sum( (h3_scaled_sim_2015_nothresh(11:80) - h3_hist_2015(11:80)).^2 ./(h3_hist_2015(11:80))); + + dT_step=20; + kr_mean_2016=zeros(length(40+dT_step/2:dT_step:300-dT_step/2),1); + kr_mean_2015=zeros(length(40+dT_step/2:dT_step:300-dT_step/2),1); + dT_centers=zeros(length(40+dT_step/2:dT_step:300-dT_step/2),1); + + full_kr_fit_res_2016=fit([0:1:1000].',hist(kr_energy_2016,[0:1:1000]).','gauss1'); + full_kr_fit_res_2015=fit([0:1:1000].',hist(kr_energy_2015,[0:1:1000]).','gauss1'); + full_kr_chi2_2016=((41.55-full_kr_fit_res_2016.b1)./0.2395).^2; %SHOULD BE 0.2395 BASED ON RUN03 + full_kr_chi2_2015=((41.55-full_kr_fit_res_2015.b1)./0.2395).^2; + + clear kr_fit_res_2016 kr_fit_res_2015 kr_conf_2016 kr_conf_2015 dT_max + kk=1; + for dT_max=40+dT_step/2:dT_step:300-dT_step/2; + clear kr_fit_res_2016 kr_fit_res_2015 + kr_fit_res_2016=fit([0:1:1000].',hist(kr_energy_2016(inrange(kr_2016_drift_time,[dT_max-dT_step dT_max])),[0:1:1000]).','gauss1'); + kr_fit_res_2015=fit([0:1:1000].',hist(kr_energy_2015(inrange(kr_2015_drift_time,[dT_max-dT_step dT_max])),[0:1:1000]).','gauss1'); + kr_mean_2016(kk)=kr_fit_res_2016.b1; + kr_mean_2015(kk)=kr_fit_res_2015.b1; + dT_centers(kk)=dT_max-dT_step/2; + kk=kk+1; + end + + clear cut + cut=kr_mean_2015==0 | kr_mean_2016==0; + kr_mean_2016(cut)=[]; + kr_mean_2015(cut)=[]; + dT_centers(cut)=[]; + + + kr_chi2_2016=((41.55-kr_mean_2016)./0.2395).^2; %SHOULD BE 0.2395 BASED ON RUN03 + kr_chi2_2015=((41.55-kr_mean_2015)./0.2395).^2; + + total_h3_chi2=(h3_chi2_2016+h3_chi2_2015)/2; + total_h3_chi2_nothresh=(h3_chi2_2016_nothresh+h3_chi2_2015_nothresh)/2; + total_h3_chi2_nothresh_separatescaling=(h3_chi2_2016_nothresh_separatescaling+h3_chi2_2015_nothresh_separatescaling)/2; + + total_kr_chi2_2016=mean(kr_chi2_2016); + total_kr_chi2_2015=mean(kr_chi2_2015); + + total_kr_chi2=(total_kr_chi2_2016+total_kr_chi2_2015)./2; + total_chi2=(total_kr_chi2+total_h3_chi2)/2; + total_chi2_nothresh=(total_kr_chi2+total_h3_chi2_nothresh)/2; + total_chi2_nothresh_separatescaling=(total_kr_chi2+total_h3_chi2_nothresh_separatescaling)/2; + + alternate_total_chi2=(sum( (h3_scaled_sim_2016(4:80) - h3_hist_2016(4:80)).^2 ./(h3_hist_2016(4:80)))+sum(kr_chi2_2016)+sum(kr_chi2_2015))/(74+length(kr_chi2_2016)+length(kr_chi2_2015)-4); + alternate_total_chi2_nothresh=(sum( (h3_scaled_sim_2016(11:80) - h3_hist_2016(11:80)).^2 ./(h3_hist_2016(11:80)))+sum(kr_chi2_2016)+sum(kr_chi2_2015))/(68+length(kr_chi2_2016)+length(kr_chi2_2015)-4); + + if total_chi2 < best_total_chi2; + best_total_chi2=total_chi2; + best_total_kr_chi2=total_kr_chi2; + best_total_h3_chi2=total_h3_chi2; + besta2=a2; + bestb2=b2; + bestc2=c2; + bestg1=g1; + bestEE=ee; + end + + + if alternate_total_chi2 < best_total_alternate_chi2; + best_total_alternate_chi2=alternate_total_chi2; + best_total_alternate_kr_chi2=total_kr_chi2; + best_total_alternate_h3_chi2=total_h3_chi2; + besta2_alternate=a2; + bestb2_alternate=b2; + bestc2_alternate=c2; + bestg1_alternate=g1; + bestEE_alternate=ee; + end + + if total_chi2_nothresh < best_total_chi2_nothresh; + best_total_chi2_nothresh=total_chi2_nothresh; + best_total_kr_chi2_nothresh=total_kr_chi2; + best_total_h3_chi2_nothresh=total_h3_chi2_nothresh; + besta2_nothresh=a2; + bestb2_nothresh=b2; + bestc2_nothresh=c2; + bestg1_nothresh=g1; + bestEE_nothresh=ee; + end + + if total_chi2_nothresh_separatescaling < best_total_chi2_nothresh_separatescaling; + best_total_chi2_nothresh_separatescaling=total_chi2_nothresh_separatescaling; + best_total_kr_chi2_nothresh_separatescaling=total_kr_chi2; + best_total_h3_chi2_nothresh_separatescaling=total_h3_chi2_nothresh_separatescaling; + besta2_nothresh_separatescaling=a2; + bestb2_nothresh_separatescaling=b2; + bestc2_nothresh_separatescaling=c2; + bestg1_nothresh_separatescaling=g1; + bestEE_nothresh_separatescaling=ee; + end + + if alternate_total_chi2_nothresh < best_total_alternate_chi2_nothresh; + best_total_alternate_chi2_nothresh=alternate_total_chi2_nothresh; + best_total_alternate_kr_chi2_nothresh=total_kr_chi2; + best_total_alternate_h3_chi2_nothresh=total_h3_chi2_nothresh; + besta2_alternate_nothresh=a2; + bestb2_alternate_nothresh=b2; + bestc2_alternate_nothresh=c2; + bestg1_alternate_nothresh=g1; + bestEE_alternate_nothresh=ee; + end + + +a2_list(param_counter)=a2; +b2_list(param_counter)=b2; +c2_list(param_counter)=c2; +g1_list(param_counter)=g1; +ee_list(param_counter)=ee; +total_h3_chi2_list(param_counter)=total_h3_chi2; +total_h3_chi2_nothresh_list(param_counter)=total_h3_chi2_nothresh; +total_kr_chi2_list(param_counter)=total_kr_chi2; +total_chi2_list(param_counter)=total_chi2; +total_chi2_nothresh_list(param_counter)=total_chi2_nothresh; +alternate_total_chi2_list(param_counter)=alternate_total_chi2; +alternate_total_chi2_nothresh_list(param_counter)=alternate_total_chi2_nothresh; + +total_h3_chi2_nothresh_separatescaling_list(param_counter)=total_h3_chi2_nothresh_separatescaling; +total_chi2_nothresh_separatescaling_list(param_counter)=total_chi2_nothresh_separatescaling; + +h3_chi2_2016_list(param_counter)=h3_chi2_2016; +h3_chi2_2016_nothresh_list(param_counter)=h3_chi2_2016_nothresh; +h3_chi2_2015_list(param_counter)=h3_chi2_2015; +h3_chi2_2015_nothresh_list(param_counter)=h3_chi2_2015_nothresh; +h3_chi2_2015_nothresh_separatescaling_list(param_counter)=h3_chi2_2015_nothresh_separatescaling; +h3_chi2_2016_nothresh_separatescaling_list(param_counter)=h3_chi2_2016_nothresh_separatescaling; + +kr_chi2_2016_list(param_counter)=total_kr_chi2_2016; +kr_chi2_2015_list(param_counter)=total_kr_chi2_2015; +full_kr_chi2_2016_list(param_counter)=full_kr_chi2_2016; +full_kr_chi2_2015_list(param_counter)=full_kr_chi2_2015; +electron_lifetime_2016_list(param_counter)=pseudo_lifetime_2016; +electron_lifetime_2015_list(param_counter)=pseudo_lifetime_2015; + +kr_chi2_2016_zslice_list(param_counter,:)=kr_chi2_2016; +kr_chi2_2015_zslice_list(param_counter,:)=kr_chi2_2015; +kr_chi2_zslice_zcenter_list(param_counter,:)=dT_centers; + +% total_h3_chi2_map(a2_counter,b2_counter,g1_counter,g2_counter)=total_h3_chi2; +% total_h3_chi2_nothresh_map(a2_counter,b2_counter,g1_counter,g2_counter)=total_h3_chi2_nothresh; +% total_kr_chi2_map(a2_counter,b2_counter,g1_counter,g2_counter)=total_kr_chi2; +% total_chi2_map(a2_counter,b2_counter,g1_counter,g2_counter)=total_chi2; +% total_chi2_nothresh_map(a2_counter,b2_counter,g1_counter,g2_counter)=total_chi2_nothresh; +% alternate_total_chi2_map(a2_counter,b2_counter,g1_counter,g2_counter)=alternate_total_chi2; +% alternate_total_chi2_nothresh_map(a2_counter,b2_counter,g1_counter,g2_counter)=alternate_total_chi2_nothresh; +% h3_chi2_2016_map(a2_counter,b2_counter,g1_counter,g2_counter)=h3_chi2_2016; +% h3_chi2_2016_nothresh_map(a2_counter,b2_counter,g1_counter,g2_counter)=h3_chi2_2016_nothresh; +% kr_chi2_2016_map(a2_counter,b2_counter,g1_counter,g2_counter)=total_kr_chi2_2016; +% h3_chi2_2015_map(a2_counter,b2_counter,g1_counter,g2_counter)=h3_chi2_2015; +% h3_chi2_2015_nothresh_map(a2_counter,b2_counter,g1_counter,g2_counter)=h3_chi2_2015_nothresh; +% kr_chi2_2015_map(a2_counter,b2_counter,g1_counter,g2_counter)=total_kr_chi2_2015; +% electron_lifetime_2016_map(a2_counter,b2_counter,g1_counter,g2_counter)=pseudo_lifetime_2016; +% electron_lifetime_2015_map(a2_counter,b2_counter,g1_counter,g2_counter)=pseudo_lifetime_2015; +% +% total_h3_chi2_nothresh_separatescaling_map(a2_counter,b2_counter,g1_counter,g2_counter)=total_h3_chi2_nothresh_separatescaling; +% total_chi2_nothresh_separatescaling_map(a2_counter,b2_counter,g1_counter,g2_counter)=total_chi2_nothresh_separatescaling; + +param_counter=param_counter+1; +g2_counter=g2_counter+1; + end +g1_counter=g1_counter+1; +end + + +catch + %Tried the b2 loop, but failed +sprintf('Caught Error, so skipped. a2=%0.3f b2=%0.3f', a2, b2) + +a2_list(param_counter)=a2; +b2_list(param_counter)=b2; +% c1_list(param_counter)=c1; +c2_list(param_counter)=c2; +g1_list(param_counter)=-1; +ee_list(param_counter)=-1; +total_h3_chi2_list(param_counter)=-1; +total_kr_chi2_list(param_counter)=-1; +total_chi2_list(param_counter)=-1; +alternate_total_chi2_list(param_counter)=-1; +h3_chi2_2016_list(param_counter)=-1; +h3_chi2_2015_list(param_counter)=-1; +kr_chi2_2016_list(param_counter)=-1; +kr_chi2_2015_list(param_counter)=-1; +electron_lifetime_2016_list(param_counter)=-1; +electron_lifetime_2015_list(param_counter)=-1; +full_kr_chi2_2016_list(param_counter)=-1; +full_kr_chi2_2015_list(param_counter)=-1; +kr_chi2_2016_zslice_list(param_counter,:)=-1; +kr_chi2_2015_zslice_list(param_counter,:)=-1; +kr_chi2_zslice_zcenter_list(param_counter,:)=-1; +total_h3_chi2_nothresh_list(param_counter)=-1; +total_chi2_nothresh_list(param_counter)=-1; +alternate_total_chi2_nothresh_list(param_counter)=-1; +h3_chi2_2015_nothresh_list(param_counter)=-1; +h3_chi2_2016_nothresh_list(param_counter)=-1; +h3_chi2_2015_nothresh_separatescaling_list(param_counter)=-1; +h3_chi2_2016_nothresh_separatescaling_list(param_counter)=-1; + +total_h3_chi2_nothresh_separatescaling_list(param_counter)=-1; +total_chi2_nothresh_separatescaling_list(param_counter)=-1; + +% total_h3_chi2_map(a2_counter,b2_counter,:,:)=-1; +% total_kr_chi2_map(a2_counter,b2_counter,:,:)=-1; +% total_chi2_map(a2_counter,b2_counter,:,:)=-1; +% alternate_total_chi2_map(a2_counter,b2_counter,:,:)=-1; +% h3_chi2_2016_map(a2_counter,b2_counter,:,:)=-1; +% kr_chi2_2016_map(a2_counter,b2_counter,:,:)=-1; +% h3_chi2_2015_map(a2_counter,b2_counter,:,:)=-1; +% kr_chi2_2015_map(a2_counter,b2_counter,:,:)=-1; +% electron_lifetime_2016_map(a2_counter,b2_counter,:,:)=-1; +% electron_lifetime_2015_map(a2_counter,b2_counter,:,:)=-1; +% total_h3_chi2_nothresh_map(a2_counter,b2_counter,:,:)=-1; +% total_chi2_nothresh_map(a2_counter,b2_counter,:,:)=-1; +% alternate_total_chi2_nothresh_map(a2_counter,b2_counter,:,:)=-1; +% h3_chi2_2016_nothresh_map(a2_counter,b2_counter,:,:)=-1; +% h3_chi2_2015_nothresh_map(a2_counter,b2_counter,:,:)=-1; +% +% total_h3_chi2_nothresh_separatescaling_map(a2_counter,b2_counter,:,:)=-1; +% total_chi2_nothresh_separatescaling_map(a2_counter,b2_counter,:,:)=-1; + + +param_counter=param_counter+1; +end + +g1_counter=1; +% g1=firstg1; + +%Done with b2, so save and incriment counter +clearvars -except param_counter a1_list b1_list a2_list b2_list total_chi2_list h3_chi2_list kr_chi2_list g1_list g2_list total_chi2_map h3_chi2_map kr_chi2_map chi2_midtobot_list... + best_chi2_midtotop besta1_midtotop besta2_midtotop bestb1_midtotop bestb2_midtotop best_chi2_midtobot... + besta1_midtobot besta1_midtotop bestb1_midtobot bestb1_midtotop a1 b1 a2 b2 chi2_midtotop_map chi2_midtobot_map b_counter a_counter... + besta1_combined bestb1_combined besta2_combined bestb2_combined best_chi2_combined chi2_combined_map chi2_combined_list b1_counter a1_counter a2_counter b2_counter... + a1_counter b1_counter a2_counter b2_counter c1_list c2_list bestc1_midtobot bestc2_midtobot bestc1_midtotop bestc2_midtotop bestc1_combined bestc2_combined... + besta1_combined besta2_combined bestb1_combined bestb2_combined besta1 bestb1 bestc1 besta2 bestb2 bestc2 bestg1 bestg2 best_total_chi2 NEST_CH3T_Spectrum inpaint_on... + best_kr_chi2 best_h3_chi2 electron_lifetime_list electron_lifetime_map a2_start a1_start b1_start b2_start ... + total_h3_chi2_list total_kr_chi2_list total_chi2_list h3_chi2_2016_list h3_chi2_2015_list kr_chi2_2016_list kr_chi2_2015_list ... + electron_lifetime_2016_list electron_lifetime_2015_list total_h3_chi2_map total_kr_chi2_map total_chi2_map h3_chi2_2016_map h3_chi2_2015_map ... + kr_chi2_2016_map kr_chi2_2015_map electron_lifetime_2016_map electron_lifetime_2015_map NEST_CH3T_Spectrum_Sep2015 NEST_CH3T_Spectrum_Feb2016 g1 g2 bestg1 bestg2 g1_counter g2_counter ... + firsta1 firstb1 firsta2 firstb2 firstg1 firstg2 kr_means_2015_map kr_means_2016_map kr_sigma_2015_map kr_sigma_2016_map kr_staterr_2015_map kr_staterr_2016_map ... + kr_means_2015_list kr_means_2016_list kr_2015_num_events kr_2016_num_events kr_sigma_2015_list kr_sigma_2016_list kr_staterr_2015_list kr_staterr_2016_list ... + pseudo_lifetime_2016 pseudo_lifetime_2015 kr_2015_drift_time kr_2015_s2x kr_2015_s2y kr_2016_drift_time kr_2016_s2x kr_2016_s2y ... + kr_chi2_2016_zslice_list kr_chi2_2015_zslice_list kr_chi2_zslice_zcenter_list ... + full_kr_chi2_2016_list full_kr_chi2_2015_list best_total_kr_chi2 best_total_h3_chi2 alternate_total_chi2_map alternate_total_chi2_list ... + best_total_alternate_chi2 best_total_alternate_kr_chi2 best_total_alternate_h3_chi2 besta2_alternate bestb2_alternate bestg1_alternate bestg2_alternate bestc2_alternate c2 ... + total_h3_chi2_nothresh_list total_chi2_nothresh_list alternate_total_chi2_nothresh_list h3_chi2_2015_nothresh_list h3_chi2_2016_nothresh_list ... + total_h3_chi2_nothresh_map total_chi2_nothresh_map alternate_total_chi2_nothresh_map h3_chi2_2016_nothresh_map h3_chi2_2015_nothresh_map ... + best_total_chi2_nothresh best_total_kr_chi2_nothresh best_total_h3_chi2_nothresh besta2_nothresh bestb2_nothresh bestc2_nothresh bestg1_nothresh bestEE_nothresh ... + best_total_alternate_chi2_nothresh best_total_alternate_kr_chi2_nothresh best_total_alternate_h3_chi2_nothresh besta2_alternate_nothresh bestb2_alternate_nothresh ... + bestc2_alternate_nothresh bestg1_alternate_nothresh bestEE_alternate_nothresh best_total_chi2_nothresh best_total_alternate_chi2_nothresh ee_list ... + total_h3_chi2_nothresh_separatescaling_list total_chi2_nothresh_separatescaling_list best_total_chi2_nothresh_separatescaling ... + best_total_kr_chi2_nothresh_separatescaling best_total_h3_chi2_nothresh_separatescaling besta2_nothresh_separatescaling ... + bestc2_nothresh_separatescaling bestg1_nothresh_separatescaling bestEE_nothresh_separatescaling ... + total_h3_chi2_nothresh_separatescaling_map total_chi2_nothresh_separatescaling_map bestEE_nothresh ... + h3_chi2_2015_nothresh_separatescaling_list h3_chi2_2016_nothresh_separatescaling_list ee_list + + + +save('/scratch4/UMDcode/EnergyChi2/KrypCal_2p21/TritiumMethod/libNEST_CH3TModel/S1aS1bParamScan_EnergyChi2_S1FloatPoly_S2Poly2015.mat') + + + b2_counter=b2_counter+1; + + end + + a2_counter=a2_counter+1; + b2_counter=1; + end + diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/EnergyChi2_S1LineFloatPoly_S2Poly2015_Iron56_Improved.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/EnergyChi2_S1LineFloatPoly_S2Poly2015_Iron56_Improved.m new file mode 100644 index 0000000..0b6814e --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/EnergyChi2_S1LineFloatPoly_S2Poly2015_Iron56_Improved.m @@ -0,0 +1,1869 @@ +param_counter=1; + best_chi2_midtobot=10^100; + best_chi2_midtotop=10^100; + best_chi2_combined=10^100; + + + %initialize matrices +a2_list=zeros(1,503316); +b2_list=zeros(1,503316); +c2_list=zeros(1,503316); +g1_list=zeros(1,503316); +g2_list=zeros(1,503316); +total_h3_chi2_list=zeros(1,503316); +total_kr_chi2_list=zeros(1,503316); +total_chi2_list=zeros(1,503316); +alternate_total_chi2_list=zeros(1,503316); +h3_chi2_2016_list=zeros(1,503316); +h3_chi2_2015_list=zeros(1,503316); +kr_chi2_2016_list=zeros(1,503316); +kr_chi2_2015_list=zeros(1,503316); +electron_lifetime_2016_list=zeros(1,503316); +electron_lifetime_2015_list=zeros(1,503316); +kr_staterr_2016_list=zeros(1,503316); +kr_staterr_2015_list=zeros(1,503316); +kr_sigma_2016_list=zeros(1,503316); +kr_sigma_2015_list=zeros(1,503316); +kr_2016_num_events=zeros(1,503316); +kr_2015_num_events=zeros(1,503316); +kr_means_2016_list=zeros(1,503316); +kr_means_2015_list=zeros(1,503316); +full_kr_chi2_2016_list=zeros(1,503316); +full_kr_chi2_2015_list=zeros(1,503316); +total_h3_chi2_nothresh_list=zeros(1,503316); +total_chi2_nothresh_list=zeros(1,503316); +alternate_total_chi2_nothresh_list=zeros(1,503316); +h3_chi2_2016_nothresh_list=zeros(1,503316); +h3_chi2_2015_nothresh_list=zeros(1,503316); +h3_chi2_2015_nothresh_separatescaling_list=zeros(1,503316); +h3_chi2_2016_nothresh_separatescaling_list=zeros(1,503316); + +total_h3_chi2_nothresh_separatescaling_list=zeros(1,503316); +total_chi2_nothresh_separatescaling_list=zeros(1,503316); + +h3_chi2_2016_oldsim_list=zeros(1,503316); +h3_chi2_2015_oldsim_list=zeros(1,503316); +total_h3_chi2_oldsim_list=zeros(1,503316); +total_chi2_oldsim_list=zeros(1,503316); + + +ee_list=zeros(1,503316); + +kr_chi2_2016_zslice_list=zeros(503316,length(40+20/2:20:300-20/2)); +kr_chi2_2015_zslice_list=zeros(503316,length(40+20/2:20:300-20/2)); +kr_chi2_zslice_zcenter_list=zeros(503316,length(40+20/2:20:300-20/2)); +% +% total_h3_chi2_map=zeros(36,41,11,31); +% total_kr_chi2_map=zeros(36,41,11,31); +% total_chi2_map=zeros(36,41,11,31); +% alternate_total_chi2_map=zeros(36,41,11,31); +% h3_chi2_2016_map=zeros(36,41,11,31); +% kr_chi2_2016_map=zeros(36,41,11,31); +% h3_chi2_2015_map=zeros(36,41,11,31); +% kr_chi2_2015_map=zeros(36,41,11,31); +% electron_lifetime_2016_map=zeros(36,41,11,31); +% electron_lifetime_2015_map=zeros(36,41,11,31); +% total_h3_chi2_nothresh_map=zeros(36,41,11,31); +% total_chi2_nothresh_map=zeros(36,41,11,31); +% alternate_total_chi2_nothresh_map=zeros(36,41,11,31); +% h3_chi2_2016_nothresh_map=zeros(36,41,11,31); +% h3_chi2_2015_nothresh_map=zeros(36,41,11,31); +% total_h3_chi2_nothresh_separatescaling_map=zeros(36,41,11,31); +% total_chi2_nothresh_separatescaling_map=zeros(36,41,11,31); + +best_total_chi2=1000000000000000000; +best_total_alternate_chi2=1000000000000000000; +best_total_chi2_nothresh=1000000000000000000; +best_total_alternate_chi2_nothresh=1000000000000000000; +best_total_chi2_nothresh_separatescaling=1000000000000000000; +best_total_chi2_oldsim=1000000000000000000; + + +inpaint_on=1; +% Measurement is a1=-0.765; b1=2.939; a2=0.1934; b2=-0.744; + +load('/scratch4/UMDcode/EnergyChi2/KrypCal_2p21/TritiumMethod/libNEST_CH3TModel/NEST_CH3T_Spectrum_Sep2015_Kr2p21.mat') +load('/scratch4/UMDcode/EnergyChi2/KrypCal_2p21/TritiumMethod/libNEST_CH3TModel/NEST_CH3T_Spectrum_Feb2016_Kr2p21.mat') +load('/scratch4/UMDcode/EnergyChi2/KrypCal_2p21/TritiumMethod/libNEST_CH3TModel/NEST_CH3T_Spectrum_old.mat') + + +a2_counter=1; +for a2=0:0.02:0.7; %p1*x^2 coefficient for s1ab_s2_xyz_fit.p1 + b2_counter=1; + for b2=0:0.05:2; %p1*x^2 coefficient for s1ab_s2_xyz_fit.p1 + + + +g1_counter=1; +g2_counter=1; + + %%UPDATE THIS + +s1ab_s2_xyz_fit_map.p1=-0.4988; %these are slightly different than Kr2p20, prob just a resulting of the fitting +s1ab_s2_xyz_fit_map.p2=1.484; +c1=1-s1ab_s2_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s2_xyz_fit_map.p2; +s1ab_s2_xyz_fit_map.p3=c1; + +s1ab_s1_xyz_fit_map.p1=a2; +s1ab_s1_xyz_fit_map.p2=b2; +c2=1-a2.*2.7303.^2-2.7303.*b2; +s1ab_s1_xyz_fit_map.p3=c2; +%% Load the Uncorrected Sep 2015 Kr data + + +%HAVE TO MAKE THIS .MAT FILE STILL - USE class 1 and class 9 for S1 +load('/scratch4/UMDcode/EnergyChi2/KrypCal_2p21/TritiumMethod/libNEST_CH3TModel/MappingParametersFit_Start_2015_CutDown.mat') + + +%% Calculate 2015 Corrections + +try + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>90000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval); + + + + end + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=1000; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1500]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[5+bin_size, 500] );%from 50 to 300us for the fit, based on when s1as1b values get strange + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + %%Tracker for pseudo-lifetime + s2_at_bottom=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_2015=-320/log(s2_at_bottom/s2_at_top); + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_xbins),floor(s2_ybins)); +Sigma_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); +Count_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_xbins),floor(s1_ybins)); +Sigma_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); +Count_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XYZ. 3D Map, caluculate and Submit IQ +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% if Kr_events>150000 +% +% % LUXkrypCal_S1_3D(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_distance_\mus,user_name,file_id_cp,dp_version,submit); +% LUXkrypCal_S1_3D_Run04_local_2p14FixedZHisto(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_time,x_center,y_center,z_center,det_edge,inpaint_on,user_name,file_id_cp,dp_version, algorithm_name, submit); +% +% +% end + + +%% Apply corrections to CH3T and calculate the ER band shift + +%First load the data + +clear s1_phe_both s2_phe_both +load('/scratch4/UMDcode/EnergyChi2/KrypCal_2p21/TritiumMethod/libNEST_CH3TModel/CH3T_Sep2015_NoCorrections.mat'); + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = S2_x; +s1_y_cm = S2_y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,S2_x,S2_y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + h3_cut= inrange(drift_time,[40 300]) & inrange(s1_phe_both,[0 120]) ... + & (log10(s1_phe_both)+0.8*log10(s2_phe_both)<5.2) .... + & (log10(s1_phe_both)-2*log10(s2_phe_both)>-6.8) & (log10(s1_phe_both)-2*log10(s2_phe_both)<-4.8)... + & s2_phe_both>100 & s2_phe_both<16000 & s2radius<25; %used to be drift time 100 to 250 + +h3_s1_c_2015=s1_phe_both_xyz(h3_cut); +h3_s2_c_2015=s2_phe_both_xyz(h3_cut); + + + kr_cut= inrange(drift_time,[40 300]) & inrange(s1_phe_both,[30 1000]) ... + & (log10(s1_phe_both)+0.6*log10(s2_phe_both)>4.5) & (log10(s1_phe_both)+0.6*log10(s2_phe_both)<5.05) ... + & (log10(s1_phe_both)-2*log10(s2_phe_both)>-7.6) & (log10(s1_phe_both)-2*log10(s2_phe_both)<-4.7) ... + & s2_phe_both>3000 & s2_phe_both<60000 & s2radius<25; %used to be drift time 100 to 250 + +kr_s1_c_2015=s1_phe_both_xyz(kr_cut); +kr_s2_c_2015=s2_phe_both_xyz(kr_cut); +kr_2015_drift_time=drift_time(kr_cut); +kr_2015_s2x=S2_x(kr_cut); +kr_2015_s2y=S2_y(kr_cut); + + clearvars -except param_counter a1_list b1_list a2_list b2_list total_chi2_list h3_chi2_list kr_chi2_list g1_list g2_list total_chi2_map h3_chi2_map kr_chi2_map chi2_midtobot_list... + best_chi2_midtotop besta1_midtotop besta2_midtotop bestb1_midtotop bestb2_midtotop best_chi2_midtobot... + besta1_midtobot besta1_midtotop bestb1_midtobot bestb1_midtotop a1 b1 a2 b2 c2 chi2_midtotop_map chi2_midtobot_map b_counter a_counter... + besta1_combined bestb1_combined besta2_combined bestb2_combined best_chi2_combined chi2_combined_map chi2_combined_list b1_counter a1_counter a2_counter b2_counter... + a1_counter b1_counter a2_counter b2_counter c1_list c2_list bestc1_midtobot bestc2_midtobot bestc1_midtotop bestc2_midtotop bestc1_combined bestc2_combined... + besta1_combined besta2_combined bestb1_combined bestb2_combined besta1 bestb1 bestc1 besta2 bestb2 bestc2 bestg1 bestg2 best_total_chi2 NEST_CH3T_Spectrum inpaint_on... + best_kr_chi2 best_h3_chi2 electron_lifetime_list electron_lifetime_map a2_start a1_start b1_start b2_start ... + total_h3_chi2_list total_kr_chi2_list total_chi2_list h3_chi2_2016_list h3_chi2_2015_list kr_chi2_2016_list kr_chi2_2015_list ... + electron_lifetime_2016_list electron_lifetime_2015_list total_h3_chi2_map total_kr_chi2_map total_chi2_map h3_chi2_2016_map h3_chi2_2015_map ... + kr_chi2_2016_map kr_chi2_2015_map electron_lifetime_2016_map electron_lifetime_2015_map NEST_CH3T_Spectrum_Sep2015 NEST_CH3T_Spectrum_Feb2016 g1 g2 bestg1 bestg2 g1_counter g2_counter ... + firsta1 firstb1 firsta2 firstb2 firstg1 firstg2 kr_means_2015_map kr_means_2016_map kr_sigma_2015_map kr_sigma_2016_map kr_staterr_2015_map kr_staterr_2016_map ... + kr_means_2015_list kr_means_2016_list kr_2015_num_events kr_2016_num_events kr_sigma_2015_list kr_sigma_2016_list kr_staterr_2015_list kr_staterr_2016_list ... + pseudo_lifetime_2016 pseudo_lifetime_2015 kr_s1_c_2015 kr_s2_c_2015 h3_s1_c_2015 h3_s2_c_2015 s1ab_s2_xyz_fit_map s1ab_s1_xyz_fit_map ... + kr_2015_drift_time kr_2015_s2x kr_2015_s2y kr_chi2_2016_zslice_list kr_chi2_2015_zslice_list kr_chi2_zslice_zcenter_list ... + full_kr_chi2_2016_list full_kr_chi2_2015_list best_total_kr_chi2 best_total_h3_chi2 alternate_total_chi2_map alternate_total_chi2_list ... + best_total_alternate_chi2 best_total_alternate_kr_chi2 best_total_alternate_h3_chi2 besta2_alternate bestb2_alternate bestg1_alternate bestg2_alternate bestc2_alternate ... + total_h3_chi2_nothresh_list total_chi2_nothresh_list alternate_total_chi2_nothresh_list h3_chi2_2015_nothresh_list h3_chi2_2016_nothresh_list ... + total_h3_chi2_nothresh_map total_chi2_nothresh_map alternate_total_chi2_nothresh_map h3_chi2_2016_nothresh_map h3_chi2_2015_nothresh_map ... + best_total_chi2_nothresh best_total_kr_chi2_nothresh best_total_h3_chi2_nothresh besta2_nothresh bestb2_nothresh bestc2_nothresh bestg1_nothresh bestEE_nothresh ... + best_total_alternate_chi2_nothresh best_total_alternate_kr_chi2_nothresh best_total_alternate_h3_chi2_nothresh besta2_alternate_nothresh bestb2_alternate_nothresh ... + bestc2_alternate_nothresh bestg1_alternate_nothresh bestEE_alternate_nothresh best_total_chi2_nothresh best_total_alternate_chi2_nothresh ee_list ... + total_h3_chi2_nothresh_separatescaling_list total_chi2_nothresh_separatescaling_list best_total_chi2_nothresh_separatescaling ... + best_total_kr_chi2_nothresh_separatescaling best_total_h3_chi2_nothresh_separatescaling besta2_nothresh_separatescaling ... + bestc2_nothresh_separatescaling bestg1_nothresh_separatescaling bestEE_nothresh_separatescaling ... + total_h3_chi2_nothresh_separatescaling_map total_chi2_nothresh_separatescaling_map bestEE_nothresh ... + h3_chi2_2015_nothresh_separatescaling_list h3_chi2_2016_nothresh_separatescaling_list ee_list ... + h3_chi2_2016_oldsim_list h3_chi2_2015_oldsim_list total_h3_chi2_oldsim_list total_chi2_oldsim_list ... + best_total_chi2_oldsim best_total_kr_chi2_oldsim best_total_h3_chi2_oldsim besta2_oldsim bestb2_oldsim ... + bestc2_oldsim bestg1_oldsim bestEE_oldsim NEST_CH3T_Spectrum_old + + + + + +%%%%%%%%%%%%%%%%%%%%% +%% REPEAT FOR 2016 DATA +%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('/scratch4/UMDcode/EnergyChi2/KrypCal_2p21/TritiumMethod/libNEST_CH3TModel/MappingParametersFit_Start_2016_CutDown.mat') + + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>90000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval); + + + + end + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[5+bin_size, 500] );%from 50 to 300us for the fit, based on when s1as1b values get strange + +s2_both_norm_z_index=mean_index(dT_range); +s2_both_norm_z_means=means(dT_range); + s2_at_top=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + %%Tracker for pseudo-lifetime + s2_at_bottom=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_2016=-320/log(s2_at_bottom/s2_at_top); +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_xbins),floor(s2_ybins)); +Sigma_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); +Count_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_xbins),floor(s1_ybins)); +Sigma_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); +Count_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Apply corrections to 2016 Kr data +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('/scratch4/UMDcode/EnergyChi2/KrypCal_2p21/TritiumMethod/libNEST_CH3TModel/MappingParametersFit_Start_2016_CutDown.mat') + + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; +% +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate ER Band shift +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + liquid_cut= inrange(drift_time,[40 300]) ... + & (log10(s1_phe_both)+0.7*log10(s2_phe_both)>4.9) & (log10(s1_phe_both)+0.7*log10(s2_phe_both)<5.5) ... + & s2_phe_both>3000 & s2_phe_both<80000 & s2radius<25; %used to be drift time 100 to 250 + + +kr_s1_c_2016=s1_phe_both_xyz(liquid_cut); +kr_s2_c_2016=s2_phe_both_xyz(liquid_cut); +kr_2016_drift_time=drift_time(liquid_cut); +kr_2016_s2x=s2x(liquid_cut); +kr_2016_s2y=s2y(liquid_cut); + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%Apply Corrections to 2016 CH3T Data +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('/scratch4/UMDcode/EnergyChi2/KrypCal_2p21/TritiumMethod/libNEST_CH3TModel/CH3T_Feb2016_NoCorrections.mat'); + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +% electron_lifetime_2016=e_lifetime_both; +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate ER Band shift +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +s1_min=0; +s1_max=120; + + %% Redo with r<10 cm + + + liquid_cut= clean_cut & inrange(drift_time,[40 300]) ... + & (log10(s1_phe_both)+log10(s2_phe_both)<5.9) & (log10(s1_phe_both)-2.*log10(s2_phe_both)<-4.8) ... + & (log10(s1_phe_both)-2.*log10(s2_phe_both)>-6.8) ... + & s2_phe_both>600 & s2_phe_both<16000 & s2radius<25; %used to be drift time 100 to 250 + + + +h3_s1_c_2016=s1_phe_both_xyz(liquid_cut); +h3_s2_c_2016=s2_phe_both_xyz(liquid_cut); + + clearvars -except param_counter a1_list b1_list a2_list b2_list total_chi2_list h3_chi2_list kr_chi2_list g1_list g2_list total_chi2_map h3_chi2_map kr_chi2_map chi2_midtobot_list... + best_chi2_midtotop besta1_midtotop besta2_midtotop bestb1_midtotop bestb2_midtotop best_chi2_midtobot... + besta1_midtobot besta1_midtotop bestb1_midtobot bestb1_midtotop a1 b1 a2 b2 chi2_midtotop_map chi2_midtobot_map b_counter a_counter... + besta1_combined bestb1_combined besta2_combined bestb2_combined best_chi2_combined chi2_combined_map chi2_combined_list b1_counter a1_counter a2_counter b2_counter... + a1_counter b1_counter a2_counter b2_counter c1_list c2_list bestc1_midtobot bestc2_midtobot bestc1_midtotop bestc2_midtotop bestc1_combined bestc2_combined... + besta1_combined besta2_combined bestb1_combined bestb2_combined besta1 bestb1 bestc1 besta2 bestb2 bestc2 bestg1 bestg2 best_total_chi2 NEST_CH3T_Spectrum inpaint_on... + best_kr_chi2 best_h3_chi2 electron_lifetime_list electron_lifetime_map a2_start a1_start b1_start b2_start ... + total_h3_chi2_list total_kr_chi2_list total_chi2_list h3_chi2_2016_list h3_chi2_2015_list kr_chi2_2016_list kr_chi2_2015_list ... + electron_lifetime_2016_list electron_lifetime_2015_list total_h3_chi2_map total_kr_chi2_map total_chi2_map h3_chi2_2016_map h3_chi2_2015_map ... + kr_chi2_2016_map kr_chi2_2015_map electron_lifetime_2016_map electron_lifetime_2015_map NEST_CH3T_Spectrum_Sep2015 NEST_CH3T_Spectrum_Feb2016 g1 g2 bestg1 bestg2 g1_counter g2_counter ... + firsta1 firstb1 firsta2 firstb2 firstg1 firstg2 kr_means_2015_map kr_means_2016_map kr_sigma_2015_map kr_sigma_2016_map kr_staterr_2015_map kr_staterr_2016_map ... + kr_means_2015_list kr_means_2016_list kr_2015_num_events kr_2016_num_events kr_sigma_2015_list kr_sigma_2016_list kr_staterr_2015_list kr_staterr_2016_list ... + pseudo_lifetime_2016 pseudo_lifetime_2015 kr_s1_c_2015 kr_s2_c_2015 h3_s1_c_2015 h3_s2_c_2015 kr_s1_c_2016 kr_s2_c_2016 h3_s1_c_2016 h3_s2_c_2016 ... + kr_2015_drift_time kr_2015_s2x kr_2015_s2y kr_2016_drift_time kr_2016_s2x kr_2016_s2y ... + kr_chi2_2016_zslice_list kr_chi2_2015_zslice_list kr_chi2_zslice_zcenter_list ... + full_kr_chi2_2016_list full_kr_chi2_2015_list best_total_kr_chi2 best_total_h3_chi2 alternate_total_chi2_map alternate_total_chi2_list ... + best_total_alternate_chi2 best_total_alternate_kr_chi2 best_total_alternate_h3_chi2 besta2_alternate bestb2_alternate bestg1_alternate bestg2_alternate bestc2_alternate c2 ... + total_h3_chi2_nothresh_list total_chi2_nothresh_list alternate_total_chi2_nothresh_list h3_chi2_2015_nothresh_list h3_chi2_2016_nothresh_list ... + total_h3_chi2_nothresh_map total_chi2_nothresh_map alternate_total_chi2_nothresh_map h3_chi2_2016_nothresh_map h3_chi2_2015_nothresh_map ... + best_total_chi2_nothresh best_total_kr_chi2_nothresh best_total_h3_chi2_nothresh besta2_nothresh bestb2_nothresh bestc2_nothresh bestg1_nothresh bestEE_nothresh ... + best_total_alternate_chi2_nothresh best_total_alternate_kr_chi2_nothresh best_total_alternate_h3_chi2_nothresh besta2_alternate_nothresh bestb2_alternate_nothresh ... + bestc2_alternate_nothresh bestg1_alternate_nothresh bestEE_alternate_nothresh best_total_chi2_nothresh best_total_alternate_chi2_nothresh ee_list ... + total_h3_chi2_nothresh_separatescaling_list total_chi2_nothresh_separatescaling_list best_total_chi2_nothresh_separatescaling ... + best_total_kr_chi2_nothresh_separatescaling best_total_h3_chi2_nothresh_separatescaling besta2_nothresh_separatescaling ... + bestc2_nothresh_separatescaling bestg1_nothresh_separatescaling bestEE_nothresh_separatescaling ... + total_h3_chi2_nothresh_separatescaling_map total_chi2_nothresh_separatescaling_map bestEE_nothresh ... + h3_chi2_2015_nothresh_separatescaling_list h3_chi2_2016_nothresh_separatescaling_list ee_list ... + h3_chi2_2016_oldsim_list h3_chi2_2015_oldsim_list total_h3_chi2_oldsim_list total_chi2_oldsim_list ... + best_total_chi2_oldsim best_total_kr_chi2_oldsim best_total_h3_chi2_oldsim besta2_oldsim bestb2_oldsim ... + bestc2_oldsim bestg1_oldsim bestEE_oldsim NEST_CH3T_Spectrum_old + + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% DO CHI2 TO ENEGY SPECTRA +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +g1_counter=1; +for g1=0.09:0.002:0.11; + g2_counter=1; +% for g2=16.5:0.1:21; + for ee=0.6:0.01:0.9; + g2_Feb2016=25.05*ee; %converting to g2 with SE size + g2_sep2015=25.8536*ee; + + h3_energy_2016=(1/73).*(h3_s1_c_2016./g1 + h3_s2_c_2016./g2_Feb2016); + kr_energy_2016=(1/73).*(kr_s1_c_2016./g1 + kr_s2_c_2016./g2_Feb2016); + h3_energy_2015=(1/73).*(h3_s1_c_2015./g1 + h3_s2_c_2015./g2_sep2015); + kr_energy_2015=(1/73).*(kr_s1_c_2015./g1 + kr_s2_c_2015./g2_sep2015); + + + + %make CH3T data spectrum + [h3_hist_2016,h3_hist_bin_2016]=hist(h3_energy_2016,NEST_CH3T_Spectrum_Feb2016(1,:)); + [h3_hist_2015,h3_hist_bin_2015]=hist(h3_energy_2015,NEST_CH3T_Spectrum_Sep2015(1,:)); + + %scale the simulation to the data + scale_factor_2016=sum(h3_hist_2016)/sum(NEST_CH3T_Spectrum_Feb2016(2,:)); %sum(h3_hist_2016(17:80))./sum(NEST_CH3T_Spectrum(2,17:80)); - sims have an expected threshold now... so can ignore the bin cuts + h3_scaled_sim_2016=scale_factor_2016.*NEST_CH3T_Spectrum_Feb2016(2,:); + + scale_factor_2016_nothresh=sum(h3_hist_2016(11:80))/sum(NEST_CH3T_Spectrum_Feb2016(2,11:80)); %sum(h3_hist_2016(17:80))./sum(NEST_CH3T_Spectrum(2,17:80)); - sims have an expected threshold now... so can ignore the bin cuts + h3_scaled_sim_2016_nothresh=scale_factor_2016_nothresh.*NEST_CH3T_Spectrum_Feb2016(2,:); + + scale_factor_2015=sum(h3_hist_2015)/sum(NEST_CH3T_Spectrum_Sep2015(2,:)); %sum(h3_hist_2015(17:80))./sum(NEST_CH3T_Spectrum(2,17:80)); - sims have an expected threshold now... so can ignore the bin cuts + h3_scaled_sim_2015=scale_factor_2015.*NEST_CH3T_Spectrum_Sep2015(2,:); + + scale_factor_2015_nothresh=sum(h3_hist_2015(11:80))/sum(NEST_CH3T_Spectrum_Sep2015(2,11:80)); %sum(h3_hist_2015(17:80))./sum(NEST_CH3T_Spectrum(2,17:80)); - sims have an expected threshold now... so can ignore the bin cuts + h3_scaled_sim_2015_nothresh=scale_factor_2015_nothresh.*NEST_CH3T_Spectrum_Sep2015(2,:); + + scale_factor_2015_oldsim=sum(h3_hist_2015(17:80))/sum(NEST_CH3T_Spectrum_old(2,17:80)); + h3_scaled_oldsim_2015=scale_factor_2015_oldsim.*NEST_CH3T_Spectrum_old(2,:); + + scale_factor_2016_oldsim=sum(h3_hist_2016(17:80))/sum(NEST_CH3T_Spectrum_old(2,17:80)); + h3_scaled_oldsim_2016=scale_factor_2016_oldsim.*NEST_CH3T_Spectrum_old(2,:); + + %Calculate chi2 for h3 spectrum + h3_chi2_2016=(1/74).*sum( (h3_scaled_sim_2016(4:80) - h3_hist_2016(4:80)).^2 ./(h3_hist_2016(4:80))); %(4:80) is to avoid low stat areas in the simulation + h3_chi2_2015=(1/74).*sum( (h3_scaled_sim_2015(4:80) - h3_hist_2015(4:80)).^2 ./(h3_hist_2015(4:80))); + + %Calculate chi2 for h3 spectrum away from threshold + h3_chi2_2016_nothresh=(1/68).*sum( (h3_scaled_sim_2016(11:80) - h3_hist_2016(11:80)).^2 ./(h3_hist_2016(11:80))); %(4:80) is to avoid low stat areas in the simulation + h3_chi2_2015_nothresh=(1/68).*sum( (h3_scaled_sim_2015(11:80) - h3_hist_2015(11:80)).^2 ./(h3_hist_2015(11:80))); + + h3_chi2_2016_nothresh_separatescaling=(1/68).*sum( (h3_scaled_sim_2016_nothresh(11:80) - h3_hist_2016(11:80)).^2 ./(h3_hist_2016(11:80))); %(4:80) is to avoid low stat areas in the simulation + h3_chi2_2015_nothresh_separatescaling=(1/68).*sum( (h3_scaled_sim_2015_nothresh(11:80) - h3_hist_2015(11:80)).^2 ./(h3_hist_2015(11:80))); + + h3_chi2_2016_oldsim=(1/62).*sum( (h3_scaled_oldsim_2016(17:80) - h3_hist_2016(17:80)).^2 ./(h3_hist_2016(17:80))); %(4:80) is to avoid low stat areas in the simulation + h3_chi2_2015_oldsim=(1/62).*sum( (h3_scaled_oldsim_2015(17:80) - h3_hist_2015(17:80)).^2 ./(h3_hist_2015(17:80))); + + dT_step=20; + kr_mean_2016=zeros(length(40+dT_step/2:dT_step:300-dT_step/2),1); + kr_mean_2015=zeros(length(40+dT_step/2:dT_step:300-dT_step/2),1); + dT_centers=zeros(length(40+dT_step/2:dT_step:300-dT_step/2),1); + + full_kr_fit_res_2016=fit([0:1:1000].',hist(kr_energy_2016,[0:1:1000]).','gauss1'); + full_kr_fit_res_2015=fit([0:1:1000].',hist(kr_energy_2015,[0:1:1000]).','gauss1'); + full_kr_chi2_2016=((41.55-full_kr_fit_res_2016.b1)./0.2395).^2; %SHOULD BE 0.2395 BASED ON RUN03 + full_kr_chi2_2015=((41.55-full_kr_fit_res_2015.b1)./0.2395).^2; + + clear kr_fit_res_2016 kr_fit_res_2015 kr_conf_2016 kr_conf_2015 dT_max + kk=1; + for dT_max=40+dT_step/2:dT_step:300-dT_step/2; + clear kr_fit_res_2016 kr_fit_res_2015 + kr_fit_res_2016=fit([0:1:1000].',hist(kr_energy_2016(inrange(kr_2016_drift_time,[dT_max-dT_step dT_max])),[0:1:1000]).','gauss1'); + kr_fit_res_2015=fit([0:1:1000].',hist(kr_energy_2015(inrange(kr_2015_drift_time,[dT_max-dT_step dT_max])),[0:1:1000]).','gauss1'); + kr_mean_2016(kk)=kr_fit_res_2016.b1; + kr_mean_2015(kk)=kr_fit_res_2015.b1; + dT_centers(kk)=dT_max-dT_step/2; + kk=kk+1; + end + + clear cut + cut=kr_mean_2015==0 | kr_mean_2016==0; + kr_mean_2016(cut)=[]; + kr_mean_2015(cut)=[]; + dT_centers(cut)=[]; + + + kr_chi2_2016=((41.55-kr_mean_2016)./0.2395).^2; %SHOULD BE 0.2395 BASED ON RUN03 + kr_chi2_2015=((41.55-kr_mean_2015)./0.2395).^2; + + total_h3_chi2=(h3_chi2_2016+h3_chi2_2015)/2; + total_h3_chi2_nothresh=(h3_chi2_2016_nothresh+h3_chi2_2015_nothresh)/2; + total_h3_chi2_oldsim=(h3_chi2_2016_oldsim+h3_chi2_2015_oldsim)/2; + total_h3_chi2_nothresh_separatescaling=(h3_chi2_2016_nothresh_separatescaling+h3_chi2_2015_nothresh_separatescaling)/2; + + total_kr_chi2_2016=mean(kr_chi2_2016); + total_kr_chi2_2015=mean(kr_chi2_2015); + + total_kr_chi2=(total_kr_chi2_2016+total_kr_chi2_2015)./2; + total_chi2=(total_kr_chi2+total_h3_chi2)/2; + total_chi2_nothresh=(total_kr_chi2+total_h3_chi2_nothresh)/2; + total_chi2_nothresh_separatescaling=(total_kr_chi2+total_h3_chi2_nothresh_separatescaling)/2; + total_chi2_oldsim=(total_kr_chi2+total_h3_chi2_oldsim)/2; + + alternate_total_chi2=(sum( (h3_scaled_sim_2016(4:80) - h3_hist_2016(4:80)).^2 ./(h3_hist_2016(4:80)))+sum(kr_chi2_2016)+sum(kr_chi2_2015))/(74+length(kr_chi2_2016)+length(kr_chi2_2015)-4); + alternate_total_chi2_nothresh=(sum( (h3_scaled_sim_2016(11:80) - h3_hist_2016(11:80)).^2 ./(h3_hist_2016(11:80)))+sum(kr_chi2_2016)+sum(kr_chi2_2015))/(68+length(kr_chi2_2016)+length(kr_chi2_2015)-4); + + if total_chi2 < best_total_chi2; + best_total_chi2=total_chi2; + best_total_kr_chi2=total_kr_chi2; + best_total_h3_chi2=total_h3_chi2; + besta2=a2; + bestb2=b2; + bestc2=c2; + bestg1=g1; + bestEE=ee; + end + + + if alternate_total_chi2 < best_total_alternate_chi2; + best_total_alternate_chi2=alternate_total_chi2; + best_total_alternate_kr_chi2=total_kr_chi2; + best_total_alternate_h3_chi2=total_h3_chi2; + besta2_alternate=a2; + bestb2_alternate=b2; + bestc2_alternate=c2; + bestg1_alternate=g1; + bestEE_alternate=ee; + end + + if total_chi2_nothresh < best_total_chi2_nothresh; + best_total_chi2_nothresh=total_chi2_nothresh; + best_total_kr_chi2_nothresh=total_kr_chi2; + best_total_h3_chi2_nothresh=total_h3_chi2_nothresh; + besta2_nothresh=a2; + bestb2_nothresh=b2; + bestc2_nothresh=c2; + bestg1_nothresh=g1; + bestEE_nothresh=ee; + end + + if total_chi2_nothresh_separatescaling < best_total_chi2_nothresh_separatescaling; + best_total_chi2_nothresh_separatescaling=total_chi2_nothresh_separatescaling; + best_total_kr_chi2_nothresh_separatescaling=total_kr_chi2; + best_total_h3_chi2_nothresh_separatescaling=total_h3_chi2_nothresh_separatescaling; + besta2_nothresh_separatescaling=a2; + bestb2_nothresh_separatescaling=b2; + bestc2_nothresh_separatescaling=c2; + bestg1_nothresh_separatescaling=g1; + bestEE_nothresh_separatescaling=ee; + end + + if alternate_total_chi2_nothresh < best_total_alternate_chi2_nothresh; + best_total_alternate_chi2_nothresh=alternate_total_chi2_nothresh; + best_total_alternate_kr_chi2_nothresh=total_kr_chi2; + best_total_alternate_h3_chi2_nothresh=total_h3_chi2_nothresh; + besta2_alternate_nothresh=a2; + bestb2_alternate_nothresh=b2; + bestc2_alternate_nothresh=c2; + bestg1_alternate_nothresh=g1; + bestEE_alternate_nothresh=ee; + end + + if total_chi2_oldsim < best_total_chi2_oldsim; + best_total_chi2_oldsim=total_chi2_oldsim; + best_total_kr_chi2_oldsim=total_kr_chi2; + best_total_h3_chi2_oldsim=total_h3_chi2_oldsim; + besta2_oldsim=a2; + bestb2_oldsim=b2; + bestc2_oldsim=c2; + bestg1_oldsim=g1; + bestEE_oldsim=ee; + end + +a2_list(param_counter)=a2; +b2_list(param_counter)=b2; +c2_list(param_counter)=c2; +g1_list(param_counter)=g1; +ee_list(param_counter)=ee; +total_h3_chi2_list(param_counter)=total_h3_chi2; +total_h3_chi2_nothresh_list(param_counter)=total_h3_chi2_nothresh; +total_kr_chi2_list(param_counter)=total_kr_chi2; +total_chi2_list(param_counter)=total_chi2; +total_chi2_nothresh_list(param_counter)=total_chi2_nothresh; +alternate_total_chi2_list(param_counter)=alternate_total_chi2; +alternate_total_chi2_nothresh_list(param_counter)=alternate_total_chi2_nothresh; + +total_h3_chi2_nothresh_separatescaling_list(param_counter)=total_h3_chi2_nothresh_separatescaling; +total_chi2_nothresh_separatescaling_list(param_counter)=total_chi2_nothresh_separatescaling; + +h3_chi2_2016_list(param_counter)=h3_chi2_2016; +h3_chi2_2016_nothresh_list(param_counter)=h3_chi2_2016_nothresh; +h3_chi2_2015_list(param_counter)=h3_chi2_2015; +h3_chi2_2015_nothresh_list(param_counter)=h3_chi2_2015_nothresh; +h3_chi2_2015_nothresh_separatescaling_list(param_counter)=h3_chi2_2015_nothresh_separatescaling; +h3_chi2_2016_nothresh_separatescaling_list(param_counter)=h3_chi2_2016_nothresh_separatescaling; + +kr_chi2_2016_list(param_counter)=total_kr_chi2_2016; +kr_chi2_2015_list(param_counter)=total_kr_chi2_2015; +full_kr_chi2_2016_list(param_counter)=full_kr_chi2_2016; +full_kr_chi2_2015_list(param_counter)=full_kr_chi2_2015; +electron_lifetime_2016_list(param_counter)=pseudo_lifetime_2016; +electron_lifetime_2015_list(param_counter)=pseudo_lifetime_2015; + +kr_chi2_2016_zslice_list(param_counter,:)=kr_chi2_2016; +kr_chi2_2015_zslice_list(param_counter,:)=kr_chi2_2015; +kr_chi2_zslice_zcenter_list(param_counter,:)=dT_centers; + +h3_chi2_2016_oldsim_list(param_counter)=h3_chi2_2016_oldsim; +h3_chi2_2015_oldsim_list(param_counter)=h3_chi2_2015_oldsim; +total_h3_chi2_oldsim_list(param_counter)=total_h3_chi2_oldsim; +total_chi2_oldsim_list(param_counter)=total_chi2_oldsim; + +% total_h3_chi2_map(a2_counter,b2_counter,g1_counter,g2_counter)=total_h3_chi2; +% total_h3_chi2_nothresh_map(a2_counter,b2_counter,g1_counter,g2_counter)=total_h3_chi2_nothresh; +% total_kr_chi2_map(a2_counter,b2_counter,g1_counter,g2_counter)=total_kr_chi2; +% total_chi2_map(a2_counter,b2_counter,g1_counter,g2_counter)=total_chi2; +% total_chi2_nothresh_map(a2_counter,b2_counter,g1_counter,g2_counter)=total_chi2_nothresh; +% alternate_total_chi2_map(a2_counter,b2_counter,g1_counter,g2_counter)=alternate_total_chi2; +% alternate_total_chi2_nothresh_map(a2_counter,b2_counter,g1_counter,g2_counter)=alternate_total_chi2_nothresh; +% h3_chi2_2016_map(a2_counter,b2_counter,g1_counter,g2_counter)=h3_chi2_2016; +% h3_chi2_2016_nothresh_map(a2_counter,b2_counter,g1_counter,g2_counter)=h3_chi2_2016_nothresh; +% kr_chi2_2016_map(a2_counter,b2_counter,g1_counter,g2_counter)=total_kr_chi2_2016; +% h3_chi2_2015_map(a2_counter,b2_counter,g1_counter,g2_counter)=h3_chi2_2015; +% h3_chi2_2015_nothresh_map(a2_counter,b2_counter,g1_counter,g2_counter)=h3_chi2_2015_nothresh; +% kr_chi2_2015_map(a2_counter,b2_counter,g1_counter,g2_counter)=total_kr_chi2_2015; +% electron_lifetime_2016_map(a2_counter,b2_counter,g1_counter,g2_counter)=pseudo_lifetime_2016; +% electron_lifetime_2015_map(a2_counter,b2_counter,g1_counter,g2_counter)=pseudo_lifetime_2015; +% +% total_h3_chi2_nothresh_separatescaling_map(a2_counter,b2_counter,g1_counter,g2_counter)=total_h3_chi2_nothresh_separatescaling; +% total_chi2_nothresh_separatescaling_map(a2_counter,b2_counter,g1_counter,g2_counter)=total_chi2_nothresh_separatescaling; + +param_counter=param_counter+1; +g2_counter=g2_counter+1; + end +g1_counter=g1_counter+1; +end + + +catch + %Tried the b2 loop, but failed +sprintf('Caught Error, so skipped. a2=%0.3f b2=%0.3f', a2, b2) + +a2_list(param_counter)=a2; +b2_list(param_counter)=b2; +% c1_list(param_counter)=c1; +c2_list(param_counter)=c2; +g1_list(param_counter)=-1; +ee_list(param_counter)=-1; +total_h3_chi2_list(param_counter)=-1; +total_kr_chi2_list(param_counter)=-1; +total_chi2_list(param_counter)=-1; +alternate_total_chi2_list(param_counter)=-1; +h3_chi2_2016_list(param_counter)=-1; +h3_chi2_2015_list(param_counter)=-1; +kr_chi2_2016_list(param_counter)=-1; +kr_chi2_2015_list(param_counter)=-1; +electron_lifetime_2016_list(param_counter)=-1; +electron_lifetime_2015_list(param_counter)=-1; +full_kr_chi2_2016_list(param_counter)=-1; +full_kr_chi2_2015_list(param_counter)=-1; +kr_chi2_2016_zslice_list(param_counter,:)=-1; +kr_chi2_2015_zslice_list(param_counter,:)=-1; +kr_chi2_zslice_zcenter_list(param_counter,:)=-1; +total_h3_chi2_nothresh_list(param_counter)=-1; +total_chi2_nothresh_list(param_counter)=-1; +alternate_total_chi2_nothresh_list(param_counter)=-1; +h3_chi2_2015_nothresh_list(param_counter)=-1; +h3_chi2_2016_nothresh_list(param_counter)=-1; +h3_chi2_2015_nothresh_separatescaling_list(param_counter)=-1; +h3_chi2_2016_nothresh_separatescaling_list(param_counter)=-1; + +total_h3_chi2_nothresh_separatescaling_list(param_counter)=-1; +total_chi2_nothresh_separatescaling_list(param_counter)=-1; + + +h3_chi2_2016_oldsim_list(param_counter)=-1; +h3_chi2_2015_oldsim_list(param_counter)=-1; +total_h3_chi2_oldsim_list(param_counter)=-1; +total_chi2_oldsim_list(param_counter)=-1; + +% total_h3_chi2_map(a2_counter,b2_counter,:,:)=-1; +% total_kr_chi2_map(a2_counter,b2_counter,:,:)=-1; +% total_chi2_map(a2_counter,b2_counter,:,:)=-1; +% alternate_total_chi2_map(a2_counter,b2_counter,:,:)=-1; +% h3_chi2_2016_map(a2_counter,b2_counter,:,:)=-1; +% kr_chi2_2016_map(a2_counter,b2_counter,:,:)=-1; +% h3_chi2_2015_map(a2_counter,b2_counter,:,:)=-1; +% kr_chi2_2015_map(a2_counter,b2_counter,:,:)=-1; +% electron_lifetime_2016_map(a2_counter,b2_counter,:,:)=-1; +% electron_lifetime_2015_map(a2_counter,b2_counter,:,:)=-1; +% total_h3_chi2_nothresh_map(a2_counter,b2_counter,:,:)=-1; +% total_chi2_nothresh_map(a2_counter,b2_counter,:,:)=-1; +% alternate_total_chi2_nothresh_map(a2_counter,b2_counter,:,:)=-1; +% h3_chi2_2016_nothresh_map(a2_counter,b2_counter,:,:)=-1; +% h3_chi2_2015_nothresh_map(a2_counter,b2_counter,:,:)=-1; +% +% total_h3_chi2_nothresh_separatescaling_map(a2_counter,b2_counter,:,:)=-1; +% total_chi2_nothresh_separatescaling_map(a2_counter,b2_counter,:,:)=-1; + + +param_counter=param_counter+1; +end + +g1_counter=1; +% g1=firstg1; + +%Done with b2, so save and incriment counter +clearvars -except param_counter a1_list b1_list a2_list b2_list total_chi2_list h3_chi2_list kr_chi2_list g1_list g2_list total_chi2_map h3_chi2_map kr_chi2_map chi2_midtobot_list... + best_chi2_midtotop besta1_midtotop besta2_midtotop bestb1_midtotop bestb2_midtotop best_chi2_midtobot... + besta1_midtobot besta1_midtotop bestb1_midtobot bestb1_midtotop a1 b1 a2 b2 chi2_midtotop_map chi2_midtobot_map b_counter a_counter... + besta1_combined bestb1_combined besta2_combined bestb2_combined best_chi2_combined chi2_combined_map chi2_combined_list b1_counter a1_counter a2_counter b2_counter... + a1_counter b1_counter a2_counter b2_counter c1_list c2_list bestc1_midtobot bestc2_midtobot bestc1_midtotop bestc2_midtotop bestc1_combined bestc2_combined... + besta1_combined besta2_combined bestb1_combined bestb2_combined besta1 bestb1 bestc1 besta2 bestb2 bestc2 bestg1 bestg2 best_total_chi2 NEST_CH3T_Spectrum inpaint_on... + best_kr_chi2 best_h3_chi2 electron_lifetime_list electron_lifetime_map a2_start a1_start b1_start b2_start ... + total_h3_chi2_list total_kr_chi2_list total_chi2_list h3_chi2_2016_list h3_chi2_2015_list kr_chi2_2016_list kr_chi2_2015_list ... + electron_lifetime_2016_list electron_lifetime_2015_list total_h3_chi2_map total_kr_chi2_map total_chi2_map h3_chi2_2016_map h3_chi2_2015_map ... + kr_chi2_2016_map kr_chi2_2015_map electron_lifetime_2016_map electron_lifetime_2015_map NEST_CH3T_Spectrum_Sep2015 NEST_CH3T_Spectrum_Feb2016 g1 g2 bestg1 bestg2 g1_counter g2_counter ... + firsta1 firstb1 firsta2 firstb2 firstg1 firstg2 kr_means_2015_map kr_means_2016_map kr_sigma_2015_map kr_sigma_2016_map kr_staterr_2015_map kr_staterr_2016_map ... + kr_means_2015_list kr_means_2016_list kr_2015_num_events kr_2016_num_events kr_sigma_2015_list kr_sigma_2016_list kr_staterr_2015_list kr_staterr_2016_list ... + pseudo_lifetime_2016 pseudo_lifetime_2015 kr_2015_drift_time kr_2015_s2x kr_2015_s2y kr_2016_drift_time kr_2016_s2x kr_2016_s2y ... + kr_chi2_2016_zslice_list kr_chi2_2015_zslice_list kr_chi2_zslice_zcenter_list ... + full_kr_chi2_2016_list full_kr_chi2_2015_list best_total_kr_chi2 best_total_h3_chi2 alternate_total_chi2_map alternate_total_chi2_list ... + best_total_alternate_chi2 best_total_alternate_kr_chi2 best_total_alternate_h3_chi2 besta2_alternate bestb2_alternate bestg1_alternate bestg2_alternate bestc2_alternate c2 ... + total_h3_chi2_nothresh_list total_chi2_nothresh_list alternate_total_chi2_nothresh_list h3_chi2_2015_nothresh_list h3_chi2_2016_nothresh_list ... + total_h3_chi2_nothresh_map total_chi2_nothresh_map alternate_total_chi2_nothresh_map h3_chi2_2016_nothresh_map h3_chi2_2015_nothresh_map ... + best_total_chi2_nothresh best_total_kr_chi2_nothresh best_total_h3_chi2_nothresh besta2_nothresh bestb2_nothresh bestc2_nothresh bestg1_nothresh bestEE_nothresh ... + best_total_alternate_chi2_nothresh best_total_alternate_kr_chi2_nothresh best_total_alternate_h3_chi2_nothresh besta2_alternate_nothresh bestb2_alternate_nothresh ... + bestc2_alternate_nothresh bestg1_alternate_nothresh bestEE_alternate_nothresh best_total_chi2_nothresh best_total_alternate_chi2_nothresh ee_list ... + total_h3_chi2_nothresh_separatescaling_list total_chi2_nothresh_separatescaling_list best_total_chi2_nothresh_separatescaling ... + best_total_kr_chi2_nothresh_separatescaling best_total_h3_chi2_nothresh_separatescaling besta2_nothresh_separatescaling ... + bestc2_nothresh_separatescaling bestg1_nothresh_separatescaling bestEE_nothresh_separatescaling ... + total_h3_chi2_nothresh_separatescaling_map total_chi2_nothresh_separatescaling_map bestEE_nothresh ... + h3_chi2_2015_nothresh_separatescaling_list h3_chi2_2016_nothresh_separatescaling_list ee_list ... + h3_chi2_2016_oldsim_list h3_chi2_2015_oldsim_list total_h3_chi2_oldsim_list total_chi2_oldsim_list ... + best_total_chi2_oldsim best_total_kr_chi2_oldsim best_total_h3_chi2_oldsim besta2_oldsim bestb2_oldsim ... + bestc2_oldsim bestg1_oldsim bestEE_oldsim NEST_CH3T_Spectrum_old + + + +save('/scratch4/UMDcode/EnergyChi2/KrypCal_2p21/TritiumMethod/libNEST_CH3TModel/S1aS1bParamScan_EnergyChi2_S1FloatPoly_S2Poly2015_Improved.mat') + + + b2_counter=b2_counter+1; + + end + + a2_counter=a2_counter+1; + b2_counter=1; + end + diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/EnergyChi2_S1LineFloatPoly_S2Poly2015_Iron56_Improved_With1D2D.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/EnergyChi2_S1LineFloatPoly_S2Poly2015_Iron56_Improved_With1D2D.m new file mode 100644 index 0000000..3930d2c --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/EnergyChi2_S1LineFloatPoly_S2Poly2015_Iron56_Improved_With1D2D.m @@ -0,0 +1,1870 @@ +param_counter=1; + best_chi2_midtobot=10^100; + best_chi2_midtotop=10^100; + best_chi2_combined=10^100; + + + %initialize matrices +a2_list=zeros(1,503316); +b2_list=zeros(1,503316); +c2_list=zeros(1,503316); +g1_list=zeros(1,503316); +g2_list=zeros(1,503316); +total_h3_chi2_list=zeros(1,503316); +total_kr_chi2_list=zeros(1,503316); +total_chi2_list=zeros(1,503316); +alternate_total_chi2_list=zeros(1,503316); +h3_chi2_2016_list=zeros(1,503316); +h3_chi2_2015_list=zeros(1,503316); +kr_chi2_2016_list=zeros(1,503316); +kr_chi2_2015_list=zeros(1,503316); +electron_lifetime_2016_list=zeros(1,503316); +electron_lifetime_2015_list=zeros(1,503316); +kr_staterr_2016_list=zeros(1,503316); +kr_staterr_2015_list=zeros(1,503316); +kr_sigma_2016_list=zeros(1,503316); +kr_sigma_2015_list=zeros(1,503316); +kr_2016_num_events=zeros(1,503316); +kr_2015_num_events=zeros(1,503316); +kr_means_2016_list=zeros(1,503316); +kr_means_2015_list=zeros(1,503316); +full_kr_chi2_2016_list=zeros(1,503316); +full_kr_chi2_2015_list=zeros(1,503316); +total_h3_chi2_nothresh_list=zeros(1,503316); +total_chi2_nothresh_list=zeros(1,503316); +alternate_total_chi2_nothresh_list=zeros(1,503316); +h3_chi2_2016_nothresh_list=zeros(1,503316); +h3_chi2_2015_nothresh_list=zeros(1,503316); +h3_chi2_2015_nothresh_separatescaling_list=zeros(1,503316); +h3_chi2_2016_nothresh_separatescaling_list=zeros(1,503316); + +total_h3_chi2_nothresh_separatescaling_list=zeros(1,503316); +total_chi2_nothresh_separatescaling_list=zeros(1,503316); + +h3_chi2_2016_oldsim_list=zeros(1,503316); +h3_chi2_2015_oldsim_list=zeros(1,503316); +total_h3_chi2_oldsim_list=zeros(1,503316); +total_chi2_oldsim_list=zeros(1,503316); + + +ee_list=zeros(1,503316); + +kr_chi2_2016_zslice_list=zeros(503316,length(40+20/2:20:300-20/2)); +kr_chi2_2015_zslice_list=zeros(503316,length(40+20/2:20:300-20/2)); +kr_chi2_zslice_zcenter_list=zeros(503316,length(40+20/2:20:300-20/2)); +% +% total_h3_chi2_map=zeros(36,41,11,31); +% total_kr_chi2_map=zeros(36,41,11,31); +% total_chi2_map=zeros(36,41,11,31); +% alternate_total_chi2_map=zeros(36,41,11,31); +% h3_chi2_2016_map=zeros(36,41,11,31); +% kr_chi2_2016_map=zeros(36,41,11,31); +% h3_chi2_2015_map=zeros(36,41,11,31); +% kr_chi2_2015_map=zeros(36,41,11,31); +% electron_lifetime_2016_map=zeros(36,41,11,31); +% electron_lifetime_2015_map=zeros(36,41,11,31); +% total_h3_chi2_nothresh_map=zeros(36,41,11,31); +% total_chi2_nothresh_map=zeros(36,41,11,31); +% alternate_total_chi2_nothresh_map=zeros(36,41,11,31); +% h3_chi2_2016_nothresh_map=zeros(36,41,11,31); +% h3_chi2_2015_nothresh_map=zeros(36,41,11,31); +% total_h3_chi2_nothresh_separatescaling_map=zeros(36,41,11,31); +% total_chi2_nothresh_separatescaling_map=zeros(36,41,11,31); + +best_total_chi2=1000000000000000000; +best_total_alternate_chi2=1000000000000000000; +best_total_chi2_nothresh=1000000000000000000; +best_total_alternate_chi2_nothresh=1000000000000000000; +best_total_chi2_nothresh_separatescaling=1000000000000000000; +best_total_chi2_oldsim=1000000000000000000; + + +inpaint_on=1; +% Measurement is a1=-0.765; b1=2.939; a2=0.1934; b2=-0.744; + +load('/scratch4/UMDcode/EnergyChi2/KrypCal_2p21/TritiumMethod/libNEST_CH3TModel/NEST_CH3T_Spectrum_Sep2015_Kr2p21.mat') +load('/scratch4/UMDcode/EnergyChi2/KrypCal_2p21/TritiumMethod/libNEST_CH3TModel/NEST_CH3T_Spectrum_Feb2016_Kr2p21.mat') +load('/scratch4/UMDcode/EnergyChi2/KrypCal_2p21/TritiumMethod/libNEST_CH3TModel/NEST_CH3T_Spectrum_old.mat') + + +a2_counter=1; +for a2=0:0.02:0.7; %p1*x^2 coefficient for s1ab_s2_xyz_fit.p1 + b2_counter=1; + for b2=0:0.05:2; %p1*x^2 coefficient for s1ab_s2_xyz_fit.p1 + + + +g1_counter=1; +g2_counter=1; + + %%UPDATE THIS + +s1ab_s2_xyz_fit_map.p1=-0.4988; %these are slightly different than Kr2p20, prob just a resulting of the fitting +s1ab_s2_xyz_fit_map.p2=1.484; +c1=1-s1ab_s2_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s2_xyz_fit_map.p2; +s1ab_s2_xyz_fit_map.p3=c1; + +s1ab_s1_xyz_fit_map.p1=a2; +s1ab_s1_xyz_fit_map.p2=b2; +c2=1-a2.*2.7303.^2-2.7303.*b2; +s1ab_s1_xyz_fit_map.p3=c2; +%% Load the Uncorrected Sep 2015 Kr data + + +%HAVE TO MAKE THIS .MAT FILE STILL - USE class 1 and class 9 for S1 +load('/scratch4/UMDcode/EnergyChi2/KrypCal_2p21/TritiumMethod/libNEST_CH3TModel/MappingParametersFit_Start_2015_CutDown.mat') + + +%% Calculate 2015 Corrections + +try + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>90000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval.*s2_xyfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval.*s2_xyfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval.*s1_xyfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval.*s1_xyfieldremoval); + + + + end + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=1000; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1500]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[5+bin_size, 500] );%from 50 to 300us for the fit, based on when s1as1b values get strange + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + %%Tracker for pseudo-lifetime + s2_at_bottom=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_2015=-320/log(s2_at_bottom/s2_at_top); + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_xbins),floor(s2_ybins)); +Sigma_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); +Count_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_xbins),floor(s1_ybins)); +Sigma_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); +Count_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XYZ. 3D Map, caluculate and Submit IQ +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% if Kr_events>150000 +% +% % LUXkrypCal_S1_3D(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_distance_\mus,user_name,file_id_cp,dp_version,submit); +% LUXkrypCal_S1_3D_Run04_local_2p14FixedZHisto(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_time,x_center,y_center,z_center,det_edge,inpaint_on,user_name,file_id_cp,dp_version, algorithm_name, submit); +% +% +% end + + +%% Apply corrections to CH3T and calculate the ER band shift + +%First load the data + +clear s1_phe_both s2_phe_both +load('/scratch4/UMDcode/EnergyChi2/KrypCal_2p21/TritiumMethod/libNEST_CH3TModel/CH3T_Sep2015_NoCorrections.mat'); + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = S2_x; +s1_y_cm = S2_y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,S2_x,S2_y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + h3_cut= inrange(drift_time,[40 300]) & inrange(s1_phe_both,[0 120]) ... + & (log10(s1_phe_both)+0.8*log10(s2_phe_both)<5.2) .... + & (log10(s1_phe_both)-2*log10(s2_phe_both)>-6.8) & (log10(s1_phe_both)-2*log10(s2_phe_both)<-4.8)... + & s2_phe_both>100 & s2_phe_both<16000 & s2radius<25; %used to be drift time 100 to 250 + +h3_s1_c_2015=s1_phe_both_xyz(h3_cut); +h3_s2_c_2015=s2_phe_both_xyz(h3_cut); + + + kr_cut= inrange(drift_time,[40 300]) & inrange(s1_phe_both,[30 1000]) ... + & (log10(s1_phe_both)+0.6*log10(s2_phe_both)>4.5) & (log10(s1_phe_both)+0.6*log10(s2_phe_both)<5.05) ... + & (log10(s1_phe_both)-2*log10(s2_phe_both)>-7.6) & (log10(s1_phe_both)-2*log10(s2_phe_both)<-4.7) ... + & s2_phe_both>3000 & s2_phe_both<60000 & s2radius<25; %used to be drift time 100 to 250 + +kr_s1_c_2015=s1_phe_both_xyz(kr_cut); +kr_s2_c_2015=s2_phe_both_xyz(kr_cut); +kr_2015_drift_time=drift_time(kr_cut); +kr_2015_s2x=S2_x(kr_cut); +kr_2015_s2y=S2_y(kr_cut); + + clearvars -except param_counter a1_list b1_list a2_list b2_list total_chi2_list h3_chi2_list kr_chi2_list g1_list g2_list total_chi2_map h3_chi2_map kr_chi2_map chi2_midtobot_list... + best_chi2_midtotop besta1_midtotop besta2_midtotop bestb1_midtotop bestb2_midtotop best_chi2_midtobot... + besta1_midtobot besta1_midtotop bestb1_midtobot bestb1_midtotop a1 b1 a2 b2 c2 chi2_midtotop_map chi2_midtobot_map b_counter a_counter... + besta1_combined bestb1_combined besta2_combined bestb2_combined best_chi2_combined chi2_combined_map chi2_combined_list b1_counter a1_counter a2_counter b2_counter... + a1_counter b1_counter a2_counter b2_counter c1_list c2_list bestc1_midtobot bestc2_midtobot bestc1_midtotop bestc2_midtotop bestc1_combined bestc2_combined... + besta1_combined besta2_combined bestb1_combined bestb2_combined besta1 bestb1 bestc1 besta2 bestb2 bestc2 bestg1 bestg2 best_total_chi2 NEST_CH3T_Spectrum inpaint_on... + best_kr_chi2 best_h3_chi2 electron_lifetime_list electron_lifetime_map a2_start a1_start b1_start b2_start ... + total_h3_chi2_list total_kr_chi2_list total_chi2_list h3_chi2_2016_list h3_chi2_2015_list kr_chi2_2016_list kr_chi2_2015_list ... + electron_lifetime_2016_list electron_lifetime_2015_list total_h3_chi2_map total_kr_chi2_map total_chi2_map h3_chi2_2016_map h3_chi2_2015_map ... + kr_chi2_2016_map kr_chi2_2015_map electron_lifetime_2016_map electron_lifetime_2015_map NEST_CH3T_Spectrum_Sep2015 NEST_CH3T_Spectrum_Feb2016 g1 g2 bestg1 bestg2 g1_counter g2_counter ... + firsta1 firstb1 firsta2 firstb2 firstg1 firstg2 kr_means_2015_map kr_means_2016_map kr_sigma_2015_map kr_sigma_2016_map kr_staterr_2015_map kr_staterr_2016_map ... + kr_means_2015_list kr_means_2016_list kr_2015_num_events kr_2016_num_events kr_sigma_2015_list kr_sigma_2016_list kr_staterr_2015_list kr_staterr_2016_list ... + pseudo_lifetime_2016 pseudo_lifetime_2015 kr_s1_c_2015 kr_s2_c_2015 h3_s1_c_2015 h3_s2_c_2015 s1ab_s2_xyz_fit_map s1ab_s1_xyz_fit_map ... + kr_2015_drift_time kr_2015_s2x kr_2015_s2y kr_chi2_2016_zslice_list kr_chi2_2015_zslice_list kr_chi2_zslice_zcenter_list ... + full_kr_chi2_2016_list full_kr_chi2_2015_list best_total_kr_chi2 best_total_h3_chi2 alternate_total_chi2_map alternate_total_chi2_list ... + best_total_alternate_chi2 best_total_alternate_kr_chi2 best_total_alternate_h3_chi2 besta2_alternate bestb2_alternate bestg1_alternate bestg2_alternate bestc2_alternate ... + total_h3_chi2_nothresh_list total_chi2_nothresh_list alternate_total_chi2_nothresh_list h3_chi2_2015_nothresh_list h3_chi2_2016_nothresh_list ... + total_h3_chi2_nothresh_map total_chi2_nothresh_map alternate_total_chi2_nothresh_map h3_chi2_2016_nothresh_map h3_chi2_2015_nothresh_map ... + best_total_chi2_nothresh best_total_kr_chi2_nothresh best_total_h3_chi2_nothresh besta2_nothresh bestb2_nothresh bestc2_nothresh bestg1_nothresh bestEE_nothresh ... + best_total_alternate_chi2_nothresh best_total_alternate_kr_chi2_nothresh best_total_alternate_h3_chi2_nothresh besta2_alternate_nothresh bestb2_alternate_nothresh ... + bestc2_alternate_nothresh bestg1_alternate_nothresh bestEE_alternate_nothresh best_total_chi2_nothresh best_total_alternate_chi2_nothresh ee_list ... + total_h3_chi2_nothresh_separatescaling_list total_chi2_nothresh_separatescaling_list best_total_chi2_nothresh_separatescaling ... + best_total_kr_chi2_nothresh_separatescaling best_total_h3_chi2_nothresh_separatescaling besta2_nothresh_separatescaling ... + bestc2_nothresh_separatescaling bestg1_nothresh_separatescaling bestEE_nothresh_separatescaling ... + total_h3_chi2_nothresh_separatescaling_map total_chi2_nothresh_separatescaling_map bestEE_nothresh ... + h3_chi2_2015_nothresh_separatescaling_list h3_chi2_2016_nothresh_separatescaling_list ee_list ... + h3_chi2_2016_oldsim_list h3_chi2_2015_oldsim_list total_h3_chi2_oldsim_list total_chi2_oldsim_list ... + best_total_chi2_oldsim best_total_kr_chi2_oldsim best_total_h3_chi2_oldsim besta2_oldsim bestb2_oldsim ... + bestc2_oldsim bestg1_oldsim bestEE_oldsim NEST_CH3T_Spectrum_old + + + + + +%%%%%%%%%%%%%%%%%%%%% +%% REPEAT FOR 2016 DATA +%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('/scratch4/UMDcode/EnergyChi2/KrypCal_2p21/TritiumMethod/libNEST_CH3TModel/MappingParametersFit_Start_2016_CutDown.mat') + + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>90000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval.*s2_xyfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval.*s2_xyfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval.*s1_xyfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval.*s1_xyfieldremoval); + + + + end + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[5+bin_size, 500] );%from 50 to 300us for the fit, based on when s1as1b values get strange + +s2_both_norm_z_index=mean_index(dT_range); +s2_both_norm_z_means=means(dT_range); + s2_at_top=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + %%Tracker for pseudo-lifetime + s2_at_bottom=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_2016=-320/log(s2_at_bottom/s2_at_top); +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_xbins),floor(s2_ybins)); +Sigma_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); +Count_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_xbins),floor(s1_ybins)); +Sigma_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); +Count_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Apply corrections to 2016 Kr data +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('/scratch4/UMDcode/EnergyChi2/KrypCal_2p21/TritiumMethod/libNEST_CH3TModel/MappingParametersFit_Start_2016_CutDown.mat') + + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; +% +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate ER Band shift +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + liquid_cut= inrange(drift_time,[40 300]) ... + & (log10(s1_phe_both)+0.7*log10(s2_phe_both)>4.9) & (log10(s1_phe_both)+0.7*log10(s2_phe_both)<5.5) ... + & s2_phe_both>3000 & s2_phe_both<80000 & s2radius<25; %used to be drift time 100 to 250 + + +kr_s1_c_2016=s1_phe_both_xyz(liquid_cut); +kr_s2_c_2016=s2_phe_both_xyz(liquid_cut); +kr_2016_drift_time=drift_time(liquid_cut); +kr_2016_s2x=s2x(liquid_cut); +kr_2016_s2y=s2y(liquid_cut); + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%Apply Corrections to 2016 CH3T Data +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('/scratch4/UMDcode/EnergyChi2/KrypCal_2p21/TritiumMethod/libNEST_CH3TModel/CH3T_Feb2016_NoCorrections.mat'); + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +% electron_lifetime_2016=e_lifetime_both; +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate ER Band shift +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +s1_min=0; +s1_max=120; + + %% Redo with r<10 cm + + + liquid_cut= clean_cut & inrange(drift_time,[40 300]) ... + & (log10(s1_phe_both)+log10(s2_phe_both)<5.9) & (log10(s1_phe_both)-2.*log10(s2_phe_both)<-4.8) ... + & (log10(s1_phe_both)-2.*log10(s2_phe_both)>-6.8) ... + & s2_phe_both>600 & s2_phe_both<16000 & s2radius<25; %used to be drift time 100 to 250 + + + +h3_s1_c_2016=s1_phe_both_xyz(liquid_cut); +h3_s2_c_2016=s2_phe_both_xyz(liquid_cut); + + clearvars -except param_counter a1_list b1_list a2_list b2_list total_chi2_list h3_chi2_list kr_chi2_list g1_list g2_list total_chi2_map h3_chi2_map kr_chi2_map chi2_midtobot_list... + best_chi2_midtotop besta1_midtotop besta2_midtotop bestb1_midtotop bestb2_midtotop best_chi2_midtobot... + besta1_midtobot besta1_midtotop bestb1_midtobot bestb1_midtotop a1 b1 a2 b2 chi2_midtotop_map chi2_midtobot_map b_counter a_counter... + besta1_combined bestb1_combined besta2_combined bestb2_combined best_chi2_combined chi2_combined_map chi2_combined_list b1_counter a1_counter a2_counter b2_counter... + a1_counter b1_counter a2_counter b2_counter c1_list c2_list bestc1_midtobot bestc2_midtobot bestc1_midtotop bestc2_midtotop bestc1_combined bestc2_combined... + besta1_combined besta2_combined bestb1_combined bestb2_combined besta1 bestb1 bestc1 besta2 bestb2 bestc2 bestg1 bestg2 best_total_chi2 NEST_CH3T_Spectrum inpaint_on... + best_kr_chi2 best_h3_chi2 electron_lifetime_list electron_lifetime_map a2_start a1_start b1_start b2_start ... + total_h3_chi2_list total_kr_chi2_list total_chi2_list h3_chi2_2016_list h3_chi2_2015_list kr_chi2_2016_list kr_chi2_2015_list ... + electron_lifetime_2016_list electron_lifetime_2015_list total_h3_chi2_map total_kr_chi2_map total_chi2_map h3_chi2_2016_map h3_chi2_2015_map ... + kr_chi2_2016_map kr_chi2_2015_map electron_lifetime_2016_map electron_lifetime_2015_map NEST_CH3T_Spectrum_Sep2015 NEST_CH3T_Spectrum_Feb2016 g1 g2 bestg1 bestg2 g1_counter g2_counter ... + firsta1 firstb1 firsta2 firstb2 firstg1 firstg2 kr_means_2015_map kr_means_2016_map kr_sigma_2015_map kr_sigma_2016_map kr_staterr_2015_map kr_staterr_2016_map ... + kr_means_2015_list kr_means_2016_list kr_2015_num_events kr_2016_num_events kr_sigma_2015_list kr_sigma_2016_list kr_staterr_2015_list kr_staterr_2016_list ... + pseudo_lifetime_2016 pseudo_lifetime_2015 kr_s1_c_2015 kr_s2_c_2015 h3_s1_c_2015 h3_s2_c_2015 kr_s1_c_2016 kr_s2_c_2016 h3_s1_c_2016 h3_s2_c_2016 ... + kr_2015_drift_time kr_2015_s2x kr_2015_s2y kr_2016_drift_time kr_2016_s2x kr_2016_s2y ... + kr_chi2_2016_zslice_list kr_chi2_2015_zslice_list kr_chi2_zslice_zcenter_list ... + full_kr_chi2_2016_list full_kr_chi2_2015_list best_total_kr_chi2 best_total_h3_chi2 alternate_total_chi2_map alternate_total_chi2_list ... + best_total_alternate_chi2 best_total_alternate_kr_chi2 best_total_alternate_h3_chi2 besta2_alternate bestb2_alternate bestg1_alternate bestg2_alternate bestc2_alternate c2 ... + total_h3_chi2_nothresh_list total_chi2_nothresh_list alternate_total_chi2_nothresh_list h3_chi2_2015_nothresh_list h3_chi2_2016_nothresh_list ... + total_h3_chi2_nothresh_map total_chi2_nothresh_map alternate_total_chi2_nothresh_map h3_chi2_2016_nothresh_map h3_chi2_2015_nothresh_map ... + best_total_chi2_nothresh best_total_kr_chi2_nothresh best_total_h3_chi2_nothresh besta2_nothresh bestb2_nothresh bestc2_nothresh bestg1_nothresh bestEE_nothresh ... + best_total_alternate_chi2_nothresh best_total_alternate_kr_chi2_nothresh best_total_alternate_h3_chi2_nothresh besta2_alternate_nothresh bestb2_alternate_nothresh ... + bestc2_alternate_nothresh bestg1_alternate_nothresh bestEE_alternate_nothresh best_total_chi2_nothresh best_total_alternate_chi2_nothresh ee_list ... + total_h3_chi2_nothresh_separatescaling_list total_chi2_nothresh_separatescaling_list best_total_chi2_nothresh_separatescaling ... + best_total_kr_chi2_nothresh_separatescaling best_total_h3_chi2_nothresh_separatescaling besta2_nothresh_separatescaling ... + bestc2_nothresh_separatescaling bestg1_nothresh_separatescaling bestEE_nothresh_separatescaling ... + total_h3_chi2_nothresh_separatescaling_map total_chi2_nothresh_separatescaling_map bestEE_nothresh ... + h3_chi2_2015_nothresh_separatescaling_list h3_chi2_2016_nothresh_separatescaling_list ee_list ... + h3_chi2_2016_oldsim_list h3_chi2_2015_oldsim_list total_h3_chi2_oldsim_list total_chi2_oldsim_list ... + best_total_chi2_oldsim best_total_kr_chi2_oldsim best_total_h3_chi2_oldsim besta2_oldsim bestb2_oldsim ... + bestc2_oldsim bestg1_oldsim bestEE_oldsim NEST_CH3T_Spectrum_old + + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% DO CHI2 TO ENEGY SPECTRA +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +g1_counter=1; +for g1=0.09:0.002:0.11; + g2_counter=1; +% for g2=16.5:0.1:21; + for ee=0.6:0.01:0.9; + g2_Feb2016=25.05*ee; %converting to g2 with SE size + g2_sep2015=25.8536*ee; + + h3_energy_2016=(1/73).*(h3_s1_c_2016./g1 + h3_s2_c_2016./g2_Feb2016); + kr_energy_2016=(1/73).*(kr_s1_c_2016./g1 + kr_s2_c_2016./g2_Feb2016); + h3_energy_2015=(1/73).*(h3_s1_c_2015./g1 + h3_s2_c_2015./g2_sep2015); + kr_energy_2015=(1/73).*(kr_s1_c_2015./g1 + kr_s2_c_2015./g2_sep2015); + + + + %make CH3T data spectrum + [h3_hist_2016,h3_hist_bin_2016]=hist(h3_energy_2016,NEST_CH3T_Spectrum_Feb2016(1,:)); + [h3_hist_2015,h3_hist_bin_2015]=hist(h3_energy_2015,NEST_CH3T_Spectrum_Sep2015(1,:)); + + %scale the simulation to the data + scale_factor_2016=sum(h3_hist_2016)/sum(NEST_CH3T_Spectrum_Feb2016(2,:)); %sum(h3_hist_2016(17:80))./sum(NEST_CH3T_Spectrum(2,17:80)); - sims have an expected threshold now... so can ignore the bin cuts + h3_scaled_sim_2016=scale_factor_2016.*NEST_CH3T_Spectrum_Feb2016(2,:); + + scale_factor_2016_nothresh=sum(h3_hist_2016(11:80))/sum(NEST_CH3T_Spectrum_Feb2016(2,11:80)); %sum(h3_hist_2016(17:80))./sum(NEST_CH3T_Spectrum(2,17:80)); - sims have an expected threshold now... so can ignore the bin cuts + h3_scaled_sim_2016_nothresh=scale_factor_2016_nothresh.*NEST_CH3T_Spectrum_Feb2016(2,:); + + scale_factor_2015=sum(h3_hist_2015)/sum(NEST_CH3T_Spectrum_Sep2015(2,:)); %sum(h3_hist_2015(17:80))./sum(NEST_CH3T_Spectrum(2,17:80)); - sims have an expected threshold now... so can ignore the bin cuts + h3_scaled_sim_2015=scale_factor_2015.*NEST_CH3T_Spectrum_Sep2015(2,:); + + scale_factor_2015_nothresh=sum(h3_hist_2015(11:80))/sum(NEST_CH3T_Spectrum_Sep2015(2,11:80)); %sum(h3_hist_2015(17:80))./sum(NEST_CH3T_Spectrum(2,17:80)); - sims have an expected threshold now... so can ignore the bin cuts + h3_scaled_sim_2015_nothresh=scale_factor_2015_nothresh.*NEST_CH3T_Spectrum_Sep2015(2,:); + + scale_factor_2015_oldsim=sum(h3_hist_2015(17:80))/sum(NEST_CH3T_Spectrum_old(2,17:80)); + h3_scaled_oldsim_2015=scale_factor_2015_oldsim.*NEST_CH3T_Spectrum_old(2,:); + + scale_factor_2016_oldsim=sum(h3_hist_2016(17:80))/sum(NEST_CH3T_Spectrum_old(2,17:80)); + h3_scaled_oldsim_2016=scale_factor_2016_oldsim.*NEST_CH3T_Spectrum_old(2,:); + + %Calculate chi2 for h3 spectrum + h3_chi2_2016=(1/74).*sum( (h3_scaled_sim_2016(4:80) - h3_hist_2016(4:80)).^2 ./(h3_hist_2016(4:80))); %(4:80) is to avoid low stat areas in the simulation + h3_chi2_2015=(1/74).*sum( (h3_scaled_sim_2015(4:80) - h3_hist_2015(4:80)).^2 ./(h3_hist_2015(4:80))); + + %Calculate chi2 for h3 spectrum away from threshold + h3_chi2_2016_nothresh=(1/68).*sum( (h3_scaled_sim_2016(11:80) - h3_hist_2016(11:80)).^2 ./(h3_hist_2016(11:80))); %(4:80) is to avoid low stat areas in the simulation + h3_chi2_2015_nothresh=(1/68).*sum( (h3_scaled_sim_2015(11:80) - h3_hist_2015(11:80)).^2 ./(h3_hist_2015(11:80))); + + h3_chi2_2016_nothresh_separatescaling=(1/68).*sum( (h3_scaled_sim_2016_nothresh(11:80) - h3_hist_2016(11:80)).^2 ./(h3_hist_2016(11:80))); %(4:80) is to avoid low stat areas in the simulation + h3_chi2_2015_nothresh_separatescaling=(1/68).*sum( (h3_scaled_sim_2015_nothresh(11:80) - h3_hist_2015(11:80)).^2 ./(h3_hist_2015(11:80))); + + h3_chi2_2016_oldsim=(1/62).*sum( (h3_scaled_oldsim_2016(17:80) - h3_hist_2016(17:80)).^2 ./(h3_hist_2016(17:80))); %(4:80) is to avoid low stat areas in the simulation + h3_chi2_2015_oldsim=(1/62).*sum( (h3_scaled_oldsim_2015(17:80) - h3_hist_2015(17:80)).^2 ./(h3_hist_2015(17:80))); + + dT_step=20; + kr_mean_2016=zeros(length(40+dT_step/2:dT_step:300-dT_step/2),1); + kr_mean_2015=zeros(length(40+dT_step/2:dT_step:300-dT_step/2),1); + dT_centers=zeros(length(40+dT_step/2:dT_step:300-dT_step/2),1); + + full_kr_fit_res_2016=fit([0:1:1000].',hist(kr_energy_2016,[0:1:1000]).','gauss1'); + full_kr_fit_res_2015=fit([0:1:1000].',hist(kr_energy_2015,[0:1:1000]).','gauss1'); + full_kr_chi2_2016=((41.55-full_kr_fit_res_2016.b1)./0.2395).^2; %SHOULD BE 0.2395 BASED ON RUN03 + full_kr_chi2_2015=((41.55-full_kr_fit_res_2015.b1)./0.2395).^2; + + clear kr_fit_res_2016 kr_fit_res_2015 kr_conf_2016 kr_conf_2015 dT_max + kk=1; + for dT_max=40+dT_step/2:dT_step:300-dT_step/2; + clear kr_fit_res_2016 kr_fit_res_2015 + kr_fit_res_2016=fit([0:1:1000].',hist(kr_energy_2016(inrange(kr_2016_drift_time,[dT_max-dT_step dT_max])),[0:1:1000]).','gauss1'); + kr_fit_res_2015=fit([0:1:1000].',hist(kr_energy_2015(inrange(kr_2015_drift_time,[dT_max-dT_step dT_max])),[0:1:1000]).','gauss1'); + kr_mean_2016(kk)=kr_fit_res_2016.b1; + kr_mean_2015(kk)=kr_fit_res_2015.b1; + dT_centers(kk)=dT_max-dT_step/2; + kk=kk+1; + end + + clear cut + cut=kr_mean_2015==0 | kr_mean_2016==0; + kr_mean_2016(cut)=[]; + kr_mean_2015(cut)=[]; + dT_centers(cut)=[]; + + + kr_chi2_2016=((41.55-kr_mean_2016)./0.2395).^2; %SHOULD BE 0.2395 BASED ON RUN03 + kr_chi2_2015=((41.55-kr_mean_2015)./0.2395).^2; + + total_h3_chi2=(h3_chi2_2016+h3_chi2_2015)/2; + total_h3_chi2_nothresh=(h3_chi2_2016_nothresh+h3_chi2_2015_nothresh)/2; + total_h3_chi2_oldsim=(h3_chi2_2016_oldsim+h3_chi2_2015_oldsim)/2; + total_h3_chi2_nothresh_separatescaling=(h3_chi2_2016_nothresh_separatescaling+h3_chi2_2015_nothresh_separatescaling)/2; + + total_kr_chi2_2016=mean(kr_chi2_2016); + total_kr_chi2_2015=mean(kr_chi2_2015); + + total_kr_chi2=(total_kr_chi2_2016+total_kr_chi2_2015)./2; + total_chi2=(total_kr_chi2+total_h3_chi2)/2; + total_chi2_nothresh=(total_kr_chi2+total_h3_chi2_nothresh)/2; + total_chi2_nothresh_separatescaling=(total_kr_chi2+total_h3_chi2_nothresh_separatescaling)/2; + total_chi2_oldsim=(total_kr_chi2+total_h3_chi2_oldsim)/2; + + alternate_total_chi2=(sum( (h3_scaled_sim_2016(4:80) - h3_hist_2016(4:80)).^2 ./(h3_hist_2016(4:80)))+sum(kr_chi2_2016)+sum(kr_chi2_2015))/(74+length(kr_chi2_2016)+length(kr_chi2_2015)-4); + alternate_total_chi2_nothresh=(sum( (h3_scaled_sim_2016(11:80) - h3_hist_2016(11:80)).^2 ./(h3_hist_2016(11:80)))+sum(kr_chi2_2016)+sum(kr_chi2_2015))/(68+length(kr_chi2_2016)+length(kr_chi2_2015)-4); + + if total_chi2 < best_total_chi2; + best_total_chi2=total_chi2; + best_total_kr_chi2=total_kr_chi2; + best_total_h3_chi2=total_h3_chi2; + besta2=a2; + bestb2=b2; + bestc2=c2; + bestg1=g1; + bestEE=ee; + end + + + if alternate_total_chi2 < best_total_alternate_chi2; + best_total_alternate_chi2=alternate_total_chi2; + best_total_alternate_kr_chi2=total_kr_chi2; + best_total_alternate_h3_chi2=total_h3_chi2; + besta2_alternate=a2; + bestb2_alternate=b2; + bestc2_alternate=c2; + bestg1_alternate=g1; + bestEE_alternate=ee; + end + + if total_chi2_nothresh < best_total_chi2_nothresh; + best_total_chi2_nothresh=total_chi2_nothresh; + best_total_kr_chi2_nothresh=total_kr_chi2; + best_total_h3_chi2_nothresh=total_h3_chi2_nothresh; + besta2_nothresh=a2; + bestb2_nothresh=b2; + bestc2_nothresh=c2; + bestg1_nothresh=g1; + bestEE_nothresh=ee; + end + + if total_chi2_nothresh_separatescaling < best_total_chi2_nothresh_separatescaling; + best_total_chi2_nothresh_separatescaling=total_chi2_nothresh_separatescaling; + best_total_kr_chi2_nothresh_separatescaling=total_kr_chi2; + best_total_h3_chi2_nothresh_separatescaling=total_h3_chi2_nothresh_separatescaling; + besta2_nothresh_separatescaling=a2; + bestb2_nothresh_separatescaling=b2; + bestc2_nothresh_separatescaling=c2; + bestg1_nothresh_separatescaling=g1; + bestEE_nothresh_separatescaling=ee; + end + + if alternate_total_chi2_nothresh < best_total_alternate_chi2_nothresh; + best_total_alternate_chi2_nothresh=alternate_total_chi2_nothresh; + best_total_alternate_kr_chi2_nothresh=total_kr_chi2; + best_total_alternate_h3_chi2_nothresh=total_h3_chi2_nothresh; + besta2_alternate_nothresh=a2; + bestb2_alternate_nothresh=b2; + bestc2_alternate_nothresh=c2; + bestg1_alternate_nothresh=g1; + bestEE_alternate_nothresh=ee; + end + + if total_chi2_oldsim < best_total_chi2_oldsim; + best_total_chi2_oldsim=total_chi2_oldsim; + best_total_kr_chi2_oldsim=total_kr_chi2; + best_total_h3_chi2_oldsim=total_h3_chi2_oldsim; + besta2_oldsim=a2; + bestb2_oldsim=b2; + bestc2_oldsim=c2; + bestg1_oldsim=g1; + bestEE_oldsim=ee; + end + +a2_list(param_counter)=a2; +b2_list(param_counter)=b2; +c2_list(param_counter)=c2; +g1_list(param_counter)=g1; +ee_list(param_counter)=ee; +total_h3_chi2_list(param_counter)=total_h3_chi2; +total_h3_chi2_nothresh_list(param_counter)=total_h3_chi2_nothresh; +total_kr_chi2_list(param_counter)=total_kr_chi2; +total_chi2_list(param_counter)=total_chi2; +total_chi2_nothresh_list(param_counter)=total_chi2_nothresh; +alternate_total_chi2_list(param_counter)=alternate_total_chi2; +alternate_total_chi2_nothresh_list(param_counter)=alternate_total_chi2_nothresh; + +total_h3_chi2_nothresh_separatescaling_list(param_counter)=total_h3_chi2_nothresh_separatescaling; +total_chi2_nothresh_separatescaling_list(param_counter)=total_chi2_nothresh_separatescaling; + +h3_chi2_2016_list(param_counter)=h3_chi2_2016; +h3_chi2_2016_nothresh_list(param_counter)=h3_chi2_2016_nothresh; +h3_chi2_2015_list(param_counter)=h3_chi2_2015; +h3_chi2_2015_nothresh_list(param_counter)=h3_chi2_2015_nothresh; +h3_chi2_2015_nothresh_separatescaling_list(param_counter)=h3_chi2_2015_nothresh_separatescaling; +h3_chi2_2016_nothresh_separatescaling_list(param_counter)=h3_chi2_2016_nothresh_separatescaling; + +kr_chi2_2016_list(param_counter)=total_kr_chi2_2016; +kr_chi2_2015_list(param_counter)=total_kr_chi2_2015; +full_kr_chi2_2016_list(param_counter)=full_kr_chi2_2016; +full_kr_chi2_2015_list(param_counter)=full_kr_chi2_2015; +electron_lifetime_2016_list(param_counter)=pseudo_lifetime_2016; +electron_lifetime_2015_list(param_counter)=pseudo_lifetime_2015; + +kr_chi2_2016_zslice_list(param_counter,:)=kr_chi2_2016; +kr_chi2_2015_zslice_list(param_counter,:)=kr_chi2_2015; +kr_chi2_zslice_zcenter_list(param_counter,:)=dT_centers; + +h3_chi2_2016_oldsim_list(param_counter)=h3_chi2_2016_oldsim; +h3_chi2_2015_oldsim_list(param_counter)=h3_chi2_2015_oldsim; +total_h3_chi2_oldsim_list(param_counter)=total_h3_chi2_oldsim; +total_chi2_oldsim_list(param_counter)=total_chi2_oldsim; + +% total_h3_chi2_map(a2_counter,b2_counter,g1_counter,g2_counter)=total_h3_chi2; +% total_h3_chi2_nothresh_map(a2_counter,b2_counter,g1_counter,g2_counter)=total_h3_chi2_nothresh; +% total_kr_chi2_map(a2_counter,b2_counter,g1_counter,g2_counter)=total_kr_chi2; +% total_chi2_map(a2_counter,b2_counter,g1_counter,g2_counter)=total_chi2; +% total_chi2_nothresh_map(a2_counter,b2_counter,g1_counter,g2_counter)=total_chi2_nothresh; +% alternate_total_chi2_map(a2_counter,b2_counter,g1_counter,g2_counter)=alternate_total_chi2; +% alternate_total_chi2_nothresh_map(a2_counter,b2_counter,g1_counter,g2_counter)=alternate_total_chi2_nothresh; +% h3_chi2_2016_map(a2_counter,b2_counter,g1_counter,g2_counter)=h3_chi2_2016; +% h3_chi2_2016_nothresh_map(a2_counter,b2_counter,g1_counter,g2_counter)=h3_chi2_2016_nothresh; +% kr_chi2_2016_map(a2_counter,b2_counter,g1_counter,g2_counter)=total_kr_chi2_2016; +% h3_chi2_2015_map(a2_counter,b2_counter,g1_counter,g2_counter)=h3_chi2_2015; +% h3_chi2_2015_nothresh_map(a2_counter,b2_counter,g1_counter,g2_counter)=h3_chi2_2015_nothresh; +% kr_chi2_2015_map(a2_counter,b2_counter,g1_counter,g2_counter)=total_kr_chi2_2015; +% electron_lifetime_2016_map(a2_counter,b2_counter,g1_counter,g2_counter)=pseudo_lifetime_2016; +% electron_lifetime_2015_map(a2_counter,b2_counter,g1_counter,g2_counter)=pseudo_lifetime_2015; +% +% total_h3_chi2_nothresh_separatescaling_map(a2_counter,b2_counter,g1_counter,g2_counter)=total_h3_chi2_nothresh_separatescaling; +% total_chi2_nothresh_separatescaling_map(a2_counter,b2_counter,g1_counter,g2_counter)=total_chi2_nothresh_separatescaling; + +param_counter=param_counter+1; +g2_counter=g2_counter+1; + end +g1_counter=g1_counter+1; +end + + +catch + %Tried the b2 loop, but failed +sprintf('Caught Error, so skipped. a2=%0.3f b2=%0.3f', a2, b2) + +a2_list(param_counter)=a2; +b2_list(param_counter)=b2; +% c1_list(param_counter)=c1; +c2_list(param_counter)=c2; +g1_list(param_counter)=-1; +ee_list(param_counter)=-1; +total_h3_chi2_list(param_counter)=-1; +total_kr_chi2_list(param_counter)=-1; +total_chi2_list(param_counter)=-1; +alternate_total_chi2_list(param_counter)=-1; +h3_chi2_2016_list(param_counter)=-1; +h3_chi2_2015_list(param_counter)=-1; +kr_chi2_2016_list(param_counter)=-1; +kr_chi2_2015_list(param_counter)=-1; +electron_lifetime_2016_list(param_counter)=-1; +electron_lifetime_2015_list(param_counter)=-1; +full_kr_chi2_2016_list(param_counter)=-1; +full_kr_chi2_2015_list(param_counter)=-1; +kr_chi2_2016_zslice_list(param_counter,:)=-1; +kr_chi2_2015_zslice_list(param_counter,:)=-1; +kr_chi2_zslice_zcenter_list(param_counter,:)=-1; +total_h3_chi2_nothresh_list(param_counter)=-1; +total_chi2_nothresh_list(param_counter)=-1; +alternate_total_chi2_nothresh_list(param_counter)=-1; +h3_chi2_2015_nothresh_list(param_counter)=-1; +h3_chi2_2016_nothresh_list(param_counter)=-1; +h3_chi2_2015_nothresh_separatescaling_list(param_counter)=-1; +h3_chi2_2016_nothresh_separatescaling_list(param_counter)=-1; + +total_h3_chi2_nothresh_separatescaling_list(param_counter)=-1; +total_chi2_nothresh_separatescaling_list(param_counter)=-1; + + +h3_chi2_2016_oldsim_list(param_counter)=-1; +h3_chi2_2015_oldsim_list(param_counter)=-1; +total_h3_chi2_oldsim_list(param_counter)=-1; +total_chi2_oldsim_list(param_counter)=-1; + +% total_h3_chi2_map(a2_counter,b2_counter,:,:)=-1; +% total_kr_chi2_map(a2_counter,b2_counter,:,:)=-1; +% total_chi2_map(a2_counter,b2_counter,:,:)=-1; +% alternate_total_chi2_map(a2_counter,b2_counter,:,:)=-1; +% h3_chi2_2016_map(a2_counter,b2_counter,:,:)=-1; +% kr_chi2_2016_map(a2_counter,b2_counter,:,:)=-1; +% h3_chi2_2015_map(a2_counter,b2_counter,:,:)=-1; +% kr_chi2_2015_map(a2_counter,b2_counter,:,:)=-1; +% electron_lifetime_2016_map(a2_counter,b2_counter,:,:)=-1; +% electron_lifetime_2015_map(a2_counter,b2_counter,:,:)=-1; +% total_h3_chi2_nothresh_map(a2_counter,b2_counter,:,:)=-1; +% total_chi2_nothresh_map(a2_counter,b2_counter,:,:)=-1; +% alternate_total_chi2_nothresh_map(a2_counter,b2_counter,:,:)=-1; +% h3_chi2_2016_nothresh_map(a2_counter,b2_counter,:,:)=-1; +% h3_chi2_2015_nothresh_map(a2_counter,b2_counter,:,:)=-1; +% +% total_h3_chi2_nothresh_separatescaling_map(a2_counter,b2_counter,:,:)=-1; +% total_chi2_nothresh_separatescaling_map(a2_counter,b2_counter,:,:)=-1; + + +param_counter=param_counter+1; +end + +g1_counter=1; +% g1=firstg1; + +%Done with b2, so save and incriment counter +clearvars -except param_counter a1_list b1_list a2_list b2_list total_chi2_list h3_chi2_list kr_chi2_list g1_list g2_list total_chi2_map h3_chi2_map kr_chi2_map chi2_midtobot_list... + best_chi2_midtotop besta1_midtotop besta2_midtotop bestb1_midtotop bestb2_midtotop best_chi2_midtobot... + besta1_midtobot besta1_midtotop bestb1_midtobot bestb1_midtotop a1 b1 a2 b2 chi2_midtotop_map chi2_midtobot_map b_counter a_counter... + besta1_combined bestb1_combined besta2_combined bestb2_combined best_chi2_combined chi2_combined_map chi2_combined_list b1_counter a1_counter a2_counter b2_counter... + a1_counter b1_counter a2_counter b2_counter c1_list c2_list bestc1_midtobot bestc2_midtobot bestc1_midtotop bestc2_midtotop bestc1_combined bestc2_combined... + besta1_combined besta2_combined bestb1_combined bestb2_combined besta1 bestb1 bestc1 besta2 bestb2 bestc2 bestg1 bestg2 best_total_chi2 NEST_CH3T_Spectrum inpaint_on... + best_kr_chi2 best_h3_chi2 electron_lifetime_list electron_lifetime_map a2_start a1_start b1_start b2_start ... + total_h3_chi2_list total_kr_chi2_list total_chi2_list h3_chi2_2016_list h3_chi2_2015_list kr_chi2_2016_list kr_chi2_2015_list ... + electron_lifetime_2016_list electron_lifetime_2015_list total_h3_chi2_map total_kr_chi2_map total_chi2_map h3_chi2_2016_map h3_chi2_2015_map ... + kr_chi2_2016_map kr_chi2_2015_map electron_lifetime_2016_map electron_lifetime_2015_map NEST_CH3T_Spectrum_Sep2015 NEST_CH3T_Spectrum_Feb2016 g1 g2 bestg1 bestg2 g1_counter g2_counter ... + firsta1 firstb1 firsta2 firstb2 firstg1 firstg2 kr_means_2015_map kr_means_2016_map kr_sigma_2015_map kr_sigma_2016_map kr_staterr_2015_map kr_staterr_2016_map ... + kr_means_2015_list kr_means_2016_list kr_2015_num_events kr_2016_num_events kr_sigma_2015_list kr_sigma_2016_list kr_staterr_2015_list kr_staterr_2016_list ... + pseudo_lifetime_2016 pseudo_lifetime_2015 kr_2015_drift_time kr_2015_s2x kr_2015_s2y kr_2016_drift_time kr_2016_s2x kr_2016_s2y ... + kr_chi2_2016_zslice_list kr_chi2_2015_zslice_list kr_chi2_zslice_zcenter_list ... + full_kr_chi2_2016_list full_kr_chi2_2015_list best_total_kr_chi2 best_total_h3_chi2 alternate_total_chi2_map alternate_total_chi2_list ... + best_total_alternate_chi2 best_total_alternate_kr_chi2 best_total_alternate_h3_chi2 besta2_alternate bestb2_alternate bestg1_alternate bestg2_alternate bestc2_alternate c2 ... + total_h3_chi2_nothresh_list total_chi2_nothresh_list alternate_total_chi2_nothresh_list h3_chi2_2015_nothresh_list h3_chi2_2016_nothresh_list ... + total_h3_chi2_nothresh_map total_chi2_nothresh_map alternate_total_chi2_nothresh_map h3_chi2_2016_nothresh_map h3_chi2_2015_nothresh_map ... + best_total_chi2_nothresh best_total_kr_chi2_nothresh best_total_h3_chi2_nothresh besta2_nothresh bestb2_nothresh bestc2_nothresh bestg1_nothresh bestEE_nothresh ... + best_total_alternate_chi2_nothresh best_total_alternate_kr_chi2_nothresh best_total_alternate_h3_chi2_nothresh besta2_alternate_nothresh bestb2_alternate_nothresh ... + bestc2_alternate_nothresh bestg1_alternate_nothresh bestEE_alternate_nothresh best_total_chi2_nothresh best_total_alternate_chi2_nothresh ee_list ... + total_h3_chi2_nothresh_separatescaling_list total_chi2_nothresh_separatescaling_list best_total_chi2_nothresh_separatescaling ... + best_total_kr_chi2_nothresh_separatescaling best_total_h3_chi2_nothresh_separatescaling besta2_nothresh_separatescaling ... + bestc2_nothresh_separatescaling bestg1_nothresh_separatescaling bestEE_nothresh_separatescaling ... + total_h3_chi2_nothresh_separatescaling_map total_chi2_nothresh_separatescaling_map bestEE_nothresh ... + h3_chi2_2015_nothresh_separatescaling_list h3_chi2_2016_nothresh_separatescaling_list ee_list ... + h3_chi2_2016_oldsim_list h3_chi2_2015_oldsim_list total_h3_chi2_oldsim_list total_chi2_oldsim_list ... + best_total_chi2_oldsim best_total_kr_chi2_oldsim best_total_h3_chi2_oldsim besta2_oldsim bestb2_oldsim ... + bestc2_oldsim bestg1_oldsim bestEE_oldsim NEST_CH3T_Spectrum_old + + + +save('/scratch4/UMDcode/EnergyChi2/KrypCal_2p21/TritiumMethod/libNEST_CH3TModel/S1aS1bParamScan_EnergyChi2_S1FloatPoly_S2Poly2015_Improved_Wtih1D2D.mat') + + + b2_counter=b2_counter+1; + + end + + a2_counter=a2_counter+1; + b2_counter=1; + end + diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/EnergyChi2_S1LineFloatPoly_S2Poly2015_Local_ImprovedHiResFINAL.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/EnergyChi2_S1LineFloatPoly_S2Poly2015_Local_ImprovedHiResFINAL.m new file mode 100644 index 0000000..7f16d59 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/EnergyChi2_S1LineFloatPoly_S2Poly2015_Local_ImprovedHiResFINAL.m @@ -0,0 +1,1869 @@ +param_counter=1; + best_chi2_midtobot=10^100; + best_chi2_midtotop=10^100; + best_chi2_combined=10^100; + + + %initialize matrices +a2_list=zeros(1,722150); +b2_list=zeros(1,722150); +c2_list=zeros(1,722150); +g1_list=zeros(1,722150); +g2_list=zeros(1,722150); +total_h3_chi2_list=zeros(1,722150); +total_kr_chi2_list=zeros(1,722150); +total_chi2_list=zeros(1,722150); +alternate_total_chi2_list=zeros(1,722150); +h3_chi2_2016_list=zeros(1,722150); +h3_chi2_2015_list=zeros(1,722150); +kr_chi2_2016_list=zeros(1,722150); +kr_chi2_2015_list=zeros(1,722150); +electron_lifetime_2016_list=zeros(1,722150); +electron_lifetime_2015_list=zeros(1,722150); +kr_staterr_2016_list=zeros(1,722150); +kr_staterr_2015_list=zeros(1,722150); +kr_sigma_2016_list=zeros(1,722150); +kr_sigma_2015_list=zeros(1,722150); +kr_2016_num_events=zeros(1,722150); +kr_2015_num_events=zeros(1,722150); +kr_means_2016_list=zeros(1,722150); +kr_means_2015_list=zeros(1,722150); +full_kr_chi2_2016_list=zeros(1,722150); +full_kr_chi2_2015_list=zeros(1,722150); +total_h3_chi2_nothresh_list=zeros(1,722150); +total_chi2_nothresh_list=zeros(1,722150); +alternate_total_chi2_nothresh_list=zeros(1,722150); +h3_chi2_2016_nothresh_list=zeros(1,722150); +h3_chi2_2015_nothresh_list=zeros(1,722150); +h3_chi2_2015_nothresh_separatescaling_list=zeros(1,722150); +h3_chi2_2016_nothresh_separatescaling_list=zeros(1,722150); + +total_h3_chi2_nothresh_separatescaling_list=zeros(1,722150); +total_chi2_nothresh_separatescaling_list=zeros(1,722150); + +h3_chi2_2016_oldsim_list=zeros(1,722150); +h3_chi2_2015_oldsim_list=zeros(1,722150); +total_h3_chi2_oldsim_list=zeros(1,722150); +total_chi2_oldsim_list=zeros(1,722150); + + +ee_list=zeros(1,722150); + +kr_chi2_2016_zslice_list=zeros(722150,length(40+20/2:20:300-20/2)); +kr_chi2_2015_zslice_list=zeros(722150,length(40+20/2:20:300-20/2)); +kr_chi2_zslice_zcenter_list=zeros(722150,length(40+20/2:20:300-20/2)); +% +% total_h3_chi2_map=zeros(36,41,11,31); +% total_kr_chi2_map=zeros(36,41,11,31); +% total_chi2_map=zeros(36,41,11,31); +% alternate_total_chi2_map=zeros(36,41,11,31); +% h3_chi2_2016_map=zeros(36,41,11,31); +% kr_chi2_2016_map=zeros(36,41,11,31); +% h3_chi2_2015_map=zeros(36,41,11,31); +% kr_chi2_2015_map=zeros(36,41,11,31); +% electron_lifetime_2016_map=zeros(36,41,11,31); +% electron_lifetime_2015_map=zeros(36,41,11,31); +% total_h3_chi2_nothresh_map=zeros(36,41,11,31); +% total_chi2_nothresh_map=zeros(36,41,11,31); +% alternate_total_chi2_nothresh_map=zeros(36,41,11,31); +% h3_chi2_2016_nothresh_map=zeros(36,41,11,31); +% h3_chi2_2015_nothresh_map=zeros(36,41,11,31); +% total_h3_chi2_nothresh_separatescaling_map=zeros(36,41,11,31); +% total_chi2_nothresh_separatescaling_map=zeros(36,41,11,31); + +best_total_chi2=1000000000000000000; +best_total_alternate_chi2=1000000000000000000; +best_total_chi2_nothresh=1000000000000000000; +best_total_alternate_chi2_nothresh=1000000000000000000; +best_total_chi2_nothresh_separatescaling=1000000000000000000; +best_total_chi2_oldsim=1000000000000000000; + + +inpaint_on=1; +% Measurement is a1=-0.765; b1=2.939; a2=0.1934; b2=-0.744; + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\NEST_CH3T_Spectrum_Sep2015_Kr2p21.mat') +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\NEST_CH3T_Spectrum_Feb2016_Kr2p21.mat') +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\NEST_CH3T_Spectrum_old.mat') + + +a2_counter=1; +for a2=0:0.005:0.12; %p1*x^2 coefficient for s1ab_s2_xyz_fit.p1 + b2_counter=1; + for b2=0:0.01:0.25; %p1*x^2 coefficient for s1ab_s2_xyz_fit.p1 + + + +g1_counter=1; +g2_counter=1; + + %%UPDATE THIS + +s1ab_s2_xyz_fit_map.p1=-0.4988; %these are slightly different than Kr2p20, prob just a resulting of the fitting +s1ab_s2_xyz_fit_map.p2=1.484; +c1=1-s1ab_s2_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s2_xyz_fit_map.p2; +s1ab_s2_xyz_fit_map.p3=c1; + +s1ab_s1_xyz_fit_map.p1=a2; +s1ab_s1_xyz_fit_map.p2=b2; +c2=1-a2.*2.7303.^2-2.7303.*b2; +s1ab_s1_xyz_fit_map.p3=c2; +%% Load the Uncorrected Sep 2015 Kr data + + +%HAVE TO MAKE THIS .MAT FILE STILL - USE class 1 and class 9 for S1 +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\MappingParametersFit_Start_2015_CutDown.mat') + + +%% Calculate 2015 Corrections + +try + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>90000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval); + + + + end + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=1000; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1500]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[5+bin_size, 500] );%from 50 to 300us for the fit, based on when s1as1b values get strange + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + %%Tracker for pseudo-lifetime + s2_at_bottom=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_2015=-320/log(s2_at_bottom/s2_at_top); + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_xbins),floor(s2_ybins)); +Sigma_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); +Count_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_xbins),floor(s1_ybins)); +Sigma_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); +Count_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XYZ. 3D Map, caluculate and Submit IQ +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% if Kr_events>150000 +% +% % LUXkrypCal_S1_3D(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_distance_\mus,user_name,file_id_cp,dp_version,submit); +% LUXkrypCal_S1_3D_Run04_local_2p14FixedZHisto(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_time,x_center,y_center,z_center,det_edge,inpaint_on,user_name,file_id_cp,dp_version, algorithm_name, submit); +% +% +% end + + +%% Apply corrections to CH3T and calculate the ER band shift + +%First load the data + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\CH3T_Sep2015_NoCorrections.mat'); + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = S2_x; +s1_y_cm = S2_y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,S2_x,S2_y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + h3_cut= inrange(drift_time,[40 300]) & inrange(s1_phe_both,[0 120]) ... + & (log10(s1_phe_both)+0.8*log10(s2_phe_both)<5.2) .... + & (log10(s1_phe_both)-2*log10(s2_phe_both)>-6.8) & (log10(s1_phe_both)-2*log10(s2_phe_both)<-4.8)... + & s2_phe_both>100 & s2_phe_both<16000 & s2radius<25; %used to be drift time 100 to 250 + +h3_s1_c_2015=s1_phe_both_xyz(h3_cut); +h3_s2_c_2015=s2_phe_both_xyz(h3_cut); + + + kr_cut= inrange(drift_time,[40 300]) & inrange(s1_phe_both,[30 1000]) ... + & (log10(s1_phe_both)+0.6*log10(s2_phe_both)>4.5) & (log10(s1_phe_both)+0.6*log10(s2_phe_both)<5.05) ... + & (log10(s1_phe_both)-2*log10(s2_phe_both)>-7.6) & (log10(s1_phe_both)-2*log10(s2_phe_both)<-4.7) ... + & s2_phe_both>3000 & s2_phe_both<60000 & s2radius<25; %used to be drift time 100 to 250 + +kr_s1_c_2015=s1_phe_both_xyz(kr_cut); +kr_s2_c_2015=s2_phe_both_xyz(kr_cut); +kr_2015_drift_time=drift_time(kr_cut); +kr_2015_s2x=S2_x(kr_cut); +kr_2015_s2y=S2_y(kr_cut); + + clearvars -except param_counter a1_list b1_list a2_list b2_list total_chi2_list h3_chi2_list kr_chi2_list g1_list g2_list total_chi2_map h3_chi2_map kr_chi2_map chi2_midtobot_list... + best_chi2_midtotop besta1_midtotop besta2_midtotop bestb1_midtotop bestb2_midtotop best_chi2_midtobot... + besta1_midtobot besta1_midtotop bestb1_midtobot bestb1_midtotop a1 b1 a2 b2 c2 chi2_midtotop_map chi2_midtobot_map b_counter a_counter... + besta1_combined bestb1_combined besta2_combined bestb2_combined best_chi2_combined chi2_combined_map chi2_combined_list b1_counter a1_counter a2_counter b2_counter... + a1_counter b1_counter a2_counter b2_counter c1_list c2_list bestc1_midtobot bestc2_midtobot bestc1_midtotop bestc2_midtotop bestc1_combined bestc2_combined... + besta1_combined besta2_combined bestb1_combined bestb2_combined besta1 bestb1 bestc1 besta2 bestb2 bestc2 bestg1 bestg2 best_total_chi2 NEST_CH3T_Spectrum inpaint_on... + best_kr_chi2 best_h3_chi2 electron_lifetime_list electron_lifetime_map a2_start a1_start b1_start b2_start ... + total_h3_chi2_list total_kr_chi2_list total_chi2_list h3_chi2_2016_list h3_chi2_2015_list kr_chi2_2016_list kr_chi2_2015_list ... + electron_lifetime_2016_list electron_lifetime_2015_list total_h3_chi2_map total_kr_chi2_map total_chi2_map h3_chi2_2016_map h3_chi2_2015_map ... + kr_chi2_2016_map kr_chi2_2015_map electron_lifetime_2016_map electron_lifetime_2015_map NEST_CH3T_Spectrum_Sep2015 NEST_CH3T_Spectrum_Feb2016 g1 g2 bestg1 bestg2 g1_counter g2_counter ... + firsta1 firstb1 firsta2 firstb2 firstg1 firstg2 kr_means_2015_map kr_means_2016_map kr_sigma_2015_map kr_sigma_2016_map kr_staterr_2015_map kr_staterr_2016_map ... + kr_means_2015_list kr_means_2016_list kr_2015_num_events kr_2016_num_events kr_sigma_2015_list kr_sigma_2016_list kr_staterr_2015_list kr_staterr_2016_list ... + pseudo_lifetime_2016 pseudo_lifetime_2015 kr_s1_c_2015 kr_s2_c_2015 h3_s1_c_2015 h3_s2_c_2015 s1ab_s2_xyz_fit_map s1ab_s1_xyz_fit_map ... + kr_2015_drift_time kr_2015_s2x kr_2015_s2y kr_chi2_2016_zslice_list kr_chi2_2015_zslice_list kr_chi2_zslice_zcenter_list ... + full_kr_chi2_2016_list full_kr_chi2_2015_list best_total_kr_chi2 best_total_h3_chi2 alternate_total_chi2_map alternate_total_chi2_list ... + best_total_alternate_chi2 best_total_alternate_kr_chi2 best_total_alternate_h3_chi2 besta2_alternate bestb2_alternate bestg1_alternate bestg2_alternate bestc2_alternate ... + total_h3_chi2_nothresh_list total_chi2_nothresh_list alternate_total_chi2_nothresh_list h3_chi2_2015_nothresh_list h3_chi2_2016_nothresh_list ... + total_h3_chi2_nothresh_map total_chi2_nothresh_map alternate_total_chi2_nothresh_map h3_chi2_2016_nothresh_map h3_chi2_2015_nothresh_map ... + best_total_chi2_nothresh best_total_kr_chi2_nothresh best_total_h3_chi2_nothresh besta2_nothresh bestb2_nothresh bestc2_nothresh bestg1_nothresh bestEE_nothresh ... + best_total_alternate_chi2_nothresh best_total_alternate_kr_chi2_nothresh best_total_alternate_h3_chi2_nothresh besta2_alternate_nothresh bestb2_alternate_nothresh ... + bestc2_alternate_nothresh bestg1_alternate_nothresh bestEE_alternate_nothresh best_total_chi2_nothresh best_total_alternate_chi2_nothresh ee_list ... + total_h3_chi2_nothresh_separatescaling_list total_chi2_nothresh_separatescaling_list best_total_chi2_nothresh_separatescaling ... + best_total_kr_chi2_nothresh_separatescaling best_total_h3_chi2_nothresh_separatescaling besta2_nothresh_separatescaling ... + bestc2_nothresh_separatescaling bestg1_nothresh_separatescaling bestEE_nothresh_separatescaling ... + total_h3_chi2_nothresh_separatescaling_map total_chi2_nothresh_separatescaling_map bestEE_nothresh ... + h3_chi2_2015_nothresh_separatescaling_list h3_chi2_2016_nothresh_separatescaling_list ee_list ... + h3_chi2_2016_oldsim_list h3_chi2_2015_oldsim_list total_h3_chi2_oldsim_list total_chi2_oldsim_list ... + best_total_chi2_oldsim best_total_kr_chi2_oldsim best_total_h3_chi2_oldsim besta2_oldsim bestb2_oldsim ... + bestc2_oldsim bestg1_oldsim bestEE_oldsim NEST_CH3T_Spectrum_old + + + + + +%%%%%%%%%%%%%%%%%%%%% +%% REPEAT FOR 2016 DATA +%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\MappingParametersFit_Start_2016_CutDown.mat') + + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>90000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval); + + + + end + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[5+bin_size, 500] );%from 50 to 300us for the fit, based on when s1as1b values get strange + +s2_both_norm_z_index=mean_index(dT_range); +s2_both_norm_z_means=means(dT_range); + s2_at_top=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + %%Tracker for pseudo-lifetime + s2_at_bottom=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_2016=-320/log(s2_at_bottom/s2_at_top); +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_xbins),floor(s2_ybins)); +Sigma_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); +Count_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_xbins),floor(s1_ybins)); +Sigma_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); +Count_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Apply corrections to 2016 Kr data +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\MappingParametersFit_Start_2016_CutDown.mat') + + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; +% +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate ER Band shift +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + liquid_cut= inrange(drift_time,[40 300]) ... + & (log10(s1_phe_both)+0.7*log10(s2_phe_both)>4.9) & (log10(s1_phe_both)+0.7*log10(s2_phe_both)<5.5) ... + & s2_phe_both>3000 & s2_phe_both<80000 & s2radius<25; %used to be drift time 100 to 250 + + +kr_s1_c_2016=s1_phe_both_xyz(liquid_cut); +kr_s2_c_2016=s2_phe_both_xyz(liquid_cut); +kr_2016_drift_time=drift_time(liquid_cut); +kr_2016_s2x=s2x(liquid_cut); +kr_2016_s2y=s2y(liquid_cut); + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%Apply Corrections to 2016 CH3T Data +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\CH3T_Feb2016_NoCorrections.mat'); + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +% electron_lifetime_2016=e_lifetime_both; +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate ER Band shift +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +s1_min=0; +s1_max=120; + + %% Redo with r<10 cm + + + liquid_cut= clean_cut & inrange(drift_time,[40 300]) ... + & (log10(s1_phe_both)+log10(s2_phe_both)<5.9) & (log10(s1_phe_both)-2.*log10(s2_phe_both)<-4.8) ... + & (log10(s1_phe_both)-2.*log10(s2_phe_both)>-6.8) ... + & s2_phe_both>600 & s2_phe_both<16000 & s2radius<25; %used to be drift time 100 to 250 + + + +h3_s1_c_2016=s1_phe_both_xyz(liquid_cut); +h3_s2_c_2016=s2_phe_both_xyz(liquid_cut); + + clearvars -except param_counter a1_list b1_list a2_list b2_list total_chi2_list h3_chi2_list kr_chi2_list g1_list g2_list total_chi2_map h3_chi2_map kr_chi2_map chi2_midtobot_list... + best_chi2_midtotop besta1_midtotop besta2_midtotop bestb1_midtotop bestb2_midtotop best_chi2_midtobot... + besta1_midtobot besta1_midtotop bestb1_midtobot bestb1_midtotop a1 b1 a2 b2 chi2_midtotop_map chi2_midtobot_map b_counter a_counter... + besta1_combined bestb1_combined besta2_combined bestb2_combined best_chi2_combined chi2_combined_map chi2_combined_list b1_counter a1_counter a2_counter b2_counter... + a1_counter b1_counter a2_counter b2_counter c1_list c2_list bestc1_midtobot bestc2_midtobot bestc1_midtotop bestc2_midtotop bestc1_combined bestc2_combined... + besta1_combined besta2_combined bestb1_combined bestb2_combined besta1 bestb1 bestc1 besta2 bestb2 bestc2 bestg1 bestg2 best_total_chi2 NEST_CH3T_Spectrum inpaint_on... + best_kr_chi2 best_h3_chi2 electron_lifetime_list electron_lifetime_map a2_start a1_start b1_start b2_start ... + total_h3_chi2_list total_kr_chi2_list total_chi2_list h3_chi2_2016_list h3_chi2_2015_list kr_chi2_2016_list kr_chi2_2015_list ... + electron_lifetime_2016_list electron_lifetime_2015_list total_h3_chi2_map total_kr_chi2_map total_chi2_map h3_chi2_2016_map h3_chi2_2015_map ... + kr_chi2_2016_map kr_chi2_2015_map electron_lifetime_2016_map electron_lifetime_2015_map NEST_CH3T_Spectrum_Sep2015 NEST_CH3T_Spectrum_Feb2016 g1 g2 bestg1 bestg2 g1_counter g2_counter ... + firsta1 firstb1 firsta2 firstb2 firstg1 firstg2 kr_means_2015_map kr_means_2016_map kr_sigma_2015_map kr_sigma_2016_map kr_staterr_2015_map kr_staterr_2016_map ... + kr_means_2015_list kr_means_2016_list kr_2015_num_events kr_2016_num_events kr_sigma_2015_list kr_sigma_2016_list kr_staterr_2015_list kr_staterr_2016_list ... + pseudo_lifetime_2016 pseudo_lifetime_2015 kr_s1_c_2015 kr_s2_c_2015 h3_s1_c_2015 h3_s2_c_2015 kr_s1_c_2016 kr_s2_c_2016 h3_s1_c_2016 h3_s2_c_2016 ... + kr_2015_drift_time kr_2015_s2x kr_2015_s2y kr_2016_drift_time kr_2016_s2x kr_2016_s2y ... + kr_chi2_2016_zslice_list kr_chi2_2015_zslice_list kr_chi2_zslice_zcenter_list ... + full_kr_chi2_2016_list full_kr_chi2_2015_list best_total_kr_chi2 best_total_h3_chi2 alternate_total_chi2_map alternate_total_chi2_list ... + best_total_alternate_chi2 best_total_alternate_kr_chi2 best_total_alternate_h3_chi2 besta2_alternate bestb2_alternate bestg1_alternate bestg2_alternate bestc2_alternate c2 ... + total_h3_chi2_nothresh_list total_chi2_nothresh_list alternate_total_chi2_nothresh_list h3_chi2_2015_nothresh_list h3_chi2_2016_nothresh_list ... + total_h3_chi2_nothresh_map total_chi2_nothresh_map alternate_total_chi2_nothresh_map h3_chi2_2016_nothresh_map h3_chi2_2015_nothresh_map ... + best_total_chi2_nothresh best_total_kr_chi2_nothresh best_total_h3_chi2_nothresh besta2_nothresh bestb2_nothresh bestc2_nothresh bestg1_nothresh bestEE_nothresh ... + best_total_alternate_chi2_nothresh best_total_alternate_kr_chi2_nothresh best_total_alternate_h3_chi2_nothresh besta2_alternate_nothresh bestb2_alternate_nothresh ... + bestc2_alternate_nothresh bestg1_alternate_nothresh bestEE_alternate_nothresh best_total_chi2_nothresh best_total_alternate_chi2_nothresh ee_list ... + total_h3_chi2_nothresh_separatescaling_list total_chi2_nothresh_separatescaling_list best_total_chi2_nothresh_separatescaling ... + best_total_kr_chi2_nothresh_separatescaling best_total_h3_chi2_nothresh_separatescaling besta2_nothresh_separatescaling ... + bestc2_nothresh_separatescaling bestg1_nothresh_separatescaling bestEE_nothresh_separatescaling ... + total_h3_chi2_nothresh_separatescaling_map total_chi2_nothresh_separatescaling_map bestEE_nothresh ... + h3_chi2_2015_nothresh_separatescaling_list h3_chi2_2016_nothresh_separatescaling_list ee_list ... + h3_chi2_2016_oldsim_list h3_chi2_2015_oldsim_list total_h3_chi2_oldsim_list total_chi2_oldsim_list ... + best_total_chi2_oldsim best_total_kr_chi2_oldsim best_total_h3_chi2_oldsim besta2_oldsim bestb2_oldsim ... + bestc2_oldsim bestg1_oldsim bestEE_oldsim NEST_CH3T_Spectrum_old + + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% DO CHI2 TO ENEGY SPECTRA +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +g1_counter=1; +for g1=0.095:0.001:0.105; + g2_counter=1; +% for g2=16.5:0.1:21; + for ee=0.7:0.002:0.9; + g2_Feb2016=25.05*ee; %converting to g2 with SE size + g2_sep2015=25.8536*ee; + + h3_energy_2016=(1/73).*(h3_s1_c_2016./g1 + h3_s2_c_2016./g2_Feb2016); + kr_energy_2016=(1/73).*(kr_s1_c_2016./g1 + kr_s2_c_2016./g2_Feb2016); + h3_energy_2015=(1/73).*(h3_s1_c_2015./g1 + h3_s2_c_2015./g2_sep2015); + kr_energy_2015=(1/73).*(kr_s1_c_2015./g1 + kr_s2_c_2015./g2_sep2015); + + + + %make CH3T data spectrum + [h3_hist_2016,h3_hist_bin_2016]=hist(h3_energy_2016,NEST_CH3T_Spectrum_Feb2016(1,:)); + [h3_hist_2015,h3_hist_bin_2015]=hist(h3_energy_2015,NEST_CH3T_Spectrum_Sep2015(1,:)); + + %scale the simulation to the data + scale_factor_2016=sum(h3_hist_2016)/sum(NEST_CH3T_Spectrum_Feb2016(2,:)); %sum(h3_hist_2016(17:80))./sum(NEST_CH3T_Spectrum(2,17:80)); - sims have an expected threshold now... so can ignore the bin cuts + h3_scaled_sim_2016=scale_factor_2016.*NEST_CH3T_Spectrum_Feb2016(2,:); + + scale_factor_2016_nothresh=sum(h3_hist_2016(11:80))/sum(NEST_CH3T_Spectrum_Feb2016(2,11:80)); %sum(h3_hist_2016(17:80))./sum(NEST_CH3T_Spectrum(2,17:80)); - sims have an expected threshold now... so can ignore the bin cuts + h3_scaled_sim_2016_nothresh=scale_factor_2016_nothresh.*NEST_CH3T_Spectrum_Feb2016(2,:); + + scale_factor_2015=sum(h3_hist_2015)/sum(NEST_CH3T_Spectrum_Sep2015(2,:)); %sum(h3_hist_2015(17:80))./sum(NEST_CH3T_Spectrum(2,17:80)); - sims have an expected threshold now... so can ignore the bin cuts + h3_scaled_sim_2015=scale_factor_2015.*NEST_CH3T_Spectrum_Sep2015(2,:); + + scale_factor_2015_nothresh=sum(h3_hist_2015(11:80))/sum(NEST_CH3T_Spectrum_Sep2015(2,11:80)); %sum(h3_hist_2015(17:80))./sum(NEST_CH3T_Spectrum(2,17:80)); - sims have an expected threshold now... so can ignore the bin cuts + h3_scaled_sim_2015_nothresh=scale_factor_2015_nothresh.*NEST_CH3T_Spectrum_Sep2015(2,:); + + scale_factor_2015_oldsim=sum(h3_hist_2015(17:80))/sum(NEST_CH3T_Spectrum_old(2,17:80)); + h3_scaled_oldsim_2015=scale_factor_2015_oldsim.*NEST_CH3T_Spectrum_old(2,:); + + scale_factor_2016_oldsim=sum(h3_hist_2016(17:80))/sum(NEST_CH3T_Spectrum_old(2,17:80)); + h3_scaled_oldsim_2016=scale_factor_2016_oldsim.*NEST_CH3T_Spectrum_old(2,:); + + %Calculate chi2 for h3 spectrum + h3_chi2_2016=(1/74).*sum( (h3_scaled_sim_2016(4:80) - h3_hist_2016(4:80)).^2 ./(h3_hist_2016(4:80))); %(4:80) is to avoid low stat areas in the simulation + h3_chi2_2015=(1/74).*sum( (h3_scaled_sim_2015(4:80) - h3_hist_2015(4:80)).^2 ./(h3_hist_2015(4:80))); + + %Calculate chi2 for h3 spectrum away from threshold + h3_chi2_2016_nothresh=(1/68).*sum( (h3_scaled_sim_2016(11:80) - h3_hist_2016(11:80)).^2 ./(h3_hist_2016(11:80))); %(4:80) is to avoid low stat areas in the simulation + h3_chi2_2015_nothresh=(1/68).*sum( (h3_scaled_sim_2015(11:80) - h3_hist_2015(11:80)).^2 ./(h3_hist_2015(11:80))); + + h3_chi2_2016_nothresh_separatescaling=(1/68).*sum( (h3_scaled_sim_2016_nothresh(11:80) - h3_hist_2016(11:80)).^2 ./(h3_hist_2016(11:80))); %(4:80) is to avoid low stat areas in the simulation + h3_chi2_2015_nothresh_separatescaling=(1/68).*sum( (h3_scaled_sim_2015_nothresh(11:80) - h3_hist_2015(11:80)).^2 ./(h3_hist_2015(11:80))); + + h3_chi2_2016_oldsim=(1/62).*sum( (h3_scaled_oldsim_2016(17:80) - h3_hist_2016(17:80)).^2 ./(h3_hist_2016(17:80))); %(4:80) is to avoid low stat areas in the simulation + h3_chi2_2015_oldsim=(1/62).*sum( (h3_scaled_oldsim_2015(17:80) - h3_hist_2015(17:80)).^2 ./(h3_hist_2015(17:80))); + + dT_step=20; + kr_mean_2016=zeros(length(40+dT_step/2:dT_step:300-dT_step/2),1); + kr_mean_2015=zeros(length(40+dT_step/2:dT_step:300-dT_step/2),1); + dT_centers=zeros(length(40+dT_step/2:dT_step:300-dT_step/2),1); + + full_kr_fit_res_2016=fit([0:1:1000].',hist(kr_energy_2016,[0:1:1000]).','gauss1'); + full_kr_fit_res_2015=fit([0:1:1000].',hist(kr_energy_2015,[0:1:1000]).','gauss1'); + full_kr_chi2_2016=((41.55-full_kr_fit_res_2016.b1)./0.2395).^2; %SHOULD BE 0.2395 BASED ON RUN03 + full_kr_chi2_2015=((41.55-full_kr_fit_res_2015.b1)./0.2395).^2; + + clear kr_fit_res_2016 kr_fit_res_2015 kr_conf_2016 kr_conf_2015 dT_max + kk=1; + for dT_max=40+dT_step/2:dT_step:300-dT_step/2; + clear kr_fit_res_2016 kr_fit_res_2015 + kr_fit_res_2016=fit([0:1:1000].',hist(kr_energy_2016(inrange(kr_2016_drift_time,[dT_max-dT_step dT_max])),[0:1:1000]).','gauss1'); + kr_fit_res_2015=fit([0:1:1000].',hist(kr_energy_2015(inrange(kr_2015_drift_time,[dT_max-dT_step dT_max])),[0:1:1000]).','gauss1'); + kr_mean_2016(kk)=kr_fit_res_2016.b1; + kr_mean_2015(kk)=kr_fit_res_2015.b1; + dT_centers(kk)=dT_max-dT_step/2; + kk=kk+1; + end + + clear cut + cut=kr_mean_2015==0 | kr_mean_2016==0; + kr_mean_2016(cut)=[]; + kr_mean_2015(cut)=[]; + dT_centers(cut)=[]; + + + kr_chi2_2016=((41.55-kr_mean_2016)./0.2395).^2; %SHOULD BE 0.2395 BASED ON RUN03 + kr_chi2_2015=((41.55-kr_mean_2015)./0.2395).^2; + + total_h3_chi2=(h3_chi2_2016+h3_chi2_2015)/2; + total_h3_chi2_nothresh=(h3_chi2_2016_nothresh+h3_chi2_2015_nothresh)/2; + total_h3_chi2_oldsim=(h3_chi2_2016_oldsim+h3_chi2_2015_oldsim)/2; + total_h3_chi2_nothresh_separatescaling=(h3_chi2_2016_nothresh_separatescaling+h3_chi2_2015_nothresh_separatescaling)/2; + + total_kr_chi2_2016=mean(kr_chi2_2016); + total_kr_chi2_2015=mean(kr_chi2_2015); + + total_kr_chi2=(total_kr_chi2_2016+total_kr_chi2_2015)./2; + total_chi2=(total_kr_chi2+total_h3_chi2)/2; + total_chi2_nothresh=(total_kr_chi2+total_h3_chi2_nothresh)/2; + total_chi2_nothresh_separatescaling=(total_kr_chi2+total_h3_chi2_nothresh_separatescaling)/2; + total_chi2_oldsim=(total_kr_chi2+total_h3_chi2_oldsim)/2; + + alternate_total_chi2=(sum( (h3_scaled_sim_2016(4:80) - h3_hist_2016(4:80)).^2 ./(h3_hist_2016(4:80)))+sum(kr_chi2_2016)+sum(kr_chi2_2015))/(74+length(kr_chi2_2016)+length(kr_chi2_2015)-4); + alternate_total_chi2_nothresh=(sum( (h3_scaled_sim_2016(11:80) - h3_hist_2016(11:80)).^2 ./(h3_hist_2016(11:80)))+sum(kr_chi2_2016)+sum(kr_chi2_2015))/(68+length(kr_chi2_2016)+length(kr_chi2_2015)-4); + + if total_chi2 < best_total_chi2; + best_total_chi2=total_chi2; + best_total_kr_chi2=total_kr_chi2; + best_total_h3_chi2=total_h3_chi2; + besta2=a2; + bestb2=b2; + bestc2=c2; + bestg1=g1; + bestEE=ee; + end + + + if alternate_total_chi2 < best_total_alternate_chi2; + best_total_alternate_chi2=alternate_total_chi2; + best_total_alternate_kr_chi2=total_kr_chi2; + best_total_alternate_h3_chi2=total_h3_chi2; + besta2_alternate=a2; + bestb2_alternate=b2; + bestc2_alternate=c2; + bestg1_alternate=g1; + bestEE_alternate=ee; + end + + if total_chi2_nothresh < best_total_chi2_nothresh; + best_total_chi2_nothresh=total_chi2_nothresh; + best_total_kr_chi2_nothresh=total_kr_chi2; + best_total_h3_chi2_nothresh=total_h3_chi2_nothresh; + besta2_nothresh=a2; + bestb2_nothresh=b2; + bestc2_nothresh=c2; + bestg1_nothresh=g1; + bestEE_nothresh=ee; + end + + if total_chi2_nothresh_separatescaling < best_total_chi2_nothresh_separatescaling; + best_total_chi2_nothresh_separatescaling=total_chi2_nothresh_separatescaling; + best_total_kr_chi2_nothresh_separatescaling=total_kr_chi2; + best_total_h3_chi2_nothresh_separatescaling=total_h3_chi2_nothresh_separatescaling; + besta2_nothresh_separatescaling=a2; + bestb2_nothresh_separatescaling=b2; + bestc2_nothresh_separatescaling=c2; + bestg1_nothresh_separatescaling=g1; + bestEE_nothresh_separatescaling=ee; + end + + if alternate_total_chi2_nothresh < best_total_alternate_chi2_nothresh; + best_total_alternate_chi2_nothresh=alternate_total_chi2_nothresh; + best_total_alternate_kr_chi2_nothresh=total_kr_chi2; + best_total_alternate_h3_chi2_nothresh=total_h3_chi2_nothresh; + besta2_alternate_nothresh=a2; + bestb2_alternate_nothresh=b2; + bestc2_alternate_nothresh=c2; + bestg1_alternate_nothresh=g1; + bestEE_alternate_nothresh=ee; + end + + if total_chi2_oldsim < best_total_chi2_oldsim; + best_total_chi2_oldsim=total_chi2_oldsim; + best_total_kr_chi2_oldsim=total_kr_chi2; + best_total_h3_chi2_oldsim=total_h3_chi2_oldsim; + besta2_oldsim=a2; + bestb2_oldsim=b2; + bestc2_oldsim=c2; + bestg1_oldsim=g1; + bestEE_oldsim=ee; + end + +a2_list(param_counter)=a2; +b2_list(param_counter)=b2; +c2_list(param_counter)=c2; +g1_list(param_counter)=g1; +ee_list(param_counter)=ee; +total_h3_chi2_list(param_counter)=total_h3_chi2; +total_h3_chi2_nothresh_list(param_counter)=total_h3_chi2_nothresh; +total_kr_chi2_list(param_counter)=total_kr_chi2; +total_chi2_list(param_counter)=total_chi2; +total_chi2_nothresh_list(param_counter)=total_chi2_nothresh; +alternate_total_chi2_list(param_counter)=alternate_total_chi2; +alternate_total_chi2_nothresh_list(param_counter)=alternate_total_chi2_nothresh; + +total_h3_chi2_nothresh_separatescaling_list(param_counter)=total_h3_chi2_nothresh_separatescaling; +total_chi2_nothresh_separatescaling_list(param_counter)=total_chi2_nothresh_separatescaling; + +h3_chi2_2016_list(param_counter)=h3_chi2_2016; +h3_chi2_2016_nothresh_list(param_counter)=h3_chi2_2016_nothresh; +h3_chi2_2015_list(param_counter)=h3_chi2_2015; +h3_chi2_2015_nothresh_list(param_counter)=h3_chi2_2015_nothresh; +h3_chi2_2015_nothresh_separatescaling_list(param_counter)=h3_chi2_2015_nothresh_separatescaling; +h3_chi2_2016_nothresh_separatescaling_list(param_counter)=h3_chi2_2016_nothresh_separatescaling; + +kr_chi2_2016_list(param_counter)=total_kr_chi2_2016; +kr_chi2_2015_list(param_counter)=total_kr_chi2_2015; +full_kr_chi2_2016_list(param_counter)=full_kr_chi2_2016; +full_kr_chi2_2015_list(param_counter)=full_kr_chi2_2015; +electron_lifetime_2016_list(param_counter)=pseudo_lifetime_2016; +electron_lifetime_2015_list(param_counter)=pseudo_lifetime_2015; + +kr_chi2_2016_zslice_list(param_counter,:)=kr_chi2_2016; +kr_chi2_2015_zslice_list(param_counter,:)=kr_chi2_2015; +kr_chi2_zslice_zcenter_list(param_counter,:)=dT_centers; + +h3_chi2_2016_oldsim_list(param_counter)=h3_chi2_2016_oldsim; +h3_chi2_2015_oldsim_list(param_counter)=h3_chi2_2015_oldsim; +total_h3_chi2_oldsim_list(param_counter)=total_h3_chi2_oldsim; +total_chi2_oldsim_list(param_counter)=total_chi2_oldsim; + +% total_h3_chi2_map(a2_counter,b2_counter,g1_counter,g2_counter)=total_h3_chi2; +% total_h3_chi2_nothresh_map(a2_counter,b2_counter,g1_counter,g2_counter)=total_h3_chi2_nothresh; +% total_kr_chi2_map(a2_counter,b2_counter,g1_counter,g2_counter)=total_kr_chi2; +% total_chi2_map(a2_counter,b2_counter,g1_counter,g2_counter)=total_chi2; +% total_chi2_nothresh_map(a2_counter,b2_counter,g1_counter,g2_counter)=total_chi2_nothresh; +% alternate_total_chi2_map(a2_counter,b2_counter,g1_counter,g2_counter)=alternate_total_chi2; +% alternate_total_chi2_nothresh_map(a2_counter,b2_counter,g1_counter,g2_counter)=alternate_total_chi2_nothresh; +% h3_chi2_2016_map(a2_counter,b2_counter,g1_counter,g2_counter)=h3_chi2_2016; +% h3_chi2_2016_nothresh_map(a2_counter,b2_counter,g1_counter,g2_counter)=h3_chi2_2016_nothresh; +% kr_chi2_2016_map(a2_counter,b2_counter,g1_counter,g2_counter)=total_kr_chi2_2016; +% h3_chi2_2015_map(a2_counter,b2_counter,g1_counter,g2_counter)=h3_chi2_2015; +% h3_chi2_2015_nothresh_map(a2_counter,b2_counter,g1_counter,g2_counter)=h3_chi2_2015_nothresh; +% kr_chi2_2015_map(a2_counter,b2_counter,g1_counter,g2_counter)=total_kr_chi2_2015; +% electron_lifetime_2016_map(a2_counter,b2_counter,g1_counter,g2_counter)=pseudo_lifetime_2016; +% electron_lifetime_2015_map(a2_counter,b2_counter,g1_counter,g2_counter)=pseudo_lifetime_2015; +% +% total_h3_chi2_nothresh_separatescaling_map(a2_counter,b2_counter,g1_counter,g2_counter)=total_h3_chi2_nothresh_separatescaling; +% total_chi2_nothresh_separatescaling_map(a2_counter,b2_counter,g1_counter,g2_counter)=total_chi2_nothresh_separatescaling; + +param_counter=param_counter+1; +g2_counter=g2_counter+1; + end +g1_counter=g1_counter+1; +end + + +catch + %Tried the b2 loop, but failed +sprintf('Caught Error, so skipped. a2=%0.3f b2=%0.3f', a2, b2) + +a2_list(param_counter)=a2; +b2_list(param_counter)=b2; +% c1_list(param_counter)=c1; +c2_list(param_counter)=c2; +g1_list(param_counter)=-1; +ee_list(param_counter)=-1; +total_h3_chi2_list(param_counter)=-1; +total_kr_chi2_list(param_counter)=-1; +total_chi2_list(param_counter)=-1; +alternate_total_chi2_list(param_counter)=-1; +h3_chi2_2016_list(param_counter)=-1; +h3_chi2_2015_list(param_counter)=-1; +kr_chi2_2016_list(param_counter)=-1; +kr_chi2_2015_list(param_counter)=-1; +electron_lifetime_2016_list(param_counter)=-1; +electron_lifetime_2015_list(param_counter)=-1; +full_kr_chi2_2016_list(param_counter)=-1; +full_kr_chi2_2015_list(param_counter)=-1; +kr_chi2_2016_zslice_list(param_counter,:)=-1; +kr_chi2_2015_zslice_list(param_counter,:)=-1; +kr_chi2_zslice_zcenter_list(param_counter,:)=-1; +total_h3_chi2_nothresh_list(param_counter)=-1; +total_chi2_nothresh_list(param_counter)=-1; +alternate_total_chi2_nothresh_list(param_counter)=-1; +h3_chi2_2015_nothresh_list(param_counter)=-1; +h3_chi2_2016_nothresh_list(param_counter)=-1; +h3_chi2_2015_nothresh_separatescaling_list(param_counter)=-1; +h3_chi2_2016_nothresh_separatescaling_list(param_counter)=-1; + +total_h3_chi2_nothresh_separatescaling_list(param_counter)=-1; +total_chi2_nothresh_separatescaling_list(param_counter)=-1; + + +h3_chi2_2016_oldsim_list(param_counter)=-1; +h3_chi2_2015_oldsim_list(param_counter)=-1; +total_h3_chi2_oldsim_list(param_counter)=-1; +total_chi2_oldsim_list(param_counter)=-1; + +% total_h3_chi2_map(a2_counter,b2_counter,:,:)=-1; +% total_kr_chi2_map(a2_counter,b2_counter,:,:)=-1; +% total_chi2_map(a2_counter,b2_counter,:,:)=-1; +% alternate_total_chi2_map(a2_counter,b2_counter,:,:)=-1; +% h3_chi2_2016_map(a2_counter,b2_counter,:,:)=-1; +% kr_chi2_2016_map(a2_counter,b2_counter,:,:)=-1; +% h3_chi2_2015_map(a2_counter,b2_counter,:,:)=-1; +% kr_chi2_2015_map(a2_counter,b2_counter,:,:)=-1; +% electron_lifetime_2016_map(a2_counter,b2_counter,:,:)=-1; +% electron_lifetime_2015_map(a2_counter,b2_counter,:,:)=-1; +% total_h3_chi2_nothresh_map(a2_counter,b2_counter,:,:)=-1; +% total_chi2_nothresh_map(a2_counter,b2_counter,:,:)=-1; +% alternate_total_chi2_nothresh_map(a2_counter,b2_counter,:,:)=-1; +% h3_chi2_2016_nothresh_map(a2_counter,b2_counter,:,:)=-1; +% h3_chi2_2015_nothresh_map(a2_counter,b2_counter,:,:)=-1; +% +% total_h3_chi2_nothresh_separatescaling_map(a2_counter,b2_counter,:,:)=-1; +% total_chi2_nothresh_separatescaling_map(a2_counter,b2_counter,:,:)=-1; + + +param_counter=param_counter+1; +end + +g1_counter=1; +% g1=firstg1; + +%Done with b2, so save and incriment counter +clearvars -except param_counter a1_list b1_list a2_list b2_list total_chi2_list h3_chi2_list kr_chi2_list g1_list g2_list total_chi2_map h3_chi2_map kr_chi2_map chi2_midtobot_list... + best_chi2_midtotop besta1_midtotop besta2_midtotop bestb1_midtotop bestb2_midtotop best_chi2_midtobot... + besta1_midtobot besta1_midtotop bestb1_midtobot bestb1_midtotop a1 b1 a2 b2 chi2_midtotop_map chi2_midtobot_map b_counter a_counter... + besta1_combined bestb1_combined besta2_combined bestb2_combined best_chi2_combined chi2_combined_map chi2_combined_list b1_counter a1_counter a2_counter b2_counter... + a1_counter b1_counter a2_counter b2_counter c1_list c2_list bestc1_midtobot bestc2_midtobot bestc1_midtotop bestc2_midtotop bestc1_combined bestc2_combined... + besta1_combined besta2_combined bestb1_combined bestb2_combined besta1 bestb1 bestc1 besta2 bestb2 bestc2 bestg1 bestg2 best_total_chi2 NEST_CH3T_Spectrum inpaint_on... + best_kr_chi2 best_h3_chi2 electron_lifetime_list electron_lifetime_map a2_start a1_start b1_start b2_start ... + total_h3_chi2_list total_kr_chi2_list total_chi2_list h3_chi2_2016_list h3_chi2_2015_list kr_chi2_2016_list kr_chi2_2015_list ... + electron_lifetime_2016_list electron_lifetime_2015_list total_h3_chi2_map total_kr_chi2_map total_chi2_map h3_chi2_2016_map h3_chi2_2015_map ... + kr_chi2_2016_map kr_chi2_2015_map electron_lifetime_2016_map electron_lifetime_2015_map NEST_CH3T_Spectrum_Sep2015 NEST_CH3T_Spectrum_Feb2016 g1 g2 bestg1 bestg2 g1_counter g2_counter ... + firsta1 firstb1 firsta2 firstb2 firstg1 firstg2 kr_means_2015_map kr_means_2016_map kr_sigma_2015_map kr_sigma_2016_map kr_staterr_2015_map kr_staterr_2016_map ... + kr_means_2015_list kr_means_2016_list kr_2015_num_events kr_2016_num_events kr_sigma_2015_list kr_sigma_2016_list kr_staterr_2015_list kr_staterr_2016_list ... + pseudo_lifetime_2016 pseudo_lifetime_2015 kr_2015_drift_time kr_2015_s2x kr_2015_s2y kr_2016_drift_time kr_2016_s2x kr_2016_s2y ... + kr_chi2_2016_zslice_list kr_chi2_2015_zslice_list kr_chi2_zslice_zcenter_list ... + full_kr_chi2_2016_list full_kr_chi2_2015_list best_total_kr_chi2 best_total_h3_chi2 alternate_total_chi2_map alternate_total_chi2_list ... + best_total_alternate_chi2 best_total_alternate_kr_chi2 best_total_alternate_h3_chi2 besta2_alternate bestb2_alternate bestg1_alternate bestg2_alternate bestc2_alternate c2 ... + total_h3_chi2_nothresh_list total_chi2_nothresh_list alternate_total_chi2_nothresh_list h3_chi2_2015_nothresh_list h3_chi2_2016_nothresh_list ... + total_h3_chi2_nothresh_map total_chi2_nothresh_map alternate_total_chi2_nothresh_map h3_chi2_2016_nothresh_map h3_chi2_2015_nothresh_map ... + best_total_chi2_nothresh best_total_kr_chi2_nothresh best_total_h3_chi2_nothresh besta2_nothresh bestb2_nothresh bestc2_nothresh bestg1_nothresh bestEE_nothresh ... + best_total_alternate_chi2_nothresh best_total_alternate_kr_chi2_nothresh best_total_alternate_h3_chi2_nothresh besta2_alternate_nothresh bestb2_alternate_nothresh ... + bestc2_alternate_nothresh bestg1_alternate_nothresh bestEE_alternate_nothresh best_total_chi2_nothresh best_total_alternate_chi2_nothresh ee_list ... + total_h3_chi2_nothresh_separatescaling_list total_chi2_nothresh_separatescaling_list best_total_chi2_nothresh_separatescaling ... + best_total_kr_chi2_nothresh_separatescaling best_total_h3_chi2_nothresh_separatescaling besta2_nothresh_separatescaling ... + bestc2_nothresh_separatescaling bestg1_nothresh_separatescaling bestEE_nothresh_separatescaling ... + total_h3_chi2_nothresh_separatescaling_map total_chi2_nothresh_separatescaling_map bestEE_nothresh ... + h3_chi2_2015_nothresh_separatescaling_list h3_chi2_2016_nothresh_separatescaling_list ee_list ... + h3_chi2_2016_oldsim_list h3_chi2_2015_oldsim_list total_h3_chi2_oldsim_list total_chi2_oldsim_list ... + best_total_chi2_oldsim best_total_kr_chi2_oldsim best_total_h3_chi2_oldsim besta2_oldsim bestb2_oldsim ... + bestc2_oldsim bestg1_oldsim bestEE_oldsim NEST_CH3T_Spectrum_old + + + +save('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\S1aS1bParamScan_EnergyChi2_S1FloatPoly_S2Poly2015_ImprovedFineRes.mat') + + + b2_counter=b2_counter+1; + + end + + a2_counter=a2_counter+1; + b2_counter=1; + end + diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/EstimateField_Sep2014.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/EstimateField_Sep2014.m new file mode 100644 index 0000000..410864f --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/EstimateField_Sep2014.m @@ -0,0 +1,96 @@ +function [ FieldValues ] = EstimateField_Sep2014( s2radius, s2drift ) + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% This function takes s2radius and s2drift inputs in the form of 1D vectors. It +% uses Scott Hertel's field simulation to determine the field at the location of each data point. +% The output of this function is a 1D vector of the same length of the original data which +% has corresponding field values for each data point in the units of V/cm. +% +% We use a cubic interpolation of Scott's map within the bounds of his simulated data +% and use a nearest neighbor interpolation outside of the bounds. The bounds are defined by +% fitting a spline to a rvZ scatterplot in the simulated data, with the additional constraint +% that any simulated data with drift_time<20 uSec is thrown out since the simualtion seems +% inaccurate in that region. Additionally, any real data that has radius < 1 cm is +% considered to be outside of the simulation bounds, since a cubic interpolation fails in that region +% despite the data being within the simulation bounds. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% Load simualted field data from Scott +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\sep2014_field_map.mat') + +%% Reshape simulated field data +sim_radius=reshape(sep2014_field_map.r_end_cm,1,size(sep2014_field_map.r_end_cm,1)*size(sep2014_field_map.r_end_cm,2)); +sim_drift=reshape(sep2014_field_map.t_end_us,1,size(sep2014_field_map.t_end_us,1)*size(sep2014_field_map.t_end_us,2)); +sim_field=reshape(sep2014_field_map.E_start_Vcm,1,size(sep2014_field_map.E_start_Vcm,1)*size(sep2014_field_map.E_start_Vcm,2)); + +%% Remove NaN from simulated field data +nan_cut=(~isnan(sim_radius) & ~isnan(sim_drift) & ~isnan(sim_field)); +sim_radius=sim_radius(nan_cut); +sim_drift=sim_drift(nan_cut); +sim_field=sim_field(nan_cut); + +%% Make a 2D map of the field, with radius_bin and drift_bin vectors + + + +%% Can use griddata to interpolate the Field Map, but it doesn't work well for points outside the boundary +% We first find the boundary, use nearest neighbor interp outside of it, and cubic interp inside of it + +%Finds the boundary of the radius, drift_time scatter plot +clear r_center max_z +i=1; +r_step=0.5; +for r_max=[0.45:r_step:25]; + r_center(i)=mean(sim_radius(inrange(sim_radius,[r_max-r_step,r_max]))); + max_z(i)=max(sim_drift(inrange(sim_radius,[r_max-r_step,r_max]))); + i=i+1; +end + +% Construct the boundary from a spline fit to the maximum values found above +boundary_spline=csapi(r_center,max_z); + +%Evaluates if data is inside or outside the boundary +data_boundary=fnval(boundary_spline, s2radius); + +%A cut that is one in inside, zero if outside. Has extra specifications to avoid bad simulation data at low drift and radius +data_inside_bound=(s2drift<=data_boundary & s2drift>=20 & s2radius>=1); + +%To get field value for the data - first split into inside/outside bound data vectors +data_inbound_radius=s2radius(data_inside_bound); +data_inbound_drift=s2drift(data_inside_bound); +data_outbound_radius=s2radius(~data_inside_bound); +data_outbound_drift=s2drift(~data_inside_bound); + +%Interpolate: outside bound use nearest neighbor, inside bound use cubic +field_inbound_value=griddata(sim_drift,sim_radius,sim_field,data_inbound_drift,data_inbound_radius,'cubic'); + +%only uses nearest for sim_drift>=20 uSec to avoid problem at low drift in sim +field_outbound_value=griddata(sim_drift(sim_drift>=20),sim_radius(sim_drift>=20),sim_field(sim_drift>=20),data_outbound_drift,data_outbound_radius,'nearest'); + +%Patch inbound and outbound field values together +FieldValues=zeros(length(field_inbound_value)+length(field_outbound_value),1); +FieldValues(data_inside_bound)=field_inbound_value; +FieldValues(~data_inside_bound)=field_outbound_value; + +end + +%% For testing purposes, a way to make a heat plot of the field based on data or sims + +% %For data +% x=s2radius(inrange(s2radius,[0 25]) & inrange(drift_time,[0 300])); y=drift_time(inrange(s2radius,[0 25]) & inrange(drift_time,[0 300])); +% p=fieldvals(inrange(s2radius,[0 25]) & inrange(drift_time,[0 300])); + +% %For sims +% x=sim_radius(~isnan(sim_radius.*sim_drift.*sim_field)); y=sim_drift(~isnan(sim_radius.*sim_drift.*sim_field)); p=sim_field(~isnan(sim_radius.*sim_drift.*sim_field)); + +% %Makes heatmap with colorscale being the field value +% x2=round(x-min(x)+1); +% y2=round(y-min(y)+1); +% %fill array +% A=[]; +% for k=1:length(x), +% A(x2(k),y2(k))=p(k); +% end +% figure +% imagesc(A.'); +% colormap(jet); \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/EstimateField_Sep2015.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/EstimateField_Sep2015.m new file mode 100644 index 0000000..5c62cdf --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/EstimateField_Sep2015.m @@ -0,0 +1,96 @@ +function [ FieldValues ] = EstimateField_Sep2015( s2radius, s2drift ) + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% This function takes s2radius and s2drift inputs in the form of 1D vectors. It +% uses Scott Hertel's field simulation to determine the field at the location of each data point. +% The output of this function is a 1D vector of the same length of the original data which +% has corresponding field values for each data point in the units of V/cm. +% +% We use a cubic interpolation of Scott's map within the bounds of his simulated data +% and use a nearest neighbor interpolation outside of the bounds. The bounds are defined by +% fitting a spline to a rvZ scatterplot in the simulated data, with the additional constraint +% that any simulated data with drift_time<20 uSec is thrown out since the simualtion seems +% inaccurate in that region. Additionally, any real data that has radius < 1 cm is +% considered to be outside of the simulation bounds, since a cubic interpolation fails in that region +% despite the data being within the simulation bounds. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% Load simualted field data from Scott +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\sep2015_field_map.mat') + +%% Reshape simulated field data +sim_radius=reshape(sep2015_field_map.r_end_cm,1,size(sep2015_field_map.r_end_cm,1)*size(sep2015_field_map.r_end_cm,2)); +sim_drift=reshape(sep2015_field_map.t_end_us,1,size(sep2015_field_map.t_end_us,1)*size(sep2015_field_map.t_end_us,2)); +sim_field=reshape(sep2015_field_map.E_start_Vcm,1,size(sep2015_field_map.E_start_Vcm,1)*size(sep2015_field_map.E_start_Vcm,2)); + +%% Remove NaN from simulated field data +nan_cut=(~isnan(sim_radius) & ~isnan(sim_drift) & ~isnan(sim_field)); +sim_radius=sim_radius(nan_cut); +sim_drift=sim_drift(nan_cut); +sim_field=sim_field(nan_cut); + +%% Make a 2D map of the field, with radius_bin and drift_bin vectors + + + +%% Can use griddata to interpolate the Field Map, but it doesn't work well for points outside the boundary +% We first find the boundary, use nearest neighbor interp outside of it, and cubic interp inside of it + +%Finds the boundary of the radius, drift_time scatter plot +clear r_center max_z +i=1; +r_step=0.5; +for r_max=[0.45:r_step:25]; + r_center(i)=mean(sim_radius(inrange(sim_radius,[r_max-r_step,r_max]))); + max_z(i)=max(sim_drift(inrange(sim_radius,[r_max-r_step,r_max]))); + i=i+1; +end + +% Construct the boundary from a spline fit to the maximum values found above +boundary_spline=csapi(r_center,max_z); + +%Evaluates if data is inside or outside the boundary +data_boundary=fnval(boundary_spline, s2radius); + +%A cut that is one in inside, zero if outside. Has extra specifications to avoid bad simulation data at low drift and radius +data_inside_bound=(s2drift<=data_boundary & s2drift>=20 & s2radius>=1); + +%To get field value for the data - first split into inside/outside bound data vectors +data_inbound_radius=s2radius(data_inside_bound); +data_inbound_drift=s2drift(data_inside_bound); +data_outbound_radius=s2radius(~data_inside_bound); +data_outbound_drift=s2drift(~data_inside_bound); + +%Interpolate: outside bound use nearest neighbor, inside bound use cubic +field_inbound_value=griddata(sim_drift,sim_radius,sim_field,data_inbound_drift,data_inbound_radius,'cubic'); + +%only uses nearest for sim_drift>=20 uSec to avoid problem at low drift in sim +field_outbound_value=griddata(sim_drift(sim_drift>=20),sim_radius(sim_drift>=20),sim_field(sim_drift>=20),data_outbound_drift,data_outbound_radius,'nearest'); + +%Patch inbound and outbound field values together +FieldValues=zeros(length(field_inbound_value)+length(field_outbound_value),1); +FieldValues(data_inside_bound)=field_inbound_value; +FieldValues(~data_inside_bound)=field_outbound_value; + +end + +%% For testing purposes, a way to make a heat plot of the field based on data or sims + +% %For data +% x=s2radius(inrange(s2radius,[0 25]) & inrange(drift_time,[0 300])); y=drift_time(inrange(s2radius,[0 25]) & inrange(drift_time,[0 300])); +% p=fieldvals(inrange(s2radius,[0 25]) & inrange(drift_time,[0 300])); + +% %For sims +% x=sim_radius(~isnan(sim_radius.*sim_drift.*sim_field)); y=sim_drift(~isnan(sim_radius.*sim_drift.*sim_field)); p=sim_field(~isnan(sim_radius.*sim_drift.*sim_field)); + +% %Makes heatmap with colorscale being the field value +% x2=round(x-min(x)+1); +% y2=round(y-min(y)+1); +% %fill array +% A=[]; +% for k=1:length(x), +% A(x2(k),y2(k))=p(k); +% end +% figure +% imagesc(A.'); +% colormap(jet); \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/FindG1EEStatError.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/FindG1EEStatError.m new file mode 100644 index 0000000..99c2146 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/FindG1EEStatError.m @@ -0,0 +1,26 @@ +load('S1aS1bParamScan_EnergyChi2_S1FloatPoly_S2Poly2015_ImprovedFineRes.mat') + + +%% Find EE array with everything else held constant +ee_cut=total_chi2_oldsim_list>0 & a2_list==besta2_oldsim & b2_list==bestb2_oldsim &... + g1_list==bestg1_oldsim; + + +% Find 1.4 chi2 diff = 0.68 interval = 1 sigma interval +EErange=ee_list(ee_cut); +Chi2range=total_chi2_oldsim_list(ee_cut); + +EEupperbound=max(EErange(Chi2range-min(Chi2range) < 1.4)); +EE_one_sig=EEupperbound-bestEE_oldsim + + +%% Repeat for g1 +g1_cut=total_chi2_oldsim_list>0 & a2_list==besta2_oldsim & b2_list==bestb2_oldsim &... + ee_list==bestEE_oldsim; + +% Find 1.4 chi2 diff = 0.68 interval = 1 sigma interval +g1range=g1_list(g1_cut); +Chi2range=total_chi2_oldsim_list(g1_cut); + +g1upperbound=max(g1range(Chi2range-min(Chi2range) < 1.4)); +g1_one_sig=g1upperbound-bestg1_oldsim diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/KrypCal_FindFieldDependence_Kr2p21_2015.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/KrypCal_FindFieldDependence_Kr2p21_2015.m new file mode 100644 index 0000000..4063860 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/KrypCal_FindFieldDependence_Kr2p21_2015.m @@ -0,0 +1,1901 @@ +%The desired outputs are the "field" corrections,s2z_normalization_fit, norm_S2_xy (and s2_xy_xbins s2_xy_ybins), +%mean_fit_s1z and norm_s1_xy (and s1_xy_xbins s1_xy_ybins) + +%Resrict s1a s1b to (inrange(s1a_phe_both,[90 250]) & inrange(s1b_phe_both,[35,90])) + + +%Apply corrections with +% s2_phe_bottom_xyz_z=s2_phe_bottom_xyz.*polyval(s2z_normalization_fit,0)./polyval(s2z_normalization_fit,drift_time) +% s2_phe_bottom_xyz_xyz=s2_phe_bottom_xyz_z.*interp2(s2_xy_xbins,s2_xy_ybins,norm_S2_xy,s2x,s2y,'spline'); +% s1_phe_both_xyz_z=s1_phe_both_xyz.*polyval(mean_fit_s1z,(det_edge-4)/2)./polyval(mean_fit_s1z,drift_time); +% s1_phe_both_xyz_xyz=s1_phe_both_xyz_z.*interp2(s1_xy_xbins,s1_xy_ybins,norm_S1_both,s2x,s2y,'spline'); + + +%%%%%%%%%%%%%%%%% +%First measure the "true" lifetime from CH3T, after removing field dependence based on NEST +%Note that earlier versions of this code assumed no field dependence in CH3T +%%%%%%%%%%%%%%%%% + +%Load in the uncorrected CH3T data, using cp 170** (Kr 2p13 IQs and DP2.1) +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\CH3T_Sep2015_NoCorrections.mat'); + +%Construct data vectors +s2radius=(s2x.^2+s2y.^2).^(1/2); +s2_phe_bottom=s2_phe_bottom(s2radius<25); +s2_phe_both=s2_phe_both(s2radius<25); +s1_phe_both=s1_phe_both(s2radius<25); +s1_phe_bottom=s1_phe_bottom(s2radius<25); +s2x=s2x(s2radius<25); +s2y=s2y(s2radius<25); +drift_time=drift_time(s2radius<25); +s2radius=s2radius(s2radius<25); + +%Cut down to only CH3T data +h3_area_cut=(inrange(s2_phe_both,[630 14000]) & inrange(s1_phe_both,[1 125])); +h3_s2_phe_bottom=s2_phe_bottom(h3_area_cut); +h3_s2_phe_both=s2_phe_both(h3_area_cut); +h3_drift_time=drift_time(h3_area_cut); +h3_radius=s2radius(h3_area_cut); +h3_x=s2x(h3_area_cut); +h3_y=s2y(h3_area_cut); + +%Sticking with Scott's 2D map instead of Lucie's 3D map for 4 reasons +% 1) It is easier to interpolate and extrapolate a 2D map +% 2) The maps are very similar until you get to the extrapolation regions +% 3) Lucie's map claims very strong jump in field right before the grids... and Scott's is more well behaved +% 4) Lucie's map has discrete jumps in the field over the entire lenght of z, due to how she places her charges +% %load in 3D field map from Lucie +% load('C:\Program Files\MATLAB\R2012a\bin\Run04_ERBand\Kr2p20\Sep2015_3Dfield_map.mat'); +% %inpaint it with spring method for interpolation +% FieldMap2015=inpaint_nans3(FieldMap2015,1); + +%Estimate field at CH3T data points +h3_field=EstimateField_Sep2015(h3_radius,h3_drift_time); + +%Plot the estimate of the field +x=h3_radius(inrange(h3_radius,[0 25]) & inrange(h3_drift_time,[0 300])); y=h3_drift_time(inrange(h3_radius,[0 25]) & inrange(h3_drift_time,[0 300])); +p=h3_field(inrange(h3_radius,[0 25]) & inrange(h3_drift_time,[0 300])); +x2=round(x-min(x)+1); +y2=round(y-min(y)+1); +A=[]; +for k=1:length(x), + A(x2(k),y2(k))=p(k); +end +figure +imagesc(A.'); +c=colormap(jet); +c(1,:)=[1 1 1]; +colormap(c); +h=colorbar; +myfigview(16); +ylabel(h,'Field Strength (V/cm)'); +xlabel('Radius (cm)'); +ylabel('Drift Time (uSec)'); + +%Use NEST to remove the field effect in the CH3T data, assuming E=2.5 keV +Energy_estimate=2.5; %Setting to 2.5 for now, maybe use better estimate for each data set in the future... it does have a large effect on r. Have to change r later in the code if I do so +TI_param=0.046.*h3_field.^-0.14; %based on PandaX work, which is consistent with Pixie work +N_q=Energy_estimate./0.0137; %number of quanta +alpha=0.11; %exciton to ion ratio +N_ion=N_q./(1+alpha); +h3_recomb=1-log(1+(TI_param./4).*N_ion)./((TI_param./4).*N_ion); %From NEST, based on energy (fixed for now) and where the event is in space + +%Plot estimate of recombination for CH3T +clear x y p +x=h3_radius(inrange(h3_radius,[0 25]) & inrange(h3_drift_time,[0 300])); y=h3_drift_time(inrange(h3_radius,[0 25]) & inrange(h3_drift_time,[0 300])); +p=h3_recomb(inrange(h3_radius,[0 25]) & inrange(h3_drift_time,[0 300])); +x2=round(x-min(x)+1); +y2=round(y-min(y)+1); +A=[]; +for k=1:length(x), + A(x2(k),y2(k))=p(k); +end +figure +imagesc(A.'); +c=colormap(jet); +c(1,:)=[1 1 1]; +colormap(c); +h=colorbar; +myfigview(16); +caxis([0.25, 0.32]); +ylabel(h,'Recombination Probability for 2.5 keV ER'); +xlabel('Radius (cm)'); +ylabel('Drift Time (uSec)'); + +%%%% Detector Center Detection %%%%%%% +h3x_center=mean(h3_x(h3_drift_time>4)); %exclude extraction field region at uSec<4 +h3y_center=mean(h3_y(h3_drift_time>4)); +h3z_center=mean(h3_drift_time(h3_drift_time>4)); + +%Determine the field dependence from CH3T data +%This is doing event by event basis, maybe it'd be better to do a 3D map and interpolate instead. +Nphot=N_q.*(alpha./(1+alpha))+N_ion.*h3_recomb; +Nelec=N_q-Nphot; +Nphot_center=mean(Nphot(inrange(h3_drift_time,[h3z_center-30 h3z_center+30]) & inrange(h3_x,[h3x_center-5 h3x_center+5]) & inrange(h3_y,[h3y_center-5 h3y_center+5]))); +Nelec_center=mean(Nelec(inrange(h3_drift_time,[h3z_center-30 h3z_center+30]) & inrange(h3_x,[h3x_center-5 h3x_center+5]) & inrange(h3_y,[h3y_center-5 h3y_center+5]))); +h3_r_center=mean(h3_recomb(inrange(h3_drift_time,[h3z_center-30 h3z_center+30]) & inrange(h3_x,[h3x_center-5 h3x_center+5]) & inrange(h3_y,[h3y_center-5 h3y_center+5]))); + +h3_S1fieldremoval=Nphot_center./Nphot; +h3_S2fieldremoval=Nelec_center./Nelec; + +%Removing field from S2. Don't care about S1 since it isn't used in this code +h3_s2_phe_bottom=h3_s2_phe_bottom.*h3_S2fieldremoval; +h3_s2_phe_both=h3_s2_phe_both.*h3_S2fieldremoval; + + + +%% Get lifetime for s2_bottom -- there's a ~4% systematic based on what I pick s2_limit to be, 2% systematic based on what I pick binning to be. Keeping dT spacing large helps negate these effects +s2_limit=2000; %For TAGCB=1,7,1,8.5,2 s2_limit=2500, FOR TAGCB=1,7,2,10,2 s2_limit=1200 +s2_min=400; %For TAGCB=1,7,1,8.5,2 = s2_min=100, FOR TAGCB=1,7,2,10,2 s2_min=s2_min + +dT_step=10; +i=1; + +for dT_max=10+dT_step:dT_step:330; +h3_mean(i)=histfitlandau(h3_s2_phe_bottom(inrange(h3_radius,[0 25]) & inrange(h3_drift_time,[dT_max-dT_step dT_max])), 150, 400, (s2_limit+(285-dT_max)*2.0408)); +dT_loc(i)=dT_max-dT_step/2; +i=i+1; +end + +h3_mean_fit=fit(dT_loc(2:end-1).',h3_mean(2:end-1).','exp1'); +fit_points=0:2:310; +h3_fit_line=h3_mean_fit.a.*exp(h3_mean_fit.b.*fit_points); + +figure +scatter(dT_loc,h3_mean,'.k'); +hold on; +plot(fit_points,h3_fit_line,'-r','LineWidth',2); +xlabel('Drift Time (uSec)');ylabel('Uncorrected CH3T S2Bot Peak (phe)'); myfigview(16); +title('Electron Lifetime Extracted from Landau Fits to CH3T'); +e_lifetime_landau=-1/h3_mean_fit.b; +b=confint(h3_mean_fit, 0.683);%1 sigma matrix +sigma_e_lifetime=(1/b(1,2)-1/b(2,2))/2; +legend('S2\_bottom Mean', strcat( '\lambda= ', num2str(e_lifetime_landau,4), ' \pm ', num2str(sigma_e_lifetime,2), ' \mus' )... + ,'location','northeast'); + + + +s2_bot_norm_z_index=dT_loc; +s2_bot_norm_z_means=h3_mean; + s2_at_top=RK_1DCubicInterp_LinearExtrap(s2_bot_norm_z_index,s2_bot_norm_z_means,4); %normalize to right below the gate, spline doesnt work well here + +%Checking interp +figure +hold on; +plot([0:1:350],RK_1DCubicInterp_LinearExtrap(s2_bot_norm_z_index,s2_bot_norm_z_means,[0:1:350]),'.r') %spline doesnt work well here +plot(s2_bot_norm_z_index,s2_bot_norm_z_means,'.k') +xlabel('Drift Time'); +ylabel('S2 bot interp'); +myfigview(16); + + s2_bot_norm_z=RK_1DCubicInterp_LinearExtrap(s2_bot_norm_z_index,s2_bot_norm_z_means,4)./s2_bot_norm_z_means; + %%Tracker for pseudo-lifetime + s2_at_bottom=RK_1DCubicInterp_LinearExtrap(s2_bot_norm_z_index,s2_bot_norm_z_means,320); + pseudo_lifetime_2014_bot=-320/log(s2_at_bottom/s2_at_top); + +%Show some slices for Landau +dT_step=60; +figure +hold on; +colors={'r','b','g'}; +colors2={[1 0.6 0.6],[0.6 0.6 1],[0.6 1 0.6]}; +i=1; + while i <4 +for dT_max=30+dT_step:dT_step:310-dT_step; +val=h3_s2_phe_bottom(inrange(h3_drift_time,[dT_max-dT_step dT_max])); +passo=75; +inizio=s2_min; +fine=(s2_limit+(285-dT_max)*2.0408);%s2_limit; +[y,x]=hist_(val,passo,min(val),fine,fine,1); +step(val,[inizio:passo:fine],colors2{i}) +x=x+passo/2; +inz=find(x 600; + h3_s2_bottom_xymeans(j,i)=histfitlandau(h3_s2_phe_bottom_z(inrange(h3_drift_time,[10 330]) & inrange(h3_x,[x_bin-xx_step x_bin+xx_step]) & inrange(h3_y,[y_bin-yy_step y_bin+yy_step])), 100, 400, 2500); + + else + + h3_s2_bottom_xymeans(j,i)=0; + + end + j=j+1; + end + i=i+1; + end + + h3_s2_bottom_xymeans(isnan(h3_s2_bottom_xymeans)) = 0; + + +%%Plot the correction S2_XY bottom %%%%%%%%%%%%%%% + +s2x_bins=-25+xx_step/2:xx_step:25-xx_step/2; +s2y_bins=-25+yy_step/2:yy_step:25-yy_step/2; + +old_s2xbins=s2x_bins; +old_s2ybins=s2y_bins; + + color_range_max=max(max(h3_s2_bottom_xymeans)); + color_range_min=min(min(h3_s2_bottom_xymeans(h3_s2_bottom_xymeans>0))); + vc_step=(color_range_max-color_range_min)/50; + + vc=color_range_min:vc_step:color_range_max; + + s2_xy_bottom_fig = figure; + contourf(s2x_bins,s2y_bins,h3_s2_bottom_xymeans,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat('S2 Mean (Bottom PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'Phe','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + %Remove zeros before interpolating +% h3_s2_bottom_xymeans(h3_s2_bottom_xymeans==0)=NaN; +% h3_s2_bottom_xymeans=inpaint_nans(h3_s2_bottom_xymeans,3); + + %Calculate corrections matrix and 1 sigma corrections matrix +center=interp2(s2x_bins,s2y_bins,h3_s2_bottom_xymeans,h3x_center,h3y_center,'spline');%Normalize to the center (x=y=0) +norm_S2_bot=center./h3_s2_bottom_xymeans; +norm_S2_bot(isinf(norm_S2_bot))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_bot(isnan(norm_S2_bot))=1; +% +% sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_bottom,0,0,'spline',1);%Normalize to the center (x=y=0) +% sigma_norm_S2_bot=sqrt((sigma_center./mean_S2_bottom_xy).^2+(Sigma_S2_bottom.*center./mean_S2_bottom_xy.^2).^2); +% sigma_norm_S2_bot(isinf(sigma_norm_S2_bot))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +% sigma_norm_S2_bot(isnan(sigma_norm_S2_bot))=1;%no nan. Set Sigma=1, which is 100% uncertainty +% +h3_s2_phe_bottom_xyz=h3_s2_phe_bottom_z.*interp2(s2x_bins,s2y_bins,norm_S2_bot,h3_x,h3_y,'spline',1); + +figure +%Showing that the correction worked +xx_step=3; +yy_step=3; +h3_s2_bottom_xymeans_test = zeros(floor(50/yy_step),floor(50/xx_step)); +i=1; + for x_bin=-25+xx_step/2:xx_step:25-xx_step/2 + j=1; + for y_bin=-25+yy_step/2:yy_step:25-yy_step/2 + if length(h3_s2_phe_bottom_z(inrange(h3_drift_time,[10 330]) & inrange(h3_x,[x_bin-xx_step x_bin+xx_step]) & inrange(h3_y,[y_bin-yy_step y_bin+yy_step]))) > 600; + h3_s2_bottom_xymeans_test(j,i)=histfitlandau(h3_s2_phe_bottom_xyz(inrange(h3_drift_time,[10 330]) & inrange(h3_x,[x_bin-xx_step x_bin+xx_step]) & inrange(h3_y,[y_bin-yy_step y_bin+yy_step])), 100, 400, 2500); + + else + + h3_s2_bottom_xymeans_test(j,i)=0; + + end + j=j+1; + end + i=i+1; + end + + h3_s2_bottom_xymeans_test(isnan(h3_s2_bottom_xymeans_test)) = 0; + + +%%Plot the correction S2_XY bottom %%%%%%%%%%%%%%% + +s2x_bins=-25+xx_step/2:xx_step:25-xx_step/2; +s2y_bins=-25+yy_step/2:yy_step:25-yy_step/2; + + color_range_max=max(max(h3_s2_bottom_xymeans_test)); + color_range_min=min(min(h3_s2_bottom_xymeans_test(h3_s2_bottom_xymeans_test>0))); + vc_step=(color_range_max-color_range_min)/50; + + vc=color_range_min:vc_step:color_range_max; + + s2_xy_bottom_fig = figure; + contourf(s2x_bins,s2y_bins,h3_s2_bottom_xymeans_test,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat('XYZ Corrected S2 Mean (Bottom PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'Phe','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); +%% Getting S2 XY for using S2 both + +%%%%%%%%%%%%%%%%%%% +% Get S2 XY geomtric corrections based on CH3T +%%%%%%%%%%%%%%%%%%% +clear x2 hist_bin + +xx_step=3; +yy_step=3; +%set up matricies to be filled +h3_s2_both_xymeans = zeros(floor(50/yy_step),floor(50/xx_step)); +i=1; + for x_bin=-25+xx_step/2:xx_step:25-xx_step/2 + j=1; + for y_bin=-25+yy_step/2:yy_step:25-yy_step/2 + if length(h3_s2_phe_both_z(inrange(h3_drift_time,[10 330]) & inrange(h3_x,[x_bin-xx_step x_bin+xx_step]) & inrange(h3_y,[y_bin-yy_step y_bin+yy_step]))) > 600; + h3_s2_both_xymeans(j,i)=histfitlandau(h3_s2_phe_both_z(inrange(h3_drift_time,[10 330]) & inrange(h3_x,[x_bin-xx_step x_bin+xx_step]) & inrange(h3_y,[y_bin-yy_step y_bin+yy_step])), 100, 400, 5000); + + else + + h3_s2_both_xymeans(j,i)=0; + + end + j=j+1; + end + i=i+1; + end + + h3_s2_both_xymeans(isnan(h3_s2_both_xymeans)) = 0; + + +%%Plot the correction S2_XY bottom %%%%%%%%%%%%%%% + +s2x_bins=-25+xx_step/2:xx_step:25-xx_step/2; +s2y_bins=-25+yy_step/2:yy_step:25-yy_step/2; + +old_s2xbins_both=s2x_bins; +old_s2ybins_both=s2y_bins; + + color_range_max=max(max(h3_s2_both_xymeans)); + color_range_min=min(min(h3_s2_both_xymeans(h3_s2_both_xymeans>0))); + vc_step=(color_range_max-color_range_min)/50; + + vc=color_range_min:vc_step:color_range_max; + + s2_xy_both_fig = figure; + contourf(s2x_bins,s2y_bins,h3_s2_both_xymeans,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat('S2 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'Phe','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + %Remove zeros before interpolating +% h3_s2_both_xymeans(h3_s2_both_xymeans==0)=NaN; +% h3_s2_both_xymeans=inpaint_nans(h3_s2_both_xymeans,3); + + %Calculate corrections matrix and 1 sigma corrections matrix +center=interp2(s2x_bins,s2y_bins,h3_s2_both_xymeans,h3x_center,h3y_center,'spline');%Normalize to the center (x=y=0) +norm_S2_both=center./h3_s2_both_xymeans; +norm_S2_both(isinf(norm_S2_both))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_both(isnan(norm_S2_both))=1; + +h3_s2_phe_both_xyz=h3_s2_phe_both_z.*interp2(s2x_bins,s2y_bins,norm_S2_both,h3_x,h3_y,'spline',1); + +figure +%Showing that the correction worked +xx_step=3; +yy_step=3; +h3_s2_both_xymeans_test = zeros(floor(50/yy_step),floor(50/xx_step)); +i=1; + for x_bin=-25+xx_step/2:xx_step:25-xx_step/2 + j=1; + for y_bin=-25+yy_step/2:yy_step:25-yy_step/2 + if length(h3_s2_phe_both_z(inrange(h3_drift_time,[10 330]) & inrange(h3_x,[x_bin-xx_step x_bin+xx_step]) & inrange(h3_y,[y_bin-yy_step y_bin+yy_step]))) > 600; + h3_s2_both_xymeans_test(j,i)=histfitlandau(h3_s2_phe_both_xyz(inrange(h3_drift_time,[10 330]) & inrange(h3_x,[x_bin-xx_step x_bin+xx_step]) & inrange(h3_y,[y_bin-yy_step y_bin+yy_step])), 100, 400, 5000); + + else + + h3_s2_both_xymeans_test(j,i)=0; + + end + j=j+1; + end + i=i+1; + end + + h3_s2_both_xymeans_test(isnan(h3_s2_both_xymeans_test)) = 0; + + +%%Plot the correction S2_XY bottom %%%%%%%%%%%%%%% + +s2x_bins=-25+xx_step/2:xx_step:25-xx_step/2; +s2y_bins=-25+yy_step/2:yy_step:25-yy_step/2; + + color_range_max=max(max(h3_s2_both_xymeans_test)); + color_range_min=min(min(h3_s2_both_xymeans_test(h3_s2_both_xymeans_test>0))); + vc_step=(color_range_max-color_range_min)/50; + + vc=color_range_min:vc_step:color_range_max; + + s2_xy_both_fig = figure; + contourf(s2x_bins,s2y_bins,h3_s2_both_xymeans_test,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat('XYZ Corrected S2 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'Phe','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + +%% Loading in Krypton data + +%%%%%%%%%%%%%%%%%%%%%% +%Correct the Kr data with the lifetime found above +%%%%%%%%%%%%%%%%%%%%%% +dir_path='C:\Users\Richard\Desktop\LUX Analysis\'; +user_name='RichardKnoche'; +dp_version='2.0'; +algorithm_name='LUXkrypCal'; +use_ccv_flag=1; + +% folders_to_load{1}='Run04_CH3T_Kr2p13 IQs\lux10_20140903T1918_cp17059'; %tritium is on 20140905 +folders_to_load{1}='lux10_20150929T1905_cp18197'; + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'z_corrected_pulse_area_all_phe','xyz_corrected_pulse_area_all_phe'... + ,'xyz_corrected_pulse_area_bot_phe'... + ,'top_bottom_ratio','x_cm'... + ,'y_cm','z_corrected_pulse_area_bot_phe','xyz_corrected_pulse_area_bot_phe'... + ,'full_evt_area_phe','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe','Kr83fit_dt_samples'}; + +path=strcat(dir_path,'/',folders_to_load{1}); +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +%% Defining cuts and variables + +submit=0; +delay_min=0; +grid_size=2; %cm XY plane + +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 20;%100 +s1area_bound_max = 600;%600 + +s2area_bound_min = 100;%200 %change to cut out CH3T if needed +s2area_bound_max = 35000;%30000 + +min_evts_per_bin = 200; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + +% Pulse Classification + Pulse_Class=1; + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events + +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + +% Old cuts +% s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); +% s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); +% s1_class=(d.pulse_classification==1 | d.pulse_classification==9) & s1_area_cut ; +% s2_class=(d.pulse_classification==2) & s2_area_cut ; +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,10,1)); +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,10,1)); +% + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_number=d.event_number(evt_cut); + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + + s2radius = (s2x.^2+s2y.^2).^(0.5); + clean_cut = (log10(s1_phe_both)+0.6*log10(s2_phe_both)>4.5) & s2radius<25; + + s1_phe_bottom=s1_phe_bottom(clean_cut); + s1_phe_both=s1_phe_both(clean_cut); + s2_phe_bottom=s2_phe_bottom(clean_cut); + s2_phe_both=s2_phe_both(clean_cut); + drift_time=drift_time(clean_cut); + s2x=s2x(clean_cut); + s2y=s2y(clean_cut); + s2radius = (s2x.^2+s2y.^2).^(0.5); + event_timestamp_samples=event_timestamp_samples(clean_cut); + + %%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + +%%%%%%%%%%%%%%%%% +%Correcting S2 Z and finds remaining "field" dependence +%%%%%%%%%%%%%%%%% + + %%%%%%%% CORRECTING S2 SIGNAL BASED ON CH3T %%%%%%%%%%%%% + clear hist_s2_bottom Fit_s2_bottom means means_error mean_index mean_ratios s2_phe_bottom_zslice +% electron_lifetime=e_lifetime_landau; + + s2_phe_bottom_z=s2_phe_bottom.*RK_1DCubicInterp_LinearExtrap(s2_bot_norm_z_index,s2_bot_norm_z, drift_time); + s2_phe_bottom_xyz=s2_phe_bottom_z.*interp2(old_s2xbins,old_s2ybins,norm_S2_bot,s2x,s2y,'spline',1); + s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + s2_phe_both_xyz=s2_phe_both_z.*interp2(old_s2xbins_both,old_s2ybins_both,norm_S2_both,s2x,s2y,'spline',1); + + %Plotting the corrections + figure + hold on; + plot(drift_time,RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time).*interp2(old_s2xbins,old_s2ybins,norm_S2_both,s2x,s2y,'spline',1),'.k') + plot(drift_time,RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time),'.r') + xlabel('Drift Time'); ylabel('S2 corrections'); legend('Z','XYZ');myfigview(16); + +%Calculating remaining S2 Z dependence using S2 bot +clear dT_loc s2z_mean s2z_fit +dT_step=10; +i=1; +for dT_max=10+dT_step:dT_step:320; +s2z_fit=fit([0:100:16000]',hist(s2_phe_bottom_xyz(inrange(s2radius,[0 25]) & inrange(drift_time,[dT_max-dT_step dT_max])),[0:100:16000])','gauss1'); +s2z_mean_bottom(i)=s2z_fit.b1; +znorm_dT_loc(i)=dT_max-dT_step/2; +i=i+1; +end + + +% % Making a plot of the S2 Z dependence +% figure +% hold on; +% i=1; +% for dT_max=90:60:210; +% s2z_fit_temp=fit([2000:200:16000]',hist(s2_phe_bottom_xyz(inrange(s2radius,[0 25]) & inrange(drift_time,[dT_max-60 dT_max])),[2000:200:16000])','gauss1'); +% step(s2_phe_bottom_xyz(inrange(s2radius,[0 25]) & inrange(drift_time,[dT_max-60 dT_max])),[2000:200:16000],colors2{i}); +% x=[2000:200:16000]; y=s2z_fit_temp.a1.*exp(-((x-s2z_fit_temp.b1)./s2z_fit_temp.c1).^2); +% i=i+1; +% end +% legend('30-90 uSec','90-150 uSec','150-210 uSec'); +% myfigview(16); +% xlabel('S2_E (phe)'); ylabel('Counts'); +% i=1; +% for dT_max=90:60:210; +% s2z_fit_temp=fit([2000:200:16000]',hist(s2_phe_bottom_xyz(inrange(s2radius,[0 25]) & inrange(drift_time,[dT_max-60 dT_max])),[2000:200:16000])','gauss1'); +% % step(s2_phe_bottom_xyz(inrange(s2radius,[0 25]) & inrange(drift_time,[dT_max-60 dT_max])),[2000:200:16000],colors{i}); +% x=[2000:200:16000]; y=s2z_fit_temp.a1.*exp(-((x-s2z_fit_temp.b1)./s2z_fit_temp.c1).^2); plot(x,y,'LineWidth',2,'Color',colors{i}); +% i=i+1; +% end + +s2_field_dep_z_bins_bottom=znorm_dT_loc; +s2_field_dep_z_bottom=s2z_mean_bottom; + +% s2z_normalization_fit_bot=polyfit(znorm_dT_loc,s2z_mean_bottom,6); +fit_points=0:2:330; +s2z_fit_line=RK_1DCubicInterp_LinearExtrap(s2_field_dep_z_bins_bottom,s2_field_dep_z_bottom,fit_points); + +figure +scatter(znorm_dT_loc,s2z_mean_bottom,'.k'); +hold on; +plot(fit_points,s2z_fit_line,'-r','LineWidth',2); +xlabel('Drift Time (uSec)');ylabel('CH3T Corrected Kr S2 Peak (phe)'); myfigview(16); +title('Field Effect from CH3T Corrected Kr S2 Peaks'); + + +s2_phe_bottom_xyz_z=s2_phe_bottom_xyz.*RK_1DCubicInterp_LinearExtrap(s2_field_dep_z_bins_bottom,s2_field_dep_z_bottom,z_center)./RK_1DCubicInterp_LinearExtrap(s2_field_dep_z_bins_bottom,s2_field_dep_z_bottom,drift_time); + +% %Checking interp +% figure +% plot(drift_time,s2_phe_bottom_xyz_z,'.k') + +%%Showing Z correction worked +i=1; +for dT_max=10+dT_step:dT_step:320; +s2z_fit=fit([0:100:16000]',hist(s2_phe_bottom_xyz_z(inrange(s2radius,[0 25]) & inrange(drift_time,[dT_max-dT_step dT_max])),[0:100:16000])','gauss1'); +s2z_mean_bottom_z(i)=s2z_fit.b1; +i=i+1; +end + +figure +scatter(znorm_dT_loc,s2z_mean_bottom_z,'.k') +hold on; +scatter(znorm_dT_loc,s2z_mean_bottom,'.r'); +xlabel('Drift Time (uSec)');ylabel('Kr S2 (phe)'); +legend('CH3T and Field Corrected - S2 bot','CH3T Corrected'); +title('Showing Field Correction works'); +myfigview(16); + +%% + +%Calculating remaining S2 Z dependence using S2 both +clear dT_loc s2z_fit +dT_step=10; +i=1; +for dT_max=10+dT_step:dT_step:320; +s2z_fit_both=fit([0:200:40000]',hist(s2_phe_both_xyz(inrange(s2radius,[0 25]) & inrange(drift_time,[dT_max-dT_step dT_max])),[0:200:40000])','gauss1'); +s2z_mean_both(i)=s2z_fit_both.b1; +znorm_dT_loc(i)=dT_max-dT_step/2; +i=i+1; +end + +s2_field_dep_z_bins_both=znorm_dT_loc; +s2_field_dep_z_both=s2z_mean_both; + +% s2z_normalization_fit_both=polyfit(znorm_dT_loc,s2z_mean_both,6); +fit_points=0:2:330; +s2z_fit_line=RK_1DCubicInterp_LinearExtrap(s2_field_dep_z_bins_both,s2_field_dep_z_both,fit_points); + +figure +scatter(znorm_dT_loc,s2z_mean_both,'.k'); +hold on; +plot(fit_points,s2z_fit_line,'-r','LineWidth',2); +xlabel('Drift Time (uSec)');ylabel('CH3T Corrected Kr S2Both Peak (phe)'); myfigview(16); +title('Field Effect from CH3T Corrected Kr S2Both Peaks'); + +% Making a plot of the S2 Z dependence +% figure +% hold on; +% i=1; +% for dT_max=90:60:210; +% s2z_fit_temp=fit([3000:200:35000]',hist(s2_phe_both_xyz(inrange(s2radius,[0 25]) & inrange(drift_time,[dT_max-60 dT_max])),[3000:200:35000])','gauss1'); +% step(s2_phe_both_xyz(inrange(s2radius,[0 25]) & inrange(drift_time,[dT_max-60 dT_max])),[3000:200:35000],colors2{i}); +% % x=[2000:200:16000]; y=s2z_fit_temp.a1.*exp(-((x-s2z_fit_temp.b1)./s2z_fit_temp.c1).^2); +% i=i+1; +% end +% legend('30-90 uSec','90-150 uSec','150-210 uSec'); +% myfigview(16); +% xlabel('S2_E (phe)'); ylabel('Counts'); +% i=1; +% for dT_max=90:60:210; +% s2z_fit_temp=fit([3000:200:35000]',hist(s2_phe_both_xyz(inrange(s2radius,[0 25]) & inrange(drift_time,[dT_max-60 dT_max])),[3000:200:35000])','gauss1'); +% % step(s2_phe_bottom_xyz(inrange(s2radius,[0 25]) & inrange(drift_time,[dT_max-60 dT_max])),[2000:200:16000],colors{i}); +% x=[3000:200:35000]; y=s2z_fit_temp.a1.*exp(-((x-s2z_fit_temp.b1)./s2z_fit_temp.c1).^2); plot(x,y,'LineWidth',2,'Color',colors{i}); +% i=i+1; +% end + + + +s2_phe_both_xyz_z=s2_phe_both_xyz.*RK_1DCubicInterp_LinearExtrap(s2_field_dep_z_bins_both,s2_field_dep_z_both,z_center)./RK_1DCubicInterp_LinearExtrap(s2_field_dep_z_bins_both,s2_field_dep_z_both,drift_time); + +%%Showing Z correction worked +i=1; +for dT_max=10+dT_step:dT_step:320; +s2z_fit=fit([0:200:40000]',hist(s2_phe_both_xyz_z(inrange(s2radius,[0 25]) & inrange(drift_time,[dT_max-dT_step dT_max])),[0:200:40000])','gauss1'); +s2z_mean_z(i)=s2z_fit.b1; +i=i+1; +end + +figure +scatter(znorm_dT_loc,s2z_mean_z,'.k') +hold on; +scatter(znorm_dT_loc,s2z_mean_both,'.r'); +xlabel('Drift Time (uSec)');ylabel('Kr S2 (phe)'); +legend('CH3T and Field Corrected - S2 both','CH3T Corrected'); +title('Showing Field Correction works - S2 both'); +myfigview(16); + +%% +%Corrects S2 XY and finds remaining "field" dependence + +clear s2_phe_bottom_xyz_z_xymeans s2_phe_bottom_xyz_z_xymeans_err +%Calculating remaining S2 XY dependence +xx_step=2; +yy_step=2; +s2_phe_bottom_xyz_z_xymeans = zeros(floor(50/yy_step),floor(50/xx_step)); +s2_phe_bottom_xyz_z_xymeans_err = zeros(floor(50/yy_step),floor(50/xx_step)); +i=1; + for x_bin=-25+xx_step/2:xx_step:25-xx_step/2 + j=1; + for y_bin=-25+yy_step/2:yy_step:25-yy_step/2 + if length(s2_phe_bottom_xyz_z(inrange(drift_time,[10 330]) & inrange(s2x,[x_bin-xx_step x_bin+xx_step]) & inrange(s2y,[y_bin-yy_step y_bin+yy_step]))) > 300; + s2_phe_bottom_xyz_z_xymeans_fit=fit([0:100:40000]',hist(s2_phe_bottom_xyz_z(inrange(drift_time,[10 330]) & inrange(s2x,[x_bin-xx_step x_bin+xx_step]) & inrange(s2y,[y_bin-yy_step y_bin+yy_step])),[0:100:40000])','gauss1'); + s2_phe_bottom_xyz_z_xymeans(j,i)=s2_phe_bottom_xyz_z_xymeans_fit.b1; + clear temp + temp=confint(s2_phe_bottom_xyz_z_xymeans_fit,0.683); + s2_phe_bottom_xyz_z_xymeans_err(j,i)=abs(s2_phe_bottom_xyz_z_xymeans(j,i)-temp(1,2)); + else + s2_phe_bottom_xyz_z_xymeans(j,i)=0; + s2_phe_bottom_xyz_z_xymeans_err(j,i)=0; + end + j=j+1; + end + i=i+1; + end + + + %Remove zeros before interpolating +% s2_phe_bottom_xyz_z_xymeans(s2_phe_bottom_xyz_z_xymeans==0)=NaN; +% s2_phe_bottom_xyz_z_xymeans=inpaint_nans(s2_phe_bottom_xyz_z_xymeans,3); +% s2_phe_bottom_xyz_z_xymeans_err(s2_phe_bottom_xyz_z_xymeans_err==0)=NaN; +% s2_phe_bottom_xyz_z_xymeans_err=inpaint_nans(s2_phe_bottom_xyz_z_xymeans_err,3); + +s2xbins=-25+xx_step/2:xx_step:25-xx_step/2; +s2ybins=-25+yy_step/2:yy_step:25-yy_step/2; +xy_center=interp2(s2xbins,s2ybins,s2_phe_bottom_xyz_z_xymeans,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_s2_xy_bot=xy_center./s2_phe_bottom_xyz_z_xymeans; +norm_s2_xy_bot(isinf(norm_s2_xy_bot))=1;%no infinity! Do not correct events outside r=25cm +norm_s2_xy_bot(isnan(norm_s2_xy_bot))=1; + +s2_field_dep_xy_bottom=s2_phe_bottom_xyz_z_xymeans; +s2_field_dep_xy_bottom_err=s2_phe_bottom_xyz_z_xymeans_err; +s2_field_dep_xy_xbins_bottom=s2xbins; +s2_field_dep_xy_ybins_bottom=s2ybins; + +s2_phe_bottom_xyz_xyz=s2_phe_bottom_xyz_z.*interp2(s2xbins,s2ybins,norm_s2_xy_bot,s2x,s2y,'spline',1); +s2_xy_xbins_bot=s2xbins; +s2_xy_ybins_bot=s2ybins; + +%Showing that XY correction worked +xx_step=2; +yy_step=2; +s2_phe_bottom_xyz_xyz_xymeans = zeros(floor(50/yy_step),floor(50/xx_step)); +i=1; + for x_bin=-25+xx_step/2:xx_step:25-xx_step/2 + j=1; + for y_bin=-25+yy_step/2:yy_step:25-yy_step/2 + if length(s2_phe_bottom_xyz_z(inrange(drift_time,[10 330]) & inrange(s2x,[x_bin-xx_step x_bin+xx_step]) & inrange(s2y,[y_bin-yy_step y_bin+yy_step]))) > 300; + s2_phe_bottom_xyz_xyz_xymeans_fit=fit([0:100:40000]',hist(s2_phe_bottom_xyz_xyz(inrange(drift_time,[10 330]) & inrange(s2x,[x_bin-xx_step x_bin+xx_step]) & inrange(s2y,[y_bin-yy_step y_bin+yy_step])),[0:100:40000])','gauss1'); + s2_phe_bottom_xyz_xyz_xymeans(j,i)=s2_phe_bottom_xyz_xyz_xymeans_fit.b1; + else + s2_phe_bottom_xyz_xyz_xymeans(j,i)=0; + end + j=j+1; + end + i=i+1; + end +s2x_bins=-25+xx_step/2:xx_step:25-xx_step/2; +s2y_bins=-25+yy_step/2:yy_step:25-yy_step/2; + + color_range_max=max(max(s2_phe_bottom_xyz_xyz_xymeans)); + color_range_min=min(min(s2_phe_bottom_xyz_xyz_xymeans(s2_phe_bottom_xyz_xyz_xymeans>0))); + vc_step=(color_range_max-color_range_min)/50; + + vc=color_range_min:vc_step:color_range_max; + + s2_xy_bottom_fig = figure; + contourf(s2x_bins,s2y_bins,s2_phe_bottom_xyz_xyz_xymeans,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat('S2 Mean (Bottom PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'Phe','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); +%% +%Corrects S2 Both XY and finds remaining "field" dependence + +clear s2_phe_both_xyz_z_xymeans +%Calculating remaining S2 XY dependence +xx_step=2; +yy_step=2; +s2_phe_both_xyz_z_xymeans = zeros(floor(50/yy_step),floor(50/xx_step)); +s2_phe_both_xyz_z_xymeans_err = zeros(floor(50/yy_step),floor(50/xx_step)); +i=1; + for x_bin=-25+xx_step/2:xx_step:25-xx_step/2 + j=1; + for y_bin=-25+yy_step/2:yy_step:25-yy_step/2 + if length(s2_phe_both_xyz_z(inrange(drift_time,[10 330]) & inrange(s2x,[x_bin-xx_step x_bin+xx_step]) & inrange(s2y,[y_bin-yy_step y_bin+yy_step]))) > 300; + s2_phe_both_xyz_z_xymeans_fit=fit([0:200:60000]',hist(s2_phe_both_xyz_z(inrange(drift_time,[10 330]) & inrange(s2x,[x_bin-xx_step x_bin+xx_step]) & inrange(s2y,[y_bin-yy_step y_bin+yy_step])),[0:200:60000])','gauss1'); + s2_phe_both_xyz_z_xymeans(j,i)=s2_phe_both_xyz_z_xymeans_fit.b1; + clear temp + temp=confint(s2_phe_both_xyz_z_xymeans_fit,0.683); + s2_phe_both_xyz_z_xymeans_err(j,i)=abs(s2_phe_both_xyz_z_xymeans(j,i)-temp(1,2)); + else + s2_phe_both_xyz_z_xymeans(j,i)=0; + s2_phe_both_xyz_z_xymeans_err(j,i)=0; + end + j=j+1; + end + i=i+1; + end + + + %Remove zeros before interpolating +% s2_phe_both_xyz_z_xymeans(s2_phe_both_xyz_z_xymeans==0)=NaN; +% s2_phe_both_xyz_z_xymeans=inpaint_nans(s2_phe_both_xyz_z_xymeans,3); +% s2_phe_both_xyz_z_xymeans_err(s2_phe_both_xyz_z_xymeans_err==0)=NaN; +% s2_phe_both_xyz_z_xymeans_err=inpaint_nans(s2_phe_both_xyz_z_xymeans_err,3); + + +s2xbins=-25+xx_step/2:xx_step:25-xx_step/2; +s2ybins=-25+yy_step/2:yy_step:25-yy_step/2; +xy_center=interp2(s2xbins,s2ybins,s2_phe_both_xyz_z_xymeans,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S2_xy_both=xy_center./s2_phe_both_xyz_z_xymeans; +norm_S2_xy_both(isinf(norm_S2_xy_both))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_xy_both(isnan(norm_S2_xy_both))=1; + + +s2_field_dep_xy_both=s2_phe_both_xyz_z_xymeans; +s2_field_dep_xy_both_err=s2_phe_both_xyz_z_xymeans_err; +s2_field_dep_xy_xbins_both=s2xbins; +s2_field_dep_xy_ybins_both=s2ybins; + +s2_phe_both_xyz_xyz=s2_phe_both_xyz_z.*interp2(s2xbins,s2ybins,norm_S2_xy_both,s2x,s2y,'spline',1); +s2_xy_xbins_both=s2xbins; +s2_xy_ybins_both=s2ybins; + +%Showing that XY correction worked +xx_step=2; +yy_step=2; +s2_phe_both_xyz_xyz_xymeans = zeros(floor(50/yy_step),floor(50/xx_step)); +i=1; + for x_bin=-25+xx_step/2:xx_step:25-xx_step/2 + j=1; + for y_bin=-25+yy_step/2:yy_step:25-yy_step/2 + if length(s2_phe_both_xyz_z(inrange(drift_time,[10 330]) & inrange(s2x,[x_bin-xx_step x_bin+xx_step]) & inrange(s2y,[y_bin-yy_step y_bin+yy_step]))) > 300; + s2_phe_both_xyz_xyz_xymeans_fit=fit([0:200:60000]',hist(s2_phe_both_xyz_xyz(inrange(drift_time,[10 330]) & inrange(s2x,[x_bin-xx_step x_bin+xx_step]) & inrange(s2y,[y_bin-yy_step y_bin+yy_step])),[0:200:60000])','gauss1'); + s2_phe_both_xyz_xyz_xymeans(j,i)=s2_phe_both_xyz_xyz_xymeans_fit.b1; + else + s2_phe_both_xyz_xyz_xymeans(j,i)=0; + end + j=j+1; + end + i=i+1; + end +s2x_bins=-25+xx_step/2:xx_step:25-xx_step/2; +s2y_bins=-25+yy_step/2:yy_step:25-yy_step/2; + + color_range_max=max(max(s2_phe_both_xyz_xyz_xymeans)); + color_range_min=min(min(s2_phe_both_xyz_xyz_xymeans(s2_phe_both_xyz_xyz_xymeans>0))); + vc_step=(color_range_max-color_range_min)/50; + + vc=color_range_min:vc_step:color_range_max; + + s2_xy_both_fig = figure; + contourf(s2x_bins,s2y_bins,s2_phe_both_xyz_xyz_xymeans,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat('S2 Mean (both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'Phe','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + +%Removing zeros from the matrix +% s2_field_dep_xy_both(s2_field_dep_xy_both==0)=NaN; +% s2_field_dep_xy_both=inpaint_nans(s2_field_dep_xy_both,3); +% s2_field_dep_xy_both_err(s2_field_dep_xy_both_err==0)=NaN; +% s2_field_dep_xy_both_err=inpaint_nans(s2_field_dep_xy_both_err,3); +% s2_field_dep_xy_bottom(s2_field_dep_xy_bottom==0)=NaN; +% s2_field_dep_xy_bottom=inpaint_nans(s2_field_dep_xy_bottom,3); +% s2_field_dep_xy_bottom_err(s2_field_dep_xy_bottom_err==0)=NaN; +% s2_field_dep_xy_bottom_err=inpaint_nans(s2_field_dep_xy_bottom_err,3); + + %% Finding 3D field dependence + +det_edge=330; +z_step=30; +s2zbins=floor(0.05*det_edge):z_step:floor(0.05*det_edge)+z_step*15; +r_max=25; +xy_step=3.5; + +s2xbins=-r_max+xy_step/2:xy_step:r_max-xy_step/2; +s2ybins=-r_max+xy_step/2:xy_step:r_max-xy_step/2; + +Mean_s2_3D_both=zeros(length(s2ybins),length(s2xbins),length(s2zbins)); +Mean_s2_3D_bottom=zeros(length(s2ybins),length(s2xbins),length(s2zbins)); +Mean_s2_3D_both_err=zeros(length(s2ybins),length(s2xbins),length(s2zbins)); +Mean_s2_3D_bottom_err=zeros(length(s2ybins),length(s2xbins),length(s2zbins)); +Sigma_s2_3D_both=zeros(length(s2ybins),length(s2xbins),length(s2zbins)); +Sigma_s2_3D_bottom=zeros(length(s2ybins),length(s2xbins),length(s2zbins)); + +for k = s2zbins; + for i = (-r_max+xy_step):xy_step:r_max %map to rows going down (y_cm) + for j = (-r_max+xy_step):xy_step:r_max %map columns across (x_cm) + + l=int8(i/xy_step+(r_max)/xy_step); %real y from 1:25 + m=int8(j/xy_step+(r_max)/xy_step); % real x from 1:25 + n=(k-floor(0.05*det_edge))/z_step + 1; %z from 1:16 + + %sort, and make the cut. using the variable q + spatial_cut = s2x(j-xy_step) & s2y(i-xy_step) & inrange(drift_time,[(k-z_step/2) , (k+z_step/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + + if (length(s2_phe_both_xyz(spatial_cut)) >= 100) % at least 200 counts before fitting. + + fit_both= fit([0:500:60000].',hist(s2_phe_both_xyz(spatial_cut),[0:500:60000]).','gauss1'); + fit_bottom= fit([0:500:60000].',hist(s2_phe_bottom_xyz(spatial_cut),[0:500:60000]).','gauss1'); + + %Peak location (mean) + Mean_s2_3D_both(l,m,n)=fit_both.b1; + Mean_s2_3D_bottom(l,m,n)=fit_bottom.b1; + + %1-sigma of peak position + clear temp_both temp_bottom + temp_both=confint(fit_both,0.683); + temp_bottom=confint(fit_both,0.683); + Mean_s2_3D_both_err(l,m,n)=abs(temp_both(1,2)-Mean_s2_3D_both(l,m,n)); + Mean_s2_3D_bottom_err(l,m,n)=abs(temp_bottom(1,2)-Mean_s2_3D_both(l,m,n)); + Sigma_s2_3D_both(l,m,n)=fit_both.c1/sqrt(2); + Sigma_s2_3D_bottom(l,m,n)=fit_bottom.c1/sqrt(2); + + else %not enough stats to do the fit + + Mean_s2_3D_both(l,m,n)=0; + Mean_s2_3D_both_err(l,m,n)=0; + Mean_s2_3D_bottom(l,m,n)=0; + Mean_s2_3D_bottom_err(l,m,n)=0; + Sigma_s2_3D_both(l,m,n)=0; + Sigma_s2_3D_bottom(l,m,n)=0; + + end + + + end + end + k +end + +s2_3D_xbins=s2xbins; +s2_3D_ybins=s2ybins; +s2_3D_zbins=s2zbins; +s2_field_dep_3D_both=Mean_s2_3D_both; +s2_field_dep_3D_both_err=Mean_s2_3D_both_err; +s2_field_dep_3D_bottom=Mean_s2_3D_bottom; +s2_3D_field_dep_bot_err=Mean_s2_3D_bottom_err; + +%Removing zeros from the matrix +% s2_field_dep_3D_both(s2_field_dep_3D_both==0)=NaN; +% s2_field_dep_3D_both=inpaint_nans3(s2_field_dep_3D_both,0); +% s2_field_dep_3D_both_err(s2_field_dep_3D_both_err==0)=NaN; +% s2_field_dep_3D_both_err=inpaint_nans3(s2_field_dep_3D_both_err,0); +% s2_field_dep_3D_bottom(s2_field_dep_3D_bottom==0)=NaN; +% s2_field_dep_3D_bottom=inpaint_nans3(s2_field_dep_3D_bottom,0); +% s2_3D_field_dep_bot_err(s2_3D_field_dep_bot_err==0)=NaN; +% s2_3D_field_dep_bot_err=inpaint_nans3(s2_3D_field_dep_bot_err,0); + +%% Convert S2 measurements into S1 measurements +% remember to norm to center instead of top in KrypCal code +% S2 Z Kr/CH3T: s2_field_dep_z_bins_bottom and s2_field_dep_z_bottom +% S2 XY Kr/CH3T: s2_field_dep_xy_both, s2_field_dep_xy_xbins_both s2_field_dep_xy_ybins_both +% S2 3D Kr/CH3T: s2_3D_xbins,s2_3D_ybins,s2_3D_zbins,s2_field_dep_3D_both (and bottom) + +%Calculate field dependence of S1 by Converting S2 field dependence into S1 field dependence +%assume r=0.7 and a=0.2 +r_h3=h3_r_center; +a=0.11; +% S1 Z - bins are same as s2_field_dep_z_bins_both (or bottom) +% [s2_fieldpoly_z_both s2_fieldpoly_z_both_err]=polyfit(s2_field_dep_z_bins_both,s2_field_dep_z_both,6); +% [s2_fieldpoly_z_bottom s2_fieldpoly_z_bottom_err]=polyfit(s2_field_dep_z_bins_bottom,s2_field_dep_z_bottom,6); + +s2p_s2_both_z=RK_1DCubicInterp_LinearExtrap(s2_field_dep_z_bins_both,s2_field_dep_z_both,[0:1:330])./RK_1DCubicInterp_LinearExtrap(s2_field_dep_z_bins_both,s2_field_dep_z_both,4); %Dividing by this removes the s2 field dependence, normalizing to z=0 (liquid surface); +s2p_s2_both_z_centernorm=RK_1DCubicInterp_LinearExtrap(s2_field_dep_z_bins_both,s2_field_dep_z_both,[0:1:330])./RK_1DCubicInterp_LinearExtrap(s2_field_dep_z_bins_both,s2_field_dep_z_both,z_center); %Dividing by this removes the s2 field dependence, normalizing to z=center; +NionsH3=164.4; +NionsKr=2732; +S2_kr_c=RK_1DCubicInterp_LinearExtrap(s2_field_dep_z_bins_both,s2_field_dep_z_both,z_center); +S2_h3_c=histfitlandau(h3_s2_phe_both_xyz(inrange(h3_drift_time,[h3z_center-30 h3z_center+30]) & inrange(h3_x,[h3x_center-5 h3x_center+5]) & inrange(h3_y,[h3y_center-5 h3y_center+5])), 100, 400, 6000); +r_c=1-(S2_kr_c/S2_h3_c)*(NionsH3/NionsKr)*(1-r_h3); +s1p_s1_both_z=(a+1-s2p_s2_both_z_centernorm.*(1-r_c))/(a+r_c); + + +%Old incorrect way: [a+1-(s2p_s2_both_z_centernorm).*(1-r)]/(a+r); %Dividing by this removes the s1 field dependence, normalizing to z=center; + +s2p_s2_bot_z=RK_1DCubicInterp_LinearExtrap(s2_field_dep_z_bins_bottom,s2_field_dep_z_bottom,[0:1:330])./RK_1DCubicInterp_LinearExtrap(s2_field_dep_z_bins_bottom,s2_field_dep_z_bottom,4); +s2p_s2_bot_z_centernorm=RK_1DCubicInterp_LinearExtrap(s2_field_dep_z_bins_bottom,s2_field_dep_z_bottom,[0:1:330])./RK_1DCubicInterp_LinearExtrap(s2_field_dep_z_bins_bottom,s2_field_dep_z_bottom,z_center); +%Old incorrect way: s1p_s1_bot_z=[a+1-(s2p_s2_bot_z_centernorm).*(1-r)]/(a+r); +S2_kr_c_bot=RK_1DCubicInterp_LinearExtrap(s2_field_dep_z_bins_bottom,s2_field_dep_z_bottom,z_center); +S2_h3_c_bot=histfitlandau(h3_s2_phe_bottom_xyz(inrange(h3_drift_time,[h3z_center-30 h3z_center+30]) & inrange(h3_x,[h3x_center-5 h3x_center+5]) & inrange(h3_y,[h3y_center-5 h3y_center+5])), 100, 400, 6000); %Just average corrects CH3T over detector, since we claim there is no field dependence +r_c=1-(S2_kr_c_bot/S2_h3_c_bot)*(NionsH3/NionsKr)*(1-r_h3); +s1p_s1_bot_z=(a+1-s2p_s2_bot_z_centernorm.*(1-r_c))/(a+r_c); + +%Plot the field measurements +figure +hold on; +plot([0:1:330],s2p_s2_both_z_centernorm,'-b','LineWidth',2) +plot([0:1:330],s2p_s2_bot_z_centernorm,'-g','LineWidth',2) +plot([0:1:330],s1p_s1_both_z,'-r','LineWidth',2) +plot([0:1:330],s1p_s1_bot_z,'-m','LineWidth',2) +xlabel('Drift time (uSec)'); ylabel('Field effect at Z/Field effect at center'); +legend('S2 Both','S2 Bot','S1 Both','S1 Bot'); +myfigview(16); + +%CONVERT THIS TO INTERP TO THE CENTER +% S1 XY - bins are the same as s2_field_dep_xy_xbins_both and s2_field_dep_xy_ybins_both +s2p_s2_both_xy=interp2(s2_field_dep_xy_xbins_both,s2_field_dep_xy_ybins_both,s2_field_dep_xy_both,[-25:1:25].',[-25:1:25])./interp2(s2_field_dep_xy_xbins_both,s2_field_dep_xy_ybins_both,s2_field_dep_xy_both,x_center,y_center); %Field normalized to center, divide by this to remove +S2_kr_c=interp2(s2_field_dep_xy_xbins_both,s2_field_dep_xy_ybins_both,s2_field_dep_xy_both,x_center,y_center); +S2_h3_c=histfitlandau(h3_s2_phe_both_xyz(inrange(h3_drift_time,[h3z_center-30 h3z_center+30]) & inrange(h3_x,[h3x_center-5 h3x_center+5]) & inrange(h3_y,[h3y_center-5 h3y_center+5])), 100, 400, 5000); %Just average corrects CH3T over detector, since we claim there is no field dependence +r_c=1-(S2_kr_c/S2_h3_c)*(NionsH3/NionsKr)*(1-r_h3); +s1p_s1_both_xy=(a+1-s2p_s2_both_xy.*(1-r_c))/(a+r_c); +%Old incorrect way: s1p_s1_both_xy=[a+1-(s2p_s2_both_xy).*(1-r)]/(a+r); + +s2p_s2_bot_xy=interp2(s2_field_dep_xy_xbins_bottom,s2_field_dep_xy_ybins_bottom,s2_field_dep_xy_bottom,[-25:1:25].',[-25:1:25])./interp2(s2_field_dep_xy_xbins_bottom,s2_field_dep_xy_ybins_bottom,s2_field_dep_xy_bottom,x_center,y_center); +S2_kr_c=interp2(s2_field_dep_xy_xbins_bottom,s2_field_dep_xy_ybins_bottom,s2_field_dep_xy_bottom,x_center,y_center); +S2_h3_c=histfitlandau(h3_s2_phe_bottom_xyz(inrange(h3_drift_time,[h3z_center-30 h3z_center+30]) & inrange(h3_x,[h3x_center-5 h3x_center+5]) & inrange(h3_y,[h3y_center-5 h3y_center+5])), 100, 400, 5000); %Just average corrects CH3T over detector, since we claim there is no field dependence +r_c=1-(S2_kr_c/S2_h3_c)*(NionsH3/NionsKr)*(1-r_h3); +s1p_s1_bot_xy=(a+1-s2p_s2_bot_xy.*(1-r_c))/(a+r_c); +%Old incorrect way:s1p_s1_bot_xy=[a+1-(s2p_s2_bot_xy).*(1-r)]/(a+r); + +%Plot XY Field + color_range_max=max(max(s2p_s2_both_xy)); + color_range_min=min(min(s2p_s2_both_xy(s2p_s2_both_xy>0.9))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + figure; + contourf([-25:1:25],[-25:1:25],s2p_s2_both_xy,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat('S2 Field Effect (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'Field Effect at XY/Field Effect at Center','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + %repeat for bottom + color_range_max=max(max(s2p_s2_bot_xy)); + color_range_min=min(min(s2p_s2_bot_xy(s2p_s2_bot_xy>0.95))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + figure; + contourf([-25:1:25],[-25:1:25],s2p_s2_bot_xy,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat('S2 Field Effect (Bottom PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'Field Effect at XY/Field Effect at Center','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + +%Plot S1 XY Field + color_range_max=1.03; + color_range_min=0.97; + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + figure; + contourf([-25:1:25],[-25:1:25],s1p_s1_both_xy,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat('S1 Field Effect (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + c=colormap; + c(end,1)=1; + c(end,2)=1; + c(end,3)=1; + colormap(c); + ylabel(g,'Field Effect at XY/Field Effect at Center','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + %Repeat for bottom + color_range_max=1.03; + color_range_min=0.96; + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + figure; + contourf([-25:1:25],[-25:1:25],s1p_s1_bot_xy,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat('S1 Field Effect (Bottom PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + clear c + c=colormap; + c(end,1)=1; + c(end,2)=1; + c(end,3)=1; + colormap(c); + ylabel(g,'Field Effect at XY/Field Effect at Center','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + +% S1 3D - bins are the same as s2_3D_xbins, s2_3D_ybins, and s2_3D_zbins +s2p_s2_both_3D=interp3(s2_3D_xbins,s2_3D_ybins,s2_3D_zbins,s2_field_dep_3D_both,[-25:1:25].',[-25:1:25],[0:1:330])./interp3(s2_3D_xbins,s2_3D_ybins,s2_3D_zbins,s2_field_dep_3D_both,x_center,y_center,z_center); +S2_kr_c=interp3(s2_3D_xbins,s2_3D_ybins,s2_3D_zbins,s2_field_dep_3D_both,x_center,y_center,z_center); +S2_h3_c=histfitlandau(h3_s2_phe_both_xyz(inrange(h3_drift_time,[h3z_center-30 h3z_center+30]) & inrange(h3_x,[h3x_center-5 h3x_center+5]) & inrange(h3_y,[h3y_center-5 h3y_center+5])), 100, 400, 5000); %Just average corrects CH3T over detector, since we claim there is no field dependence +r_c=1-(S2_kr_c/S2_h3_c)*(NionsH3/NionsKr)*(1-r_h3); +s1p_s1_both_3D=(a+1-s2p_s2_both_3D.*(1-r_c))/(a+r_c); +%incorrect old way: s1p_s1_both_3D=[a+1-(s2p_s2_both_xy).*(1-r)]/(a+r); + +s2p_s2_bot_3D=interp3(s2_3D_xbins,s2_3D_ybins,s2_3D_zbins,s2_field_dep_3D_bottom,[-25:1:25].',[-25:1:25],[0:1:330])./interp3(s2_3D_xbins,s2_3D_ybins,s2_3D_zbins,s2_field_dep_3D_bottom,x_center,y_center,z_center); +S2_kr_c=interp3(s2_3D_xbins,s2_3D_ybins,s2_3D_zbins,s2_field_dep_3D_bottom,x_center,y_center,z_center); +S2_h3_c=histfitlandau(h3_s2_phe_bottom_xyz(inrange(h3_drift_time,[h3z_center-30 h3z_center+30]) & inrange(h3_x,[h3x_center-5 h3x_center+5]) & inrange(h3_y,[h3y_center-5 h3y_center+5])), 100, 400, 5000); %Just average corrects CH3T over detector, since we claim there is no field dependence +r_c=1-(S2_kr_c/S2_h3_c)*(NionsH3/NionsKr)*(1-r_h3); +s1p_s1_bot_3D=(a+1-s2p_s2_bot_3D.*(1-r_c))/(a+r_c); + +%incorrect old way: s1p_s1_bot_3D=[a+1-(s2p_s2_bot_3D).*(1-r)]/(a+r); + + +%% Compare to Kr S1a/S1b maps + +% Get s1a s1b info + + s1ab_cut=logical(sum(s1_single_cut(:,:),1)); + s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); + s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); + s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); + s1ab_x=d.x_cm(s2_single_cut); + s1ab_y=d.y_cm(s2_single_cut); + s1ab_z=d.z_drift_samples(s2_single_cut)/100; + s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); + + s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<=25; + %plotting x=s1a v y=s1a/s1b cuts: y<0.035x-1, y>-0.035.*x+5; y>0.01.*x; %y<4.2; x<255 +% s1ab_areacut= (s1a_phe_both./s1b_phe_both-0.035.*s1a_phe_both<-1) & (s1a_phe_both./s1b_phe_both+0.035.*s1a_phe_both>5)... +% & (s1a_phe_both./s1b_phe_both > 0.01.* s1a_phe_both) & (s1a_phe_both./s1b_phe_both<4.2) & (s1a_phe_both<255); + + s1ab_x=s1ab_x(s1ab_timing_cut); + s1ab_y=s1ab_y(s1ab_timing_cut); + s1ab_z=s1ab_z(s1ab_timing_cut); + s1a_phe_both=s1a_phe_both(s1ab_timing_cut); + s1b_phe_both=s1b_phe_both(s1ab_timing_cut); + + dT_step=det_edge/(length(s1ab_z)/1000); %2000 events per z bin + + %% making plots + %Z Dependence of S1a +% figure +% hold on; +% i=1; +% for z_max=90:60:210; +% s1a_fit=fit([0:2:400].',hist(s1a_phe_both(s1a_phe_both>0 & inrange(s1ab_z,[z_max-60,z_max]).'),[0:2:400]).','gauss1'); +% step(s1a_phe_both(s1a_phe_both>0 & inrange(s1ab_z,[z_max-60,z_max]).'),[0:2:400],colors2{i}); +% i=i+1; +% end +% xlabel('S1a (phe)'); ylabel('Counts'); myfigview(16); +% legend('30-90 uSec','90-150 uSec','150-210 uSec'); +% i=1; +% for z_max=90:60:210; +% s1a_fit=fit([0:2:400].',hist(s1a_phe_both(s1a_phe_both>0 & inrange(s1ab_z,[z_max-60,z_max]).'),[0:2:400]).','gauss1'); +% x=[0:2:400]; y=s1a_fit.a1.*exp(-((x-s1a_fit.b1)./s1a_fit.c1).^2); plot(x,y,'LineWidth',2,'Color',colors{i}); +% i=i+1; +% end + + + + clear s1a_z_means s1a_z_means_err s1b_z_means s1b_z_means_err s1ab_bincenters s1ab_z_means s1ab_z_means_err +%Z Dependence of S1a/S1b +i=1; + for z_max=10+dT_step:dT_step:det_edge; + s1a_fit=fit([0:2:400].',hist(s1a_phe_both(s1a_phe_both>0 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:400]).','gauss1'); + s1b_fit=fit([0:2:300].',hist(s1b_phe_both(s1b_phe_both>0 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:300]).','gauss1'); + s1a_z_means(i)=s1a_fit.b1; + s1a_z_means_err(i)=s1a_fit.c1/sqrt(2)/sqrt(length(s1a_phe_both(s1a_phe_both>0 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1b_z_means(i)=s1b_fit.b1; + s1b_z_means_err(i)=s1b_fit.c1/sqrt(2)/sqrt(length(s1b_phe_both(s1b_phe_both>0 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1ab_bincenters(i)=z_max-dT_step/2; + i=i+1; + end + +s1ab_z_means=s1a_z_means./s1b_z_means; +s1ab_z_means_err=sqrt( (s1b_z_means_err.*s1a_z_means./(s1b_z_means.^2)).^2 + (s1a_z_means_err./s1b_z_means).^2); + +%fit polynomial to s1az and s1bz, to remove z dependence later in xy fit +[s1a_P, s1a_S]=polyfit(s1ab_bincenters,s1a_z_means,3); +[s1b_P, s1b_S]=polyfit(s1ab_bincenters,s1b_z_means,3); +[s1ab_P, s1ab_S]=polyfit(s1ab_bincenters,s1ab_z_means,2); + +%S1a z dependence plot +s1az_plot=figure; +errorbar(s1ab_bincenters,s1a_z_means,s1a_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a Mean (phe)'); title('S1a Z Dependence'); myfigview(16); +hold on; +plot([50:1:320],polyval(s1a_P,[50:1:320]),'-r','LineWidth',2) + +%S1b z dependence plot +s1bz_plot=figure; +errorbar(s1ab_bincenters,s1b_z_means,s1b_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1b Mean (phe)'); title('S1b Z Dependence'); myfigview(16); +hold on; +plot([20:1:320],polyval(s1b_P,[20:1:320]),'-r','LineWidth',2) + +%S1a/b z dependence plot +s1a_over_bz_plot=figure; +errorbar(s1ab_bincenters,s1ab_z_means,s1ab_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a/b'); title('S1 a/b Z Dependence'); myfigview(16); +hold on; +plot([20:1:320],polyval(s1ab_P,[20:1:320]),'-r','LineWidth',2) + +%Saving variables for plot at the end + +s1ab_bincenters_0307=s1ab_bincenters; +s1a_z_means_0307=s1a_z_means; +s1a_z_means_err_0307=s1a_z_means_err; +s1b_z_means_0307=s1b_z_means; +s1b_z_means_err_0307=s1b_z_means_err; +s1ab_z_means_0307=s1ab_z_means; +s1ab_z_means_err_0307=s1ab_z_means_err; +s1a_P_0307=s1a_P; +s1b_P_0307=s1b_P; +s1ab_P_0307=s1ab_P; + +%% S1a/b XY map (after z correction) + +%Correcting z dependence to get XY dependence in same manner that Kr/CH3T +%map does + s1a_phe_both_z=s1a_phe_both.'.*polyval(s1a_P,z_center)./polyval(s1a_P,s1ab_z); + s1b_phe_both_z=s1b_phe_both.'.*polyval(s1b_P,z_center)./polyval(s1b_P,s1ab_z); + +s1ab_xbin_min=-25; +s1ab_ybin_min=-25; +s1ab_xbin_max=25; +s1ab_ybin_max=25; +s1ab_xybinsize=sqrt((50*50)/(length(s1ab_z)/500)); +clear s1a_xy_mean s1a_xy_mean_err s1b_xy_mean s1b_xy_mean_err + +s1ab_xbins=s1ab_xbin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_xbin_max; +s1ab_ybins=s1ab_ybin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_ybin_max; + +s1a_xy_mean=zeros(length(s1ab_ybins),length(s1ab_xbins)); +s1b_xy_mean=zeros(length(s1ab_ybins),length(s1ab_xbins)); + + for x_bin=s1ab_xbin_min:s1ab_xybinsize:(s1ab_xbin_max-s1ab_xybinsize/2); + for y_bin=s1ab_ybin_min:s1ab_xybinsize:(s1ab_ybin_max-s1ab_xybinsize/2); + x_min = x_bin; x_max = x_bin+s1ab_xybinsize; + y_min = y_bin; y_max = y_bin+s1ab_xybinsize; + + x_count=int32(1+x_bin/s1ab_xybinsize+s1ab_xbin_max/s1ab_xybinsize); + y_count=int32(1+y_bin/s1ab_xybinsize+s1ab_ybin_max/s1ab_xybinsize); + + bin_cut = inrange(s1ab_z,[10 330]).' & s1a_phe_both>0 & s1b_phe_both>0 & inrange(s1ab_x,[x_min,x_max]).' & inrange(s1ab_y,[y_min,y_max]).'; + if length(s1a_phe_both_z(bin_cut))>200; + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both_z(bin_cut),[0:2:400]).','gauss1'); + s1a_xy_mean(y_count,x_count)=s1a_z_fit.b1; + s1a_xy_mean_err(y_count,x_count)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both_z(bin_cut)); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both_z(bin_cut),[0:2:300]).','gauss1'); + s1b_xy_mean(y_count,x_count)=s1b_z_fit.b1; + s1b_xy_mean_err(y_count,x_count)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both_z(bin_cut)); + else + s1a_xy_mean(y_count,x_count)=0; + s1a_xy_mean_err(y_count,x_count)=0; + s1b_xy_mean(y_count,x_count)=0; + s1b_xy_mean_err(y_count,x_count)=0; + end + + end + end + s1ab_xy_mean=s1a_xy_mean./s1b_xy_mean; + s1ab_xy_mean_err=sqrt( (s1b_xy_mean_err.*s1a_xy_mean./(s1b_xy_mean.^2)).^2 + (s1a_xy_mean_err./s1b_xy_mean).^2); + + + %Plot s1a XY means + color_range_max=max(max(s1a_xy_mean)); + color_range_min=min(min(s1a_xy_mean(s1a_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + s1a_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1a_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat('0307 S1a Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + %Plot s1b XY means + color_range_max=max(max(s1b_xy_mean)); + color_range_min=min(min(s1b_xy_mean(s1b_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + s1b_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1b_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat('0307 S1b Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1b Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + %s1a/b XY Ratio + color_range_max=max(max(s1ab_xy_mean)); + color_range_min=min(min(s1ab_xy_mean(s1ab_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + s1ab_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat('0307 S1a/b Ratio vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a/b Ratio','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + %Saving variables + s1a_xy_mean_0307=s1a_xy_mean; + s1a_xy_mean_err_0307=s1a_xy_mean_err; + s1b_xy_mean_0307=s1b_xy_mean; + s1b_xy_mean_err_0307=s1b_xy_mean_err; + s1ab_xy_mean_0307=s1ab_xy_mean; + s1ab_xy_mean_err_0307=s1ab_xy_mean_err; + s1ab_xbins_0307=s1ab_xbins; + s1ab_ybins_0307=s1ab_ybins; + + +%% 3D Kr s1a/s1b map + +s1ab_xyz_numbins=10; %gives ~100 events per bin +s1ab_xyz_zstep=det_edge/s1ab_xyz_numbins; +s1ab_xyz_xstep=50/s1ab_xyz_numbins; +s1ab_xyz_ystep=50/s1ab_xyz_numbins; +s1ab_xyz_xmax=25; +r_max=25; + +s1ab_xyz_zbins=50:s1ab_xyz_zstep:50+s1ab_xyz_zstep*s1ab_xyz_numbins; %20 us +s1ab_xyz_xbins=(-r_max+s1ab_xyz_xstep/2):s1ab_xyz_xstep:r_max; +s1ab_xyz_ybins=(-r_max+s1ab_xyz_ystep/2):s1ab_xyz_ystep:r_max; + +s1a_xyz_mean=zeros(length(s1ab_xyz_ybins),length(s1ab_xyz_xbins),length(s1ab_xyz_zbins)); +s1a_xyz_mean_err=zeros(length(s1ab_xyz_ybins),length(s1ab_xyz_xbins),length(s1ab_xyz_zbins)); +s1b_xyz_mean=zeros(length(s1ab_xyz_ybins),length(s1ab_xyz_xbins),length(s1ab_xyz_zbins)); +s1b_xyz_mean_err=zeros(length(s1ab_xyz_ybins),length(s1ab_xyz_xbins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + m=int8(j/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + n=int8((k-50)/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + + %Count the number of events per bin + Count_S1ab_3D(l,m,n)=length(s1a_phe_both(q)); + + if (Count_S1ab_3D(l,m,n) >= 60) % at least 100 counts before fitting. + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both(q.' & s1a_phe_both>0),[0:2:400]).','gauss1'); + s1a_xyz_mean(l,m,n)=s1a_z_fit.b1; + s1a_xyz_mean_err(l,m,n)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & s1a_phe_both>0)); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both(q.' & s1b_phe_both>0 ),[0:2:300]).','gauss1'); + s1b_xyz_mean(l,m,n)=s1b_z_fit.b1; + s1b_xyz_mean_err(l,m,n)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & s1b_phe_both>0)); + else %not enough stats to do the fit + s1a_xyz_mean(l,m,n)=0; + s1a_xyz_mean_err(l,m,n)=0; + s1b_xyz_mean(l,m,n)=0; + s1b_xyz_mean_err(l,m,n)=0; + end + + end + end +k +end + + s1ab_xyz_mean=s1a_xyz_mean./s1b_xyz_mean; + s1ab_xyz_mean_err=sqrt( (s1b_xyz_mean_err.*s1a_xyz_mean./(s1b_xyz_mean.^2)).^2 + (s1a_xyz_mean_err./s1b_xyz_mean).^2); + + +%Saving Variables + +s1a_xyz_mean_0307=s1a_xyz_mean; +s1a_xyz_mean_err_0307=s1a_xyz_mean_err; +s1b_xyz_mean_0307=s1b_xyz_mean; +s1b_xyz_mean_err_0307=s1b_xyz_mean_err; +s1ab_xyz_mean_0307=s1ab_xyz_mean; +s1ab_xyz_mean_err_0307=s1ab_xyz_mean_err; +s1ab_xyz_zbins_0307=s1ab_xyz_zbins; +s1ab_xyz_xbins_0307=s1ab_xyz_xbins; +s1ab_xyz_ybins_0307=s1ab_xyz_ybins; + + +%% Compare S1aS1b to Field Measurement -- Z Dep + +r=h3_r_center; +a=0.11; +% S1 Z - bins are same as s2_field_dep_z_bins_both (or bottom) +% [s2_fieldpoly_z_both s2_fieldpoly_z_both_err]=polyfit(s2_field_dep_z_bins_both,s2_field_dep_z_both,6); +% [s2_fieldpoly_z_bottom s2_fieldpoly_z_bottom_err]=polyfit(s2_field_dep_z_bins_bottom,s2_field_dep_z_bottom,6); + + +% s2p_s2_z_s1as1b_bins=polyval(s2_fieldpoly_z_both,s1ab_bincenters_0307)./polyval(s2_fieldpoly_z_both,z_center); +s2p_s2_z_s1as1b_bins=RK_1DCubicInterp_LinearExtrap(s2_field_dep_z_bins_both,s2_field_dep_z_both,s1ab_bincenters_0307)./RK_1DCubicInterp_LinearExtrap(s2_field_dep_z_bins_both,s2_field_dep_z_both,z_center); + +S2_kr_c=RK_1DCubicInterp_LinearExtrap(s2_field_dep_z_bins_both,s2_field_dep_z_both,z_center); +[S2_h3_c S2_h3_c_err]=histfitlandau(h3_s2_phe_both_xyz(inrange(h3_drift_time,[h3z_center-30 h3z_center+30]) & inrange(h3_x,[h3x_center-5 h3x_center+5]) & inrange(h3_y,[h3y_center-5 h3y_center+5])), 100, 400, 6000); %Just average corrects CH3T over detector, since we claim there is no field dependence +S2_h3_c_err=10/S2_h3_c; %replace error measurement based on systematic errors involved with changing the bin_max value +r_c=1-(S2_kr_c/S2_h3_c)*(NionsH3/NionsKr)*(1-r_h3); +s1p_s1_z_s1as1b_bins=(a+1-s2p_s2_z_s1as1b_bins.*(1-r_c))/(a+r_c); + +%temp variables for propagating errors. +% [junkone temp_err_one]=polyval(s2_fieldpoly_z_both,s1ab_bincenters_0307,s2_fieldpoly_z_both_err); %numerator +% [junktwo temp_err_two]=polyval(s2_fieldpoly_z_both,z_center,s2_fieldpoly_z_both_err); %denominator +% r_c_err=sqrt( (S2_kr_c_err*(NionsH3/NionsKr)*(1-r_h3)/S2_h3_c).^2 + (S2_h3_c_err*(S2_kr_c/S2_h3_c.^2)*(NionsH3/NionsKr)*(1-r_h3)).^2 ); +% s2p_s2_z_s1as1b_bins_err=sqrt( (temp_err_one./polyval(s2_fieldpoly_z_both,z_center)).^2 + (temp_err_two.*polyval(s2_fieldpoly_z_both,s1ab_bincenters_0307)./(polyval(s2_fieldpoly_z_both,z_center).^2)).^2 ); +% s1p_s1_z_s1as1b_bins_err=sqrt( ((s2p_s2_z_s1as1b_bins_err.*(1-r_c))/(a+r_c)).^2 + (r_c_err.*s2p_s2_z_s1as1b_bins.*(1+a)/(a+r_c).^2).^2 ); %doesn't include errors on a or r + +% %S2 comparison +% figure +% rkploterr(s1ab_z_means,s2p_s2_z_s1as1b_bins,s1ab_z_means_err,[],'.k'); +% xlabel('S1a/S1b'); ylabel('CH3T Corrected Kr S2 at Z / CH3T Corrected Kr S2 at Center'); +% xlim([2.5 3]);ylim([0.7 1.2]); +% myfigview(16); +% +% %S1 comparison +% figure +% ploterr(s1ab_z_means,s1p_s1_z_s1as1b_bins,s1ab_z_means_err,[],'.k'); +% xlabel('S1a/S1b'); ylabel('CH3T Corrected Kr S1 at Z / CH3T Corrected Kr S1 at Center'); +% xlim([2.5 3]);ylim([0.8 1.2]); +% myfigview(16); + +%Both at same time +figure +rkploterr(s1ab_z_means,s2p_s2_z_s1as1b_bins,s1ab_z_means_err,[],[1 0 0],'.',100,1); +hold on; +rkploterr(s1ab_z_means,s1p_s1_z_s1as1b_bins,s1ab_z_means_err,[],[0 0 0],'.',100,1); +xlabel('S1a/S1b'); ylabel('CH3T Corrected Kr at Z / CH3T Corrected Kr at Center'); +xlim([2.2 3.1]);ylim([0.6 1.5]); +legend('S2 Mapping','S1 Mapping'); +% legend('S2','S1'); Ploterr is screwing up the legend colors +myfigview(16); + +%% Compare S1aS1b to Field Measurement -- XY Dep + +s2p_s2_xy_s1as1b_bins=interp2(s2_field_dep_xy_xbins_both,s2_field_dep_xy_ybins_both,s2_field_dep_xy_both,s1ab_xbins_0307.',s1ab_ybins_0307)./interp2(s2_field_dep_xy_xbins_both,s2_field_dep_xy_ybins_both,s2_field_dep_xy_both,x_center,y_center); +temp_err_1=interp2(s2_field_dep_xy_xbins_both,s2_field_dep_xy_ybins_both,s2_field_dep_xy_both_err,s1ab_xbins_0307.',s1ab_ybins_0307); +temp_err_2=interp2(s2_field_dep_xy_xbins_both,s2_field_dep_xy_ybins_both,s2_phe_both_xyz_z_xymeans_err,x_center,y_center); +s2p_s2_xy_s1as1b_bins_err=sqrt( (temp_err_1./interp2(s2_field_dep_xy_xbins_both,s2_field_dep_xy_ybins_both,s2_field_dep_xy_both,x_center,y_center)).^2 + (temp_err_2.*interp2(s2_field_dep_xy_xbins_both,s2_field_dep_xy_ybins_both,s2_field_dep_xy_both,s1ab_xbins_0307.',s1ab_ybins_0307)./(interp2(s2_field_dep_xy_xbins_both,s2_field_dep_xy_ybins_both,s2_field_dep_xy_both,x_center,y_center).^2)).^2 ); + +S2_kr_c=interp2(s2_field_dep_xy_xbins_both,s2_field_dep_xy_ybins_both,s2_field_dep_xy_both,x_center,y_center); +S2_kr_c_err=interp2(s2_field_dep_xy_xbins_both,s2_field_dep_xy_ybins_both,s2_phe_both_xyz_z_xymeans_err,x_center,y_center); +[S2_h3_c S2_h3_c_err]=histfitlandau(h3_s2_phe_both_xyz(inrange(h3_drift_time,[h3z_center-30 h3z_center+30]) & inrange(h3_x,[h3x_center-5 h3x_center+5]) & inrange(h3_y,[h3y_center-5 h3y_center+5])), 100, 400, 6000); %Just average corrects CH3T over detector, since we claim there is no field dependence +S2_h3_c_err=10/S2_h3_c; %replace error measurement based on systematic errors involved with changing the bin_max value +r_c=1-(S2_kr_c/S2_h3_c)*(NionsH3/NionsKr)*(1-r_h3); +s1p_s1_xy_s1as1b_bins=(a+1-s2p_s2_xy_s1as1b_bins.*(1-r_c))/(a+r_c); +r_c_err=sqrt( (S2_kr_c_err*(NionsH3/NionsKr)*(1-r_h3)/S2_h3_c).^2 + (S2_h3_c_err*(S2_kr_c/S2_h3_c.^2)*(NionsH3/NionsKr)*(1-r_h3)).^2 ); +s1p_s1_xy_s1as1b_bins_err=sqrt( ((s2p_s2_xy_s1as1b_bins_err.*(1-r_c))/(a+r_c)).^2 + (r_c_err.*s2p_s2_xy_s1as1b_bins.*(1+a)/(a+r_c).^2).^2 ); + +%S2 comparison +figure +hold on; +rkploterr(s1ab_xy_mean,s2p_s2_xy_s1as1b_bins,s1ab_xy_mean_err,[],[0 0 0],'.',100,1); +xlabel('S1a/S1b'); ylabel('CH3T Corrected Kr S2 at XY / CH3T Corrected Kr S2 at Center'); +xlim([2.5 2.85]);ylim([0.96 1.09]); +myfigview(16); + +%S1 comparison +figure +hold on; +rkploterr(s1ab_xy_mean,s1p_s1_xy_s1as1b_bins,s1ab_xy_mean_err,[],[0 0 0],'.',100,1); +xlabel('S1a/S1b'); ylabel('CH3T Corrected Kr S1 at XY / CH3T Corrected Kr S2 at Center'); +xlim([2.5 2.85]);ylim([0.96 1.03]); +myfigview(16); + + + + +%% Compare S1aS1b to Field Measurement -- 3D Dep +s2_field_dep_3D_both_old=s2_field_dep_3D_both; +s2_field_dep_3D_both(s2_field_dep_3D_both==0)=nan; + +%Can't have zeros when interpolating the map. Note: S2 and S1 XYZ maps with zeros are fine, since you interpolate the norm map, where the zeros get turned into NaN. +%Here zeros are bad for buisness, since they aren't ignored like NaN are +temp_map=s2_field_dep_3D_both; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s2_field_dep_3D_both=temp_map; temp_mapQ=temp_map(q); s2_field_dep_3D_both(~q)=temp_mapQ(r);s2_field_dep_3D_both=reshape(s2_field_dep_3D_both,size(s2_field_dep_3D_both_old,1),size(s2_field_dep_3D_both_old,2),size(s2_field_dep_3D_both_old,3)); + +s2p_s2_3D_s1as1b_bins=interp3(s2_3D_xbins,s2_3D_ybins,s2_3D_zbins,s2_field_dep_3D_both,s1ab_xyz_xbins.',s1ab_xyz_ybins,s1ab_xyz_zbins,'cubic')./interp3(s2_3D_xbins,s2_3D_ybins,s2_3D_zbins,s2_field_dep_3D_both,x_center,y_center,z_center,'cubic'); +clear temp_err_1 temp_err_2 +temp_err_1=interp3(s2_3D_xbins,s2_3D_ybins,s2_3D_zbins,s2_field_dep_3D_both_err,s1ab_xyz_xbins.',s1ab_xyz_ybins,s1ab_xyz_zbins,'cubic'); +temp_err_2=interp3(s2_3D_xbins,s2_3D_ybins,s2_3D_zbins,s2_field_dep_3D_both_err,x_center,y_center,z_center,'cubic'); +s2p_s2_3D_s1as1b_bins_err=sqrt( (temp_err_1./interp3(s2_3D_xbins,s2_3D_ybins,s2_3D_zbins,s2_field_dep_3D_both,x_center,y_center,z_center)).^2 + (temp_err_2.*interp3(s2_3D_xbins,s2_3D_ybins,s2_3D_zbins,s2_field_dep_3D_both,s1ab_xyz_xbins.',s1ab_xyz_ybins,s1ab_xyz_zbins)./(interp3(s2_3D_xbins,s2_3D_ybins,s2_3D_zbins,s2_field_dep_3D_both,x_center,y_center,z_center).^2)).^2 ); + +S2_kr_c=interp3(s2_3D_xbins,s2_3D_ybins,s2_3D_zbins,s2_field_dep_3D_both,x_center,y_center,z_center,'cubic'); +S2_kr_c_err=interp3(s2_3D_xbins,s2_3D_ybins,s2_3D_zbins,s2_field_dep_3D_both_err,x_center,y_center,z_center,'cubic'); +[S2_h3_c S2_h3_c_err]=histfitlandau(h3_s2_phe_both_xyz(inrange(h3_drift_time,[h3z_center-30 h3z_center+30]) & inrange(h3_x,[h3x_center-5 h3x_center+5]) & inrange(h3_y,[h3y_center-5 h3y_center+5])), 100, 400, 6000); %Just average corrects CH3T over detector, since we claim there is no field dependence +S2_h3_c_err=10/S2_h3_c; %replace error measurement based on systematic errors involved with changing the bin_max value +r_c=1-(S2_kr_c/S2_h3_c)*(NionsH3/NionsKr)*(1-r_h3); +s1p_s1_3D_s1as1b_bins=(a+1-s2p_s2_3D_s1as1b_bins.*(1-r_c))/(a+r_c); +r_c_err=sqrt( (S2_kr_c_err*(NionsH3/NionsKr)*(1-r_h3)/S2_h3_c).^2 + (S2_h3_c_err*(S2_kr_c/S2_h3_c.^2)*(NionsH3/NionsKr)*(1-r_h3)).^2 ); +s1p_s1_3D_s1as1b_bins_err=sqrt( ((s2p_s2_3D_s1as1b_bins_err.*(1-r_c))/(a+r_c)).^2 + (r_c_err.*s2p_s2_3D_s1as1b_bins.*(1+a)/(a+r_c).^2).^2 ); + + +%% Compare 3D to Z only + + +%Reshaping to fit polynomials +s1ab_xyz_mean_vector=reshape(s1ab_xyz_mean,[size(s1ab_xyz_mean,1)*size(s1ab_xyz_mean,2)*size(s1ab_xyz_mean,3) 1]); +s1p_s1_3D_s1as1b_bins_vector=reshape(s1p_s1_3D_s1as1b_bins,[size(s1p_s1_3D_s1as1b_bins,1)*size(s1p_s1_3D_s1as1b_bins,2)*size(s1p_s1_3D_s1as1b_bins,3) 1]); +s2p_s2_3D_s1as1b_bins_vector=reshape(s2p_s2_3D_s1as1b_bins,[size(s2p_s2_3D_s1as1b_bins,1)*size(s2p_s2_3D_s1as1b_bins,2)*size(s2p_s2_3D_s1as1b_bins,3) 1]); + +s1ab_z_means_vector=reshape(s1ab_z_means,[size(s1ab_z_means,1)*size(s1ab_z_means,2)*size(s1ab_z_means,3) 1]); +s1p_s1_z_s1as1b_bins_vector=reshape(s1p_s1_z_s1as1b_bins,[size(s1p_s1_z_s1as1b_bins,1)*size(s1p_s1_z_s1as1b_bins,2)*size(s1p_s1_z_s1as1b_bins,3) 1]); +s2p_s2_z_s1as1b_bins_vector=reshape(s2p_s2_z_s1as1b_bins,[size(s2p_s2_z_s1as1b_bins,1)*size(s2p_s2_z_s1as1b_bins,2)*size(s2p_s2_z_s1as1b_bins,3) 1]); + + +%removing NaN +s1p_s1_3D_s1as1b_bins_vector(isnan(s1ab_xyz_mean_vector))=[]; +s2p_s2_3D_s1as1b_bins_vector(isnan(s1ab_xyz_mean_vector))=[]; +s1ab_xyz_mean_vector(isnan(s1ab_xyz_mean_vector))=[]; + +s2p_s2_z_s1as1b_bins_vector(isnan(s1ab_z_means_vector))=[]; +s1p_s1_z_s1as1b_bins_vector(isnan(s1ab_z_means_vector))=[]; +s1ab_z_means_vector(isnan(s1ab_z_means_vector))=[]; + +%fitting polynomials +s1ab_s1_xyz_fit=fit(s1ab_xyz_mean_vector,s1p_s1_3D_s1as1b_bins_vector,'poly2'); +s1ab_s2_xyz_fit=fit(s1ab_xyz_mean_vector,s2p_s2_3D_s1as1b_bins_vector,'poly2'); +s1ab_s1_z_fit=fit(s1ab_z_means_vector,s1p_s1_z_s1as1b_bins_vector,'poly2'); +s1ab_s2_z_fit=fit(s1ab_z_means_vector,s2p_s2_z_s1as1b_bins_vector,'poly2'); + +%fitting lines +s1ab_s1_xyz_fit_linear=fit(s1ab_xyz_mean_vector,s1p_s1_3D_s1as1b_bins_vector,'poly1'); +s1ab_s2_xyz_fit_linear=fit(s1ab_xyz_mean_vector,s2p_s2_3D_s1as1b_bins_vector,'poly1'); +s1ab_s1_z_fit_linear=fit(s1ab_z_means_vector,s1p_s1_z_s1as1b_bins_vector,'poly1'); +s1ab_s2_z_fit_linear=fit(s1ab_z_means_vector,s2p_s2_z_s1as1b_bins_vector,'poly1'); + +%Both at same time +figure +hold on; +rkploterr(s1ab_xyz_mean,s1p_s1_3D_s1as1b_bins,s1ab_xyz_mean_err,s1p_s1_3D_s1as1b_bins_err,[0.7 0.7 0.7],'.',100, 2); +rkploterr(s1ab_xyz_mean,s2p_s2_3D_s1as1b_bins,s1ab_xyz_mean_err,s2p_s2_3D_s1as1b_bins_err,[1 0.7 0.7],'.',100, 2); +rkploterr(s1ab_z_means,s1p_s1_z_s1as1b_bins,s1ab_z_means_err,[],[0 0 0],'.',100, 2); +rkploterr(s1ab_z_means,s2p_s2_z_s1as1b_bins,s1ab_z_means_err,[],[1 0 0],'.',100, 2); +x=0:.01:3.1; +y=s1ab_s1_xyz_fit.p1.*x.^2+s1ab_s1_xyz_fit.p2.*x+s1ab_s1_xyz_fit.p3; +plot(x,y,'Color',[0.7 0.7 0.7],'LineWidth',2); +y=s1ab_s2_xyz_fit.p1.*x.^2+s1ab_s2_xyz_fit.p2.*x+s1ab_s2_xyz_fit.p3; +plot(x,y,'Color',[1 0.7 0.7],'LineWidth',2); +y=s1ab_s1_z_fit.p1.*x.^2+s1ab_s1_z_fit.p2.*x+s1ab_s1_z_fit.p3; +plot(x,y,'Color',[0 0 0],'LineWidth',2); +y=s1ab_s2_z_fit.p1.*x.^2+s1ab_s2_z_fit.p2.*x+s1ab_s2_z_fit.p3; +plot(x,y,'Color',[1 0 0],'LineWidth',2); +xlabel('S1a/S1b'); ylabel('CH3T Corrected Kr at XYZ / CH3T Corrected Kr at Center'); +myfigview(16); +legend('S1 - 3D Dependence','S2 - 3D Dependence','S1 - Z Dependence Only','S2 - Z Dependence Only'); +xlim([2.3 3.2]);ylim([0.5 1.45]); + +%Both at same time - S2 only +figure +hold on; +% rkploterr(s1ab_xyz_mean,s1p_s1_3D_s1as1b_bins,s1ab_xyz_mean_err,s1p_s1_3D_s1as1b_bins_err,[0.7 0.7 0.7],'.',100, 2); +rkploterr(s1ab_xyz_mean,s2p_s2_3D_s1as1b_bins,s1ab_xyz_mean_err,s2p_s2_3D_s1as1b_bins_err,[1 0.7 0.7],'.',100, 2); +% rkploterr(s1ab_z_means,s1p_s1_z_s1as1b_bins,s1ab_z_means_err,[],[0 0 0],'.',100, 2); +rkploterr(s1ab_z_means,s2p_s2_z_s1as1b_bins,s1ab_z_means_err,[],[1 0 0],'.',100, 2); +x=0:.01:3.1; +% y=s1ab_s1_xyz_fit.p1.*x.^2+s1ab_s1_xyz_fit.p2.*x+s1ab_s1_xyz_fit.p3; +% plot(x,y,'Color',[0.7 0.7 0.7],'LineWidth',2); +y=s1ab_s2_xyz_fit.p1.*x.^2+s1ab_s2_xyz_fit.p2.*x+s1ab_s2_xyz_fit.p3; +plot(x,y,'Color',[1 0.7 0.7],'LineWidth',2); +% y=s1ab_s1_z_fit.p1.*x.^2+s1ab_s1_z_fit.p2.*x+s1ab_s1_z_fit.p3; +% plot(x,y,'Color',[0 0 0],'LineWidth',2); +y=s1ab_s2_z_fit.p1.*x.^2+s1ab_s2_z_fit.p2.*x+s1ab_s2_z_fit.p3; +plot(x,y,'Color',[1 0 0],'LineWidth',2); +xlabel('S1a/S1b'); ylabel('S2_E (xyz) /S2_E (Center)'); +myfigview(16); +legend('S2 - 3D Dependence','S2 - Z Dependence Only'); +xlim([2.3 3.2]);ylim([0.5 1.45]); + +% For plotting Chi2 result +% a1=0.05; b1=0;y=a1.*x.^2+b1.*x+(1-a1*(2.755^2)-b1*2.755); +% plot(x,y,'-b') + +% For comparing saved .mat files +% figure +% hold on; +% rkploterr(s1ab_xyz_mean_map,s1p_s1_3D_s1as1b_bins_map,s1ab_xyz_mean_err_map,s1p_s1_3D_s1as1b_bins_err_map,[0.7 0.7 0.7],'.',100, 2); +% rkploterr(s1ab_xyz_mean_map,s2p_s2_3D_s1as1b_bins_map,s1ab_xyz_mean_err_map,s2p_s2_3D_s1as1b_bins_err_map,[1 0.7 0.7],'.',100, 2); +% rkploterr(s1ab_z_means_map,s1p_s1_z_s1as1b_bins_map,s1ab_z_means_err_map,s1p_s1_z_s1as1b_bins_err_map,[0 0 0],'.',100, 2); +% rkploterr(s1ab_z_means_map,s2p_s2_z_s1as1b_bins_map,s1ab_z_means_err_map,s2p_s2_z_s1as1b_bins_err_map,[1 0 0],'.',100, 2); +% x=0:.01:3.1; +% y=s1ab_s1_xyz_fit_map.p1.*x.^2+s1ab_s1_xyz_fit_map.p2.*x+s1ab_s1_xyz_fit_map.p3; +% plot(x,y,'Color',[0.7 0.7 0.7],'LineWidth',2); +% y=s1ab_s2_xyz_fit_map.p1.*x.^2+s1ab_s2_xyz_fit_map.p2.*x+s1ab_s2_xyz_fit_map.p3; +% plot(x,y,'Color',[1 0.7 0.7],'LineWidth',2); +% y=s1ab_s1_z_fit_map.p1.*x.^2+s1ab_s1_z_fit_map.p2.*x+s1ab_s1_z_fit_map.p3; +% plot(x,y,'Color',[0 0 0],'LineWidth',2); +% y=s1ab_s2_z_fit_map.p1.*x.^2+s1ab_s2_z_fit_map.p2.*x+s1ab_s2_z_fit_map.p3; +% plot(x,y,'Color',[1 0 0],'LineWidth',2); +% xlabel('S1a/S1b'); ylabel('CH3T Corrected Kr at XYZ / CH3T Corrected Kr at Center'); +% myfigview(16); +% legend('S1 - 3D Dependence','S2 - 3D Dependence','S1 - Z Dependence Only','S2 - Z Dependence Only'); +% + +%fitting polynomials +% s1ab_s1_xyz_fit=fit(s1ab_xyz_mean_vector,s1p_s1_3D_s1as1b_bins_vector,'poly1'); +% s1ab_s2_xyz_fit=fit(s1ab_xyz_mean_vector,s2p_s2_3D_s1as1b_bins_vector,'poly1'); +% s1ab_s1_z_fit=fit(s1ab_z_means_vector,s1p_s1_z_s1as1b_bins_vector,'poly1'); +% s1ab_s2_z_fit=fit(s1ab_z_means_vector,s2p_s2_z_s1as1b_bins_vector,'poly1'); + +%giving variables unique names from KrypCal code +s1ab_xyz_mean_map=s1ab_xyz_mean; +s1p_s1_3D_s1as1b_bins_map=s1p_s1_3D_s1as1b_bins; +s1ab_xyz_mean_err_map=s1ab_xyz_mean_err; +s1p_s1_3D_s1as1b_bins_err_map=s1p_s1_3D_s1as1b_bins_err; +s2p_s2_3D_s1as1b_bins_map=s2p_s2_3D_s1as1b_bins; +s2p_s2_3D_s1as1b_bins_err_map=s2p_s2_3D_s1as1b_bins_err; +s1ab_z_means_map=s1ab_z_means; +s1p_s1_z_s1as1b_bins_map=s1p_s1_z_s1as1b_bins; +s1ab_z_means_err_map=s1ab_z_means_err; +% s1p_s1_z_s1as1b_bins_err_map=s1p_s1_z_s1as1b_bins_err; +s2p_s2_z_s1as1b_bins_map=s2p_s2_z_s1as1b_bins; +% s2p_s2_z_s1as1b_bins_err_map=s2p_s2_z_s1as1b_bins_err; +s1ab_s1_xyz_fit_map=s1ab_s1_xyz_fit; +s1ab_s2_xyz_fit_map=s1ab_s2_xyz_fit; +s1ab_s1_z_fit_map=s1ab_s1_z_fit; +s1ab_s2_z_fit_map=s1ab_s2_z_fit; + +save('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\S1aS1bfieldmapping_2p21_2015polyfit','s1ab_xyz_mean_map','s1p_s1_3D_s1as1b_bins_map','s1ab_xyz_mean_err_map','s1p_s1_3D_s1as1b_bins_err_map',... + 's2p_s2_3D_s1as1b_bins_map','s2p_s2_3D_s1as1b_bins_err_map','s1ab_z_means_map','s1p_s1_z_s1as1b_bins_map','s1ab_z_means_err_map', ... + 's2p_s2_z_s1as1b_bins_map','s1ab_s1_xyz_fit_map','s1ab_s2_xyz_fit_map','s1ab_s1_z_fit_map','s1ab_s2_z_fit_map','s1ab_s2_z_fit_linear','s1ab_s1_z_fit_linear','s1ab_s2_xyz_fit_linear','s1ab_s1_xyz_fit_linear'); + +% save('CH3T_field_normalization_DP21_ConvertS2toS1','s2z_normalization_fit_bot','s2z_normalization_fit_both','norm_S1_both','norm_S1_bottom','norm_S2_xy_bot','norm_S2_xy_both','s2_xy_xbins_bot','s2_xy_xbins_both','s2_xy_ybins_bot',... +% 's2_xy_ybins_both','mean_fit_s1z','mean_fit_s1z_bottom','s1_xy_xbins','s1_xy_xbins_bottom','s1_xy_ybins','s1_xy_ybins_bottom'); diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/MakeEnergySpectra_WithChosenParams_SlicesSCRAP.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/MakeEnergySpectra_WithChosenParams_SlicesSCRAP.m new file mode 100644 index 0000000..b7edaa1 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/MakeEnergySpectra_WithChosenParams_SlicesSCRAP.m @@ -0,0 +1,1632 @@ +% NEED TO UPDATE THESE POLYNOMIALS AND G1/G2 + + +% s1ab_s2_xyz_fit_map.p1=-0.4988; %these are slightly different than Kr2p21, prob just a resulting of the fitting +% s1ab_s2_xyz_fit_map.p2=1.484; +% c1=1-s1ab_s2_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s2_xyz_fit_map.p2; +% s1ab_s2_xyz_fit_map.p3=c1; +% +% s1ab_s1_xyz_fit_map.p1=0.0400; +% s1ab_s1_xyz_fit_map.p2= 0.4000; +% s1ab_s1_xyz_fit_map.p3=-0.3903; + +s1ab_s2_xyz_fit_map.p1=-0.4988; %these are slightly different than Kr2p20, prob just a resulting of the fitting +s1ab_s2_xyz_fit_map.p2=1.484; +c1=1-s1ab_s2_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s2_xyz_fit_map.p2; +s1ab_s2_xyz_fit_map.p3=c1; + +s1ab_s1_xyz_fit_map.p1=0; +s1ab_s1_xyz_fit_map.p2=0.35; +s1ab_s1_xyz_fit_map.p3=0.0444; + + +inpaint_on=1; + +%HAVE TO MAKE THIS .MAT FILE STILL - USE class 1 and class 9 for S1 +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\MappingParametersFit_Start_2015_CutDown.mat') + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Calculate 2015 Corrections +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval.*s2_xyfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval.*s2_xyfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval.*s1_xyfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval.*s1_xyfieldremoval); + + + + end + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=1000; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1500]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + + % % Making a plot of the S2 Z dependence +% figure +colors={'r','b','g'}; +colors2={[1 0.6 0.6],[0.6 0.6 1],[0.6 1 0.6]}; +hold on; +i=1; +for dT_max=90:60:210; +s2z_fit_temp=fit(x,hist(s1_phe_both(cut==1 & inrange(drift_time,[dT_max-60 dT_max])),x)','gauss1'); +step(s1_phe_both(cut==1 & inrange(drift_time,[dT_max-60 dT_max])),x.',colors2{i}); +xx=[0:1:400]; y=s2z_fit_temp.a1.*exp(-((xx-s2z_fit_temp.b1)./s2z_fit_temp.c1).^2); +i=i+1; +end +legend('30-90 uSec','90-150 uSec','150-210 uSec'); +myfigview(16); +xlabel('S1_F (phe)'); ylabel('Counts'); +i=1; +for dT_max=90:60:210; +s2z_fit_temp=fit(x,hist(s1_phe_both(cut==1 & inrange(drift_time,[dT_max-60 dT_max])),x)','gauss1'); +xx=[0:1:400]; y=s2z_fit_temp.a1.*exp(-((xx-s2z_fit_temp.b1)./s2z_fit_temp.c1).^2); plot(xx,y,'LineWidth',2,'Color',colors{i}); +i=i+1; +end +xlim([100 350]) + + + +% Plot s1 z dep + + light_correction_fig = figure; + errorbar(mean_index,means,means_error,'.k'); + hold on + [yplot_s1_both] = polyval(P_s1_both,dT_fit); + [center_s1_both, center_s1_both_err] = polyval(P_s1_both,z_center, S); %160[us]*1.51[\mus/us] + plot(dT_fit,yplot_s1_both,'-r','LineWidth',1); + xlabel('Drift Time(\mus)', 'FontSize',16); ylabel('S1_F (phe)', 'FontSize', 16); +% title(strcat(file_id_cp,'.Kr83m. S1 Mean vs. Z'), 'FontSize', 16,'Interpreter','none'); + line([0 det_edge],[center_s1_both center_s1_both],'linestyle','--'); + line([z_center; z_center;],[min(means) max(means)],'linestyle','--'); + legend('S1\_both Mean', strcat('y=', num2str(P_s1_both(1),'%10.2e'), '*Z^2 + ', num2str(P_s1_both(2),'%10.2e')... + , '*Z + ', num2str(P_s1_both(3),4)),strcat('Det center = ',num2str(center_s1_both,4), ' [Phe]'),'location','northwest') + + box on; + myfigview(16); + xlim([0 det_edge]); + ylim([0.8*min(means) 1.15*max(means)]); +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[5+bin_size, 500] );%from 50 to 300us for the fit, based on when s1as1b values get strange + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + %%Tracker for pseudo-lifetime + s2_at_bottom=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_2015=-320/log(s2_at_bottom/s2_at_top); + + % % Making a plot of the S2 Z dependence +% figure +colors={'r','b','g'}; +colors2={[1 0.6 0.6],[0.6 0.6 1],[0.6 1 0.6]}; +hold on; +i=1; +for dT_max=90:60:210; +s2z_fit_temp=fit(x2,hist(s2_phe_both(cut==1 & inrange(drift_time,[dT_max-60 dT_max])),x2)','gauss1'); +step(s2_phe_both(cut==1 & inrange(drift_time,[dT_max-60 dT_max])),x2.',colors2{i}); +xx=[0:10:50000]; y=s2z_fit_temp.a1.*exp(-((xx-s2z_fit_temp.b1)./s2z_fit_temp.c1).^2); +i=i+1; +end +legend('30-90 uSec','90-150 uSec','150-210 uSec'); +myfigview(16); +xlabel('S2_F (phe)'); ylabel('Counts'); +i=1; +for dT_max=90:60:210; +s2z_fit_temp=fit(x2,hist(s2_phe_both(cut==1 & inrange(drift_time,[dT_max-60 dT_max])),x2)','gauss1'); +xx=[0:10:50000]; y=s2z_fit_temp.a1.*exp(-((xx-s2z_fit_temp.b1)./s2z_fit_temp.c1).^2); plot(xx,y,'LineWidth',2,'Color',colors{i}); +i=i+1; +end +xlim([5000 30000]) + +% S2_E Z dep figure + + lifetime_fig_both = figure; + errorbar(mean_index(2:end),means(2:end),means_error(2:end),'.k'); %first bin is anode, skip it + hold on + plot([0:0.1:350],RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,[0:0.1:350]),'-r','LineWidth',1); + xlabel('Drift Time (\mus)', 'FontSize',16); ylabel('S2_F (phe)', 'FontSize', 16); +% title(strcat(file_id_cp,'.Kr83m. S2_both Electron Lifetime'), 'FontSize', 16,'Interpreter','none'); + myfigview(16); + xlim([0 det_edge]); + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_xbins),floor(s2_ybins)); +Sigma_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); +Count_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>30; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + + + %centerS2b= 1; %interp2(s2xbins,s2ybins,mean_S2_bottom_xy,x_center,y_center,'spline'); + + color_range_max= max(max(mean_S2_both_xy)) ; + color_range_min= min(min(mean_S2_both_xy(mean_S2_both_xy>0))) ; + vc_step=(color_range_max-color_range_min)/50; + + vc=color_range_min:vc_step:color_range_max; + + s2_xy_both_fig = figure; + contourf(s2xbins,s2ybins,mean_S2_both_xy,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S2_F (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_xbins),floor(s1_ybins)); +Sigma_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); +Count_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>30; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +%plot + +color_range_max=max(max(mean_S1_both_xy)); +color_range_min=min(min(mean_S1_both_xy(mean_S1_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + +s1_xy_both_fig = figure; +contourf(s1xbins,s1ybins,mean_S1_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'S1_F (phe)','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XYZ. 3D Map, caluculate and Submit IQ +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% if Kr_events>150000 +% +% % LUXkrypCal_S1_3D(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_distance_\mus,user_name,file_id_cp,dp_version,submit); +% LUXkrypCal_S1_3D_Run04_local_2p14FixedZHisto(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_time,x_center,y_center,z_center,det_edge,inpaint_on,user_name,file_id_cp,dp_version, algorithm_name, submit); +% +% +% end + + +%% Apply corrections to CH3T and calculate the ER band shift + +%First load the data + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\CH3T_Sep2015_NoCorrections.mat'); + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = S2_x; +s1_y_cm = S2_y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'spline',1); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,S2_x,S2_y,'spline',1); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +%% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + h3_cut= inrange(drift_time,[40 300]) & inrange(s2radius_c,[0,18]) & inrange(s1_phe_both,[0 120]) ... + & (log10(s1_phe_both)+0.5*log10(s2_phe_both_xyz)<4) & s2_phe_both>100 & s2_phe_both<16000 ... + & drift_time<-2.*s2radius.^2+380; %used to be drift time 100 to 250 + +h3_s1_c_2015=s1_phe_both_xyz(h3_cut); +h3_s2_c_2015=s2_phe_both_xyz(h3_cut); + + kr_cut= inrange(drift_time,[40 300]) & inrange(s2radius_c,[0,18]) & inrange(s1_phe_both,[30 1000]) ... + & (log10(s1_phe_both)+0.5*log10(s2_phe_both_xyz)>4) & s2_phe_both>3000 & s2_phe_both<60000 ... + & drift_time<-2.*s2radius.^2+380; %used to be drift time 100 to 250 + + +kr_s1_c_2015=s1_phe_both_xyz(kr_cut); +kr_s2_c_2015=s2_phe_both_xyz(kr_cut); +kr_2015_drift_time=drift_time(kr_cut); +kr_2015_s2x=S2_x(kr_cut); +kr_2015_s2y=S2_y(kr_cut); + + clearvars -except param_counter a1_list b1_list a2_list b2_list total_chi2_list h3_chi2_list kr_chi2_list g1_list g2_list total_chi2_map h3_chi2_map kr_chi2_map chi2_midtobot_list... + best_chi2_midtotop besta1_midtotop besta2_midtotop bestb1_midtotop bestb2_midtotop best_chi2_midtobot... + besta1_midtobot besta1_midtotop bestb1_midtobot bestb1_midtotop a1 b1 a2 b2 chi2_midtotop_map chi2_midtobot_map b_counter a_counter... + besta1_combined bestb1_combined besta2_combined bestb2_combined best_chi2_combined chi2_combined_map chi2_combined_list b1_counter a1_counter a2_counter b2_counter... + a1_counter b1_counter a2_counter b2_counter c1_list c2_list bestc1_midtobot bestc2_midtobot bestc1_midtotop bestc2_midtotop bestc1_combined bestc2_combined... + besta1_combined besta2_combined bestb1_combined bestb2_combined besta1 bestb1 bestc1 besta2 bestb2 bestc2 bestg1 bestg2 best_total_chi2 NEST_CH3T_Spectrum inpaint_on... + best_kr_chi2 best_h3_chi2 electron_lifetime_list electron_lifetime_map a2_start a1_start b1_start b2_start ... + total_h3_chi2_list total_kr_chi2_list total_chi2_list h3_chi2_2016_list h3_chi2_2015_list kr_chi2_2016_list kr_chi2_2015_list ... + electron_lifetime_2016_list electron_lifetime_2015_list total_h3_chi2_map total_kr_chi2_map total_chi2_map h3_chi2_2016_map h3_chi2_2015_map ... + kr_chi2_2016_map kr_chi2_2015_map electron_lifetime_2016_map electron_lifetime_2015_map NEST_CH3T_Spectrum g1 g2 bestg1 bestg2 g1_counter g2_counter ... + firsta1 firstb1 firsta2 firstb2 firstg1 firstg2 kr_means_2015_map kr_means_2016_map kr_sigma_2015_map kr_sigma_2016_map kr_staterr_2015_map kr_staterr_2016_map ... + kr_means_2015_list kr_means_2016_list kr_2015_num_events kr_2016_num_events kr_sigma_2015_list kr_sigma_2016_list kr_staterr_2015_list kr_staterr_2016_list ... + pseudo_lifetime_2016 pseudo_lifetime_2015 kr_s1_c_2015 kr_s2_c_2015 h3_s1_c_2015 h3_s2_c_2015 s1ab_s2_xyz_fit_map s1ab_s1_xyz_fit_map ... + kr_2015_drift_time kr_2015_s2x kr_2015_s2y kr_chi2_2016_zslice_list kr_chi2_2015_zslice_list kr_chi2_zslice_zcenter_list ... + full_kr_chi2_2016_list full_kr_chi2_2015_list best_total_kr_chi2 best_total_h3_chi2 + + + + +%%%%%%%%%%%%%%%%%%%%% +%% REPEAT FOR 2016 DATA +%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\MappingParametersFit_Start_2016_CutDown.mat') + + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval.*s2_xyfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval.*s2_xyfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval.*s1_xyfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval.*s1_xyfieldremoval); + + + + end + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[5+bin_size, 500] );%from 50 to 300us for the fit, based on when s1as1b values get strange + +s2_both_norm_z_index=mean_index(dT_range); +s2_both_norm_z_means=means(dT_range); + s2_at_top=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + %%Tracker for pseudo-lifetime + s2_at_bottom=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_2016=-320/log(s2_at_bottom/s2_at_top); +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_xbins),floor(s2_ybins)); +Sigma_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); +Count_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>30; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_xbins),floor(s1_ybins)); +Sigma_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); +Count_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>30; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'spline');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Apply corrections to 2016 Kr data +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\MappingParametersFit_Start_2016_CutDown.mat') + + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; +% +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'spline',1); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'spline',1); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate ER Band shift +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + liquid_cut= inrange(drift_time,[40 300]) & inrange(s2radius,[0,18]) & inrange(s1_phe_both_xyz,[30 1000]) ... + & (log10(s1_phe_both_xyz)+0.5*log10(s2_phe_both_xyz)>4.2) & s2_phe_both>3000 & s2_phe_both<60000 ... ;%used to be drift time 100 to 250 + & drift_time<-1.4.*s2radius.^2+400; + + +kr_s1_c_2016=s1_phe_both_xyz(liquid_cut); +kr_s2_c_2016=s2_phe_both_xyz(liquid_cut); +kr_2016_drift_time=drift_time(liquid_cut); +kr_2016_s2x=s2x(liquid_cut); +kr_2016_s2y=s2y(liquid_cut); + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%Apply Corrections to 2016 CH3T Data +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\CH3T_Feb2016_NoCorrections.mat'); + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +% electron_lifetime_2016=e_lifetime_both; +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'spline',1); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'spline',1); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate ER Band shift +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +s1_min=0; +s1_max=120; + + %% Redo with r<10 cm + + liquid_cut= clean_cut & inrange(drift_time,[40 300]) & inrange(s1_phe_both_xyz,[s1_min s1_max]) ... + & (log10(s1_phe_both_xyz)+0.5*log10(s2_phe_both_xyz)<4.2) & s2_phe_both>100 & s2_phe_both<16000 ... ;%used to be drift time 100 to 250 + & drift_time<-1.4.*s2radius.^2+400; + +h3_s1_c_2016=s1_phe_both_xyz(liquid_cut); +h3_s2_c_2016=s2_phe_both_xyz(liquid_cut); + + clearvars -except param_counter a1_list b1_list a2_list b2_list total_chi2_list h3_chi2_list kr_chi2_list g1_list g2_list total_chi2_map h3_chi2_map kr_chi2_map chi2_midtobot_list... + best_chi2_midtotop besta1_midtotop besta2_midtotop bestb1_midtotop bestb2_midtotop best_chi2_midtobot... + besta1_midtobot besta1_midtotop bestb1_midtobot bestb1_midtotop a1 b1 a2 b2 chi2_midtotop_map chi2_midtobot_map b_counter a_counter... + besta1_combined bestb1_combined besta2_combined bestb2_combined best_chi2_combined chi2_combined_map chi2_combined_list b1_counter a1_counter a2_counter b2_counter... + a1_counter b1_counter a2_counter b2_counter c1_list c2_list bestc1_midtobot bestc2_midtobot bestc1_midtotop bestc2_midtotop bestc1_combined bestc2_combined... + besta1_combined besta2_combined bestb1_combined bestb2_combined besta1 bestb1 bestc1 besta2 bestb2 bestc2 bestg1 bestg2 best_total_chi2 NEST_CH3T_Spectrum inpaint_on... + best_kr_chi2 best_h3_chi2 electron_lifetime_list electron_lifetime_map a2_start a1_start b1_start b2_start ... + total_h3_chi2_list total_kr_chi2_list total_chi2_list h3_chi2_2016_list h3_chi2_2015_list kr_chi2_2016_list kr_chi2_2015_list ... + electron_lifetime_2016_list electron_lifetime_2015_list total_h3_chi2_map total_kr_chi2_map total_chi2_map h3_chi2_2016_map h3_chi2_2015_map ... + kr_chi2_2016_map kr_chi2_2015_map electron_lifetime_2016_map electron_lifetime_2015_map NEST_CH3T_Spectrum g1 g2 bestg1 bestg2 g1_counter g2_counter ... + firsta1 firstb1 firsta2 firstb2 firstg1 firstg2 kr_means_2015_map kr_means_2016_map kr_sigma_2015_map kr_sigma_2016_map kr_staterr_2015_map kr_staterr_2016_map ... + kr_means_2015_list kr_means_2016_list kr_2015_num_events kr_2016_num_events kr_sigma_2015_list kr_sigma_2016_list kr_staterr_2015_list kr_staterr_2016_list ... + pseudo_lifetime_2016 pseudo_lifetime_2015 kr_s1_c_2015 kr_s2_c_2015 h3_s1_c_2015 h3_s2_c_2015 kr_s1_c_2016 kr_s2_c_2016 h3_s1_c_2016 h3_s2_c_2016 ... + kr_2015_drift_time kr_2015_s2x kr_2015_s2y kr_2016_drift_time kr_2016_s2x kr_2016_s2y ... + kr_chi2_2016_zslice_list kr_chi2_2015_zslice_list kr_chi2_zslice_zcenter_list ... + full_kr_chi2_2016_list full_kr_chi2_2015_list best_total_kr_chi2 best_total_h3_chi2 +%% Make plots + + + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\NEST_CH3T_Spectrum_Feb2016_Kr2p21.mat') +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\NEST_CH3T_Spectrum_Sep2015_Kr2p21.mat') + + +best_total_chi2=100000000; + +g1=0.096; +ee=0.86; + g2_Feb2016=25.05*ee; %converting to g2 with SE size + g2_sep2015=25.8536*ee; + +Kr_E_2016=(1/73).*(kr_s1_c_2016./g1+kr_s2_c_2016./g2_Feb2016); +H3_E_2016=(1/73).*(h3_s1_c_2016./g1+h3_s2_c_2016./g2_Feb2016); + +Kr_E_2015=(1/73).*(kr_s1_c_2015./g1+kr_s2_c_2015./g2_sep2015); +H3_E_2015=(1/73).*(h3_s1_c_2015./g1+h3_s2_c_2015./g2_sep2015); + +i=1; +for dT_max=40+20/2:20:300-20/2; + temp_fit_2016=fit([0:1:100].',hist(Kr_E_2016(inrange(kr_2016_drift_time,[dT_max-20 dT_max])),[0:1:100]).','gauss1'); + kr_2016_means(i)=temp_fit_2016.b1; + kr_2016_means_err(i)=temp_fit_2016.c1/sqrt(2)/length(Kr_E_2016(inrange(kr_2016_drift_time,[dT_max-20 dT_max]))); + + temp_fit_2015=fit([0:1:100].',hist(Kr_E_2015(inrange(kr_2015_drift_time,[dT_max-20 dT_max])),[0:1:100]).','gauss1'); + kr_2015_means(i)=temp_fit_2015.b1; + kr_2015_means_err(i)=temp_fit_2015.c1/sqrt(2)/length(Kr_E_2015(inrange(kr_2015_drift_time,[dT_max-20 dT_max]))); + + dT_centers(i)=dT_max-10; + i=i+1; +end + +kr_2016_chi2_slices=((41.55-kr_2016_means)./0.2395).^2; +kr_2015_chi2_slices=((41.55-kr_2015_means)./0.2395).^2; + +figure +errorbar(dT_centers,kr_2016_means,kr_2016_means_err,'.k'); +xlabel('Drift Time (uSec)'); ylabel('Kr Energy Mean (phd)'); +title('2016 Data'); +myfigview(16); + +figure +errorbar(dT_centers,kr_2015_means,kr_2015_means_err,'.k'); +xlabel('Drift Time (uSec)'); ylabel('Kr Energy Mean (phd)'); +title('2015 Data'); +myfigview(16); + +figure +errorbar(dT_centers,kr_2016_means,kr_2016_means_err,'.k'); +hold on; +errorbar(dT_centers,kr_2015_means,kr_2015_means_err,'.r'); +xlabel('Drift Time (uSec)'); ylabel('Kr Energy Mean (phd)'); +legend('2016','2015'); +myfigview(16); + + +figure +step(Kr_E_2016,[30:0.5:60],'r') +hold on; +step(Kr_E_2015,[30:0.5:60],'b',length(Kr_E_2016)./length(Kr_E_2015)) +line([41.55 41.55],[0 30000],'Color','k','LineWidth',2) +xlabel('Energy (keV)'); ylabel('Counts'); myfigview(16); +legend('2016','2015','Expected'); + +krfit_2016=fit([30:0.5:60].',hist(Kr_E_2016,[30:0.5:60]).','gauss1'); +krerr_2016=confint(krfit_2016,0.68); +x=[30:0.5:60]; +y=krfit_2016.a1.*exp(-((x-krfit_2016.b1)./krfit_2016.c1).^2); +hold on; +plot(x,y,'-r'); + +kr_mean_2016=krfit_2016.b1 +kr_sig=krfit_2016.c1/sqrt(2) +kr_mean_err_2016=abs(krfit_2016.b1-krerr_2016(1,2)) %kr_sig./sqrt(length(Kr_E_2016(inrange(Kr_E_2016,[30 60])))) % +kr_sig_err=abs(krfit_2016.c1-krerr_2016(1,3))/sqrt(2) + +krfit_2015=fit([30:0.5:60].',(length(Kr_E_2016)./length(Kr_E_2015)).*hist(Kr_E_2015,[30:0.5:60]).','gauss1'); +krerr_2015=confint(krfit_2015,0.68); +x=[30:0.5:60]; +y=krfit_2015.a1.*exp(-((x-krfit_2015.b1)./krfit_2015.c1).^2); +hold on; +plot(x,y,'-b'); + + +kr_mean_2015=krfit_2015.b1 +kr_sig=krfit_2015.c1/sqrt(2) +kr_mean_err_2015=abs(krfit_2015.b1-krerr_2015(1,2)) %kr_sig./sqrt(length(Kr_E_2015(inrange(Kr_E_2015,[30 60])))) +kr_sig_err=abs(krfit_2015.c1-krerr_2015(1,3))/sqrt(2) + + + %make CH3T data spectrum + [h3_hist_Feb2016,h3_hist_bin_Feb2016]=hist(H3_E_2016,NEST_CH3T_Spectrum_Feb2016(1,:)); + [h3_hist_sep2015,h3_hist_bin_sep2015]=hist(H3_E_2015,NEST_CH3T_Spectrum_Sep2015(1,:)); + %scale the simulation to the data + scale_factor_Feb2016=sum(h3_hist_Feb2016(11:80))./sum(NEST_CH3T_Spectrum_Feb2016(2,11:80)); + scale_factor_sep2015=sum(h3_hist_sep2015(11:80))./sum(NEST_CH3T_Spectrum_Sep2015(2,11:80)); + h3_scaled_sim_Feb2016=NEST_CH3T_Spectrum_Feb2016(2,:).*scale_factor_Feb2016; + h3_scaled_sim_sep2015=NEST_CH3T_Spectrum_Sep2015(2,:).*scale_factor_sep2015; + + +figure +step(H3_E_2016,NEST_CH3T_Spectrum_Feb2016(1,:),'-r') +hold on; +plot(NEST_CH3T_Spectrum_Feb2016(1,:),h3_scaled_sim_Feb2016,'-k','LineWidth',2) +xlabel('Energy (keV)'); ylabel('Counts'); myfigview(16); +legend('Feb2016 Data','Expected'); + +figure +step(H3_E_2015,NEST_CH3T_Spectrum_Feb2016(1,:),'-r') +hold on; +plot(NEST_CH3T_Spectrum_Sep2015(1,:),h3_scaled_sim_sep2015,'-k','LineWidth',2) +xlabel('Energy (keV)'); ylabel('Counts'); myfigview(16); +legend('Sep2015 Data','Expected'); \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/MakeMappingParamStart_2014_cp17059.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/MakeMappingParamStart_2014_cp17059.m new file mode 100644 index 0000000..a1f0ce4 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/MakeMappingParamStart_2014_cp17059.m @@ -0,0 +1,423 @@ +path='C:\Users\Richard\Desktop\LUX Analysis\lux10_20140903T1918_cp17059\'; + + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +distinguish_string='test'; + +%Hardcoding inputs for ease of use during testing +user_name='RichardKnoche'; +dp_version='2.15_test'; +algorithm_name='test_KrypCal'; +submit=0; +delay_min=0; +inpaint_on=1; + + file=char(d.files_loaded(1)); + file_id=file(1:19); + cp_start=strfind(file,'cp')+2;%find location of 'cp' in string + cp=file(cp_start:cp_start+4);%cp number has four digits + file_id_cp = [file_id '_cp' cp '_' distinguish_string]; + + + gs=0; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 32000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + clean_cut = (log10(s1_phe_both)+0.6*log10(s2_phe_both)>4.5) & s2radius<25; + + s1_phe_bottom=s1_phe_bottom(clean_cut); + s1_phe_both=s1_phe_both(clean_cut); + s2_phe_bottom=s2_phe_bottom(clean_cut); + s2_phe_both=s2_phe_both(clean_cut); + drift_time=drift_time(clean_cut); + s2x=s2x(clean_cut); + s2y=s2y(clean_cut); + s2radius = (s2x.^2+s2y.^2).^(0.5); + event_timestamp_samples=event_timestamp_samples(clean_cut); + s2_width=s2_width(clean_cut); + s1_width=s1_width(clean_cut); + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + +%% + zcut_min = 10; %field changes at 4 uSec + zcut_max = 0.95*det_edge; + + + if Kr_events < 30000 %then create a 10x10 grid. Otherwise 25x25. Want about 30 evts per bin + + S1xybinsize = sqrt((50*50)/(Kr_events/150)); + S1_xbin_min = -25; + S1_xbin_max = 25; + S1_ybin_min = -25; + S1_ybin_max = 25; + SE_ybin_min = -25; + SE_ybin_max = 25; + + S2xybinsize = sqrt((50*50)/(Kr_events/150));%cm +% SExybinsize = 5; DEFINED LATER, based on number of SE events + S2_xbin_min = -25; + S2_xbin_max = 25; + S2_ybin_min = -25; + S2_ybin_max = 25; + SE_xbin_min = -25; + SE_xbin_max = 25; + + + end + + s1_xbins = (S1_xbin_max-S1_xbin_min)./S1xybinsize; + s1_ybins = (S1_ybin_max-S1_ybin_min)./S1xybinsize; + + s2_xbins = (S2_xbin_max-S2_xbin_min)./S2xybinsize; + s2_ybins = (S2_ybin_max-S2_ybin_min)./S2xybinsize; + + + if Kr_events < 4000; % skip krpCal if less than 4000 events + calibrations=zeros(6,1); + end + +%% +%Set up cuts and variables + s1ab_cut=logical(sum(s1_single_cut(:,:),1)); + s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); + s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); + s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); + s1ab_x=d.x_cm(s2_single_cut); + s1ab_y=d.y_cm(s2_single_cut); + s1ab_z=d.z_drift_samples(s2_single_cut)/100; + s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); + + s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<=25; + %plotting x=s1a v y=s1a/s1b cuts: y<0.035x-1, y>-0.035.*x+5; y>0.01.*x; %y<4.2; x<255 +% s1ab_areacut= (s1a_phe_both./s1b_phe_both-0.035.*s1a_phe_both<-1) & (s1a_phe_both./s1b_phe_both+0.035.*s1a_phe_both>5)... +% & (s1a_phe_both./s1b_phe_both > 0.01.* s1a_phe_both) & (s1a_phe_both./s1b_phe_both<4.2) & (s1a_phe_both<255); + + s1ab_x=s1ab_x(s1ab_timing_cut); + s1ab_y=s1ab_y(s1ab_timing_cut); + s1ab_z=s1ab_z(s1ab_timing_cut); + s1a_phe_both=s1a_phe_both(s1ab_timing_cut); + s1b_phe_both=s1b_phe_both(s1ab_timing_cut); + + dT_step=det_edge/(length(s1ab_z)/1000); %2000 events per z bin + + + clear s1a_z_means s1a_z_means_err s1b_z_means s1b_z_means_err s1ab_bincenters s1ab_z_means s1ab_z_means_err +%Z Dependence of S1a/S1b +i=1; + for z_max=10+dT_step:dT_step:det_edge; + s1a_fit=fit([0:2:400].',hist(s1a_phe_both(s1a_phe_both>0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:400]).','gauss1'); + s1b_fit=fit([0:2:300].',hist(s1b_phe_both(s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:300]).','gauss1'); + s1a_z_means(i)=s1a_fit.b1; + s1a_z_means_err(i)=s1a_fit.c1/sqrt(2)/sqrt(length(s1a_phe_both(s1a_phe_both>0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1b_z_means(i)=s1b_fit.b1; + s1b_z_means_err(i)=s1b_fit.c1/sqrt(2)/sqrt(length(s1b_phe_both(s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1ab_bincenters(i)=z_max-dT_step/2; + i=i+1; + end + +s1ab_z_means=s1a_z_means./s1b_z_means; +s1ab_z_means_err=sqrt( (s1b_z_means_err.*s1a_z_means./(s1b_z_means.^2)).^2 + (s1a_z_means_err./s1b_z_means).^2); + +%fit polynomial to s1az and s1bz, to remove z dependence later in xy fit +[s1a_P, s1a_S]=polyfit(s1ab_bincenters,s1a_z_means,3); +[s1b_P, s1b_S]=polyfit(s1ab_bincenters,s1b_z_means,3); +[s1ab_P, s1ab_S]=polyfit(s1ab_bincenters,s1ab_z_means,2); + +%S1a z dependence plot +s1az_plot=figure; +errorbar(s1ab_bincenters,s1a_z_means,s1a_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a Mean (phe)'); title('S1a Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1a_P,[10:1:320]),'-r','LineWidth',2) + + +%S1b z dependence plot +s1bz_plot=figure; +errorbar(s1ab_bincenters,s1b_z_means,s1b_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1b Mean (phe)'); title('S1b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1b_P,[10:1:320]),'-r','LineWidth',2) + +%S1a/b z dependence plot +s1a_over_bz_plot=figure; +errorbar(s1ab_bincenters,s1ab_z_means,s1ab_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a/b'); title('S1 a/b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1ab_P,[10:1:320]),'-r','LineWidth',2) + +%Correcting z dependence to get XY dependence in same manner that Kr/CH3T +%map does + s1a_phe_both_z=s1a_phe_both.'.*polyval(s1a_P,z_center)./polyval(s1a_P,s1ab_z); + s1b_phe_both_z=s1b_phe_both.'.*polyval(s1b_P,z_center)./polyval(s1b_P,s1ab_z); + +%% S1a/b XY map (after z correction) +s1ab_xbin_min=-25; +s1ab_ybin_min=-25; +s1ab_xbin_max=25; +s1ab_ybin_max=25; +s1ab_xybinsize=sqrt((50*50)/(length(s1ab_z)/300)); +clear s1a_xy_mean s1a_xy_mean_err s1b_xy_mean s1b_xy_mean_err + +s1ab_xbins=s1ab_xbin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_xbin_max; +s1ab_ybins=s1ab_ybin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_ybin_max; + +s1a_xy_mean=zeros(length(s1ab_ybins),length(s1ab_xbins)); +s1b_xy_mean=zeros(length(s1ab_ybins),length(s1ab_xbins)); + + for x_bin=s1ab_xbin_min:s1ab_xybinsize:(s1ab_xbin_max-s1ab_xybinsize/2); + for y_bin=s1ab_ybin_min:s1ab_xybinsize:(s1ab_ybin_max-s1ab_xybinsize/2); + x_min = x_bin; x_max = x_bin+s1ab_xybinsize; + y_min = y_bin; y_max = y_bin+s1ab_xybinsize; + + x_count=int32(1+x_bin/s1ab_xybinsize+s1ab_xbin_max/s1ab_xybinsize); + y_count=int32(1+y_bin/s1ab_xybinsize+s1ab_ybin_max/s1ab_xybinsize); + + bin_cut = s1a_phe_both>0 & s1b_phe_both>0 & inrange(s1ab_x,[x_min,x_max]).' & inrange(s1ab_y,[y_min,y_max]).'; + if length(s1a_phe_both_z(bin_cut))>100; + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400])),[0:2:400]).','gauss1'); + s1a_xy_mean(y_count,x_count)=s1a_z_fit.b1; + s1a_xy_mean_err(y_count,x_count)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300])),[0:2:300]).','gauss1'); + s1b_xy_mean(y_count,x_count)=s1b_z_fit.b1; + s1b_xy_mean_err(y_count,x_count)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300]))); + else + s1a_xy_mean(y_count,x_count)=0; + s1a_xy_mean_err(y_count,x_count)=0; + s1b_xy_mean(y_count,x_count)=0; + s1b_xy_mean_err(y_count,x_count)=0; + end + + end + end + s1ab_xy_mean=s1a_xy_mean./s1b_xy_mean; + s1ab_xy_mean_err=sqrt( (s1b_xy_mean_err.*s1a_xy_mean./(s1b_xy_mean.^2)).^2 + (s1a_xy_mean_err./s1b_xy_mean).^2); + + + %Plot s1a XY means + color_range_max=max(max(s1a_xy_mean)); + color_range_min=min(min(s1a_xy_mean(s1a_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1a_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1a_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + %Plot s1a XY means + color_range_max=max(max(s1b_xy_mean)); + color_range_min=min(min(s1b_xy_mean(s1b_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1b_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1b_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1b Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1b Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + %s1a/b XY Ratio + color_range_max=max(max(s1ab_xy_mean)); + color_range_min=min(min(s1ab_xy_mean(s1ab_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1ab_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a/b Ratio vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a/b Ratio','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + +%% 3D Kr s1a/s1b map + +if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +s1ab_xyz_numbins=floor((length(s1ab_z)/300)^(1/3)); %number of bins in one direction +s1ab_xyz_zstep=det_edge/s1ab_xyz_numbins; +s1ab_xyz_xstep=50/s1ab_xyz_numbins; +s1ab_xyz_ystep=50/s1ab_xyz_numbins; +s1ab_xyz_xmax=25; +r_max=25; + +s1ab_xyz_zbins=10+s1ab_xyz_zstep/2:s1ab_xyz_zstep:10+s1ab_xyz_zstep/2+s1ab_xyz_zstep*s1ab_xyz_numbins; %20 us +s1ab_xyz_xbins=(-r_max+s1ab_xyz_xstep/2):s1ab_xyz_xstep:r_max; +s1ab_xyz_ybins=(-r_max+s1ab_xyz_ystep/2):s1ab_xyz_ystep:r_max; + +s1a_xyz_mean=zeros(length(s1ab_xyz_ybins),length(s1ab_xyz_xbins),length(s1ab_xyz_zbins)); +s1a_xyz_mean_err=zeros(length(s1ab_xyz_ybins),length(s1ab_xyz_xbins),length(s1ab_xyz_zbins)); +s1b_xyz_mean=zeros(length(s1ab_xyz_ybins),length(s1ab_xyz_xbins),length(s1ab_xyz_zbins)); +s1b_xyz_mean_err=zeros(length(s1ab_xyz_ybins),length(s1ab_xyz_xbins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + m=int8(j/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + + %Count the number of events per bin + Count_S1ab_3D(l,m,n)=length(s1a_phe_both(q)); + + if (Count_S1ab_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_xyz_mean(l,m,n)=s1a_z_fit.b1; + s1a_xyz_mean_err(l,m,n)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]) ),[0:2:300]).','gauss1'); + s1b_xyz_mean(l,m,n)=s1b_z_fit.b1; + s1b_xyz_mean_err(l,m,n)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); + else %not enough stats to do the fit + s1a_xyz_mean(l,m,n)=0; + s1a_xyz_mean_err(l,m,n)=0; + s1b_xyz_mean(l,m,n)=0; + s1b_xyz_mean_err(l,m,n)=0; + end + + end + end +k +end + + s1ab_xyz_mean=s1a_xyz_mean./s1b_xyz_mean; + s1ab_xyz_mean_err=sqrt( (s1b_xyz_mean_err.*s1a_xyz_mean./(s1b_xyz_mean.^2)).^2 + (s1a_xyz_mean_err./s1b_xyz_mean).^2); + +end + +save('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\MappingParametersFit_Start_2014_CutDown','Kr_events','S1_xbin_max','S1_xbin_min','S1_ybin_max','S1_ybin_min','S1xybinsize','S2_xbin_max','S2_xbin_min','S2_ybin_max','S2_ybin_min','S2xybinsize','det_edge','drift_time','g','grid_size','max_num_bins','min_evts_per_bin','r_max','rcut_max','rcut_min','s1_phe_both','s1_phe_bottom','s1_width','s1_xbins','s1_ybins','s1a_P','s1a_S','s1a_fit','s1a_over_bz_plot','s1a_xy_fig','s1a_xy_mean','s1a_xy_mean_err','s1a_xyz_mean','s1a_xyz_mean_err','s1a_z_fit','s1a_z_means','s1a_z_means_err','s1ab_P','s1ab_S','s1ab_bincenters','s1ab_x','s1ab_xbin_max','s1ab_xbin_min','s1ab_xbins','s1ab_xy_fig','s1ab_xy_mean','s1ab_xy_mean_err','s1ab_xybinsize','s1ab_xyz_mean','s1ab_xyz_mean_err','s1ab_xyz_numbins','s1ab_xyz_xbins','s1ab_xyz_xmax','s1ab_xyz_xstep','s1ab_xyz_ybins','s1ab_xyz_ystep','s1ab_xyz_zbins','s1ab_xyz_zstep','s1ab_y','s1ab_ybin_max','s1ab_ybin_min','s1ab_ybins','s1ab_z','s1ab_z_means','s1ab_z_means_err','s1area_bound_max','s1area_bound_min','s1az_plot','s1b_P','s1b_S','s1b_fit','s1b_xy_fig','s1b_xy_mean','s1b_xy_mean_err','s1b_xyz_mean','s1b_xyz_mean_err','s1b_z_fit','s1b_z_means','s1b_z_means_err','s1bz_plot','s2_phe_both','s2_phe_bottom','s2_width','s2_xbins','s2_ybins','s2area_bound_max','s2area_bound_min','s2radius','s2x','s2y','x_bin','x_center','x_count','x_max','x_min','y_bin','y_center','y_count','y_max','y_min','z_center','z_max','zcut_max','zcut_min'); \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/MakeMappingParamStart_2015.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/MakeMappingParamStart_2015.m new file mode 100644 index 0000000..3ae9d8b --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/MakeMappingParamStart_2015.m @@ -0,0 +1,423 @@ +path='C:\Users\Richard\Desktop\LUX Analysis\lux10_20150929T1905_cp18197'; + + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +distinguish_string='test'; + +%Hardcoding inputs for ease of use during testing +user_name='RichardKnoche'; +dp_version='2.15_test'; +algorithm_name='test_KrypCal'; +submit=0; +delay_min=0; +inpaint_on=1; + + file=char(d.files_loaded(1)); + file_id=file(1:19); + cp_start=strfind(file,'cp')+2;%find location of 'cp' in string + cp=file(cp_start:cp_start+4);%cp number has four digits + file_id_cp = [file_id '_cp' cp '_' distinguish_string]; + + + gs=0; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 32000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + clean_cut = (log10(s1_phe_both)+0.6*log10(s2_phe_both)>4.5) & s2radius<25; + + s1_phe_bottom=s1_phe_bottom(clean_cut); + s1_phe_both=s1_phe_both(clean_cut); + s2_phe_bottom=s2_phe_bottom(clean_cut); + s2_phe_both=s2_phe_both(clean_cut); + drift_time=drift_time(clean_cut); + s2x=s2x(clean_cut); + s2y=s2y(clean_cut); + s2radius = (s2x.^2+s2y.^2).^(0.5); + event_timestamp_samples=event_timestamp_samples(clean_cut); + s2_width=s2_width(clean_cut); + s1_width=s1_width(clean_cut); + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + +%% + zcut_min = 10; %field changes at 4 uSec + zcut_max = 0.95*det_edge; + + + if Kr_events < 30000 %then create a 10x10 grid. Otherwise 25x25. Want about 30 evts per bin + + S1xybinsize = sqrt((50*50)/(Kr_events/150)); + S1_xbin_min = -25; + S1_xbin_max = 25; + S1_ybin_min = -25; + S1_ybin_max = 25; + SE_ybin_min = -25; + SE_ybin_max = 25; + + S2xybinsize = sqrt((50*50)/(Kr_events/150));%cm +% SExybinsize = 5; DEFINED LATER, based on number of SE events + S2_xbin_min = -25; + S2_xbin_max = 25; + S2_ybin_min = -25; + S2_ybin_max = 25; + SE_xbin_min = -25; + SE_xbin_max = 25; + + + end + + s1_xbins = (S1_xbin_max-S1_xbin_min)./S1xybinsize; + s1_ybins = (S1_ybin_max-S1_ybin_min)./S1xybinsize; + + s2_xbins = (S2_xbin_max-S2_xbin_min)./S2xybinsize; + s2_ybins = (S2_ybin_max-S2_ybin_min)./S2xybinsize; + + + if Kr_events < 4000; % skip krpCal if less than 4000 events + calibrations=zeros(6,1); + end + +%% +%Set up cuts and variables + s1ab_cut=logical(sum(s1_single_cut(:,:),1)); + s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); + s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); + s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); + s1ab_x=d.x_cm(s2_single_cut); + s1ab_y=d.y_cm(s2_single_cut); + s1ab_z=d.z_drift_samples(s2_single_cut)/100; + s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); + + s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<=25; + %plotting x=s1a v y=s1a/s1b cuts: y<0.035x-1, y>-0.035.*x+5; y>0.01.*x; %y<4.2; x<255 +% s1ab_areacut= (s1a_phe_both./s1b_phe_both-0.035.*s1a_phe_both<-1) & (s1a_phe_both./s1b_phe_both+0.035.*s1a_phe_both>5)... +% & (s1a_phe_both./s1b_phe_both > 0.01.* s1a_phe_both) & (s1a_phe_both./s1b_phe_both<4.2) & (s1a_phe_both<255); + + s1ab_x=s1ab_x(s1ab_timing_cut); + s1ab_y=s1ab_y(s1ab_timing_cut); + s1ab_z=s1ab_z(s1ab_timing_cut); + s1a_phe_both=s1a_phe_both(s1ab_timing_cut); + s1b_phe_both=s1b_phe_both(s1ab_timing_cut); + + dT_step=det_edge/(length(s1ab_z)/1000); %2000 events per z bin + + + clear s1a_z_means s1a_z_means_err s1b_z_means s1b_z_means_err s1ab_bincenters s1ab_z_means s1ab_z_means_err +%Z Dependence of S1a/S1b +i=1; + for z_max=10+dT_step:dT_step:det_edge; + s1a_fit=fit([0:2:400].',hist(s1a_phe_both(s1a_phe_both>0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:400]).','gauss1'); + s1b_fit=fit([0:2:300].',hist(s1b_phe_both(s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:300]).','gauss1'); + s1a_z_means(i)=s1a_fit.b1; + s1a_z_means_err(i)=s1a_fit.c1/sqrt(2)/sqrt(length(s1a_phe_both(s1a_phe_both>0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1b_z_means(i)=s1b_fit.b1; + s1b_z_means_err(i)=s1b_fit.c1/sqrt(2)/sqrt(length(s1b_phe_both(s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1ab_bincenters(i)=z_max-dT_step/2; + i=i+1; + end + +s1ab_z_means=s1a_z_means./s1b_z_means; +s1ab_z_means_err=sqrt( (s1b_z_means_err.*s1a_z_means./(s1b_z_means.^2)).^2 + (s1a_z_means_err./s1b_z_means).^2); + +%fit polynomial to s1az and s1bz, to remove z dependence later in xy fit +[s1a_P, s1a_S]=polyfit(s1ab_bincenters,s1a_z_means,3); +[s1b_P, s1b_S]=polyfit(s1ab_bincenters,s1b_z_means,3); +[s1ab_P, s1ab_S]=polyfit(s1ab_bincenters,s1ab_z_means,2); + +%S1a z dependence plot +s1az_plot=figure; +errorbar(s1ab_bincenters,s1a_z_means,s1a_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a Mean (phe)'); title('S1a Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1a_P,[10:1:320]),'-r','LineWidth',2) + + +%S1b z dependence plot +s1bz_plot=figure; +errorbar(s1ab_bincenters,s1b_z_means,s1b_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1b Mean (phe)'); title('S1b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1b_P,[10:1:320]),'-r','LineWidth',2) + +%S1a/b z dependence plot +s1a_over_bz_plot=figure; +errorbar(s1ab_bincenters,s1ab_z_means,s1ab_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a/b'); title('S1 a/b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1ab_P,[10:1:320]),'-r','LineWidth',2) + +%Correcting z dependence to get XY dependence in same manner that Kr/CH3T +%map does + s1a_phe_both_z=s1a_phe_both.'.*polyval(s1a_P,z_center)./polyval(s1a_P,s1ab_z); + s1b_phe_both_z=s1b_phe_both.'.*polyval(s1b_P,z_center)./polyval(s1b_P,s1ab_z); + +%% S1a/b XY map (after z correction) +s1ab_xbin_min=-25; +s1ab_ybin_min=-25; +s1ab_xbin_max=25; +s1ab_ybin_max=25; +s1ab_xybinsize=sqrt((50*50)/(length(s1ab_z)/300)); +clear s1a_xy_mean s1a_xy_mean_err s1b_xy_mean s1b_xy_mean_err + +s1ab_xbins=s1ab_xbin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_xbin_max; +s1ab_ybins=s1ab_ybin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_ybin_max; + +s1a_xy_mean=zeros(length(s1ab_ybins),length(s1ab_xbins)); +s1b_xy_mean=zeros(length(s1ab_ybins),length(s1ab_xbins)); + + for x_bin=s1ab_xbin_min:s1ab_xybinsize:(s1ab_xbin_max-s1ab_xybinsize/2); + for y_bin=s1ab_ybin_min:s1ab_xybinsize:(s1ab_ybin_max-s1ab_xybinsize/2); + x_min = x_bin; x_max = x_bin+s1ab_xybinsize; + y_min = y_bin; y_max = y_bin+s1ab_xybinsize; + + x_count=int32(1+x_bin/s1ab_xybinsize+s1ab_xbin_max/s1ab_xybinsize); + y_count=int32(1+y_bin/s1ab_xybinsize+s1ab_ybin_max/s1ab_xybinsize); + + bin_cut = s1a_phe_both>0 & s1b_phe_both>0 & inrange(s1ab_x,[x_min,x_max]).' & inrange(s1ab_y,[y_min,y_max]).'; + if length(s1a_phe_both_z(bin_cut))>100; + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400])),[0:2:400]).','gauss1'); + s1a_xy_mean(y_count,x_count)=s1a_z_fit.b1; + s1a_xy_mean_err(y_count,x_count)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300])),[0:2:300]).','gauss1'); + s1b_xy_mean(y_count,x_count)=s1b_z_fit.b1; + s1b_xy_mean_err(y_count,x_count)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300]))); + else + s1a_xy_mean(y_count,x_count)=0; + s1a_xy_mean_err(y_count,x_count)=0; + s1b_xy_mean(y_count,x_count)=0; + s1b_xy_mean_err(y_count,x_count)=0; + end + + end + end + s1ab_xy_mean=s1a_xy_mean./s1b_xy_mean; + s1ab_xy_mean_err=sqrt( (s1b_xy_mean_err.*s1a_xy_mean./(s1b_xy_mean.^2)).^2 + (s1a_xy_mean_err./s1b_xy_mean).^2); + + + %Plot s1a XY means + color_range_max=max(max(s1a_xy_mean)); + color_range_min=min(min(s1a_xy_mean(s1a_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1a_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1a_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + %Plot s1a XY means + color_range_max=max(max(s1b_xy_mean)); + color_range_min=min(min(s1b_xy_mean(s1b_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1b_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1b_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1b Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1b Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + %s1a/b XY Ratio + color_range_max=max(max(s1ab_xy_mean)); + color_range_min=min(min(s1ab_xy_mean(s1ab_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1ab_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a/b Ratio vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a/b Ratio','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + +%% 3D Kr s1a/s1b map + +if length(s1ab_z)>90000; %require 100,000 events to do 3D binning +s1ab_xyz_numbins=floor((length(s1ab_z)/250)^(1/3)); %number of bins in one direction +s1ab_xyz_zstep=det_edge/s1ab_xyz_numbins; +s1ab_xyz_xstep=50/s1ab_xyz_numbins; +s1ab_xyz_ystep=50/s1ab_xyz_numbins; +s1ab_xyz_xmax=25; +r_max=25; + +s1ab_xyz_zbins=10+s1ab_xyz_zstep/2:s1ab_xyz_zstep:10+s1ab_xyz_zstep/2+s1ab_xyz_zstep*s1ab_xyz_numbins; %20 us +s1ab_xyz_xbins=(-r_max+s1ab_xyz_xstep/2):s1ab_xyz_xstep:r_max; +s1ab_xyz_ybins=(-r_max+s1ab_xyz_ystep/2):s1ab_xyz_ystep:r_max; + +s1a_xyz_mean=zeros(length(s1ab_xyz_ybins),length(s1ab_xyz_xbins),length(s1ab_xyz_zbins)); +s1a_xyz_mean_err=zeros(length(s1ab_xyz_ybins),length(s1ab_xyz_xbins),length(s1ab_xyz_zbins)); +s1b_xyz_mean=zeros(length(s1ab_xyz_ybins),length(s1ab_xyz_xbins),length(s1ab_xyz_zbins)); +s1b_xyz_mean_err=zeros(length(s1ab_xyz_ybins),length(s1ab_xyz_xbins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + m=int8(j/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + + %Count the number of events per bin + Count_S1ab_3D(l,m,n)=length(s1a_phe_both(q)); + + if (Count_S1ab_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_xyz_mean(l,m,n)=s1a_z_fit.b1; + s1a_xyz_mean_err(l,m,n)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]) ),[0:2:300]).','gauss1'); + s1b_xyz_mean(l,m,n)=s1b_z_fit.b1; + s1b_xyz_mean_err(l,m,n)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); + else %not enough stats to do the fit + s1a_xyz_mean(l,m,n)=0; + s1a_xyz_mean_err(l,m,n)=0; + s1b_xyz_mean(l,m,n)=0; + s1b_xyz_mean_err(l,m,n)=0; + end + + end + end +k +end + + s1ab_xyz_mean=s1a_xyz_mean./s1b_xyz_mean; + s1ab_xyz_mean_err=sqrt( (s1b_xyz_mean_err.*s1a_xyz_mean./(s1b_xyz_mean.^2)).^2 + (s1a_xyz_mean_err./s1b_xyz_mean).^2); + +end + +save('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\MappingParametersFit_Start_2015_CutDown','s1ab_xyz_xbins','s1ab_xyz_ybins','s1ab_xyz_zbins','s1ab_xyz_mean','Kr_events','S1_xbin_max','S1_xbin_min','S1_ybin_max','S1_ybin_min','S1xybinsize','S2_xbin_max','S2_xbin_min','S2_ybin_max','S2_ybin_min','S2xybinsize','det_edge','drift_time','g','grid_size','i','max_num_bins','min_evts_per_bin','rcut_max','rcut_min','s1_phe_both','s1_phe_bottom','s1_width','s1_xbins','s1_ybins','s1a_P','s1a_S','s1a_fit','s1a_over_bz_plot','s1a_xy_fig','s1a_xy_mean','s1a_xy_mean_err','s1a_z_fit','s1a_z_means','s1a_z_means_err','s1ab_P','s1ab_S','s1ab_bincenters','s1ab_x','s1ab_xbin_max','s1ab_xbin_min','s1ab_xbins','s1ab_xy_fig','s1ab_xy_mean','s1ab_xy_mean_err','s1ab_xybinsize','s1ab_y','s1ab_ybin_max','s1ab_ybin_min','s1ab_ybins','s1ab_z','s1ab_z_means','s1ab_z_means_err','s1area_bound_max','s1area_bound_min','s1az_plot','s1b_P','s1b_S','s1b_fit','s1b_xy_fig','s1b_xy_mean','s1b_xy_mean_err','s1b_z_fit','s1b_z_means','s1b_z_means_err','s1bz_plot','s2_phe_both','s2_phe_bottom','s2_width','s2_xbins','s2_ybins','s2area_bound_max','s2area_bound_min','s2radius','s2x','s2y','x_bin','x_center','x_count','x_max','x_min','y_bin','y_center','y_count','y_max','y_min','z_center','z_max','zcut_max','zcut_min'); \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/MakeMappingParamStart_Feb2016.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/MakeMappingParamStart_Feb2016.m new file mode 100644 index 0000000..b038f16 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/MakeMappingParamStart_Feb2016.m @@ -0,0 +1,423 @@ +path='C:\Users\Richard\Desktop\LUX Analysis\lux10_20160208T0930_cp19837'; + + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +distinguish_string='test'; + +%Hardcoding inputs for ease of use during testing +user_name='RichardKnoche'; +dp_version='2.15_test'; +algorithm_name='test_KrypCal'; +submit=0; +delay_min=0; +inpaint_on=1; + + file=char(d.files_loaded(1)); + file_id=file(1:19); + cp_start=strfind(file,'cp')+2;%find location of 'cp' in string + cp=file(cp_start:cp_start+4);%cp number has four digits + file_id_cp = [file_id '_cp' cp '_' distinguish_string]; + + + gs=0; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 70000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + clean_cut = (log10(s1_phe_both)+0.6*log10(s2_phe_both)>4.5) & s2radius<25; + + s1_phe_bottom=s1_phe_bottom(clean_cut); + s1_phe_both=s1_phe_both(clean_cut); + s2_phe_bottom=s2_phe_bottom(clean_cut); + s2_phe_both=s2_phe_both(clean_cut); + drift_time=drift_time(clean_cut); + s2x=s2x(clean_cut); + s2y=s2y(clean_cut); + s2radius = (s2x.^2+s2y.^2).^(0.5); + event_timestamp_samples=event_timestamp_samples(clean_cut); + s2_width=s2_width(clean_cut); + s1_width=s1_width(clean_cut); + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + +%% + zcut_min = 10; %field changes at 4 uSec + zcut_max = 0.95*det_edge; + + + if Kr_events < 30000 %then create a 10x10 grid. Otherwise 25x25. Want about 30 evts per bin + + S1xybinsize = sqrt((50*50)/(Kr_events/150)); + S1_xbin_min = -25; + S1_xbin_max = 25; + S1_ybin_min = -25; + S1_ybin_max = 25; + SE_ybin_min = -25; + SE_ybin_max = 25; + + S2xybinsize = sqrt((50*50)/(Kr_events/150));%cm +% SExybinsize = 5; DEFINED LATER, based on number of SE events + S2_xbin_min = -25; + S2_xbin_max = 25; + S2_ybin_min = -25; + S2_ybin_max = 25; + SE_xbin_min = -25; + SE_xbin_max = 25; + + + end + + s1_xbins = (S1_xbin_max-S1_xbin_min)./S1xybinsize; + s1_ybins = (S1_ybin_max-S1_ybin_min)./S1xybinsize; + + s2_xbins = (S2_xbin_max-S2_xbin_min)./S2xybinsize; + s2_ybins = (S2_ybin_max-S2_ybin_min)./S2xybinsize; + + + if Kr_events < 4000; % skip krpCal if less than 4000 events + calibrations=zeros(6,1); + end + +%% +%Set up cuts and variables + s1ab_cut=logical(sum(s1_single_cut(:,:),1)); + s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); + s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); + s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); + s1ab_x=d.x_cm(s2_single_cut); + s1ab_y=d.y_cm(s2_single_cut); + s1ab_z=d.z_drift_samples(s2_single_cut)/100; + s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); + + s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<=25; + %plotting x=s1a v y=s1a/s1b cuts: y<0.035x-1, y>-0.035.*x+5; y>0.01.*x; %y<4.2; x<255 +% s1ab_areacut= (s1a_phe_both./s1b_phe_both-0.035.*s1a_phe_both<-1) & (s1a_phe_both./s1b_phe_both+0.035.*s1a_phe_both>5)... +% & (s1a_phe_both./s1b_phe_both > 0.01.* s1a_phe_both) & (s1a_phe_both./s1b_phe_both<4.2) & (s1a_phe_both<255); + + s1ab_x=s1ab_x(s1ab_timing_cut); + s1ab_y=s1ab_y(s1ab_timing_cut); + s1ab_z=s1ab_z(s1ab_timing_cut); + s1a_phe_both=s1a_phe_both(s1ab_timing_cut); + s1b_phe_both=s1b_phe_both(s1ab_timing_cut); + + dT_step=det_edge/(length(s1ab_z)/1000); %2000 events per z bin + + + clear s1a_z_means s1a_z_means_err s1b_z_means s1b_z_means_err s1ab_bincenters s1ab_z_means s1ab_z_means_err +%Z Dependence of S1a/S1b +i=1; + for z_max=10+dT_step:dT_step:det_edge; + s1a_fit=fit([0:2:400].',hist(s1a_phe_both(s1a_phe_both>0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:400]).','gauss1'); + s1b_fit=fit([0:2:300].',hist(s1b_phe_both(s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:300]).','gauss1'); + s1a_z_means(i)=s1a_fit.b1; + s1a_z_means_err(i)=s1a_fit.c1/sqrt(2)/sqrt(length(s1a_phe_both(s1a_phe_both>0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1b_z_means(i)=s1b_fit.b1; + s1b_z_means_err(i)=s1b_fit.c1/sqrt(2)/sqrt(length(s1b_phe_both(s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1ab_bincenters(i)=z_max-dT_step/2; + i=i+1; + end + +s1ab_z_means=s1a_z_means./s1b_z_means; +s1ab_z_means_err=sqrt( (s1b_z_means_err.*s1a_z_means./(s1b_z_means.^2)).^2 + (s1a_z_means_err./s1b_z_means).^2); + +%fit polynomial to s1az and s1bz, to remove z dependence later in xy fit +[s1a_P, s1a_S]=polyfit(s1ab_bincenters,s1a_z_means,3); +[s1b_P, s1b_S]=polyfit(s1ab_bincenters,s1b_z_means,3); +[s1ab_P, s1ab_S]=polyfit(s1ab_bincenters,s1ab_z_means,2); + +%S1a z dependence plot +s1az_plot=figure; +errorbar(s1ab_bincenters,s1a_z_means,s1a_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a Mean (phe)'); title('S1a Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1a_P,[10:1:320]),'-r','LineWidth',2) + + +%S1b z dependence plot +s1bz_plot=figure; +errorbar(s1ab_bincenters,s1b_z_means,s1b_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1b Mean (phe)'); title('S1b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1b_P,[10:1:320]),'-r','LineWidth',2) + +%S1a/b z dependence plot +s1a_over_bz_plot=figure; +errorbar(s1ab_bincenters,s1ab_z_means,s1ab_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a/b'); title('S1 a/b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1ab_P,[10:1:320]),'-r','LineWidth',2) + +%Correcting z dependence to get XY dependence in same manner that Kr/CH3T +%map does + s1a_phe_both_z=s1a_phe_both.'.*polyval(s1a_P,z_center)./polyval(s1a_P,s1ab_z); + s1b_phe_both_z=s1b_phe_both.'.*polyval(s1b_P,z_center)./polyval(s1b_P,s1ab_z); + +%% S1a/b XY map (after z correction) +s1ab_xbin_min=-25; +s1ab_ybin_min=-25; +s1ab_xbin_max=25; +s1ab_ybin_max=25; +s1ab_xybinsize=sqrt((50*50)/(length(s1ab_z)/300)); +clear s1a_xy_mean s1a_xy_mean_err s1b_xy_mean s1b_xy_mean_err + +s1ab_xbins=s1ab_xbin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_xbin_max; +s1ab_ybins=s1ab_ybin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_ybin_max; + +s1a_xy_mean=zeros(length(s1ab_ybins),length(s1ab_xbins)); +s1b_xy_mean=zeros(length(s1ab_ybins),length(s1ab_xbins)); + + for x_bin=s1ab_xbin_min:s1ab_xybinsize:(s1ab_xbin_max-s1ab_xybinsize/2); + for y_bin=s1ab_ybin_min:s1ab_xybinsize:(s1ab_ybin_max-s1ab_xybinsize/2); + x_min = x_bin; x_max = x_bin+s1ab_xybinsize; + y_min = y_bin; y_max = y_bin+s1ab_xybinsize; + + x_count=int32(1+x_bin/s1ab_xybinsize+s1ab_xbin_max/s1ab_xybinsize); + y_count=int32(1+y_bin/s1ab_xybinsize+s1ab_ybin_max/s1ab_xybinsize); + + bin_cut = s1a_phe_both>0 & s1b_phe_both>0 & inrange(s1ab_x,[x_min,x_max]).' & inrange(s1ab_y,[y_min,y_max]).'; + if length(s1a_phe_both_z(bin_cut))>100; + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400])),[0:2:400]).','gauss1'); + s1a_xy_mean(y_count,x_count)=s1a_z_fit.b1; + s1a_xy_mean_err(y_count,x_count)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300])),[0:2:300]).','gauss1'); + s1b_xy_mean(y_count,x_count)=s1b_z_fit.b1; + s1b_xy_mean_err(y_count,x_count)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300]))); + else + s1a_xy_mean(y_count,x_count)=0; + s1a_xy_mean_err(y_count,x_count)=0; + s1b_xy_mean(y_count,x_count)=0; + s1b_xy_mean_err(y_count,x_count)=0; + end + + end + end + s1ab_xy_mean=s1a_xy_mean./s1b_xy_mean; + s1ab_xy_mean_err=sqrt( (s1b_xy_mean_err.*s1a_xy_mean./(s1b_xy_mean.^2)).^2 + (s1a_xy_mean_err./s1b_xy_mean).^2); + + + %Plot s1a XY means + color_range_max=max(max(s1a_xy_mean)); + color_range_min=min(min(s1a_xy_mean(s1a_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1a_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1a_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + %Plot s1a XY means + color_range_max=max(max(s1b_xy_mean)); + color_range_min=min(min(s1b_xy_mean(s1b_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1b_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1b_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1b Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1b Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + %s1a/b XY Ratio + color_range_max=max(max(s1ab_xy_mean)); + color_range_min=min(min(s1ab_xy_mean(s1ab_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1ab_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a/b Ratio vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a/b Ratio','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + +%% 3D Kr s1a/s1b map + +if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +s1ab_xyz_numbins=floor((length(s1ab_z)/250)^(1/3)); %number of bins in one direction +s1ab_xyz_zstep=det_edge/s1ab_xyz_numbins; +s1ab_xyz_xstep=50/s1ab_xyz_numbins; +s1ab_xyz_ystep=50/s1ab_xyz_numbins; +s1ab_xyz_xmax=25; +r_max=25; + +s1ab_xyz_zbins=10+s1ab_xyz_zstep/2:s1ab_xyz_zstep:10+s1ab_xyz_zstep/2+s1ab_xyz_zstep*s1ab_xyz_numbins; %20 us +s1ab_xyz_xbins=(-r_max+s1ab_xyz_xstep/2):s1ab_xyz_xstep:r_max; +s1ab_xyz_ybins=(-r_max+s1ab_xyz_ystep/2):s1ab_xyz_ystep:r_max; + +s1a_xyz_mean=zeros(length(s1ab_xyz_ybins),length(s1ab_xyz_xbins),length(s1ab_xyz_zbins)); +s1a_xyz_mean_err=zeros(length(s1ab_xyz_ybins),length(s1ab_xyz_xbins),length(s1ab_xyz_zbins)); +s1b_xyz_mean=zeros(length(s1ab_xyz_ybins),length(s1ab_xyz_xbins),length(s1ab_xyz_zbins)); +s1b_xyz_mean_err=zeros(length(s1ab_xyz_ybins),length(s1ab_xyz_xbins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + m=int8(j/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + + %Count the number of events per bin + Count_S1ab_3D(l,m,n)=length(s1a_phe_both(q)); + + if (Count_S1ab_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_xyz_mean(l,m,n)=s1a_z_fit.b1; + s1a_xyz_mean_err(l,m,n)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]) ),[0:2:300]).','gauss1'); + s1b_xyz_mean(l,m,n)=s1b_z_fit.b1; + s1b_xyz_mean_err(l,m,n)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); + else %not enough stats to do the fit + s1a_xyz_mean(l,m,n)=0; + s1a_xyz_mean_err(l,m,n)=0; + s1b_xyz_mean(l,m,n)=0; + s1b_xyz_mean_err(l,m,n)=0; + end + + end + end +k +end + + s1ab_xyz_mean=s1a_xyz_mean./s1b_xyz_mean; + s1ab_xyz_mean_err=sqrt( (s1b_xyz_mean_err.*s1a_xyz_mean./(s1b_xyz_mean.^2)).^2 + (s1a_xyz_mean_err./s1b_xyz_mean).^2); + +end + +save('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\MappingParametersFit_Start_Feb2016_CutDown','Kr_events','S1_xbin_max','S1_xbin_min','S1_ybin_max','S1_ybin_min','S1xybinsize','S2_xbin_max','S2_xbin_min','S2_ybin_max','S2_ybin_min','S2xybinsize','det_edge','drift_time','g','grid_size','i','max_num_bins','min_evts_per_bin','rcut_max','rcut_min','s1_phe_both','s1_phe_bottom','s1_width','s1_xbins','s1_ybins','s1a_P','s1a_S','s1a_fit','s1a_over_bz_plot','s1a_xy_fig','s1a_xy_mean','s1a_xy_mean_err','s1a_z_fit','s1a_z_means','s1a_z_means_err','s1ab_P','s1ab_S','s1ab_bincenters','s1ab_x','s1ab_xbin_max','s1ab_xbin_min','s1ab_xbins','s1ab_xy_fig','s1ab_xy_mean','s1ab_xy_mean_err','s1ab_xybinsize','s1ab_y','s1ab_ybin_max','s1ab_ybin_min','s1ab_ybins','s1ab_z','s1ab_z_means','s1ab_z_means_err','s1area_bound_max','s1area_bound_min','s1az_plot','s1b_P','s1b_S','s1b_fit','s1b_xy_fig','s1b_xy_mean','s1b_xy_mean_err','s1b_z_fit','s1b_z_means','s1b_z_means_err','s1bz_plot','s2_phe_both','s2_phe_bottom','s2_width','s2_xbins','s2_ybins','s2area_bound_max','s2area_bound_min','s2radius','s2x','s2y','x_bin','x_center','x_count','x_max','x_min','y_bin','y_center','y_count','y_max','y_min','z_center','z_max','zcut_max','zcut_min'); \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/landau_fit/calcnbins.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/landau_fit/calcnbins.m new file mode 100644 index 0000000..2531417 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/landau_fit/calcnbins.m @@ -0,0 +1,129 @@ + +function nbins = calcnbins(x, method, minimum, maximum) + +error(nargchk(1, 4, nargin)); + +if ~isnumeric(x) && ~islogical(x) + error('calcnbins:invalidX', 'The X argument must be numeric or logical.') +end + +if ~isreal(x) + x = real(x); + warning('calcnbins:complexX', 'Imaginary parts of X will be ignored.'); +end + +% Ignore dimensions of x. +if ~isvector(x) + x = x(:); + warning('calcnbins:nonvectorX', 'X will be coerced to a vector.'); +end + +nanx = isnan(x); +if any(nanx) + x = x(~nanx); + warning('calcnbins:nanX', 'Values of X equal to NaN will be ignored.'); +end + +if nargin < 2 || isempty(method) + method = 'middle'; +end + +if ~ischar(method) + error('calcnbins:invalidMethod', 'The method argument must be a char array.'); +end + +validmethods = {'fd'; 'scott'; 'sturges'; 'all'; 'middle'}; +methodmatches = strmatch(lower(method), validmethods); +nmatches = length(methodmatches); +if nmatches~=1 + error('calnbins:unknownMethod', 'The method specified is unknown or ambiguous.'); +end +method = validmethods{methodmatches}; + +if nargin < 3 || isempty(minimum) + minimum = 1; +end + +if nargin < 4 || isempty(maximum) + maximum = Inf; +end + +% Perform the calculation +switch(method) + case 'fd' + nbins = calcfd(x); + case 'scott' + nbins = calcscott(x); + case 'sturges' + nbins = calcsturges(x); + case 'all' + nbins.fd = calcfd(x); + nbins.scott = calcscott(x); + nbins.sturges = calcsturges(x); + case 'middle' + nbins = median([calcfd(x) calcscott(x) calcsturges(x)]); +end + +% Calculation details + function nbins = calcfd(x) + h = diff(prctile0(x, [25; 75])); %inter-quartile range + if h == 0 + h = 2*median(abs(x-median(x))); %twice median absolute deviation + end + if h > 0 + nbins = ceil((max(x)-min(x))/(2*h*length(x)^(-1/3))); + else + nbins = 1; + end + nbins = confine2range(nbins, minimum, maximum); + end + + function nbins = calcscott(x) + h = 3.5*std(x)*length(x)^(-1/3); + if h > 0 + nbins = ceil((max(x)-min(x))/h); + else + nbins = 1; + end + nbins = confine2range(nbins, minimum, maximum); + end + + function nbins = calcsturges(x) + nbins = ceil(log2(length(x)) + 1); + nbins = confine2range(nbins, minimum, maximum); + end + + function y = confine2range(x, lower, upper) + y = ceil(max(x, lower)); + y = floor(min(y, upper)); + end + + function y = prctile0(x, prc) + % Simple version of prctile that only operates on vectors, and skips + % the input checking (In particluar, NaN values are now assumed to + % have been removed.) + lenx = length(x); + if lenx == 0 + y = []; + return + end + if lenx == 1 + y = x; + return + end + + function foo = makecolumnvector(foo) + if size(foo, 2) > 1 + foo = foo'; + end + end + + sortx = makecolumnvector(sort(x)); + posn = prc.*lenx/100 + 0.5; + posn = makecolumnvector(posn); + posn = confine2range(posn, 1, lenx); + y = interp1q((1:lenx)', sortx, posn); + end +end + + diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/landau_fit/hist_.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/landau_fit/hist_.m new file mode 100644 index 0000000..e41e557 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/landau_fit/hist_.m @@ -0,0 +1,86 @@ +function [h,intervalli]=hist_(x,passo,mi,mx,n,noplot,shift) +set(gca,'Fontsize',16) +if(nargin==1) + passo=(max(x)-min(x))/calcnbins(x); + mi=min(x); + mx=max(x)+passo; + n='n'; + noplot=0; + shift=0; +end; +if(nargin==2) + if ischar(passo) + n=passo; + passo=(max(x)-min(x))/calcnbins; + mi=min(x); + mx=max(x)+passo; + noplot=0; + shift=0; + else + mi=min(x); + mx=max(x)+passo; + n='n'; + noplot=0; + shift=0; + end; +end; +if(nargin==3) + if ischar(mi) + n=mi; + mi=min(x); + mx=max(x)+passo; + noplot=0; + shift=0; + else + mx=max(x)+passo; + n='n'; + noplot=0; + shift=0; + end; +end; +if(nargin==4) + if ischar(mx) + n=mx; + mx=max(x)+passo; + noplot=0; + shift=0; + else + n='n'; + noplot=0; + shift=0; + end; +end; +if(nargin==5) + noplot=0; + shift=0; +end; +if(nargin==6) + shift=0; +end; + +if isempty(mi) + mi=min(x); +end +if isempty(mx) + mx=max(x)+passo; +end + + +intervalli=mi:passo:mx; +h=histc(x,intervalli); +if (any(strcmp(n,{'n' 'N'}))) + % h=h/(sum(h)*passo); + % h=h/(sum(h)); +end; +if shift + intervalli=(intervalli-passo/2)'; +end +% bar(intervalli,h); +if (noplot==0) + stairs(intervalli,h,'k','LineWidth',2); +end; +if nargout + h=h(:); + intervalli=intervalli(:); +end; +end diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/landau_fit/histfitlandau.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/landau_fit/histfitlandau.m new file mode 100644 index 0000000..2056847 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/landau_fit/histfitlandau.m @@ -0,0 +1,77 @@ +function [vpp,sig,mv,bound]=histfitlandau(val,passo,inizio,fine) + +% function to compute and display a Landau Distribution +% for INFO visit www.cern.ch/meroli +% special thanks to Daniele + +%%% input +% val --> acquired data +% passo --> bin size +% inizio --> start point for the fit +% fine --> last point for the fit + +%%%output +% vpp --> most probable value for the Landau Distribution +% sig --> sigma for the Landau Distribution +% mv --> mean value for the Landau Distribution +% bound --> bounds for vpp and sig + +%% Example +% x(1:1000)=randn(1,1000); +% x(1001:2000)=randn(1,1000).*4+2; +% [vpp,sig,mv,bound]=histfitlandau(x,0.3,-3,15); + + + +clf; +if(nargin==1) + [y1,x1]=hist(val); + passo=(max(x1)-min(x1))/calcnbins(val); +end; +if nargin>3 + [y,x]=hist_(val,passo,min(val),fine); +else + [y,x]=hist_(val,passo); +end; +x=x+passo/2; +if nargin>2; + inz=find(x acquired data +% passo --> bin size +% inizio --> start point for the fit +% fine --> last point for the fit + +%%%output +% vpp --> most probable value for the Landau Distribution +% sig --> sigma for the Landau Distribution +% mv --> mean value for the Landau Distribution +% bound --> bounds for vpp and sig + +%% Example +% x(1:1000)=randn(1,1000); +% x(1001:2000)=randn(1,1000).*4+2; +% [vpp,sig,mv,bound]=histfitlandau(x,0.3,-3,15); + + + +clf; +if(nargin==1) + [y1,x1]=hist(val); + passo=(max(x1)-min(x1))/calcnbins(val); +end; +if nargin>3 + [y,x]=hist_(val,passo,min(val),fine); +else + [y,x]=hist_(val,passo); +end; +x=x+passo/2; +if nargin>2; + inz=find(x diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/landau_fit/readme.m b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/landau_fit/readme.m new file mode 100644 index 0000000..bf50764 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/landau_fit/readme.m @@ -0,0 +1,2 @@ +load val +[vpp,sig,mv,bound]=histfitlandau(val,3,0,1500); \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/landau_fit/readme.m~ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/landau_fit/readme.m~ new file mode 100644 index 0000000..bf50764 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/landau_fit/readme.m~ @@ -0,0 +1,2 @@ +load val +[vpp,sig,mv,bound]=histfitlandau(val,3,0,1500); \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/landau_fit/val.mat b/CodeForLUX/Matlab/MyScripts/KrypCal_FieldEffectMeasurements/TritiumMethod/libNEST_CH3TModel/landau_fit/val.mat new file mode 100644 index 0000000000000000000000000000000000000000..b68d34c9a1c67ab5764aa5cb019d7c497d4c6104 GIT binary patch literal 1691 zcmV;M24wk7K~zjZLLfCRFd$7qR4ry{Y-KDUP;6mzW^ZzBIv__(PFO)UG%O%Pa%Ew3 zWn>_4ZaN@WWn>^qb!;FqFd#87Ix;dkGczDEFflP8ARr(hARr(hARr(hARr(hARr(h zARr(hARr(hARr(hARr(hARr(hARr(hARr(B0ZB~{0000J1^@tfoGn#(P?TjHexCQ; z<#4>kBSl3*O)X8!3o8#S8}k}XQyH(xY9>wd505;WPD^tnkDNR}^IXLP6%b@SfCaoo z5)hGq@WKND5y2yRuy$v6zwg`k`@O&C`hE4Gmk;3e-_MKR+L!bH^V=36YCjh9rp<&y z$LZcWXDHK9pAQhn_RPgqoJEz%KmzhGlzrHXE0GUhlZl4RKnx1;J-0gIxffS(3Yl;? zEk`nfZqzpiF^q%x4r6f-Pf&wczRCrxK~w9}J{R#2-IxqNX5*^XMBz<)6t(YtC_yK# z;tcj2!f!lb5y6Uw(x5KIGk5tWr02XNXe4G=47JQDIsuImOb=Zs_v#uRv3Wfhm z9@6(U>|kBiW2mXaRaitnKE!!(^bo1o2Dgq9(S*ymm~+{eF`UjMZ1UQVK<#rHIr_I6 z#p<{ooA51O*FNu=QA}6$IQ`?t-s&ZUx3~jGkigsOrKcUqa7UW(6rxHvdpas{9reA> zp(AJ6PEw%;KcGOhGH}~G5HEX$@hJA_J6);`WHhg0l!Z-3sJI(o8cW4tEW{aXM!C>m z#547lp&rYGIvGVM=2?W<=2CHmn6o^CE#f{8{(Re+j1PH3x+Gw+uph=H`ttx!W}pXiIL_=vg`9Lo7!swcVI~SN zlNoZxOfgQBdssJb^H`o$SP&_MCrXzuB|~f8Z!^E=xW-?_g%zK1fL>a)t9PPHkR83 z@>HSEE_vv>-iP$tl*^qd>gGHy;UqTTzIOERA9OQt)Z<}HHVs%H4V!Q`#+kM}h+Zrb z10G>bMQ@H4vktam2d6(9v90mt6|}Q=)k%LP#iNxMkVG$`E5;PQEF}_fN9^XyZ8?}G z1^Y>X!CYgWDQzh@Cuf&pJr)Y18z;oBM;wQ;3IS%P?yN<>j4`^l6!*+Tj^YvJJ06d9 zhd*Cu8>KatEp>Mt@zcyiYL~iFdcHE7ieSbgNbAy6*{!>hP|vPIkll!jHUrObl+Sol z$#R)M$3d|_Tprl1ytx?f{fktM6T+>`;&3tZL={$Xx;ZAz3&rtyBy%Y5YY(@sokklj zIg4Cpu26R5Bin+zUT~16s&&j4 z>UXug*n)p+=Y7)LDz^c0|2N8Ysh$NV<#er7BC5o1JT_qrXY-QO$;V2Dvm^W4Xmbed zP&UkdSHPZUB zo<+a$C;59WPh*!jijqHWNz0o;bWu-`6jk1&*$^hqZ)i>g3SE@CaU-9va0fr)S8_`* lyX$(562C*wgga 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + + +%Pulse quantities +drift_time = d.z_drift_samples(s2_single_cut)/100; % us + +d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + +s1_phe_both = d.pulse_area_phe(s1_single_cut); +s1_phe_bottom = d.phe_bottom(s1_single_cut); + +s2_phe_both = d.pulse_area_phe(s2_single_cut); +s2_phe_bottom = d.phe_bottom(s2_single_cut); + +s2x = d.x_cm(s2_single_cut); +s2y = d.y_cm(s2_single_cut); + +d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; +evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut +event_timestamp_samples=d.event_timestamp_samples(evt_cut); + +time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + +s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples +s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + +s2radius = (s2x.^2+s2y.^2).^(0.5); + + + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + +zcut_min = 10; %field changes at 4 uSec +zcut_max = 0.95*det_edge; + + +if Kr_events < 30000 %then create a 10x10 grid. Otherwise 25x25. Want about 30 evts per bin + + S1xybinsize = sqrt((50*50)/(Kr_events/150)); + S1_xbin_min = -25; + S1_xbin_max = 25; + S1_ybin_min = -25; + S1_ybin_max = 25; + SE_ybin_min = -25; + SE_ybin_max = 25; + + S2xybinsize = sqrt((50*50)/(Kr_events/150));%cm +% SExybinsize = 5; DEFINED LATER, based on number of SE events + S2_xbin_min = -25; + S2_xbin_max = 25; + S2_ybin_min = -25; + S2_ybin_max = 25; + SE_xbin_min = -25; + SE_xbin_max = 25; + + +end + +s1_xbins = (S1_xbin_max-S1_xbin_min)./S1xybinsize; +s1_ybins = (S1_ybin_max-S1_ybin_min)./S1xybinsize; + +s2_xbins = (S2_xbin_max-S2_xbin_min)./S2xybinsize; +s2_ybins = (S2_ybin_max-S2_ybin_min)./S2xybinsize; + +%% Kr S1a/S2b map + +%Set up cuts and variables +s1ab_cut=logical(sum(s1_single_cut(:,:),1)); +s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); +s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); +s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); +s1ab_x=d.x_cm(s2_single_cut); +s1ab_y=d.y_cm(s2_single_cut); +s1ab_z=d.z_drift_samples(s2_single_cut)/100; +s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); +s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<25; + + +s1ab_x=s1ab_x(s1ab_timing_cut); +s1ab_y=s1ab_y(s1ab_timing_cut); +s1ab_z=s1ab_z(s1ab_timing_cut); +s1a_phe_both=s1a_phe_both(s1ab_timing_cut); +s1b_phe_both=s1b_phe_both(s1ab_timing_cut); +s1ab_radius=s1ab_radius(s1ab_timing_cut); + +%fidicual Z cut for s1ab_xy measurement +[s1ab_z_hist s1ab_z_hist_bins]=hist(s1ab_z(inrange(s1ab_z,[0,400])),[0:1:400]); +frac_hist=cumsum(s1ab_z_hist)./sum(s1ab_z_hist); +s1ab_z_cut_lower= min(s1ab_z_hist_bins(frac_hist>.10)); +s1ab_z_cut_upper= max(s1ab_z_hist_bins(frac_hist<.90)); +s1ab_z_cut=inrange(s1ab_z,[s1ab_z_cut_lower,s1ab_z_cut_upper]); + +%R cut for s1ab_Z measurement +[upperz_r_hist upperz_r_hist_bins]=hist(s1ab_radius(s1ab_z>s1ab_z_cut_upper & s1ab_radius<=26),[0:1:26]); +[lowerz_r_hist lowerz_r_hist_bins]=hist(s1ab_radius(s1ab_z0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:400]).','gauss1'); + s1b_fit=fit([0:2:300].',hist(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:300]).','gauss1'); + s1a_z_means(i)=s1a_fit.b1; + s1a_z_means_err(i)=s1a_fit.c1/sqrt(2)/sqrt(length(s1a_phe_both(s1ab_r_cut.' & s1a_phe_both>0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1b_z_means(i)=s1b_fit.b1; + s1b_z_means_err(i)=s1b_fit.c1/sqrt(2)/sqrt(length(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1ab_bincenters(i)=z_max-dT_step/2; + i=i+1; +end + +s1ab_z_means=s1a_z_means./s1b_z_means; +s1ab_z_means_err=sqrt( (s1b_z_means_err.*s1a_z_means./(s1b_z_means.^2)).^2 + (s1a_z_means_err./s1b_z_means).^2); + +%fit polynomial to s1az and s1bz, to remove z dependence later in xy fit +[s1a_P, s1a_S]=polyfit(s1ab_bincenters,s1a_z_means,3); +[s1b_P, s1b_S]=polyfit(s1ab_bincenters,s1b_z_means,3); +[s1ab_P, s1ab_S]=polyfit(s1ab_bincenters,s1ab_z_means,2); + +%S1a z dependence plot +s1az_plot=figure; +errorbar(s1ab_bincenters,s1a_z_means,s1a_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a Mean (phe)'); title('S1a Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1a_P,[10:1:320]),'-r','LineWidth',2) + +%S1b z dependence plot +s1bz_plot=figure; +errorbar(s1ab_bincenters,s1b_z_means,s1b_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1b Mean (phe)'); title('S1b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1b_P,[10:1:320]),'-r','LineWidth',2) + +%S1a/b z dependence plot +s1a_over_bz_plot=figure; +errorbar(s1ab_bincenters,s1ab_z_means,s1ab_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a/b'); title('S1 a/b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1ab_P,[10:1:320]),'-r','LineWidth',2) + + +%Correcting z dependence to get XY dependence in same manner that Kr/CH3T +%map does +s1a_phe_both_z=s1a_phe_both.'.*polyval(s1a_P,z_center)./polyval(s1a_P,s1ab_z); +s1b_phe_both_z=s1b_phe_both.'.*polyval(s1b_P,z_center)./polyval(s1b_P,s1ab_z); + +%% S1a/b XY map (after z correction) +s1ab_xbin_min=-25; +s1ab_ybin_min=-25; +s1ab_xbin_max=25; +s1ab_ybin_max=25; +s1ab_xybinsize=sqrt((50*50)/(length(s1ab_z)/300)); +clear s1a_xy_mean s1a_xy_mean_err s1b_xy_mean s1b_xy_mean_err + +s1ab_xbins=s1ab_xbin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_xbin_max; +s1ab_ybins=s1ab_ybin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_ybin_max; + +s1a_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); +s1b_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); + +for x_bin=s1ab_xbin_min:s1ab_xybinsize:(s1ab_xbin_max-s1ab_xybinsize/2); + for y_bin=s1ab_ybin_min:s1ab_xybinsize:(s1ab_ybin_max-s1ab_xybinsize/2); + x_min = x_bin; x_max = x_bin+s1ab_xybinsize; + y_min = y_bin; y_max = y_bin+s1ab_xybinsize; + + x_count=int32(1+x_bin/s1ab_xybinsize+s1ab_xbin_max/s1ab_xybinsize); + y_count=int32(1+y_bin/s1ab_xybinsize+s1ab_ybin_max/s1ab_xybinsize); + + bin_cut = s1ab_z_cut.' & inrange(s1ab_z,[10 330]).' & s1a_phe_both>0 & s1b_phe_both>0 & inrange(s1ab_x,[x_min,x_max]).' & inrange(s1ab_y,[y_min,y_max]).'; + if length(s1a_phe_both_z(bin_cut))>100; + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400])),[0:2:400]).','gauss1'); + s1a_xy_mean(y_count,x_count)=s1a_z_fit.b1; + s1a_xy_mean_err(y_count,x_count)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300])),[0:2:300]).','gauss1'); + s1b_xy_mean(y_count,x_count)=s1b_z_fit.b1; + s1b_xy_mean_err(y_count,x_count)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300]))); + else + s1a_xy_mean(y_count,x_count)=0; + s1a_xy_mean_err(y_count,x_count)=0; + s1b_xy_mean(y_count,x_count)=0; + s1b_xy_mean_err(y_count,x_count)=0; + end + + end +end +s1ab_xy_mean=s1a_xy_mean./s1b_xy_mean; +s1ab_xy_mean_err=sqrt( (s1b_xy_mean_err.*s1a_xy_mean./(s1b_xy_mean.^2)).^2 + (s1a_xy_mean_err./s1b_xy_mean).^2); + + +%Plot s1a XY means +color_range_max=max(max(s1a_xy_mean)); +color_range_min=min(min(s1a_xy_mean(s1a_xy_mean>0))); +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; + +s1a_xy_fig = figure; +contourf(s1ab_xbins,s1ab_ybins,s1a_xy_mean,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. S1a Mean vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'S1a Mean (phe)','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + + + %Plot s1a XY means + color_range_max=max(max(s1b_xy_mean)); + color_range_min=min(min(s1b_xy_mean(s1b_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + +s1b_xy_fig = figure; +contourf(s1ab_xbins,s1ab_ybins,s1b_xy_mean,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. S1b Mean vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'S1b Mean (phe)','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + + +%s1a/b XY Ratio +color_range_max=max(max(s1ab_xy_mean)); +color_range_min=min(min(s1ab_xy_mean(s1ab_xy_mean>0))); +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; + +s1ab_xy_fig = figure; +contourf(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. S1a/b Ratio vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'S1a/b Ratio','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%% 3D Kr s1a/s1b map +if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +s1ab_xyz_numbins=floor((length(s1ab_z)/200)^(1/3)); %number of bins in one direction +s1ab_xyz_zstep=det_edge/s1ab_xyz_numbins; +s1ab_xyz_xstep=50/s1ab_xyz_numbins; +s1ab_xyz_ystep=50/s1ab_xyz_numbins; +s1ab_xyz_xmax=25; +r_max=25; + +s1ab_xyz_zbins=10+s1ab_xyz_zstep/2:s1ab_xyz_zstep:10+s1ab_xyz_zstep/2+s1ab_xyz_zstep*s1ab_xyz_numbins; %20 us +s1ab_xyz_xbins=(-r_max+s1ab_xyz_xstep/2):s1ab_xyz_xstep:r_max; +s1ab_xyz_ybins=(-r_max+s1ab_xyz_ystep/2):s1ab_xyz_ystep:r_max; + +s1a_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + + %Count the number of events per bin + Count_S1ab_3D(l,m,n)=length(s1a_phe_both(q)); + + if (Count_S1ab_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_xyz_mean(l,m,n)=s1a_z_fit.b1; + s1a_xyz_mean_err(l,m,n)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]) ),[0:2:300]).','gauss1'); + s1b_xyz_mean(l,m,n)=s1b_z_fit.b1; + s1b_xyz_mean_err(l,m,n)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); + else %not enough stats to do the fit + s1a_xyz_mean(l,m,n)=0; + s1a_xyz_mean_err(l,m,n)=0; + s1b_xyz_mean(l,m,n)=0; + s1b_xyz_mean_err(l,m,n)=0; + end + + end + end +k +end + + s1ab_xyz_mean=s1a_xyz_mean./s1b_xyz_mean; + s1ab_xyz_mean_err=sqrt( (s1b_xyz_mean_err.*s1a_xyz_mean./(s1b_xyz_mean.^2)).^2 + (s1a_xyz_mean_err./s1b_xyz_mean).^2); + +end +%% Removing field dependence from S1 and S2 + +%Hard coded numbers from energy chi2 +s1ab_s2_xyz_fit_map.p1=-0.4988; +s1ab_s2_xyz_fit_map.p2=1.484; +c1=1-s1ab_s2_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s2_xyz_fit_map.p2; +s1ab_s2_xyz_fit_map.p3=c1; + +s1ab_s1_xyz_fit_map.p1=0.065; +s1ab_s1_xyz_fit_map.p2=0.02; +c2=1-s1ab_s1_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s1_xyz_fit_map.p2; +s1ab_s1_xyz_fit_map.p3=c2; + + + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D +if length(s1ab_z)>100000; %require 100,000 events to do 3D binning + %Removing zeros from map with nearest neighbor method + s1ab_xyz_mean_old=s1ab_xyz_mean; + temp_map=s1ab_xyz_mean; + q= ~isnan(temp_map); + r=nearestpoint(find(~q),find(q)); + s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + + %interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + + s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; + s2_phe_both=s2_phe_both./s2_3Dfieldremoval; + s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; + s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + +else %Only do 1D in this case + %Removing zeros from map with nearest neighbor method + s1ab_xy_mean_old=s1ab_xy_mean; + temp_map=s1ab_xy_mean; + q= ~isnan(temp_map); + r=nearestpoint(find(~q),find(q)); + s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + + %interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + + s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); + s2_phe_both=s2_phe_both./(s2_zfieldremoval); + s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); + s1_phe_both=s1_phe_both./(s1_zfieldremoval); + + + + end + + +%% Calculating the S1 Z-dependence (Both PMT arrays) + + +clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both +clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist +clear hist_s1_both x xfit S + +%set up energy bins for the gaussian fit +bin_s1=8;%5 +s1_bin_min=100; +s1_bin_max=500; +x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; +x=x'; + +cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. +bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. +if bins>max_num_bins +bins = max_num_bins; % usually we will have 65 bin. 0:5:325 +end +bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + +hist_s1_both = zeros(length(x),bins); +Fit_s1_both = cell(1,bins); +means = zeros(bins,1); +means_error = zeros(bins,1); +mean_index = zeros(bins,1); + + +for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + +end + + % //////////////////////////////Make Plots///////////////////////////////// + +dT_range= inrange( mean_index,[zcut_min, zcut_max] ); +dT_fit=0:1:det_edge; +[P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); +sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + +light_correction_fig = figure; +errorbar(mean_index,means,means_error,'.k'); +hold on +[yplot_s1_both] = polyval(P_s1_both,dT_fit); +[center_s1_both, center_s1_both_err] = polyval(P_s1_both,z_center, S); %160[us]*1.51[\mus/us] +plot(dT_fit,yplot_s1_both,'-r','LineWidth',1); +xlabel('Depth (\mus)', 'FontSize',16); ylabel('Mean (Pulse Area Phe)', 'FontSize', 16); +title(strcat(file_id_cp,'.Kr83m. S1 Mean vs. Z'), 'FontSize', 16,'Interpreter','none'); +line([0 det_edge],[center_s1_both center_s1_both],'linestyle','--'); +line([z_center; z_center;],[min(means) max(means)],'linestyle','--'); +legend('S1\_both Mean', strcat('y=', num2str(P_s1_both(1),'%10.2e'), '*Z^2 + ', num2str(P_s1_both(2),'%10.2e')... + , '*Z + ', num2str(P_s1_both(3),4)),strcat('Det center = ',num2str(center_s1_both,4), ' [Phe]'),'location','northwest') + +box on; +myfigview(16); +xlim([0 det_edge]); +ylim([0.8*min(means) 1.15*max(means)]); + + +s1_both_means=means; +s1_both_means_sigma=means_error; +s1_both_means_bin=mean_index; + +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + +s1_phe_both_z=s1_phe_both.*s1_z_correction; + + +%% Calculating the S2 Z-dependence (i.e. electron lifetime) + + + +clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit +clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist +clear hist_s1_both dT_range dT_fit S x2 + +%set up energy bins for the gaussian fit. Using both S2 only +bin_s2=500; +s2_bin_min=1000; +s2_bin_max=40000; +x2=s2_bin_min:bin_s2:s2_bin_max; +x2=x2'; + +cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; +A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. +bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. +if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 +end +bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + +hist_s2_both = zeros(length(x2),bins); +Fit_s2_both = cell(1,bins); +means=zeros(bins,1); +means_error = zeros(bins,1); +mean_index= zeros(bins,1); + +for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + +end + + % //////////////////////////////Make Plots///////////////////////////////// + + + dT_range= inrange( mean_index,[5+bin_size,500] );%from 50 to 300us for the fit + + +s2_both_norm_z_index=mean_index(dT_range); +s2_both_norm_z_means=means(dT_range); +s2_at_top_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate +s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + +%%Tracker for pseudo-lifetime +s2_at_bottom_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); +pseudo_lifetime_both=-320/log(s2_at_bottom_both/s2_at_top_both); + +dT_fit=0:1:det_edge; + +Fit_EL= fit(mean_index(dT_range),means(dT_range),'exp1'); +yfitEL = Fit_EL.a.*exp(Fit_EL.b.*dT_fit); + +e_lifetime_both=-1/Fit_EL.b; +s2_z0_both=Fit_EL.a; + +b=confint(Fit_EL, 0.683);%1 sigma matrix +sigma_e_lifetime_both=(1/b(1,2)-1/b(2,2))/2; +sigma_s2_z0_both=(b(2,1)-b(1,1))/2; + +lifetime_fig_both = figure; +errorbar(mean_index(2:end),means(2:end),means_error(2:end),'.k'); %first bin is anode, skip it +hold on +plot(dT_fit,yfitEL,'-r','LineWidth',1); +xlabel('Time (\mus)', 'FontSize',16); ylabel('Mean S2 (Pulse Area Phe)', 'FontSize', 16); +title(strcat(file_id_cp,'.Kr83m. S2_both Electron Lifetime'), 'FontSize', 16,'Interpreter','none'); +legend('S2\_both Mean', strcat( '\lambda= ', num2str(e_lifetime_both,4), ' \pm ', num2str(sigma_e_lifetime_both,2), ' \mus' )... + ,'location','northeast'); +myfigview(16); +xlim([0 det_edge]); + + + +s2_both_means=means; +s2_both_means_sigma=means_error; +s2_both_means_bin=mean_index; + +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%% Mapping S2 in XY (after correcting for Z-dep). Both PMT + + +clear x2 hist_bin + +%set up energy bins for the gaussian fit. Using both S2 only +bin_s2=500; +s2_bin_min=1000; +s2_bin_max=40000; +x2=s2_bin_min:bin_s2:s2_bin_max; +x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_ybins),floor(s2_xbins)); +Sigma_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); +Count_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end +end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + +color_range_max=max(max(mean_S2_both_xy)); +color_range_min=min(min(mean_S2_both_xy(mean_S2_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + +s2_xy_both_fig = figure; +contourf(s2xbins,s2ybins,mean_S2_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. S2 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + +%% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT + +clear hist_bin x + + +%set up energy bins for the gaussian fit +bin_s1=8;%5 +s1_bin_min=100; +s1_bin_max=500; +x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; +x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_ybins),floor(s1_xbins)); +Sigma_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); +Count_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); + +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end +end + +mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +color_range_max=max(max(mean_S1_both_xy)); +color_range_min=min(min(mean_S1_both_xy(mean_S1_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + + +s1_xy_both_fig = figure; +contourf(s1xbins,s1ybins,mean_S1_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp,'. S1 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%% Apply corrections to 7p5 DD data and calculate the NRband + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\KrypCal2p21_QualityChecks\NRBand_Z_Dependence\MutliZ_DD_7p5.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + +s2_x_bins = s2xbins; +s2_y_bins = s2ybins; +s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + +s1_x_bins = s1xbins; +s1_y_bins = s1ybins; +s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +%% Make NR Band +max_r=18; +s1_min=0; +s1_max=50; + + +pulse_area_cut=s2_phe_both_xyz>150 & s2_phe_both<10000 & s1_phe_both<300; +NR_beam_cut=inrange(drift_time,[35 75]) & inrange(s2radius_del,[0,max_r]) & ... + (s2y < -8.*s2x+70) & (s2y>-20.*s2x+10); + + +bin_counter=1; + +DD_cut= clean_cut & pulse_area_cut & NR_beam_cut; + + +%% Make Band Plot +band_sigma=1.28; %90% confidence bounds + + +s2_s1_bin= 1:0.1:5; +NR_bin_size=2; %3 works +index_i=1; +NR_bins=NR_bin_size/2+s1_min:NR_bin_size:s1_max; +lower_bound=ones(size(NR_bins)); +mean_NR_band=ones(size(NR_bins)); +upper_bound=ones(size(NR_bins)); +counts_NR_hist=ones(size(NR_bins)); +NR_sigma=ones(size(NR_bins)); +NR_sigma_sigma=ones(size(NR_bins)); + +% temporary, for calculating correct E-lifetime + clear mean_NR_band_err lower_bound_err upper_bound_err lower_bound mean_NR_band upper_bound + +for NR_bin = (NR_bin_size/2)+s1_min:NR_bin_size:(s1_max); %HIST uses bin centers + + + NR_fit_cut=DD_cut & inrange(s1_phe_both_xyz,[NR_bin-NR_bin_size/2,NR_bin+NR_bin_size/2]); + + NR_band_hist=hist(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + counts_NR_hist(index_i)=sum(NR_band_hist); + + Fit_NR=fit(s2_s1_bin',NR_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + + %band=confint(Fit_NR,.1); +% NR_sigma(index_i)= Fit_NR.c1/sqrt(2); + NR_sigma(index_i)= sqrt(rms_fit.sig2); + NR_sigma_sigma(index_i)=NR_sigma(index_i)/sqrt(2*counts_NR_hist(index_i)); + + lower_bound(index_i)=Fit_NR.b1-NR_sigma(index_i)*band_sigma; + mean_NR_band(index_i)=Fit_NR.b1; + upper_bound(index_i)=Fit_NR.b1+NR_sigma(index_i)*band_sigma; + + temp_err=confint(Fit_NR,0.68); + mean_NR_band_err(index_i)=abs(temp_err(1,2)-Fit_NR.b1); + lower_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + upper_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + + + %mean_NR_band_sim(index_i)=Fit_NR_sim.b1; + + index_i=index_i+1; +end + + +% Fit power law to the mean +g=fittype('a*x^b'); +NR_mean_power_fit=fit(NR_bins(NR_bins>2)',mean_NR_band(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); +NR_mean_fit{bin_counter}=NR_mean_power_fit.a.*NR_bins.^(NR_mean_power_fit.b); + +NR_lower_power_fit=fit(NR_bins(NR_bins>2)',lower_bound(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); +NR_lower_fit{bin_counter}=NR_lower_power_fit.a.*NR_bins.^(NR_lower_power_fit.b); + +NR_upper_power_fit=fit(NR_bins(NR_bins>2)',upper_bound(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); +NR_upper_fit{bin_counter}=NR_upper_power_fit.a.*NR_bins.^(NR_upper_power_fit.b); + +NR_mean_fit_points{bin_counter}=mean_NR_band; +NR_lower_fit_points{bin_counter}=lower_bound; +NR_upper_fit_points{bin_counter}=upper_bound; + +NR_mean_fit_points_err{bin_counter}=mean_NR_band_err; +NR_lower_fit_points_err{bin_counter}=lower_bound_err; +NR_upper_fit_points_err{bin_counter}=upper_bound_err; + +NR_bins_tracked{bin_counter}=NR_bins; + +bin_counter=bin_counter+1; +%% +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\KrypCal2p21_QualityChecks\NRBand_Z_Dependence\MutliZ_DD_15.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + +s2_x_bins = s2xbins; +s2_y_bins = s2ybins; +s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + +s1_x_bins = s1xbins; +s1_y_bins = s1ybins; +s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +%% Make NR Band +max_r=18; +s1_min=0; +s1_max=50; + + +pulse_area_cut=s2_phe_both_xyz>150 & s2_phe_both<10000 & s1_phe_both<300; +NR_beam_cut=inrange(drift_time,[75 125]) & inrange(s2radius_del,[0,max_r]) & ... + (s2y < -8.*s2x+70) & (s2y>-20.*s2x+10); + +DD_cut= clean_cut & pulse_area_cut & NR_beam_cut; + + +%% Make Band Plot +band_sigma=1.28; %90% confidence bounds + + +s2_s1_bin= 1:0.1:5; +NR_bin_size=2; %3 works +index_i=1; +NR_bins=NR_bin_size/2+s1_min:NR_bin_size:s1_max; +lower_bound=ones(size(NR_bins)); +mean_NR_band=ones(size(NR_bins)); +upper_bound=ones(size(NR_bins)); +counts_NR_hist=ones(size(NR_bins)); +NR_sigma=ones(size(NR_bins)); +NR_sigma_sigma=ones(size(NR_bins)); +clear mean_NR_band_err lower_bound_err upper_bound_err lower_bound mean_NR_band upper_bound + +for NR_bin = (NR_bin_size/2)+s1_min:NR_bin_size:(s1_max); %HIST uses bin centers + + + NR_fit_cut=DD_cut & inrange(s1_phe_both_xyz,[NR_bin-NR_bin_size/2,NR_bin+NR_bin_size/2]); + + NR_band_hist=hist(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + counts_NR_hist(index_i)=sum(NR_band_hist); + + Fit_NR=fit(s2_s1_bin',NR_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + + %band=confint(Fit_NR,.1); + % NR_sigma(index_i)= Fit_NR.c1/sqrt(2); + NR_sigma(index_i)= sqrt(rms_fit.sig2); + NR_sigma_sigma(index_i)=NR_sigma(index_i)/sqrt(2*counts_NR_hist(index_i)); + + lower_bound(index_i)=Fit_NR.b1-NR_sigma(index_i)*band_sigma; + mean_NR_band(index_i)=Fit_NR.b1; + upper_bound(index_i)=Fit_NR.b1+NR_sigma(index_i)*band_sigma; + + temp_err=confint(Fit_NR,0.68); + mean_NR_band_err(index_i)=abs(temp_err(1,2)-Fit_NR.b1); + lower_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + upper_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + + + %mean_NR_band_sim(index_i)=Fit_NR_sim.b1; + + index_i=index_i+1; +end + + +% Fit power law to the mean +g=fittype('a*x^b'); +NR_mean_power_fit=fit(NR_bins(NR_bins>2)',mean_NR_band(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); +NR_mean_fit{bin_counter}=NR_mean_power_fit.a.*NR_bins.^(NR_mean_power_fit.b); + +NR_lower_power_fit=fit(NR_bins(NR_bins>2)',lower_bound(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); +NR_lower_fit{bin_counter}=NR_lower_power_fit.a.*NR_bins.^(NR_lower_power_fit.b); + +NR_upper_power_fit=fit(NR_bins(NR_bins>2)',upper_bound(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); +NR_upper_fit{bin_counter}=NR_upper_power_fit.a.*NR_bins.^(NR_upper_power_fit.b); + +NR_mean_fit_points{bin_counter}=mean_NR_band; +NR_lower_fit_points{bin_counter}=lower_bound; +NR_upper_fit_points{bin_counter}=upper_bound; + +NR_mean_fit_points_err{bin_counter}=mean_NR_band_err; +NR_lower_fit_points_err{bin_counter}=lower_bound_err; +NR_upper_fit_points_err{bin_counter}=upper_bound_err; + +NR_bins_tracked{bin_counter}=NR_bins; +bin_counter=bin_counter+1; + + +%% +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\KrypCal2p21_QualityChecks\NRBand_Z_Dependence\MutliZ_DD_22p5.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +%% Make NR Band +max_r=18; +s1_min=0; +s1_max=50; + + +pulse_area_cut=s2_phe_both_xyz>150 & s2_phe_both<10000 & s1_phe_both<300; +NR_beam_cut=inrange(drift_time,[125 175]) & inrange(s2radius_del,[0,max_r]) & ... + (s2y < -8.*s2x+50) & (s2y>-20.*s2x+10); + + + + +DD_cut= clean_cut & pulse_area_cut & NR_beam_cut; + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:0.1:5; + NR_bin_size=6; %3 works + index_i=1; + NR_bins=NR_bin_size/2+s1_min:NR_bin_size:s1_max; + lower_bound=ones(size(NR_bins)); + mean_NR_band=ones(size(NR_bins)); + upper_bound=ones(size(NR_bins)); + counts_NR_hist=ones(size(NR_bins)); + NR_sigma=ones(size(NR_bins)); + NR_sigma_sigma=ones(size(NR_bins)); +% temporary, for calculating correct E-lifetime + clear mean_NR_band_err lower_bound_err upper_bound_err lower_bound mean_NR_band upper_bound + + for NR_bin = (NR_bin_size/2)+s1_min:NR_bin_size:(s1_max); %HIST uses bin centers + + + NR_fit_cut=DD_cut & inrange(s1_phe_both_xyz,[NR_bin-NR_bin_size/2,NR_bin+NR_bin_size/2]); + + NR_band_hist=hist(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + counts_NR_hist(index_i)=sum(NR_band_hist); + + Fit_NR=fit(s2_s1_bin',NR_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + + %band=confint(Fit_NR,.1); +% NR_sigma(index_i)= Fit_NR.c1/sqrt(2); + NR_sigma(index_i)= sqrt(rms_fit.sig2); + NR_sigma_sigma(index_i)=NR_sigma(index_i)/sqrt(2*counts_NR_hist(index_i)); + + lower_bound(index_i)=Fit_NR.b1-NR_sigma(index_i)*band_sigma; + mean_NR_band(index_i)=Fit_NR.b1; + upper_bound(index_i)=Fit_NR.b1+NR_sigma(index_i)*band_sigma; + + temp_err=confint(Fit_NR,0.68); + mean_NR_band_err(index_i)=abs(temp_err(1,2)-Fit_NR.b1); + lower_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + upper_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + + + %mean_NR_band_sim(index_i)=Fit_NR_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + NR_mean_power_fit=fit(NR_bins(NR_bins>2)',mean_NR_band(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_mean_fit{bin_counter}=NR_mean_power_fit.a.*NR_bins.^(NR_mean_power_fit.b); + + NR_lower_power_fit=fit(NR_bins(NR_bins>2)',lower_bound(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_lower_fit{bin_counter}=NR_lower_power_fit.a.*NR_bins.^(NR_lower_power_fit.b); + + NR_upper_power_fit=fit(NR_bins(NR_bins>2)',upper_bound(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_upper_fit{bin_counter}=NR_upper_power_fit.a.*NR_bins.^(NR_upper_power_fit.b); + + NR_mean_fit_points{bin_counter}=mean_NR_band; + NR_lower_fit_points{bin_counter}=lower_bound; + NR_upper_fit_points{bin_counter}=upper_bound; + + NR_mean_fit_points_err{bin_counter}=mean_NR_band_err; + NR_lower_fit_points_err{bin_counter}=lower_bound_err; + NR_upper_fit_points_err{bin_counter}=upper_bound_err; + + NR_bins_tracked{bin_counter}=NR_bins; + bin_counter=bin_counter+1; + +%% +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\KrypCal2p21_QualityChecks\NRBand_Z_Dependence\MutliZ_DD_30.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +%% Make NR Band +max_r=18; +s1_min=0; +s1_max=50; + + +pulse_area_cut=s2_phe_both_xyz>150 & s2_phe_both<10000 & s1_phe_both<300; +NR_beam_cut=inrange(drift_time,[180 225]) & inrange(s2radius_del,[0,max_r]) & ... + (s2y < -8.*s2x+36) & (s2y>-20.*s2x+5); + + + + +DD_cut= clean_cut & pulse_area_cut & NR_beam_cut; + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:0.1:5; + NR_bin_size=2; %3 works + index_i=1; + NR_bins=NR_bin_size/2+s1_min:NR_bin_size:s1_max; + lower_bound=ones(size(NR_bins)); + mean_NR_band=ones(size(NR_bins)); + upper_bound=ones(size(NR_bins)); + counts_NR_hist=ones(size(NR_bins)); + NR_sigma=ones(size(NR_bins)); + NR_sigma_sigma=ones(size(NR_bins)); + clear mean_NR_band_err lower_bound_err upper_bound_err lower_bound mean_NR_band upper_bound + +% temporary, for calculating correct E-lifetime + for NR_bin = (NR_bin_size/2)+s1_min:NR_bin_size:(s1_max); %HIST uses bin centers + + + NR_fit_cut=DD_cut & inrange(s1_phe_both_xyz,[NR_bin-NR_bin_size/2,NR_bin+NR_bin_size/2]); + + NR_band_hist=hist(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + counts_NR_hist(index_i)=sum(NR_band_hist); + + Fit_NR=fit(s2_s1_bin',NR_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + + %band=confint(Fit_NR,.1); +% NR_sigma(index_i)= Fit_NR.c1/sqrt(2); + NR_sigma(index_i)= sqrt(rms_fit.sig2); + NR_sigma_sigma(index_i)=NR_sigma(index_i)/sqrt(2*counts_NR_hist(index_i)); + + + lower_bound(index_i)=Fit_NR.b1-NR_sigma(index_i)*band_sigma; + mean_NR_band(index_i)=Fit_NR.b1; + upper_bound(index_i)=Fit_NR.b1+NR_sigma(index_i)*band_sigma; + + temp_err=confint(Fit_NR,0.68); + mean_NR_band_err(index_i)=abs(temp_err(1,2)-Fit_NR.b1); + lower_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + upper_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + + + %mean_NR_band_sim(index_i)=Fit_NR_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + NR_mean_power_fit=fit(NR_bins(NR_bins>2)',mean_NR_band(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_mean_fit{bin_counter}=NR_mean_power_fit.a.*NR_bins.^(NR_mean_power_fit.b); + + NR_lower_power_fit=fit(NR_bins(NR_bins>2)',lower_bound(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_lower_fit{bin_counter}=NR_lower_power_fit.a.*NR_bins.^(NR_lower_power_fit.b); + + NR_upper_power_fit=fit(NR_bins(NR_bins>2)',upper_bound(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_upper_fit{bin_counter}=NR_upper_power_fit.a.*NR_bins.^(NR_upper_power_fit.b); + + NR_mean_fit_points{bin_counter}=mean_NR_band; + NR_lower_fit_points{bin_counter}=lower_bound; + NR_upper_fit_points{bin_counter}=upper_bound; + + NR_mean_fit_points_err{bin_counter}=mean_NR_band_err; + NR_lower_fit_points_err{bin_counter}=lower_bound_err; + NR_upper_fit_points_err{bin_counter}=upper_bound_err; + + NR_bins_tracked{bin_counter}=NR_bins; + bin_counter=bin_counter+1; + +%% +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\KrypCal2p21_QualityChecks\NRBand_Z_Dependence\MutliZ_DD_37p5.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +%% Make NR Band +max_r=18; +s1_min=0; +s1_max=50; + + +pulse_area_cut=s2_phe_both_xyz>150 & s2_phe_both<10000 & s1_phe_both<300; +NR_beam_cut=inrange(drift_time,[235 280]) & inrange(s2radius_del,[0,max_r]) & ... + (s2y < -8.*s2x+36) & (s2y>-15.*s2x-5); + + + + +DD_cut= clean_cut & pulse_area_cut & NR_beam_cut; + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:0.1:5; + NR_bin_size=3; %3 works + index_i=1; + NR_bins=NR_bin_size/2+s1_min:NR_bin_size:s1_max; + lower_bound=ones(size(NR_bins)); + mean_NR_band=ones(size(NR_bins)); + upper_bound=ones(size(NR_bins)); + counts_NR_hist=ones(size(NR_bins)); + NR_sigma=ones(size(NR_bins)); + NR_sigma_sigma=ones(size(NR_bins)); + clear mean_NR_band_err lower_bound_err upper_bound_err lower_bound mean_NR_band upper_bound + +% temporary, for calculating correct E-lifetime + for NR_bin = (NR_bin_size/2)+s1_min:NR_bin_size:(s1_max); %HIST uses bin centers + + + NR_fit_cut=DD_cut & inrange(s1_phe_both_xyz,[NR_bin-NR_bin_size/2,NR_bin+NR_bin_size/2]); + + NR_band_hist=hist(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + counts_NR_hist(index_i)=sum(NR_band_hist); + + Fit_NR=fit(s2_s1_bin',NR_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + + %band=confint(Fit_NR,.1); +% NR_sigma(index_i)= Fit_NR.c1/sqrt(2); + NR_sigma(index_i)= sqrt(rms_fit.sig2); + NR_sigma_sigma(index_i)=NR_sigma(index_i)/sqrt(2*counts_NR_hist(index_i)); + + lower_bound(index_i)=Fit_NR.b1-NR_sigma(index_i)*band_sigma; + mean_NR_band(index_i)=Fit_NR.b1; + upper_bound(index_i)=Fit_NR.b1+NR_sigma(index_i)*band_sigma; + + temp_err=confint(Fit_NR,0.68); + mean_NR_band_err(index_i)=abs(temp_err(1,2)-Fit_NR.b1); + lower_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + upper_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + + + %mean_NR_band_sim(index_i)=Fit_NR_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + NR_mean_power_fit=fit(NR_bins(NR_bins>2)',mean_NR_band(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_mean_fit{bin_counter}=NR_mean_power_fit.a.*NR_bins.^(NR_mean_power_fit.b); + + NR_lower_power_fit=fit(NR_bins(NR_bins>2)',lower_bound(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_lower_fit{bin_counter}=NR_lower_power_fit.a.*NR_bins.^(NR_lower_power_fit.b); + + NR_upper_power_fit=fit(NR_bins(NR_bins>2)',upper_bound(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_upper_fit{bin_counter}=NR_upper_power_fit.a.*NR_bins.^(NR_upper_power_fit.b); + + NR_mean_fit_points{bin_counter}=mean_NR_band; + NR_lower_fit_points{bin_counter}=lower_bound; + NR_upper_fit_points{bin_counter}=upper_bound; + + NR_mean_fit_points_err{bin_counter}=mean_NR_band_err; + NR_lower_fit_points_err{bin_counter}=lower_bound_err; + NR_upper_fit_points_err{bin_counter}=upper_bound_err; + + NR_bins_tracked{bin_counter}=NR_bins; + +% bin_counter=bin_counter+1; + + %% + %Make Plot + + figure; + hold on + ylabel('Corrected log10(S2/S1)'); xlabel('S1 corrected (Pulse Area Phe)'); + title(sprintf('Run 04 NR Band, R<%d cm',max_r),'fontsize',16,'Interpreter','none'); + myfigview(16); + ylim([0 3.5]);xlim([0 s1_max]); + + colors={[1 0 0],[0 1 0],[0 0 1],[0 0 0],[1 1 0]}; + color_counter=1; + for i=[1:1:5]; + plot(NR_bins_tracked{i},NR_lower_fit{i},'--','Color',colors{color_counter},'markersize',14,'linewidth',2) + plot(NR_bins_tracked{i},NR_mean_fit{i},'-','Color',colors{color_counter},'markersize',20,'linewidth',2) + plot(NR_bins_tracked{i},NR_upper_fit{i},'--','Color',colors{color_counter},'markersize',14,'linewidth',2) + +% tempx=NR_bins_tracked{i}; +% tempy=NR_mean_fit_points{i}; +% tempy_err=NR_mean_fit_points_err{i}; +% +% if i ~= 4 +% errorbar(tempx(2:end-1),tempy(2:end-1),tempy_err(2:end-1),'Color',colors{color_counter}) +% else +% errorbar(tempx(2:end-2),tempy(2:end-2),tempy_err(2:end-2),'Color',colors{color_counter}) +% end +% + color_counter=color_counter+1; + end + +%% Next, get the ER band in the same z-slices from the closest CH3T data set (Sep 2014) + +clearvars -except NR_bins_tracked NR_lower_fit NR_mean_fit NR_upper_fit ... + NR_mean_fit NR_lower_fit NR_upper_fit NR_mean_fit_points NR_lower_fit_points NR_upper_fit_points ... + NR_mean_fit_points_err NR_lower_fit_points_err NR_upper_fit_points_err + + +path='C:\Users\Richard\Desktop\LUX Analysis\lux10_20140903T1918_cp17059'; + + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm','x_cm_tmplt','y_cm_tmplt'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +delay_min=0; +file_id_cp='test'; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 70000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + + + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + + zcut_min = 10; %field changes at 4 uSec + zcut_max = 0.95*det_edge; + + + if Kr_events < 30000 %then create a 10x10 grid. Otherwise 25x25. Want about 30 evts per bin + + S1xybinsize = sqrt((50*50)/(Kr_events/150)); + S1_xbin_min = -25; + S1_xbin_max = 25; + S1_ybin_min = -25; + S1_ybin_max = 25; + SE_ybin_min = -25; + SE_ybin_max = 25; + + S2xybinsize = sqrt((50*50)/(Kr_events/150));%cm +% SExybinsize = 5; DEFINED LATER, based on number of SE events + S2_xbin_min = -25; + S2_xbin_max = 25; + S2_ybin_min = -25; + S2_ybin_max = 25; + SE_xbin_min = -25; + SE_xbin_max = 25; + + + end + + s1_xbins = (S1_xbin_max-S1_xbin_min)./S1xybinsize; + s1_ybins = (S1_ybin_max-S1_ybin_min)./S1xybinsize; + + s2_xbins = (S2_xbin_max-S2_xbin_min)./S2xybinsize; + s2_ybins = (S2_ybin_max-S2_ybin_min)./S2xybinsize; + + %% Kr S1a/S2b map + +%Set up cuts and variables + s1ab_cut=logical(sum(s1_single_cut(:,:),1)); + s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); + s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); + s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); + s1ab_x=d.x_cm(s2_single_cut); + s1ab_y=d.y_cm(s2_single_cut); + s1ab_z=d.z_drift_samples(s2_single_cut)/100; + s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); + s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<25; + %plotting x=s1a v y=s1a/s1b cuts: y<0.035x-1, y>-0.035.*x+5; y>0.01.*x; %y<4.2; x<255 +% s1ab_areacut= (s1a_phe_both./s1b_phe_both-0.035.*s1a_phe_both<-1) & (s1a_phe_both./s1b_phe_both+0.035.*s1a_phe_both>5)... +% & (s1a_phe_both./s1b_phe_both > 0.01.* s1a_phe_both) & (s1a_phe_both./s1b_phe_both<4.2) & (s1a_phe_both<255); + + s1ab_x=s1ab_x(s1ab_timing_cut); + s1ab_y=s1ab_y(s1ab_timing_cut); + s1ab_z=s1ab_z(s1ab_timing_cut); + s1a_phe_both=s1a_phe_both(s1ab_timing_cut); + s1b_phe_both=s1b_phe_both(s1ab_timing_cut); + s1ab_radius=s1ab_radius(s1ab_timing_cut); + + %fidicual Z cut for s1ab_xy measurement + [s1ab_z_hist s1ab_z_hist_bins]=hist(s1ab_z(inrange(s1ab_z,[0,400])),[0:1:400]); + frac_hist=cumsum(s1ab_z_hist)./sum(s1ab_z_hist); + s1ab_z_cut_lower= min(s1ab_z_hist_bins(frac_hist>.10)); + s1ab_z_cut_upper= max(s1ab_z_hist_bins(frac_hist<.90)); + s1ab_z_cut=inrange(s1ab_z,[s1ab_z_cut_lower,s1ab_z_cut_upper]); + + %R cut for s1ab_Z measurement + [upperz_r_hist upperz_r_hist_bins]=hist(s1ab_radius(s1ab_z>s1ab_z_cut_upper & s1ab_radius<=26),[0:1:26]); + [lowerz_r_hist lowerz_r_hist_bins]=hist(s1ab_radius(s1ab_z0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:400]).','gauss1'); + s1b_fit=fit([0:2:300].',hist(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:300]).','gauss1'); + s1a_z_means(i)=s1a_fit.b1; + s1a_z_means_err(i)=s1a_fit.c1/sqrt(2)/sqrt(length(s1a_phe_both(s1ab_r_cut.' & s1a_phe_both>0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1b_z_means(i)=s1b_fit.b1; + s1b_z_means_err(i)=s1b_fit.c1/sqrt(2)/sqrt(length(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1ab_bincenters(i)=z_max-dT_step/2; + i=i+1; + end + +s1ab_z_means=s1a_z_means./s1b_z_means; +s1ab_z_means_err=sqrt( (s1b_z_means_err.*s1a_z_means./(s1b_z_means.^2)).^2 + (s1a_z_means_err./s1b_z_means).^2); + +%fit polynomial to s1az and s1bz, to remove z dependence later in xy fit +[s1a_P, s1a_S]=polyfit(s1ab_bincenters,s1a_z_means,3); +[s1b_P, s1b_S]=polyfit(s1ab_bincenters,s1b_z_means,3); +[s1ab_P, s1ab_S]=polyfit(s1ab_bincenters,s1ab_z_means,2); + +%S1a z dependence plot +s1az_plot=figure; +errorbar(s1ab_bincenters,s1a_z_means,s1a_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a Mean (phe)'); title('S1a Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1a_P,[10:1:320]),'-r','LineWidth',2) + +%S1b z dependence plot +s1bz_plot=figure; +errorbar(s1ab_bincenters,s1b_z_means,s1b_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1b Mean (phe)'); title('S1b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1b_P,[10:1:320]),'-r','LineWidth',2) + +%S1a/b z dependence plot +s1a_over_bz_plot=figure; +errorbar(s1ab_bincenters,s1ab_z_means,s1ab_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a/b'); title('S1 a/b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1ab_P,[10:1:320]),'-r','LineWidth',2) + + +%Correcting z dependence to get XY dependence in same manner that Kr/CH3T +%map does + s1a_phe_both_z=s1a_phe_both.'.*polyval(s1a_P,z_center)./polyval(s1a_P,s1ab_z); + s1b_phe_both_z=s1b_phe_both.'.*polyval(s1b_P,z_center)./polyval(s1b_P,s1ab_z); + + %% S1a/b XY map (after z correction) +s1ab_xbin_min=-25; +s1ab_ybin_min=-25; +s1ab_xbin_max=25; +s1ab_ybin_max=25; +s1ab_xybinsize=sqrt((50*50)/(length(s1ab_z)/300)); +clear s1a_xy_mean s1a_xy_mean_err s1b_xy_mean s1b_xy_mean_err + +s1ab_xbins=s1ab_xbin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_xbin_max; +s1ab_ybins=s1ab_ybin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_ybin_max; + +s1a_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); +s1b_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); + + for x_bin=s1ab_xbin_min:s1ab_xybinsize:(s1ab_xbin_max-s1ab_xybinsize/2); + for y_bin=s1ab_ybin_min:s1ab_xybinsize:(s1ab_ybin_max-s1ab_xybinsize/2); + x_min = x_bin; x_max = x_bin+s1ab_xybinsize; + y_min = y_bin; y_max = y_bin+s1ab_xybinsize; + + x_count=int32(1+x_bin/s1ab_xybinsize+s1ab_xbin_max/s1ab_xybinsize); + y_count=int32(1+y_bin/s1ab_xybinsize+s1ab_ybin_max/s1ab_xybinsize); + + bin_cut = s1ab_z_cut.' & inrange(s1ab_z,[10 330]).' & s1a_phe_both>0 & s1b_phe_both>0 & inrange(s1ab_x,[x_min,x_max]).' & inrange(s1ab_y,[y_min,y_max]).'; + if length(s1a_phe_both_z(bin_cut))>100; + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400])),[0:2:400]).','gauss1'); + s1a_xy_mean(y_count,x_count)=s1a_z_fit.b1; + s1a_xy_mean_err(y_count,x_count)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300])),[0:2:300]).','gauss1'); + s1b_xy_mean(y_count,x_count)=s1b_z_fit.b1; + s1b_xy_mean_err(y_count,x_count)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300]))); + else + s1a_xy_mean(y_count,x_count)=0; + s1a_xy_mean_err(y_count,x_count)=0; + s1b_xy_mean(y_count,x_count)=0; + s1b_xy_mean_err(y_count,x_count)=0; + end + + end + end + s1ab_xy_mean=s1a_xy_mean./s1b_xy_mean; + s1ab_xy_mean_err=sqrt( (s1b_xy_mean_err.*s1a_xy_mean./(s1b_xy_mean.^2)).^2 + (s1a_xy_mean_err./s1b_xy_mean).^2); + + + %Plot s1a XY means + color_range_max=max(max(s1a_xy_mean)); + color_range_min=min(min(s1a_xy_mean(s1a_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1a_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1a_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %Plot s1a XY means + color_range_max=max(max(s1b_xy_mean)); + color_range_min=min(min(s1b_xy_mean(s1b_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1b_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1b_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1b Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1b Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %s1a/b XY Ratio + color_range_max=max(max(s1ab_xy_mean)); + color_range_min=min(min(s1ab_xy_mean(s1ab_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1ab_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a/b Ratio vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a/b Ratio','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + +%% 3D Kr s1a/s1b map +if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +s1ab_xyz_numbins=floor((length(s1ab_z)/200)^(1/3)); %number of bins in one direction +s1ab_xyz_zstep=det_edge/s1ab_xyz_numbins; +s1ab_xyz_xstep=50/s1ab_xyz_numbins; +s1ab_xyz_ystep=50/s1ab_xyz_numbins; +s1ab_xyz_xmax=25; +r_max=25; + +s1ab_xyz_zbins=10+s1ab_xyz_zstep/2:s1ab_xyz_zstep:10+s1ab_xyz_zstep/2+s1ab_xyz_zstep*s1ab_xyz_numbins; %20 us +s1ab_xyz_xbins=(-r_max+s1ab_xyz_xstep/2):s1ab_xyz_xstep:r_max; +s1ab_xyz_ybins=(-r_max+s1ab_xyz_ystep/2):s1ab_xyz_ystep:r_max; + +s1a_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + + %Count the number of events per bin + Count_S1ab_3D(l,m,n)=length(s1a_phe_both(q)); + + if (Count_S1ab_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_xyz_mean(l,m,n)=s1a_z_fit.b1; + s1a_xyz_mean_err(l,m,n)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]) ),[0:2:300]).','gauss1'); + s1b_xyz_mean(l,m,n)=s1b_z_fit.b1; + s1b_xyz_mean_err(l,m,n)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); + else %not enough stats to do the fit + s1a_xyz_mean(l,m,n)=0; + s1a_xyz_mean_err(l,m,n)=0; + s1b_xyz_mean(l,m,n)=0; + s1b_xyz_mean_err(l,m,n)=0; + end + + end + end +k +end + + s1ab_xyz_mean=s1a_xyz_mean./s1b_xyz_mean; + s1ab_xyz_mean_err=sqrt( (s1b_xyz_mean_err.*s1a_xyz_mean./(s1b_xyz_mean.^2)).^2 + (s1a_xyz_mean_err./s1b_xyz_mean).^2); + +end + %% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % Removing field dependence from S1 and S2 + % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + %Hardcoded numbers from Energy Chi2 Fit + + + +s1ab_s2_xyz_fit_map.p1=-0.4988; +s1ab_s2_xyz_fit_map.p2=1.484; +c1=1-s1ab_s2_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s2_xyz_fit_map.p2; +s1ab_s2_xyz_fit_map.p3=c1; + +s1ab_s1_xyz_fit_map.p1=0.065; +s1ab_s1_xyz_fit_map.p2=0.02; +c2=1-s1ab_s1_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s1_xyz_fit_map.p2; +s1ab_s1_xyz_fit_map.p3=c2; + + + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else %Only do 1D in this case +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval); + + + + end + + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S1 Z-dependence (Both PMT arrays) +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + + light_correction_fig = figure; + errorbar(mean_index,means,means_error,'.k'); + hold on + [yplot_s1_both] = polyval(P_s1_both,dT_fit); + [center_s1_both, center_s1_both_err] = polyval(P_s1_both,z_center, S); %160[us]*1.51[\mus/us] + plot(dT_fit,yplot_s1_both,'-r','LineWidth',1); + xlabel('Depth (\mus)', 'FontSize',16); ylabel('Mean (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S1 Mean vs. Z'), 'FontSize', 16,'Interpreter','none'); + line([0 det_edge],[center_s1_both center_s1_both],'linestyle','--'); + line([z_center; z_center;],[min(means) max(means)],'linestyle','--'); + legend('S1\_both Mean', strcat('y=', num2str(P_s1_both(1),'%10.2e'), '*Z^2 + ', num2str(P_s1_both(2),'%10.2e')... + , '*Z + ', num2str(P_s1_both(3),4)),strcat('Det center = ',num2str(center_s1_both,4), ' [Phe]'),'location','northwest') + + box on; + myfigview(16); + xlim([0 det_edge]); + ylim([0.8*min(means) 1.15*max(means)]); + + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + + + + + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + + %%calculate S2/S1 also, just to double check the lifetime from S2 only + % hist_s2_both_s1(:,bin)= hist(s2_phe_both(time_cut)./s1_phe_both_z(time_cut),x3)'; + % temp_hist=hist_s2_both_s1(:,bin); + %Fit_s2_both_s1{bin}=fit(x3(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + % means_s2_s1(bin)=Fit_s2_both_s1{bin}.b1; + % means_error_s2_s1(bin) = Fit_s2_both_s1{bin}.c1/2/sqrt(sum(hist_s2_both_s1(:,bin))); % == sigma/sqrt(N); + % mean_index_s2_s1(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + + dT_range= inrange( mean_index,[5+bin_size,500] );%from 50 to 300us for the fit + + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + %%Tracker for pseudo-lifetime + s2_at_bottom_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_both=-320/log(s2_at_bottom_both/s2_at_top_both); + + dT_fit=0:1:det_edge; + + Fit_EL= fit(mean_index(dT_range),means(dT_range),'exp1'); + yfitEL = Fit_EL.a.*exp(Fit_EL.b.*dT_fit); + + e_lifetime_both=-1/Fit_EL.b; + s2_z0_both=Fit_EL.a; + + b=confint(Fit_EL, 0.683);%1 sigma matrix + sigma_e_lifetime_both=(1/b(1,2)-1/b(2,2))/2; + sigma_s2_z0_both=(b(2,1)-b(1,1))/2; + + lifetime_fig_both = figure; + errorbar(mean_index(2:end),means(2:end),means_error(2:end),'.k'); %first bin is anode, skip it + hold on + plot(dT_fit,yfitEL,'-r','LineWidth',1); + xlabel('Time (\mus)', 'FontSize',16); ylabel('Mean S2 (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S2_both Electron Lifetime'), 'FontSize', 16,'Interpreter','none'); + legend('S2\_both Mean', strcat( '\lambda= ', num2str(e_lifetime_both,4), ' \pm ', num2str(sigma_e_lifetime_both,2), ' \mus' )... + ,'location','northeast'); + myfigview(16); + xlim([0 det_edge]); + + + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_ybins),floor(s2_xbins)); +Sigma_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); +Count_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + +color_range_max=max(max(mean_S2_both_xy)); +color_range_min=min(min(mean_S2_both_xy(mean_S2_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + +s2_xy_both_fig = figure; +contourf(s2xbins,s2ybins,mean_S2_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. S2 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_ybins),floor(s1_xbins)); +Sigma_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); +Count_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +color_range_max=max(max(mean_S1_both_xy)); +color_range_min=min(min(mean_S1_both_xy(mean_S1_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + + +s1_xy_both_fig = figure; +contourf(s1xbins,s1ybins,mean_S1_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp,'. S1 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%% Apply corrections to ER data and calculate the ERband + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\Run04_CH3T\KrypCal2p18_IQs\MakePlots\CH3T_Sep2014_Kr2p18.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +%% Make ER Band +max_r=18; +s1_min=0; +s1_max=50; + + +pulse_area_cut= (log10(s1_phe_both)+0.7*log10(s2_phe_both)<4.85) & (log10(s1_phe_both)+0.7*log10(s2_phe_both)>2) & ... + (log10(s1_phe_both)-2*log10(s2_phe_both)<-4.7) & (log10(s1_phe_both)-2*log10(s2_phe_both)>-6.7); +fiducial_cut=inrange(drift_time,[35 75]) & inrange(s2radius_del,[0,max_r]); + +tritium_cut= pulse_area_cut & fiducial_cut; + +bin_counter=1; + + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:0.1:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + clear mean_ER_band_err lower_bound_err upper_bound_err lower_bound mean_ER_band upper_bound ... + gauss_sig_list_err gauss_amp_list gauss_amp_list_err + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=tritium_cut & inrange(s1_phe_both_xyz,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); +% ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + temp_err=confint(Fit_ER,0.68); + mean_ER_band_err(index_i)=abs(temp_err(1,2)-Fit_ER.b1); + lower_bound_err(index_i)=sqrt(mean_ER_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_ER.c1)/sqrt(2)).^2); + upper_bound_err(index_i)=sqrt(mean_ER_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_ER.c1)/sqrt(2)).^2); + + + gauss_sig_list_err(index_i)=abs(temp_err(1,3) - Fit_ER.c1)./sqrt(2); + gauss_amp_list(index_i)=Fit_ER.a1; + gauss_amp_list_err(index_i)=abs(temp_err(1,1)-Fit_ER.a1); + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit{bin_counter}=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + + ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit{bin_counter}=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + + ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit{bin_counter}=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + + ER_mean_fit_points{bin_counter}=mean_ER_band; + ER_lower_fit_points{bin_counter}=lower_bound; + ER_upper_fit_points{bin_counter}=upper_bound; + + ER_mean_fit_points_err{bin_counter}=mean_ER_band_err; + ER_lower_fit_points_err{bin_counter}=lower_bound_err; + ER_upper_fit_points_err{bin_counter}=upper_bound_err; + + ER_bins_tracked{bin_counter}=ER_bins; + + temp_NR_mean=NR_mean_fit_points{bin_counter}; + + + %Refit the NR band - ER binning is same as NR binning + NR_mean_data=NR_mean_fit{bin_counter}; + NR_bin_data=NR_bins_tracked{bin_counter}; + NR_mean_refit=fit(NR_bin_data(NR_bin_data>2)',NR_mean_data(NR_bin_data>2)',g,'startpoint',[ 2.5 -.1]); + NR_mean_line=NR_mean_refit.a.*ER_bins.^(NR_mean_refit.b); + + + + total_count=length(s1_phe_both_xyz(tritium_cut & s1_phe_both_xyz<50)); + leakage_count=length(s1_phe_both_xyz(tritium_cut & s1_phe_both_xyz<50 & (log10(s2_phe_both_xyz./s1_phe_both_xyz) < NR_mean_refit.a.*s1_phe_both_xyz.^(NR_mean_refit.b)))); + average_leakage(bin_counter)=leakage_count./total_count; + average_leakage_error(bin_counter)=sqrt( (sqrt(leakage_count)./total_count).^2 + (leakage_count.*sqrt(total_count)./(total_count.^2)).^2); + + figure + plot(s1_phe_both_xyz(tritium_cut),log10(s2_phe_both_xyz(tritium_cut)./s1_phe_both_xyz(tritium_cut)),'.k') + hold on; + plot(ER_bins,ER_mean_fit{bin_counter},'-b'); + plot(ER_bins,ER_lower_fit{bin_counter},'--b'); + plot(ER_bins,ER_upper_fit{bin_counter},'--b'); + plot(ER_bins,NR_mean_line,'-r'); + xlim([0 50]) + title('Drift time 35-85'); + xlabel('S1'); ylabel('Log10(S2/S1)'); myfigview(16); + + + + bin_counter=bin_counter+1; + + %% Move onto next Z slice +max_r=18; +s1_min=0; +s1_max=50; + + +pulse_area_cut= (log10(s1_phe_both)+0.7*log10(s2_phe_both)<4.85) & (log10(s1_phe_both)+0.7*log10(s2_phe_both)>2) & ... + (log10(s1_phe_both)-2*log10(s2_phe_both)<-4.7) & (log10(s1_phe_both)-2*log10(s2_phe_both)>-6.7); +fiducial_cut=inrange(drift_time,[75 125]) & inrange(s2radius_del,[0,max_r]); + +tritium_cut= clean_cut & pulse_area_cut & fiducial_cut; + + + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:0.1:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + clear mean_ER_band_err lower_bound_err upper_bound_err lower_bound mean_ER_band upper_bound ... + gauss_sig_list_err gauss_amp_list gauss_amp_list_err + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=tritium_cut & inrange(s1_phe_both_xyz,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); +% ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + temp_err=confint(Fit_ER,0.68); + mean_ER_band_err(index_i)=abs(temp_err(1,2)-Fit_ER.b1); + lower_bound_err(index_i)=sqrt(mean_ER_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_ER.c1)/sqrt(2)).^2); + upper_bound_err(index_i)=sqrt(mean_ER_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_ER.c1)/sqrt(2)).^2); + + + gauss_sig_list_err(index_i)=abs(temp_err(1,3) - Fit_ER.c1)./sqrt(2); + gauss_amp_list(index_i)=Fit_ER.a1; + gauss_amp_list_err(index_i)=abs(temp_err(1,1)-Fit_ER.a1); + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit{bin_counter}=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + + ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit{bin_counter}=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + + ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit{bin_counter}=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + + ER_mean_fit_points{bin_counter}=mean_ER_band; + ER_lower_fit_points{bin_counter}=lower_bound; + ER_upper_fit_points{bin_counter}=upper_bound; + + ER_mean_fit_points_err{bin_counter}=mean_ER_band_err; + ER_lower_fit_points_err{bin_counter}=lower_bound_err; + ER_upper_fit_points_err{bin_counter}=upper_bound_err; + + ER_bins_tracked{bin_counter}=ER_bins; + + temp_NR_mean=NR_mean_fit_points{bin_counter}; + + + %Refit the NR band - ER binning is same as NR binning + NR_mean_data=NR_mean_fit{bin_counter}; + NR_bin_data=NR_bins_tracked{bin_counter}; + NR_mean_refit=fit(NR_bin_data(NR_bin_data>2)',NR_mean_data(NR_bin_data>2)',g,'startpoint',[ 2.5 -.1]); + NR_mean_line=NR_mean_refit.a.*ER_bins.^(NR_mean_refit.b); + + total_count=length(s1_phe_both_xyz(tritium_cut & s1_phe_both_xyz<50)); + leakage_count=length(s1_phe_both_xyz(tritium_cut & s1_phe_both_xyz<50 & (log10(s2_phe_both_xyz./s1_phe_both_xyz) < NR_mean_refit.a.*s1_phe_both_xyz.^(NR_mean_refit.b)))); + average_leakage(bin_counter)=leakage_count./total_count; + average_leakage_error(bin_counter)=sqrt( (sqrt(leakage_count)./total_count).^2 + (leakage_count.*sqrt(total_count)./(total_count.^2)).^2); + + figure + plot(s1_phe_both_xyz(tritium_cut),log10(s2_phe_both_xyz(tritium_cut)./s1_phe_both_xyz(tritium_cut)),'.k') + hold on; + plot(ER_bins,ER_mean_fit{bin_counter},'-b'); + plot(ER_bins,ER_lower_fit{bin_counter},'--b'); + plot(ER_bins,ER_upper_fit{bin_counter},'--b'); + plot(ER_bins,NR_mean_line,'-r'); + xlim([0 50]) + title('Drift time 75-125'); + xlabel('S1'); ylabel('Log10(S2/S1)'); myfigview(16); + + + bin_counter=bin_counter+1; + + %% Move onto next Z slice +max_r=18; +s1_min=0; +s1_max=50; + + +pulse_area_cut= (log10(s1_phe_both)+0.7*log10(s2_phe_both)<4.85) & (log10(s1_phe_both)+0.7*log10(s2_phe_both)>2) & ... + (log10(s1_phe_both)-2*log10(s2_phe_both)<-4.7) & (log10(s1_phe_both)-2*log10(s2_phe_both)>-6.7); +fiducial_cut=inrange(drift_time,[125 175]) & inrange(s2radius_del,[0,max_r]); + +tritium_cut= clean_cut & pulse_area_cut & fiducial_cut; + + + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:0.1:5; + ER_bin_size=6; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + clear mean_ER_band_err lower_bound_err upper_bound_err lower_bound mean_ER_band upper_bound ... + gauss_sig_list_err gauss_amp_list gauss_amp_list_err + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=tritium_cut & inrange(s1_phe_both_xyz,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); +% ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + temp_err=confint(Fit_ER,0.68); + mean_ER_band_err(index_i)=abs(temp_err(1,2)-Fit_ER.b1); + lower_bound_err(index_i)=sqrt(mean_ER_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_ER.c1)/sqrt(2)).^2); + upper_bound_err(index_i)=sqrt(mean_ER_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_ER.c1)/sqrt(2)).^2); + + + gauss_sig_list_err(index_i)=abs(temp_err(1,3) - Fit_ER.c1)./sqrt(2); + gauss_amp_list(index_i)=Fit_ER.a1; + gauss_amp_list_err(index_i)=abs(temp_err(1,1)-Fit_ER.a1); + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit{bin_counter}=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + + ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit{bin_counter}=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + + ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit{bin_counter}=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + + ER_mean_fit_points{bin_counter}=mean_ER_band; + ER_lower_fit_points{bin_counter}=lower_bound; + ER_upper_fit_points{bin_counter}=upper_bound; + + ER_mean_fit_points_err{bin_counter}=mean_ER_band_err; + ER_lower_fit_points_err{bin_counter}=lower_bound_err; + ER_upper_fit_points_err{bin_counter}=upper_bound_err; + + ER_bins_tracked{bin_counter}=ER_bins; + + temp_NR_mean=NR_mean_fit_points{bin_counter}; + + + + %Refit the NR band - ER binning is same as NR binning + NR_mean_data=NR_mean_fit{bin_counter}; + NR_bin_data=NR_bins_tracked{bin_counter}; + NR_mean_refit=fit(NR_bin_data(NR_bin_data>2)',NR_mean_data(NR_bin_data>2)',g,'startpoint',[ 2.5 -.1]); + NR_mean_line=NR_mean_refit.a.*ER_bins.^(NR_mean_refit.b); + + total_count=length(s1_phe_both_xyz(tritium_cut & s1_phe_both_xyz<50)); + leakage_count=length(s1_phe_both_xyz(tritium_cut & s1_phe_both_xyz<50 & (log10(s2_phe_both_xyz./s1_phe_both_xyz) < NR_mean_refit.a.*s1_phe_both_xyz.^(NR_mean_refit.b)))); + average_leakage(bin_counter)=leakage_count./total_count; + average_leakage_error(bin_counter)=sqrt( (sqrt(leakage_count)./total_count).^2 + (leakage_count.*sqrt(total_count)./(total_count.^2)).^2); + + + figure + plot(s1_phe_both_xyz(tritium_cut),log10(s2_phe_both_xyz(tritium_cut)./s1_phe_both_xyz(tritium_cut)),'.k') + hold on; + plot(ER_bins,ER_mean_fit{bin_counter},'-b'); + plot(ER_bins,ER_lower_fit{bin_counter},'--b'); + plot(ER_bins,ER_upper_fit{bin_counter},'--b'); + plot(ER_bins,NR_mean_line,'-r'); + xlim([0 50]) + title('Drift time 125-175'); + xlabel('S1'); ylabel('Log10(S2/S1)'); myfigview(16); + + + + bin_counter=bin_counter+1; + + %% Move onto next Z slice +max_r=18; +s1_min=0; +s1_max=50; + + +pulse_area_cut= (log10(s1_phe_both)+0.7*log10(s2_phe_both)<4.85) & (log10(s1_phe_both)+0.7*log10(s2_phe_both)>2) & ... + (log10(s1_phe_both)-2*log10(s2_phe_both)<-4.7) & (log10(s1_phe_both)-2*log10(s2_phe_both)>-6.7); +fiducial_cut=inrange(drift_time,[180 225]) & inrange(s2radius_del,[0,max_r]); + +tritium_cut= clean_cut & pulse_area_cut & fiducial_cut; + + + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:0.1:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + clear mean_ER_band_err lower_bound_err upper_bound_err lower_bound mean_ER_band upper_bound ... + gauss_sig_list_err gauss_amp_list gauss_amp_list_err + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=tritium_cut & inrange(s1_phe_both_xyz,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); +% ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + temp_err=confint(Fit_ER,0.68); + mean_ER_band_err(index_i)=abs(temp_err(1,2)-Fit_ER.b1); + lower_bound_err(index_i)=sqrt(mean_ER_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_ER.c1)/sqrt(2)).^2); + upper_bound_err(index_i)=sqrt(mean_ER_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_ER.c1)/sqrt(2)).^2); + + + gauss_sig_list_err(index_i)=abs(temp_err(1,3) - Fit_ER.c1)./sqrt(2); + gauss_amp_list(index_i)=Fit_ER.a1; + gauss_amp_list_err(index_i)=abs(temp_err(1,1)-Fit_ER.a1); + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit{bin_counter}=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + + ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit{bin_counter}=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + + ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit{bin_counter}=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + + ER_mean_fit_points{bin_counter}=mean_ER_band; + ER_lower_fit_points{bin_counter}=lower_bound; + ER_upper_fit_points{bin_counter}=upper_bound; + + ER_mean_fit_points_err{bin_counter}=mean_ER_band_err; + ER_lower_fit_points_err{bin_counter}=lower_bound_err; + ER_upper_fit_points_err{bin_counter}=upper_bound_err; + + ER_bins_tracked{bin_counter}=ER_bins; + + temp_NR_mean=NR_mean_fit_points{bin_counter}; + + + + %Refit the NR band - ER binning is same as NR binning + NR_mean_data=NR_mean_fit{bin_counter}; + NR_bin_data=NR_bins_tracked{bin_counter}; + NR_mean_refit=fit(NR_bin_data(NR_bin_data>2)',NR_mean_data(NR_bin_data>2)',g,'startpoint',[ 2.5 -.1]); + NR_mean_line=NR_mean_refit.a.*ER_bins.^(NR_mean_refit.b); + + total_count=length(s1_phe_both_xyz(tritium_cut & s1_phe_both_xyz<50)); + leakage_count=length(s1_phe_both_xyz(tritium_cut & s1_phe_both_xyz<50 & (log10(s2_phe_both_xyz./s1_phe_both_xyz) < NR_mean_refit.a.*s1_phe_both_xyz.^(NR_mean_refit.b)))); + average_leakage(bin_counter)=leakage_count./total_count; + average_leakage_error(bin_counter)=sqrt( (sqrt(leakage_count)./total_count).^2 + (leakage_count.*sqrt(total_count)./(total_count.^2)).^2); + + figure + plot(s1_phe_both_xyz(tritium_cut),log10(s2_phe_both_xyz(tritium_cut)./s1_phe_both_xyz(tritium_cut)),'.k') + hold on; + plot(ER_bins,ER_mean_fit{bin_counter},'-b'); + plot(ER_bins,ER_lower_fit{bin_counter},'--b'); + plot(ER_bins,ER_upper_fit{bin_counter},'--b'); + plot(ER_bins,NR_mean_line,'-r'); + xlim([0 50]) + title('Drift time 180-225'); + xlabel('S1'); ylabel('Log10(S2/S1)'); myfigview(16); + + + bin_counter=bin_counter+1; + + %% Move onto next Z slice +max_r=18; +s1_min=0; +s1_max=50; + + +pulse_area_cut= (log10(s1_phe_both)+0.7*log10(s2_phe_both)<4.85) & (log10(s1_phe_both)+0.7*log10(s2_phe_both)>2) & ... + (log10(s1_phe_both)-2*log10(s2_phe_both)<-4.7) & (log10(s1_phe_both)-2*log10(s2_phe_both)>-6.7); +fiducial_cut=inrange(drift_time,[235 280]) & inrange(s2radius_del,[0,max_r]); + +tritium_cut= clean_cut & pulse_area_cut & fiducial_cut; + + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:0.1:5; + ER_bin_size=3; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + clear mean_ER_band_err lower_bound_err upper_bound_err lower_bound mean_ER_band upper_bound ... + gauss_sig_list_err gauss_amp_list gauss_amp_list_err + + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=tritium_cut & inrange(s1_phe_both_xyz,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); +% ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + temp_err=confint(Fit_ER,0.68); + mean_ER_band_err(index_i)=abs(temp_err(1,2)-Fit_ER.b1); + lower_bound_err(index_i)=sqrt(mean_ER_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_ER.c1)/sqrt(2)).^2); + upper_bound_err(index_i)=sqrt(mean_ER_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_ER.c1)/sqrt(2)).^2); + + + gauss_sig_list_err(index_i)=abs(temp_err(1,3) - Fit_ER.c1)./sqrt(2); + gauss_amp_list(index_i)=Fit_ER.a1; + gauss_amp_list_err(index_i)=abs(temp_err(1,1)-Fit_ER.a1); + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit{bin_counter}=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + + ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit{bin_counter}=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + + ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit{bin_counter}=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + + ER_mean_fit_points{bin_counter}=mean_ER_band; + ER_lower_fit_points{bin_counter}=lower_bound; + ER_upper_fit_points{bin_counter}=upper_bound; + + ER_mean_fit_points_err{bin_counter}=mean_ER_band_err; + ER_lower_fit_points_err{bin_counter}=lower_bound_err; + ER_upper_fit_points_err{bin_counter}=upper_bound_err; + + ER_bins_tracked{bin_counter}=ER_bins; + + temp_NR_mean=NR_mean_fit_points{bin_counter}; + + + + %Refit the NR band - ER binning is same as NR binning + NR_mean_data=NR_mean_fit{bin_counter}; + NR_bin_data=NR_bins_tracked{bin_counter}; + NR_mean_refit=fit(NR_bin_data(NR_bin_data>2)',NR_mean_data(NR_bin_data>2)',g,'startpoint',[ 2.5 -.1]); + NR_mean_line=NR_mean_refit.a.*ER_bins.^(NR_mean_refit.b); + + total_count=length(s1_phe_both_xyz(tritium_cut & s1_phe_both_xyz<50)); + leakage_count=length(s1_phe_both_xyz(tritium_cut & s1_phe_both_xyz<50 & (log10(s2_phe_both_xyz./s1_phe_both_xyz) < NR_mean_refit.a.*s1_phe_both_xyz.^(NR_mean_refit.b)))); + average_leakage(bin_counter)=leakage_count./total_count; + average_leakage_error(bin_counter)=sqrt( (sqrt(leakage_count)./total_count).^2 + (leakage_count.*sqrt(total_count)./(total_count.^2)).^2); + + figure + plot(s1_phe_both_xyz(tritium_cut),log10(s2_phe_both_xyz(tritium_cut)./s1_phe_both_xyz(tritium_cut)),'.k') + hold on; + plot(ER_bins,ER_mean_fit{bin_counter},'-b'); + plot(ER_bins,ER_lower_fit{bin_counter},'--b'); + plot(ER_bins,ER_upper_fit{bin_counter},'--b'); + plot(ER_bins,NR_mean_line,'-r'); + xlim([0 50]) + title('Drift time 235-280'); + xlabel('S1'); ylabel('Log10(S2/S1)'); myfigview(16); + +%% +figure +average_drift=[(35+75)/2,(75+125)/2,(125+175)/2,(180+225)/2,(235+280)/2]; +errorbar(average_drift,average_leakage,average_leakage_error,'.k') +xlabel('Average Drift Time (uSec)'); ylabel('Leakage Fraction'); +myfigview(16); + + +save('AverageLeakage','average_drift','average_leakage','average_leakage_error'); \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/Discrimination/AverageLeakage/Discrimination_ZDependence_AverageLeakage_NoFieldCorrection.m b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/Discrimination/AverageLeakage/Discrimination_ZDependence_AverageLeakage_NoFieldCorrection.m new file mode 100644 index 0000000..64355ae --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/Discrimination/AverageLeakage/Discrimination_ZDependence_AverageLeakage_NoFieldCorrection.m @@ -0,0 +1,3540 @@ +%% First Get the DD Band in Z Slices +path='C:\Users\Richard\Desktop\LUX Analysis\MultiZDD_KrData\lux10_20140920T1613_cp13946'; + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm','x_cm_tmplt','y_cm_tmplt'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +delay_min=0; +file_id_cp='test'; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 70000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + + + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + + zcut_min = 10; %field changes at 4 uSec + zcut_max = 0.95*det_edge; + + + if Kr_events < 30000 %then create a 10x10 grid. Otherwise 25x25. Want about 30 evts per bin + + S1xybinsize = sqrt((50*50)/(Kr_events/150)); + S1_xbin_min = -25; + S1_xbin_max = 25; + S1_ybin_min = -25; + S1_ybin_max = 25; + SE_ybin_min = -25; + SE_ybin_max = 25; + + S2xybinsize = sqrt((50*50)/(Kr_events/150));%cm +% SExybinsize = 5; DEFINED LATER, based on number of SE events + S2_xbin_min = -25; + S2_xbin_max = 25; + S2_ybin_min = -25; + S2_ybin_max = 25; + SE_xbin_min = -25; + SE_xbin_max = 25; + + + end + + s1_xbins = (S1_xbin_max-S1_xbin_min)./S1xybinsize; + s1_ybins = (S1_ybin_max-S1_ybin_min)./S1xybinsize; + + s2_xbins = (S2_xbin_max-S2_xbin_min)./S2xybinsize; + s2_ybins = (S2_ybin_max-S2_ybin_min)./S2xybinsize; + + %% Kr S1a/S2b map + +%Set up cuts and variables + s1ab_cut=logical(sum(s1_single_cut(:,:),1)); + s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); + s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); + s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); + s1ab_x=d.x_cm(s2_single_cut); + s1ab_y=d.y_cm(s2_single_cut); + s1ab_z=d.z_drift_samples(s2_single_cut)/100; + s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); + s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<25; + %plotting x=s1a v y=s1a/s1b cuts: y<0.035x-1, y>-0.035.*x+5; y>0.01.*x; %y<4.2; x<255 +% s1ab_areacut= (s1a_phe_both./s1b_phe_both-0.035.*s1a_phe_both<-1) & (s1a_phe_both./s1b_phe_both+0.035.*s1a_phe_both>5)... +% & (s1a_phe_both./s1b_phe_both > 0.01.* s1a_phe_both) & (s1a_phe_both./s1b_phe_both<4.2) & (s1a_phe_both<255); + + s1ab_x=s1ab_x(s1ab_timing_cut); + s1ab_y=s1ab_y(s1ab_timing_cut); + s1ab_z=s1ab_z(s1ab_timing_cut); + s1a_phe_both=s1a_phe_both(s1ab_timing_cut); + s1b_phe_both=s1b_phe_both(s1ab_timing_cut); + s1ab_radius=s1ab_radius(s1ab_timing_cut); + + %fidicual Z cut for s1ab_xy measurement + [s1ab_z_hist s1ab_z_hist_bins]=hist(s1ab_z(inrange(s1ab_z,[0,400])),[0:1:400]); + frac_hist=cumsum(s1ab_z_hist)./sum(s1ab_z_hist); + s1ab_z_cut_lower= min(s1ab_z_hist_bins(frac_hist>.10)); + s1ab_z_cut_upper= max(s1ab_z_hist_bins(frac_hist<.90)); + s1ab_z_cut=inrange(s1ab_z,[s1ab_z_cut_lower,s1ab_z_cut_upper]); + + %R cut for s1ab_Z measurement + [upperz_r_hist upperz_r_hist_bins]=hist(s1ab_radius(s1ab_z>s1ab_z_cut_upper & s1ab_radius<=26),[0:1:26]); + [lowerz_r_hist lowerz_r_hist_bins]=hist(s1ab_radius(s1ab_z0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:400]).','gauss1'); + s1b_fit=fit([0:2:300].',hist(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:300]).','gauss1'); + s1a_z_means(i)=s1a_fit.b1; + s1a_z_means_err(i)=s1a_fit.c1/sqrt(2)/sqrt(length(s1a_phe_both(s1ab_r_cut.' & s1a_phe_both>0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1b_z_means(i)=s1b_fit.b1; + s1b_z_means_err(i)=s1b_fit.c1/sqrt(2)/sqrt(length(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1ab_bincenters(i)=z_max-dT_step/2; + i=i+1; + end + +s1ab_z_means=s1a_z_means./s1b_z_means; +s1ab_z_means_err=sqrt( (s1b_z_means_err.*s1a_z_means./(s1b_z_means.^2)).^2 + (s1a_z_means_err./s1b_z_means).^2); + +%fit polynomial to s1az and s1bz, to remove z dependence later in xy fit +[s1a_P, s1a_S]=polyfit(s1ab_bincenters,s1a_z_means,3); +[s1b_P, s1b_S]=polyfit(s1ab_bincenters,s1b_z_means,3); +[s1ab_P, s1ab_S]=polyfit(s1ab_bincenters,s1ab_z_means,2); + +%S1a z dependence plot +s1az_plot=figure; +errorbar(s1ab_bincenters,s1a_z_means,s1a_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a Mean (phe)'); title('S1a Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1a_P,[10:1:320]),'-r','LineWidth',2) + +%S1b z dependence plot +s1bz_plot=figure; +errorbar(s1ab_bincenters,s1b_z_means,s1b_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1b Mean (phe)'); title('S1b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1b_P,[10:1:320]),'-r','LineWidth',2) + +%S1a/b z dependence plot +s1a_over_bz_plot=figure; +errorbar(s1ab_bincenters,s1ab_z_means,s1ab_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a/b'); title('S1 a/b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1ab_P,[10:1:320]),'-r','LineWidth',2) + + +%Correcting z dependence to get XY dependence in same manner that Kr/CH3T +%map does + s1a_phe_both_z=s1a_phe_both.'.*polyval(s1a_P,z_center)./polyval(s1a_P,s1ab_z); + s1b_phe_both_z=s1b_phe_both.'.*polyval(s1b_P,z_center)./polyval(s1b_P,s1ab_z); + + %% S1a/b XY map (after z correction) +s1ab_xbin_min=-25; +s1ab_ybin_min=-25; +s1ab_xbin_max=25; +s1ab_ybin_max=25; +s1ab_xybinsize=sqrt((50*50)/(length(s1ab_z)/300)); +clear s1a_xy_mean s1a_xy_mean_err s1b_xy_mean s1b_xy_mean_err + +s1ab_xbins=s1ab_xbin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_xbin_max; +s1ab_ybins=s1ab_ybin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_ybin_max; + +s1a_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); +s1b_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); + + for x_bin=s1ab_xbin_min:s1ab_xybinsize:(s1ab_xbin_max-s1ab_xybinsize/2); + for y_bin=s1ab_ybin_min:s1ab_xybinsize:(s1ab_ybin_max-s1ab_xybinsize/2); + x_min = x_bin; x_max = x_bin+s1ab_xybinsize; + y_min = y_bin; y_max = y_bin+s1ab_xybinsize; + + x_count=int32(1+x_bin/s1ab_xybinsize+s1ab_xbin_max/s1ab_xybinsize); + y_count=int32(1+y_bin/s1ab_xybinsize+s1ab_ybin_max/s1ab_xybinsize); + + bin_cut = s1ab_z_cut.' & inrange(s1ab_z,[10 330]).' & s1a_phe_both>0 & s1b_phe_both>0 & inrange(s1ab_x,[x_min,x_max]).' & inrange(s1ab_y,[y_min,y_max]).'; + if length(s1a_phe_both_z(bin_cut))>100; + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400])),[0:2:400]).','gauss1'); + s1a_xy_mean(y_count,x_count)=s1a_z_fit.b1; + s1a_xy_mean_err(y_count,x_count)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300])),[0:2:300]).','gauss1'); + s1b_xy_mean(y_count,x_count)=s1b_z_fit.b1; + s1b_xy_mean_err(y_count,x_count)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300]))); + else + s1a_xy_mean(y_count,x_count)=0; + s1a_xy_mean_err(y_count,x_count)=0; + s1b_xy_mean(y_count,x_count)=0; + s1b_xy_mean_err(y_count,x_count)=0; + end + + end + end + s1ab_xy_mean=s1a_xy_mean./s1b_xy_mean; + s1ab_xy_mean_err=sqrt( (s1b_xy_mean_err.*s1a_xy_mean./(s1b_xy_mean.^2)).^2 + (s1a_xy_mean_err./s1b_xy_mean).^2); + + + %Plot s1a XY means + color_range_max=max(max(s1a_xy_mean)); + color_range_min=min(min(s1a_xy_mean(s1a_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1a_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1a_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %Plot s1a XY means + color_range_max=max(max(s1b_xy_mean)); + color_range_min=min(min(s1b_xy_mean(s1b_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1b_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1b_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1b Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1b Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %s1a/b XY Ratio + color_range_max=max(max(s1ab_xy_mean)); + color_range_min=min(min(s1ab_xy_mean(s1ab_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1ab_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a/b Ratio vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a/b Ratio','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + +%% 3D Kr s1a/s1b map +if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +s1ab_xyz_numbins=floor((length(s1ab_z)/200)^(1/3)); %number of bins in one direction +s1ab_xyz_zstep=det_edge/s1ab_xyz_numbins; +s1ab_xyz_xstep=50/s1ab_xyz_numbins; +s1ab_xyz_ystep=50/s1ab_xyz_numbins; +s1ab_xyz_xmax=25; +r_max=25; + +s1ab_xyz_zbins=10+s1ab_xyz_zstep/2:s1ab_xyz_zstep:10+s1ab_xyz_zstep/2+s1ab_xyz_zstep*s1ab_xyz_numbins; %20 us +s1ab_xyz_xbins=(-r_max+s1ab_xyz_xstep/2):s1ab_xyz_xstep:r_max; +s1ab_xyz_ybins=(-r_max+s1ab_xyz_ystep/2):s1ab_xyz_ystep:r_max; + +s1a_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + + %Count the number of events per bin + Count_S1ab_3D(l,m,n)=length(s1a_phe_both(q)); + + if (Count_S1ab_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_xyz_mean(l,m,n)=s1a_z_fit.b1; + s1a_xyz_mean_err(l,m,n)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]) ),[0:2:300]).','gauss1'); + s1b_xyz_mean(l,m,n)=s1b_z_fit.b1; + s1b_xyz_mean_err(l,m,n)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); + else %not enough stats to do the fit + s1a_xyz_mean(l,m,n)=0; + s1a_xyz_mean_err(l,m,n)=0; + s1b_xyz_mean(l,m,n)=0; + s1b_xyz_mean_err(l,m,n)=0; + end + + end + end +k +end + + s1ab_xyz_mean=s1a_xyz_mean./s1b_xyz_mean; + s1ab_xyz_mean_err=sqrt( (s1b_xyz_mean_err.*s1a_xyz_mean./(s1b_xyz_mean.^2)).^2 + (s1a_xyz_mean_err./s1b_xyz_mean).^2); + +end + %% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % Removing field dependence from S1 and S2 + % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + %Hardcoded numbers from Energy Chi2 Fit + +% +% +% s1ab_s2_xyz_fit_map.p1=-0.4988; +% s1ab_s2_xyz_fit_map.p2=1.484; +% c1=1-s1ab_s2_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s2_xyz_fit_map.p2; +% s1ab_s2_xyz_fit_map.p3=c1; +% +% s1ab_s1_xyz_fit_map.p1=0.065; +% s1ab_s1_xyz_fit_map.p2=0.02; +% c2=1-s1ab_s1_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s1_xyz_fit_map.p2; +% s1ab_s1_xyz_fit_map.p3=c2; +% +% +% %If we can use 3D map, do so. If there aren't enough events do 1D then 2D +% if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +% %Removing zeros from map with nearest neighbor method +% s1ab_xyz_mean_old=s1ab_xyz_mean; +% temp_map=s1ab_xyz_mean; +% q= ~isnan(temp_map); +% r=nearestpoint(find(~q),find(q)); +% s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); +% +% %interpolating with cubic so that we get NaN when extrapolating +% s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); +% s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); +% s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); +% s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); +% +% %Filling in NaN values with the s1a/s1b Z map polynomial +% s1as1b_zvalues= polyval(s1ab_P,drift_time); +% s1as1b_z_at_center=s1as1b_at_center; +% s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); +% s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); +% s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); +% s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); +% +% s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +% s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +% s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +% s1_phe_both=s1_phe_both./s1_3Dfieldremoval; +% +% +% else %Only do 1D in this case +% %Removing zeros from map with nearest neighbor method +% s1ab_xy_mean_old=s1ab_xy_mean; +% temp_map=s1ab_xy_mean; +% q= ~isnan(temp_map); +% r=nearestpoint(find(~q),find(q)); +% s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); +% +% %interpolating with cubic so that we get NaN when extrapolating +% s1as1b_zvalues= polyval(s1ab_P,drift_time); +% s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); +% s1as1b_z_at_center=polyval(s1ab_P,z_center); +% s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); +% +% s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); +% s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); +% s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); +% s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); +% +% %Filling in NaN values with no XY correction. (Z dependence should never be NaN) +% s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; +% s2_zfieldremoval(isnan(s2_zfieldremoval))=1; +% s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; +% s1_zfieldremoval(isnan(s1_zfieldremoval))=1; +% +% +% s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +% s2_phe_both=s2_phe_both./(s2_zfieldremoval); +% s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +% s1_phe_both=s1_phe_both./(s1_zfieldremoval); +% +% +% +% end + + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S1 Z-dependence (Both PMT arrays) +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + + light_correction_fig = figure; + errorbar(mean_index,means,means_error,'.k'); + hold on + [yplot_s1_both] = polyval(P_s1_both,dT_fit); + [center_s1_both, center_s1_both_err] = polyval(P_s1_both,z_center, S); %160[us]*1.51[\mus/us] + plot(dT_fit,yplot_s1_both,'-r','LineWidth',1); + xlabel('Depth (\mus)', 'FontSize',16); ylabel('Mean (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S1 Mean vs. Z'), 'FontSize', 16,'Interpreter','none'); + line([0 det_edge],[center_s1_both center_s1_both],'linestyle','--'); + line([z_center; z_center;],[min(means) max(means)],'linestyle','--'); + legend('S1\_both Mean', strcat('y=', num2str(P_s1_both(1),'%10.2e'), '*Z^2 + ', num2str(P_s1_both(2),'%10.2e')... + , '*Z + ', num2str(P_s1_both(3),4)),strcat('Det center = ',num2str(center_s1_both,4), ' [Phe]'),'location','northwest') + + box on; + myfigview(16); + xlim([0 det_edge]); + ylim([0.8*min(means) 1.15*max(means)]); + + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + + + + + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + + %%calculate S2/S1 also, just to double check the lifetime from S2 only + % hist_s2_both_s1(:,bin)= hist(s2_phe_both(time_cut)./s1_phe_both_z(time_cut),x3)'; + % temp_hist=hist_s2_both_s1(:,bin); + %Fit_s2_both_s1{bin}=fit(x3(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + % means_s2_s1(bin)=Fit_s2_both_s1{bin}.b1; + % means_error_s2_s1(bin) = Fit_s2_both_s1{bin}.c1/2/sqrt(sum(hist_s2_both_s1(:,bin))); % == sigma/sqrt(N); + % mean_index_s2_s1(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + + dT_range= inrange( mean_index,[5+bin_size,500] );%from 50 to 300us for the fit + + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + %%Tracker for pseudo-lifetime + s2_at_bottom_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_both=-320/log(s2_at_bottom_both/s2_at_top_both); + + dT_fit=0:1:det_edge; + + Fit_EL= fit(mean_index(dT_range),means(dT_range),'exp1'); + yfitEL = Fit_EL.a.*exp(Fit_EL.b.*dT_fit); + + e_lifetime_both=-1/Fit_EL.b; + s2_z0_both=Fit_EL.a; + + b=confint(Fit_EL, 0.683);%1 sigma matrix + sigma_e_lifetime_both=(1/b(1,2)-1/b(2,2))/2; + sigma_s2_z0_both=(b(2,1)-b(1,1))/2; + + lifetime_fig_both = figure; + errorbar(mean_index(2:end),means(2:end),means_error(2:end),'.k'); %first bin is anode, skip it + hold on + plot(dT_fit,yfitEL,'-r','LineWidth',1); + xlabel('Time (\mus)', 'FontSize',16); ylabel('Mean S2 (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S2_both Electron Lifetime'), 'FontSize', 16,'Interpreter','none'); + legend('S2\_both Mean', strcat( '\lambda= ', num2str(e_lifetime_both,4), ' \pm ', num2str(sigma_e_lifetime_both,2), ' \mus' )... + ,'location','northeast'); + myfigview(16); + xlim([0 det_edge]); + + + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_ybins),floor(s2_xbins)); +Sigma_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); +Count_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + +color_range_max=max(max(mean_S2_both_xy)); +color_range_min=min(min(mean_S2_both_xy(mean_S2_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + +s2_xy_both_fig = figure; +contourf(s2xbins,s2ybins,mean_S2_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. S2 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_ybins),floor(s1_xbins)); +Sigma_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); +Count_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +color_range_max=max(max(mean_S1_both_xy)); +color_range_min=min(min(mean_S1_both_xy(mean_S1_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + + +s1_xy_both_fig = figure; +contourf(s1xbins,s1ybins,mean_S1_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp,'. S1 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%% Apply corrections to 7p5 DD data and calculate the NRband + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\KrypCal2p21_QualityChecks\NRBand_Z_Dependence\MutliZ_DD_7p5.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +%% Make NR Band +max_r=18; +s1_min=0; +s1_max=50; + + +pulse_area_cut=s2_phe_both_xyz>150 & s2_phe_both<10000 & s1_phe_both<300; +NR_beam_cut=inrange(drift_time,[35 75]) & inrange(s2radius_del,[0,max_r]) & ... + (s2y < -8.*s2x+70) & (s2y>-20.*s2x+10); + + +bin_counter=1; + +DD_cut= clean_cut & pulse_area_cut & NR_beam_cut; + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:0.1:5; + NR_bin_size=2; %3 works + index_i=1; + NR_bins=NR_bin_size/2+s1_min:NR_bin_size:s1_max; + lower_bound=ones(size(NR_bins)); + mean_NR_band=ones(size(NR_bins)); + upper_bound=ones(size(NR_bins)); + counts_NR_hist=ones(size(NR_bins)); + NR_sigma=ones(size(NR_bins)); + NR_sigma_sigma=ones(size(NR_bins)); + +% temporary, for calculating correct E-lifetime + clear mean_NR_band_err lower_bound_err upper_bound_err lower_bound mean_NR_band upper_bound + + for NR_bin = (NR_bin_size/2)+s1_min:NR_bin_size:(s1_max); %HIST uses bin centers + + + NR_fit_cut=DD_cut & inrange(s1_phe_both_xyz,[NR_bin-NR_bin_size/2,NR_bin+NR_bin_size/2]); + + NR_band_hist=hist(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + counts_NR_hist(index_i)=sum(NR_band_hist); + + Fit_NR=fit(s2_s1_bin',NR_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + + %band=confint(Fit_NR,.1); +% NR_sigma(index_i)= Fit_NR.c1/sqrt(2); + NR_sigma(index_i)= sqrt(rms_fit.sig2); + NR_sigma_sigma(index_i)=NR_sigma(index_i)/sqrt(2*counts_NR_hist(index_i)); + + lower_bound(index_i)=Fit_NR.b1-NR_sigma(index_i)*band_sigma; + mean_NR_band(index_i)=Fit_NR.b1; + upper_bound(index_i)=Fit_NR.b1+NR_sigma(index_i)*band_sigma; + + temp_err=confint(Fit_NR,0.68); + mean_NR_band_err(index_i)=abs(temp_err(1,2)-Fit_NR.b1); + lower_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + upper_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + + + %mean_NR_band_sim(index_i)=Fit_NR_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + NR_mean_power_fit=fit(NR_bins(NR_bins>2)',mean_NR_band(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_mean_fit{bin_counter}=NR_mean_power_fit.a.*NR_bins.^(NR_mean_power_fit.b); + + NR_lower_power_fit=fit(NR_bins(NR_bins>2)',lower_bound(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_lower_fit{bin_counter}=NR_lower_power_fit.a.*NR_bins.^(NR_lower_power_fit.b); + + NR_upper_power_fit=fit(NR_bins(NR_bins>2)',upper_bound(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_upper_fit{bin_counter}=NR_upper_power_fit.a.*NR_bins.^(NR_upper_power_fit.b); + + NR_mean_fit_points{bin_counter}=mean_NR_band; + NR_lower_fit_points{bin_counter}=lower_bound; + NR_upper_fit_points{bin_counter}=upper_bound; + + NR_mean_fit_points_err{bin_counter}=mean_NR_band_err; + NR_lower_fit_points_err{bin_counter}=lower_bound_err; + NR_upper_fit_points_err{bin_counter}=upper_bound_err; + + NR_bins_tracked{bin_counter}=NR_bins; + + bin_counter=bin_counter+1; +%% +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\KrypCal2p21_QualityChecks\NRBand_Z_Dependence\MutliZ_DD_15.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +%% Make NR Band +max_r=18; +s1_min=0; +s1_max=50; + + +pulse_area_cut=s2_phe_both_xyz>150 & s2_phe_both<10000 & s1_phe_both<300; +NR_beam_cut=inrange(drift_time,[75 125]) & inrange(s2radius_del,[0,max_r]) & ... + (s2y < -8.*s2x+70) & (s2y>-20.*s2x+10); + + + + +DD_cut= clean_cut & pulse_area_cut & NR_beam_cut; + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:0.1:5; + NR_bin_size=2; %3 works + index_i=1; + NR_bins=NR_bin_size/2+s1_min:NR_bin_size:s1_max; + lower_bound=ones(size(NR_bins)); + mean_NR_band=ones(size(NR_bins)); + upper_bound=ones(size(NR_bins)); + counts_NR_hist=ones(size(NR_bins)); + NR_sigma=ones(size(NR_bins)); + NR_sigma_sigma=ones(size(NR_bins)); + clear mean_NR_band_err lower_bound_err upper_bound_err lower_bound mean_NR_band upper_bound + +% temporary, for calculating correct E-lifetime + for NR_bin = (NR_bin_size/2)+s1_min:NR_bin_size:(s1_max); %HIST uses bin centers + + + NR_fit_cut=DD_cut & inrange(s1_phe_both_xyz,[NR_bin-NR_bin_size/2,NR_bin+NR_bin_size/2]); + + NR_band_hist=hist(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + counts_NR_hist(index_i)=sum(NR_band_hist); + + Fit_NR=fit(s2_s1_bin',NR_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + + %band=confint(Fit_NR,.1); +% NR_sigma(index_i)= Fit_NR.c1/sqrt(2); + NR_sigma(index_i)= sqrt(rms_fit.sig2); + NR_sigma_sigma(index_i)=NR_sigma(index_i)/sqrt(2*counts_NR_hist(index_i)); + + lower_bound(index_i)=Fit_NR.b1-NR_sigma(index_i)*band_sigma; + mean_NR_band(index_i)=Fit_NR.b1; + upper_bound(index_i)=Fit_NR.b1+NR_sigma(index_i)*band_sigma; + + temp_err=confint(Fit_NR,0.68); + mean_NR_band_err(index_i)=abs(temp_err(1,2)-Fit_NR.b1); + lower_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + upper_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + + + %mean_NR_band_sim(index_i)=Fit_NR_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + NR_mean_power_fit=fit(NR_bins(NR_bins>2)',mean_NR_band(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_mean_fit{bin_counter}=NR_mean_power_fit.a.*NR_bins.^(NR_mean_power_fit.b); + + NR_lower_power_fit=fit(NR_bins(NR_bins>2)',lower_bound(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_lower_fit{bin_counter}=NR_lower_power_fit.a.*NR_bins.^(NR_lower_power_fit.b); + + NR_upper_power_fit=fit(NR_bins(NR_bins>2)',upper_bound(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_upper_fit{bin_counter}=NR_upper_power_fit.a.*NR_bins.^(NR_upper_power_fit.b); + + NR_mean_fit_points{bin_counter}=mean_NR_band; + NR_lower_fit_points{bin_counter}=lower_bound; + NR_upper_fit_points{bin_counter}=upper_bound; + + NR_mean_fit_points_err{bin_counter}=mean_NR_band_err; + NR_lower_fit_points_err{bin_counter}=lower_bound_err; + NR_upper_fit_points_err{bin_counter}=upper_bound_err; + + NR_bins_tracked{bin_counter}=NR_bins; + bin_counter=bin_counter+1; + + +%% +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\KrypCal2p21_QualityChecks\NRBand_Z_Dependence\MutliZ_DD_22p5.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +%% Make NR Band +max_r=18; +s1_min=0; +s1_max=50; + + +pulse_area_cut=s2_phe_both_xyz>150 & s2_phe_both<10000 & s1_phe_both<300; +NR_beam_cut=inrange(drift_time,[125 175]) & inrange(s2radius_del,[0,max_r]) & ... + (s2y < -8.*s2x+50) & (s2y>-20.*s2x+10); + + + + +DD_cut= clean_cut & pulse_area_cut & NR_beam_cut; + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:0.1:5; + NR_bin_size=6; %3 works + index_i=1; + NR_bins=NR_bin_size/2+s1_min:NR_bin_size:s1_max; + lower_bound=ones(size(NR_bins)); + mean_NR_band=ones(size(NR_bins)); + upper_bound=ones(size(NR_bins)); + counts_NR_hist=ones(size(NR_bins)); + NR_sigma=ones(size(NR_bins)); + NR_sigma_sigma=ones(size(NR_bins)); +% temporary, for calculating correct E-lifetime + clear mean_NR_band_err lower_bound_err upper_bound_err lower_bound mean_NR_band upper_bound + + for NR_bin = (NR_bin_size/2)+s1_min:NR_bin_size:(s1_max); %HIST uses bin centers + + + NR_fit_cut=DD_cut & inrange(s1_phe_both_xyz,[NR_bin-NR_bin_size/2,NR_bin+NR_bin_size/2]); + + NR_band_hist=hist(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + counts_NR_hist(index_i)=sum(NR_band_hist); + + Fit_NR=fit(s2_s1_bin',NR_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + + %band=confint(Fit_NR,.1); +% NR_sigma(index_i)= Fit_NR.c1/sqrt(2); + NR_sigma(index_i)= sqrt(rms_fit.sig2); + NR_sigma_sigma(index_i)=NR_sigma(index_i)/sqrt(2*counts_NR_hist(index_i)); + + lower_bound(index_i)=Fit_NR.b1-NR_sigma(index_i)*band_sigma; + mean_NR_band(index_i)=Fit_NR.b1; + upper_bound(index_i)=Fit_NR.b1+NR_sigma(index_i)*band_sigma; + + temp_err=confint(Fit_NR,0.68); + mean_NR_band_err(index_i)=abs(temp_err(1,2)-Fit_NR.b1); + lower_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + upper_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + + + %mean_NR_band_sim(index_i)=Fit_NR_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + NR_mean_power_fit=fit(NR_bins(NR_bins>2)',mean_NR_band(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_mean_fit{bin_counter}=NR_mean_power_fit.a.*NR_bins.^(NR_mean_power_fit.b); + + NR_lower_power_fit=fit(NR_bins(NR_bins>2)',lower_bound(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_lower_fit{bin_counter}=NR_lower_power_fit.a.*NR_bins.^(NR_lower_power_fit.b); + + NR_upper_power_fit=fit(NR_bins(NR_bins>2)',upper_bound(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_upper_fit{bin_counter}=NR_upper_power_fit.a.*NR_bins.^(NR_upper_power_fit.b); + + NR_mean_fit_points{bin_counter}=mean_NR_band; + NR_lower_fit_points{bin_counter}=lower_bound; + NR_upper_fit_points{bin_counter}=upper_bound; + + NR_mean_fit_points_err{bin_counter}=mean_NR_band_err; + NR_lower_fit_points_err{bin_counter}=lower_bound_err; + NR_upper_fit_points_err{bin_counter}=upper_bound_err; + + NR_bins_tracked{bin_counter}=NR_bins; + bin_counter=bin_counter+1; + +%% +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\KrypCal2p21_QualityChecks\NRBand_Z_Dependence\MutliZ_DD_30.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +%% Make NR Band +max_r=18; +s1_min=0; +s1_max=50; + + +pulse_area_cut=s2_phe_both_xyz>150 & s2_phe_both<10000 & s1_phe_both<300; +NR_beam_cut=inrange(drift_time,[180 225]) & inrange(s2radius_del,[0,max_r]) & ... + (s2y < -8.*s2x+36) & (s2y>-20.*s2x+5); + + + + +DD_cut= clean_cut & pulse_area_cut & NR_beam_cut; + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:0.1:5; + NR_bin_size=2; %3 works + index_i=1; + NR_bins=NR_bin_size/2+s1_min:NR_bin_size:s1_max; + lower_bound=ones(size(NR_bins)); + mean_NR_band=ones(size(NR_bins)); + upper_bound=ones(size(NR_bins)); + counts_NR_hist=ones(size(NR_bins)); + NR_sigma=ones(size(NR_bins)); + NR_sigma_sigma=ones(size(NR_bins)); + clear mean_NR_band_err lower_bound_err upper_bound_err lower_bound mean_NR_band upper_bound + +% temporary, for calculating correct E-lifetime + for NR_bin = (NR_bin_size/2)+s1_min:NR_bin_size:(s1_max); %HIST uses bin centers + + + NR_fit_cut=DD_cut & inrange(s1_phe_both_xyz,[NR_bin-NR_bin_size/2,NR_bin+NR_bin_size/2]); + + NR_band_hist=hist(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + counts_NR_hist(index_i)=sum(NR_band_hist); + + Fit_NR=fit(s2_s1_bin',NR_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + + %band=confint(Fit_NR,.1); +% NR_sigma(index_i)= Fit_NR.c1/sqrt(2); + NR_sigma(index_i)= sqrt(rms_fit.sig2); + NR_sigma_sigma(index_i)=NR_sigma(index_i)/sqrt(2*counts_NR_hist(index_i)); + + + lower_bound(index_i)=Fit_NR.b1-NR_sigma(index_i)*band_sigma; + mean_NR_band(index_i)=Fit_NR.b1; + upper_bound(index_i)=Fit_NR.b1+NR_sigma(index_i)*band_sigma; + + temp_err=confint(Fit_NR,0.68); + mean_NR_band_err(index_i)=abs(temp_err(1,2)-Fit_NR.b1); + lower_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + upper_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + + + %mean_NR_band_sim(index_i)=Fit_NR_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + NR_mean_power_fit=fit(NR_bins(NR_bins>2)',mean_NR_band(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_mean_fit{bin_counter}=NR_mean_power_fit.a.*NR_bins.^(NR_mean_power_fit.b); + + NR_lower_power_fit=fit(NR_bins(NR_bins>2)',lower_bound(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_lower_fit{bin_counter}=NR_lower_power_fit.a.*NR_bins.^(NR_lower_power_fit.b); + + NR_upper_power_fit=fit(NR_bins(NR_bins>2)',upper_bound(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_upper_fit{bin_counter}=NR_upper_power_fit.a.*NR_bins.^(NR_upper_power_fit.b); + + NR_mean_fit_points{bin_counter}=mean_NR_band; + NR_lower_fit_points{bin_counter}=lower_bound; + NR_upper_fit_points{bin_counter}=upper_bound; + + NR_mean_fit_points_err{bin_counter}=mean_NR_band_err; + NR_lower_fit_points_err{bin_counter}=lower_bound_err; + NR_upper_fit_points_err{bin_counter}=upper_bound_err; + + NR_bins_tracked{bin_counter}=NR_bins; + bin_counter=bin_counter+1; + +%% +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\KrypCal2p21_QualityChecks\NRBand_Z_Dependence\MutliZ_DD_37p5.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +%% Make NR Band +max_r=18; +s1_min=0; +s1_max=50; + + +pulse_area_cut=s2_phe_both_xyz>150 & s2_phe_both<10000 & s1_phe_both<300; +NR_beam_cut=inrange(drift_time,[235 280]) & inrange(s2radius_del,[0,max_r]) & ... + (s2y < -8.*s2x+36) & (s2y>-15.*s2x-5); + + + + +DD_cut= clean_cut & pulse_area_cut & NR_beam_cut; + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:0.1:5; + NR_bin_size=3; %3 works + index_i=1; + NR_bins=NR_bin_size/2+s1_min:NR_bin_size:s1_max; + lower_bound=ones(size(NR_bins)); + mean_NR_band=ones(size(NR_bins)); + upper_bound=ones(size(NR_bins)); + counts_NR_hist=ones(size(NR_bins)); + NR_sigma=ones(size(NR_bins)); + NR_sigma_sigma=ones(size(NR_bins)); + clear mean_NR_band_err lower_bound_err upper_bound_err lower_bound mean_NR_band upper_bound + +% temporary, for calculating correct E-lifetime + for NR_bin = (NR_bin_size/2)+s1_min:NR_bin_size:(s1_max); %HIST uses bin centers + + + NR_fit_cut=DD_cut & inrange(s1_phe_both_xyz,[NR_bin-NR_bin_size/2,NR_bin+NR_bin_size/2]); + + NR_band_hist=hist(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + counts_NR_hist(index_i)=sum(NR_band_hist); + + Fit_NR=fit(s2_s1_bin',NR_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + + %band=confint(Fit_NR,.1); +% NR_sigma(index_i)= Fit_NR.c1/sqrt(2); + NR_sigma(index_i)= sqrt(rms_fit.sig2); + NR_sigma_sigma(index_i)=NR_sigma(index_i)/sqrt(2*counts_NR_hist(index_i)); + + lower_bound(index_i)=Fit_NR.b1-NR_sigma(index_i)*band_sigma; + mean_NR_band(index_i)=Fit_NR.b1; + upper_bound(index_i)=Fit_NR.b1+NR_sigma(index_i)*band_sigma; + + temp_err=confint(Fit_NR,0.68); + mean_NR_band_err(index_i)=abs(temp_err(1,2)-Fit_NR.b1); + lower_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + upper_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + + + %mean_NR_band_sim(index_i)=Fit_NR_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + NR_mean_power_fit=fit(NR_bins(NR_bins>2)',mean_NR_band(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_mean_fit{bin_counter}=NR_mean_power_fit.a.*NR_bins.^(NR_mean_power_fit.b); + + NR_lower_power_fit=fit(NR_bins(NR_bins>2)',lower_bound(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_lower_fit{bin_counter}=NR_lower_power_fit.a.*NR_bins.^(NR_lower_power_fit.b); + + NR_upper_power_fit=fit(NR_bins(NR_bins>2)',upper_bound(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_upper_fit{bin_counter}=NR_upper_power_fit.a.*NR_bins.^(NR_upper_power_fit.b); + + NR_mean_fit_points{bin_counter}=mean_NR_band; + NR_lower_fit_points{bin_counter}=lower_bound; + NR_upper_fit_points{bin_counter}=upper_bound; + + NR_mean_fit_points_err{bin_counter}=mean_NR_band_err; + NR_lower_fit_points_err{bin_counter}=lower_bound_err; + NR_upper_fit_points_err{bin_counter}=upper_bound_err; + + NR_bins_tracked{bin_counter}=NR_bins; + +% bin_counter=bin_counter+1; + + %% + %Make Plot + + figure; + hold on + ylabel('Corrected log10(S2/S1)'); xlabel('S1 corrected (Pulse Area Phe)'); + title(sprintf('Run 04 NR Band, R<%d cm',max_r),'fontsize',16,'Interpreter','none'); + myfigview(16); + ylim([0 3.5]);xlim([0 s1_max]); + + colors={[1 0 0],[0 1 0],[0 0 1],[0 0 0],[1 1 0]}; + color_counter=1; + for i=[1:1:5]; + plot(NR_bins_tracked{i},NR_lower_fit{i},'--','Color',colors{color_counter},'markersize',14,'linewidth',2) + plot(NR_bins_tracked{i},NR_mean_fit{i},'-','Color',colors{color_counter},'markersize',20,'linewidth',2) + plot(NR_bins_tracked{i},NR_upper_fit{i},'--','Color',colors{color_counter},'markersize',14,'linewidth',2) + +% tempx=NR_bins_tracked{i}; +% tempy=NR_mean_fit_points{i}; +% tempy_err=NR_mean_fit_points_err{i}; +% +% if i ~= 4 +% errorbar(tempx(2:end-1),tempy(2:end-1),tempy_err(2:end-1),'Color',colors{color_counter}) +% else +% errorbar(tempx(2:end-2),tempy(2:end-2),tempy_err(2:end-2),'Color',colors{color_counter}) +% end +% + color_counter=color_counter+1; + end + +%% Next, get the ER band in the same z-slices from the closest CH3T data set (Sep 2014) + +clearvars -except NR_bins_tracked NR_lower_fit NR_mean_fit NR_upper_fit ... + NR_mean_fit NR_lower_fit NR_upper_fit NR_mean_fit_points NR_lower_fit_points NR_upper_fit_points ... + NR_mean_fit_points_err NR_lower_fit_points_err NR_upper_fit_points_err + + +path='C:\Users\Richard\Desktop\LUX Analysis\lux10_20140903T1918_cp17059'; + + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm','x_cm_tmplt','y_cm_tmplt'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +delay_min=0; +file_id_cp='test'; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 70000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + + + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + + zcut_min = 10; %field changes at 4 uSec + zcut_max = 0.95*det_edge; + + + if Kr_events < 30000 %then create a 10x10 grid. Otherwise 25x25. Want about 30 evts per bin + + S1xybinsize = sqrt((50*50)/(Kr_events/150)); + S1_xbin_min = -25; + S1_xbin_max = 25; + S1_ybin_min = -25; + S1_ybin_max = 25; + SE_ybin_min = -25; + SE_ybin_max = 25; + + S2xybinsize = sqrt((50*50)/(Kr_events/150));%cm +% SExybinsize = 5; DEFINED LATER, based on number of SE events + S2_xbin_min = -25; + S2_xbin_max = 25; + S2_ybin_min = -25; + S2_ybin_max = 25; + SE_xbin_min = -25; + SE_xbin_max = 25; + + + end + + s1_xbins = (S1_xbin_max-S1_xbin_min)./S1xybinsize; + s1_ybins = (S1_ybin_max-S1_ybin_min)./S1xybinsize; + + s2_xbins = (S2_xbin_max-S2_xbin_min)./S2xybinsize; + s2_ybins = (S2_ybin_max-S2_ybin_min)./S2xybinsize; + + %% Kr S1a/S2b map + +%Set up cuts and variables + s1ab_cut=logical(sum(s1_single_cut(:,:),1)); + s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); + s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); + s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); + s1ab_x=d.x_cm(s2_single_cut); + s1ab_y=d.y_cm(s2_single_cut); + s1ab_z=d.z_drift_samples(s2_single_cut)/100; + s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); + s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<25; + %plotting x=s1a v y=s1a/s1b cuts: y<0.035x-1, y>-0.035.*x+5; y>0.01.*x; %y<4.2; x<255 +% s1ab_areacut= (s1a_phe_both./s1b_phe_both-0.035.*s1a_phe_both<-1) & (s1a_phe_both./s1b_phe_both+0.035.*s1a_phe_both>5)... +% & (s1a_phe_both./s1b_phe_both > 0.01.* s1a_phe_both) & (s1a_phe_both./s1b_phe_both<4.2) & (s1a_phe_both<255); + + s1ab_x=s1ab_x(s1ab_timing_cut); + s1ab_y=s1ab_y(s1ab_timing_cut); + s1ab_z=s1ab_z(s1ab_timing_cut); + s1a_phe_both=s1a_phe_both(s1ab_timing_cut); + s1b_phe_both=s1b_phe_both(s1ab_timing_cut); + s1ab_radius=s1ab_radius(s1ab_timing_cut); + + %fidicual Z cut for s1ab_xy measurement + [s1ab_z_hist s1ab_z_hist_bins]=hist(s1ab_z(inrange(s1ab_z,[0,400])),[0:1:400]); + frac_hist=cumsum(s1ab_z_hist)./sum(s1ab_z_hist); + s1ab_z_cut_lower= min(s1ab_z_hist_bins(frac_hist>.10)); + s1ab_z_cut_upper= max(s1ab_z_hist_bins(frac_hist<.90)); + s1ab_z_cut=inrange(s1ab_z,[s1ab_z_cut_lower,s1ab_z_cut_upper]); + + %R cut for s1ab_Z measurement + [upperz_r_hist upperz_r_hist_bins]=hist(s1ab_radius(s1ab_z>s1ab_z_cut_upper & s1ab_radius<=26),[0:1:26]); + [lowerz_r_hist lowerz_r_hist_bins]=hist(s1ab_radius(s1ab_z0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:400]).','gauss1'); + s1b_fit=fit([0:2:300].',hist(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:300]).','gauss1'); + s1a_z_means(i)=s1a_fit.b1; + s1a_z_means_err(i)=s1a_fit.c1/sqrt(2)/sqrt(length(s1a_phe_both(s1ab_r_cut.' & s1a_phe_both>0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1b_z_means(i)=s1b_fit.b1; + s1b_z_means_err(i)=s1b_fit.c1/sqrt(2)/sqrt(length(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1ab_bincenters(i)=z_max-dT_step/2; + i=i+1; + end + +s1ab_z_means=s1a_z_means./s1b_z_means; +s1ab_z_means_err=sqrt( (s1b_z_means_err.*s1a_z_means./(s1b_z_means.^2)).^2 + (s1a_z_means_err./s1b_z_means).^2); + +%fit polynomial to s1az and s1bz, to remove z dependence later in xy fit +[s1a_P, s1a_S]=polyfit(s1ab_bincenters,s1a_z_means,3); +[s1b_P, s1b_S]=polyfit(s1ab_bincenters,s1b_z_means,3); +[s1ab_P, s1ab_S]=polyfit(s1ab_bincenters,s1ab_z_means,2); + +%S1a z dependence plot +s1az_plot=figure; +errorbar(s1ab_bincenters,s1a_z_means,s1a_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a Mean (phe)'); title('S1a Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1a_P,[10:1:320]),'-r','LineWidth',2) + +%S1b z dependence plot +s1bz_plot=figure; +errorbar(s1ab_bincenters,s1b_z_means,s1b_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1b Mean (phe)'); title('S1b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1b_P,[10:1:320]),'-r','LineWidth',2) + +%S1a/b z dependence plot +s1a_over_bz_plot=figure; +errorbar(s1ab_bincenters,s1ab_z_means,s1ab_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a/b'); title('S1 a/b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1ab_P,[10:1:320]),'-r','LineWidth',2) + + +%Correcting z dependence to get XY dependence in same manner that Kr/CH3T +%map does + s1a_phe_both_z=s1a_phe_both.'.*polyval(s1a_P,z_center)./polyval(s1a_P,s1ab_z); + s1b_phe_both_z=s1b_phe_both.'.*polyval(s1b_P,z_center)./polyval(s1b_P,s1ab_z); + + %% S1a/b XY map (after z correction) +s1ab_xbin_min=-25; +s1ab_ybin_min=-25; +s1ab_xbin_max=25; +s1ab_ybin_max=25; +s1ab_xybinsize=sqrt((50*50)/(length(s1ab_z)/300)); +clear s1a_xy_mean s1a_xy_mean_err s1b_xy_mean s1b_xy_mean_err + +s1ab_xbins=s1ab_xbin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_xbin_max; +s1ab_ybins=s1ab_ybin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_ybin_max; + +s1a_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); +s1b_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); + + for x_bin=s1ab_xbin_min:s1ab_xybinsize:(s1ab_xbin_max-s1ab_xybinsize/2); + for y_bin=s1ab_ybin_min:s1ab_xybinsize:(s1ab_ybin_max-s1ab_xybinsize/2); + x_min = x_bin; x_max = x_bin+s1ab_xybinsize; + y_min = y_bin; y_max = y_bin+s1ab_xybinsize; + + x_count=int32(1+x_bin/s1ab_xybinsize+s1ab_xbin_max/s1ab_xybinsize); + y_count=int32(1+y_bin/s1ab_xybinsize+s1ab_ybin_max/s1ab_xybinsize); + + bin_cut = s1ab_z_cut.' & inrange(s1ab_z,[10 330]).' & s1a_phe_both>0 & s1b_phe_both>0 & inrange(s1ab_x,[x_min,x_max]).' & inrange(s1ab_y,[y_min,y_max]).'; + if length(s1a_phe_both_z(bin_cut))>100; + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400])),[0:2:400]).','gauss1'); + s1a_xy_mean(y_count,x_count)=s1a_z_fit.b1; + s1a_xy_mean_err(y_count,x_count)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300])),[0:2:300]).','gauss1'); + s1b_xy_mean(y_count,x_count)=s1b_z_fit.b1; + s1b_xy_mean_err(y_count,x_count)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300]))); + else + s1a_xy_mean(y_count,x_count)=0; + s1a_xy_mean_err(y_count,x_count)=0; + s1b_xy_mean(y_count,x_count)=0; + s1b_xy_mean_err(y_count,x_count)=0; + end + + end + end + s1ab_xy_mean=s1a_xy_mean./s1b_xy_mean; + s1ab_xy_mean_err=sqrt( (s1b_xy_mean_err.*s1a_xy_mean./(s1b_xy_mean.^2)).^2 + (s1a_xy_mean_err./s1b_xy_mean).^2); + + + %Plot s1a XY means + color_range_max=max(max(s1a_xy_mean)); + color_range_min=min(min(s1a_xy_mean(s1a_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1a_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1a_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %Plot s1a XY means + color_range_max=max(max(s1b_xy_mean)); + color_range_min=min(min(s1b_xy_mean(s1b_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1b_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1b_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1b Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1b Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %s1a/b XY Ratio + color_range_max=max(max(s1ab_xy_mean)); + color_range_min=min(min(s1ab_xy_mean(s1ab_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1ab_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a/b Ratio vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a/b Ratio','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + +%% 3D Kr s1a/s1b map +if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +s1ab_xyz_numbins=floor((length(s1ab_z)/200)^(1/3)); %number of bins in one direction +s1ab_xyz_zstep=det_edge/s1ab_xyz_numbins; +s1ab_xyz_xstep=50/s1ab_xyz_numbins; +s1ab_xyz_ystep=50/s1ab_xyz_numbins; +s1ab_xyz_xmax=25; +r_max=25; + +s1ab_xyz_zbins=10+s1ab_xyz_zstep/2:s1ab_xyz_zstep:10+s1ab_xyz_zstep/2+s1ab_xyz_zstep*s1ab_xyz_numbins; %20 us +s1ab_xyz_xbins=(-r_max+s1ab_xyz_xstep/2):s1ab_xyz_xstep:r_max; +s1ab_xyz_ybins=(-r_max+s1ab_xyz_ystep/2):s1ab_xyz_ystep:r_max; + +s1a_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + + %Count the number of events per bin + Count_S1ab_3D(l,m,n)=length(s1a_phe_both(q)); + + if (Count_S1ab_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_xyz_mean(l,m,n)=s1a_z_fit.b1; + s1a_xyz_mean_err(l,m,n)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]) ),[0:2:300]).','gauss1'); + s1b_xyz_mean(l,m,n)=s1b_z_fit.b1; + s1b_xyz_mean_err(l,m,n)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); + else %not enough stats to do the fit + s1a_xyz_mean(l,m,n)=0; + s1a_xyz_mean_err(l,m,n)=0; + s1b_xyz_mean(l,m,n)=0; + s1b_xyz_mean_err(l,m,n)=0; + end + + end + end +k +end + + s1ab_xyz_mean=s1a_xyz_mean./s1b_xyz_mean; + s1ab_xyz_mean_err=sqrt( (s1b_xyz_mean_err.*s1a_xyz_mean./(s1b_xyz_mean.^2)).^2 + (s1a_xyz_mean_err./s1b_xyz_mean).^2); + +end + %% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % Removing field dependence from S1 and S2 + % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + %Hardcoded numbers from Energy Chi2 Fit + + +% +% s1ab_s2_xyz_fit_map.p1=-0.4988; +% s1ab_s2_xyz_fit_map.p2=1.484; +% c1=1-s1ab_s2_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s2_xyz_fit_map.p2; +% s1ab_s2_xyz_fit_map.p3=c1; +% +% s1ab_s1_xyz_fit_map.p1=0.065; +% s1ab_s1_xyz_fit_map.p2=0.02; +% c2=1-s1ab_s1_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s1_xyz_fit_map.p2; +% s1ab_s1_xyz_fit_map.p3=c2; +% +% +% %If we can use 3D map, do so. If there aren't enough events do 1D then 2D +% if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +% %Removing zeros from map with nearest neighbor method +% s1ab_xyz_mean_old=s1ab_xyz_mean; +% temp_map=s1ab_xyz_mean; +% q= ~isnan(temp_map); +% r=nearestpoint(find(~q),find(q)); +% s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); +% +% %interpolating with cubic so that we get NaN when extrapolating +% s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); +% s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); +% s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); +% s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); +% +% %Filling in NaN values with the s1a/s1b Z map polynomial +% s1as1b_zvalues= polyval(s1ab_P,drift_time); +% s1as1b_z_at_center=s1as1b_at_center; +% s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); +% s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); +% s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); +% s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); +% +% s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +% s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +% s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +% s1_phe_both=s1_phe_both./s1_3Dfieldremoval; +% +% +% else %Only do 1D in this case +% %Removing zeros from map with nearest neighbor method +% s1ab_xy_mean_old=s1ab_xy_mean; +% temp_map=s1ab_xy_mean; +% q= ~isnan(temp_map); +% r=nearestpoint(find(~q),find(q)); +% s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); +% +% %interpolating with cubic so that we get NaN when extrapolating +% s1as1b_zvalues= polyval(s1ab_P,drift_time); +% s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); +% s1as1b_z_at_center=polyval(s1ab_P,z_center); +% s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); +% +% s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); +% s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); +% s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); +% s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); +% +% %Filling in NaN values with no XY correction. (Z dependence should never be NaN) +% s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; +% s2_zfieldremoval(isnan(s2_zfieldremoval))=1; +% s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; +% s1_zfieldremoval(isnan(s1_zfieldremoval))=1; +% +% +% s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +% s2_phe_both=s2_phe_both./(s2_zfieldremoval); +% s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +% s1_phe_both=s1_phe_both./(s1_zfieldremoval); +% +% +% +% end + + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S1 Z-dependence (Both PMT arrays) +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + + light_correction_fig = figure; + errorbar(mean_index,means,means_error,'.k'); + hold on + [yplot_s1_both] = polyval(P_s1_both,dT_fit); + [center_s1_both, center_s1_both_err] = polyval(P_s1_both,z_center, S); %160[us]*1.51[\mus/us] + plot(dT_fit,yplot_s1_both,'-r','LineWidth',1); + xlabel('Depth (\mus)', 'FontSize',16); ylabel('Mean (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S1 Mean vs. Z'), 'FontSize', 16,'Interpreter','none'); + line([0 det_edge],[center_s1_both center_s1_both],'linestyle','--'); + line([z_center; z_center;],[min(means) max(means)],'linestyle','--'); + legend('S1\_both Mean', strcat('y=', num2str(P_s1_both(1),'%10.2e'), '*Z^2 + ', num2str(P_s1_both(2),'%10.2e')... + , '*Z + ', num2str(P_s1_both(3),4)),strcat('Det center = ',num2str(center_s1_both,4), ' [Phe]'),'location','northwest') + + box on; + myfigview(16); + xlim([0 det_edge]); + ylim([0.8*min(means) 1.15*max(means)]); + + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + + + + + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + + %%calculate S2/S1 also, just to double check the lifetime from S2 only + % hist_s2_both_s1(:,bin)= hist(s2_phe_both(time_cut)./s1_phe_both_z(time_cut),x3)'; + % temp_hist=hist_s2_both_s1(:,bin); + %Fit_s2_both_s1{bin}=fit(x3(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + % means_s2_s1(bin)=Fit_s2_both_s1{bin}.b1; + % means_error_s2_s1(bin) = Fit_s2_both_s1{bin}.c1/2/sqrt(sum(hist_s2_both_s1(:,bin))); % == sigma/sqrt(N); + % mean_index_s2_s1(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + + dT_range= inrange( mean_index,[5+bin_size,500] );%from 50 to 300us for the fit + + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + %%Tracker for pseudo-lifetime + s2_at_bottom_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_both=-320/log(s2_at_bottom_both/s2_at_top_both); + + dT_fit=0:1:det_edge; + + Fit_EL= fit(mean_index(dT_range),means(dT_range),'exp1'); + yfitEL = Fit_EL.a.*exp(Fit_EL.b.*dT_fit); + + e_lifetime_both=-1/Fit_EL.b; + s2_z0_both=Fit_EL.a; + + b=confint(Fit_EL, 0.683);%1 sigma matrix + sigma_e_lifetime_both=(1/b(1,2)-1/b(2,2))/2; + sigma_s2_z0_both=(b(2,1)-b(1,1))/2; + + lifetime_fig_both = figure; + errorbar(mean_index(2:end),means(2:end),means_error(2:end),'.k'); %first bin is anode, skip it + hold on + plot(dT_fit,yfitEL,'-r','LineWidth',1); + xlabel('Time (\mus)', 'FontSize',16); ylabel('Mean S2 (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S2_both Electron Lifetime'), 'FontSize', 16,'Interpreter','none'); + legend('S2\_both Mean', strcat( '\lambda= ', num2str(e_lifetime_both,4), ' \pm ', num2str(sigma_e_lifetime_both,2), ' \mus' )... + ,'location','northeast'); + myfigview(16); + xlim([0 det_edge]); + + + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_ybins),floor(s2_xbins)); +Sigma_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); +Count_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + +color_range_max=max(max(mean_S2_both_xy)); +color_range_min=min(min(mean_S2_both_xy(mean_S2_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + +s2_xy_both_fig = figure; +contourf(s2xbins,s2ybins,mean_S2_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. S2 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_ybins),floor(s1_xbins)); +Sigma_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); +Count_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +color_range_max=max(max(mean_S1_both_xy)); +color_range_min=min(min(mean_S1_both_xy(mean_S1_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + + +s1_xy_both_fig = figure; +contourf(s1xbins,s1ybins,mean_S1_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp,'. S1 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%% Apply corrections to ER data and calculate the ERband + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\Run04_CH3T\KrypCal2p18_IQs\MakePlots\CH3T_Sep2014_Kr2p18.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +%% Make ER Band +max_r=18; +s1_min=0; +s1_max=50; + + +pulse_area_cut= (log10(s1_phe_both)+0.7*log10(s2_phe_both)<4.85) & (log10(s1_phe_both)+0.7*log10(s2_phe_both)>2) & ... + (log10(s1_phe_both)-2*log10(s2_phe_both)<-4.7) & (log10(s1_phe_both)-2*log10(s2_phe_both)>-6.7); +fiducial_cut=inrange(drift_time,[35 75]) & inrange(s2radius_del,[0,max_r]); + +tritium_cut= pulse_area_cut & fiducial_cut; + +bin_counter=1; + + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:0.1:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + clear mean_ER_band_err lower_bound_err upper_bound_err lower_bound mean_ER_band upper_bound ... + gauss_sig_list_err gauss_amp_list gauss_amp_list_err + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=tritium_cut & inrange(s1_phe_both_xyz,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); +% ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + temp_err=confint(Fit_ER,0.68); + mean_ER_band_err(index_i)=abs(temp_err(1,2)-Fit_ER.b1); + lower_bound_err(index_i)=sqrt(mean_ER_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_ER.c1)/sqrt(2)).^2); + upper_bound_err(index_i)=sqrt(mean_ER_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_ER.c1)/sqrt(2)).^2); + + + gauss_sig_list_err(index_i)=abs(temp_err(1,3) - Fit_ER.c1)./sqrt(2); + gauss_amp_list(index_i)=Fit_ER.a1; + gauss_amp_list_err(index_i)=abs(temp_err(1,1)-Fit_ER.a1); + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit{bin_counter}=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + + ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit{bin_counter}=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + + ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit{bin_counter}=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + + ER_mean_fit_points{bin_counter}=mean_ER_band; + ER_lower_fit_points{bin_counter}=lower_bound; + ER_upper_fit_points{bin_counter}=upper_bound; + + ER_mean_fit_points_err{bin_counter}=mean_ER_band_err; + ER_lower_fit_points_err{bin_counter}=lower_bound_err; + ER_upper_fit_points_err{bin_counter}=upper_bound_err; + + ER_bins_tracked{bin_counter}=ER_bins; + + temp_NR_mean=NR_mean_fit_points{bin_counter}; + + + %Refit the NR band - ER binning is same as NR binning + NR_mean_data=NR_mean_fit{bin_counter}; + NR_bin_data=NR_bins_tracked{bin_counter}; + NR_mean_refit=fit(NR_bin_data(NR_bin_data>2)',NR_mean_data(NR_bin_data>2)',g,'startpoint',[ 2.5 -.1]); + NR_mean_line=NR_mean_refit.a.*ER_bins.^(NR_mean_refit.b); + + + + total_count=length(s1_phe_both_xyz(tritium_cut & s1_phe_both_xyz<50)); + leakage_count=length(s1_phe_both_xyz(tritium_cut & s1_phe_both_xyz<50 & (log10(s2_phe_both_xyz./s1_phe_both_xyz) < NR_mean_refit.a.*s1_phe_both_xyz.^(NR_mean_refit.b)))); + average_leakage(bin_counter)=leakage_count./total_count; + average_leakage_error(bin_counter)=sqrt( (sqrt(leakage_count)./total_count).^2 + (leakage_count.*sqrt(total_count)./(total_count.^2)).^2); + + figure + plot(s1_phe_both_xyz(tritium_cut),log10(s2_phe_both_xyz(tritium_cut)./s1_phe_both_xyz(tritium_cut)),'.k') + hold on; + plot(ER_bins,ER_mean_fit{bin_counter},'-b'); + plot(ER_bins,ER_lower_fit{bin_counter},'--b'); + plot(ER_bins,ER_upper_fit{bin_counter},'--b'); + plot(ER_bins,NR_mean_line,'-r'); + xlim([0 50]) + title('Drift time 35-85'); + xlabel('S1'); ylabel('Log10(S2/S1)'); myfigview(16); + + + + bin_counter=bin_counter+1; + + %% Move onto next Z slice +max_r=18; +s1_min=0; +s1_max=50; + + +pulse_area_cut= (log10(s1_phe_both)+0.7*log10(s2_phe_both)<4.85) & (log10(s1_phe_both)+0.7*log10(s2_phe_both)>2) & ... + (log10(s1_phe_both)-2*log10(s2_phe_both)<-4.7) & (log10(s1_phe_both)-2*log10(s2_phe_both)>-6.7); +fiducial_cut=inrange(drift_time,[75 125]) & inrange(s2radius_del,[0,max_r]); + +tritium_cut= clean_cut & pulse_area_cut & fiducial_cut; + + + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:0.1:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + clear mean_ER_band_err lower_bound_err upper_bound_err lower_bound mean_ER_band upper_bound ... + gauss_sig_list_err gauss_amp_list gauss_amp_list_err + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=tritium_cut & inrange(s1_phe_both_xyz,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); +% ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + temp_err=confint(Fit_ER,0.68); + mean_ER_band_err(index_i)=abs(temp_err(1,2)-Fit_ER.b1); + lower_bound_err(index_i)=sqrt(mean_ER_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_ER.c1)/sqrt(2)).^2); + upper_bound_err(index_i)=sqrt(mean_ER_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_ER.c1)/sqrt(2)).^2); + + + gauss_sig_list_err(index_i)=abs(temp_err(1,3) - Fit_ER.c1)./sqrt(2); + gauss_amp_list(index_i)=Fit_ER.a1; + gauss_amp_list_err(index_i)=abs(temp_err(1,1)-Fit_ER.a1); + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit{bin_counter}=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + + ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit{bin_counter}=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + + ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit{bin_counter}=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + + ER_mean_fit_points{bin_counter}=mean_ER_band; + ER_lower_fit_points{bin_counter}=lower_bound; + ER_upper_fit_points{bin_counter}=upper_bound; + + ER_mean_fit_points_err{bin_counter}=mean_ER_band_err; + ER_lower_fit_points_err{bin_counter}=lower_bound_err; + ER_upper_fit_points_err{bin_counter}=upper_bound_err; + + ER_bins_tracked{bin_counter}=ER_bins; + + temp_NR_mean=NR_mean_fit_points{bin_counter}; + + + %Refit the NR band - ER binning is same as NR binning + NR_mean_data=NR_mean_fit{bin_counter}; + NR_bin_data=NR_bins_tracked{bin_counter}; + NR_mean_refit=fit(NR_bin_data(NR_bin_data>2)',NR_mean_data(NR_bin_data>2)',g,'startpoint',[ 2.5 -.1]); + NR_mean_line=NR_mean_refit.a.*ER_bins.^(NR_mean_refit.b); + + total_count=length(s1_phe_both_xyz(tritium_cut & s1_phe_both_xyz<50)); + leakage_count=length(s1_phe_both_xyz(tritium_cut & s1_phe_both_xyz<50 & (log10(s2_phe_both_xyz./s1_phe_both_xyz) < NR_mean_refit.a.*s1_phe_both_xyz.^(NR_mean_refit.b)))); + average_leakage(bin_counter)=leakage_count./total_count; + average_leakage_error(bin_counter)=sqrt( (sqrt(leakage_count)./total_count).^2 + (leakage_count.*sqrt(total_count)./(total_count.^2)).^2); + + figure + plot(s1_phe_both_xyz(tritium_cut),log10(s2_phe_both_xyz(tritium_cut)./s1_phe_both_xyz(tritium_cut)),'.k') + hold on; + plot(ER_bins,ER_mean_fit{bin_counter},'-b'); + plot(ER_bins,ER_lower_fit{bin_counter},'--b'); + plot(ER_bins,ER_upper_fit{bin_counter},'--b'); + plot(ER_bins,NR_mean_line,'-r'); + xlim([0 50]) + title('Drift time 75-125'); + xlabel('S1'); ylabel('Log10(S2/S1)'); myfigview(16); + + + bin_counter=bin_counter+1; + + %% Move onto next Z slice +max_r=18; +s1_min=0; +s1_max=50; + + +pulse_area_cut= (log10(s1_phe_both)+0.7*log10(s2_phe_both)<4.85) & (log10(s1_phe_both)+0.7*log10(s2_phe_both)>2) & ... + (log10(s1_phe_both)-2*log10(s2_phe_both)<-4.7) & (log10(s1_phe_both)-2*log10(s2_phe_both)>-6.7); +fiducial_cut=inrange(drift_time,[125 175]) & inrange(s2radius_del,[0,max_r]); + +tritium_cut= clean_cut & pulse_area_cut & fiducial_cut; + + + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:0.1:5; + ER_bin_size=6; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + clear mean_ER_band_err lower_bound_err upper_bound_err lower_bound mean_ER_band upper_bound ... + gauss_sig_list_err gauss_amp_list gauss_amp_list_err + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=tritium_cut & inrange(s1_phe_both_xyz,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); +% ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + temp_err=confint(Fit_ER,0.68); + mean_ER_band_err(index_i)=abs(temp_err(1,2)-Fit_ER.b1); + lower_bound_err(index_i)=sqrt(mean_ER_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_ER.c1)/sqrt(2)).^2); + upper_bound_err(index_i)=sqrt(mean_ER_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_ER.c1)/sqrt(2)).^2); + + + gauss_sig_list_err(index_i)=abs(temp_err(1,3) - Fit_ER.c1)./sqrt(2); + gauss_amp_list(index_i)=Fit_ER.a1; + gauss_amp_list_err(index_i)=abs(temp_err(1,1)-Fit_ER.a1); + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit{bin_counter}=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + + ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit{bin_counter}=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + + ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit{bin_counter}=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + + ER_mean_fit_points{bin_counter}=mean_ER_band; + ER_lower_fit_points{bin_counter}=lower_bound; + ER_upper_fit_points{bin_counter}=upper_bound; + + ER_mean_fit_points_err{bin_counter}=mean_ER_band_err; + ER_lower_fit_points_err{bin_counter}=lower_bound_err; + ER_upper_fit_points_err{bin_counter}=upper_bound_err; + + ER_bins_tracked{bin_counter}=ER_bins; + + temp_NR_mean=NR_mean_fit_points{bin_counter}; + + + + %Refit the NR band - ER binning is same as NR binning + NR_mean_data=NR_mean_fit{bin_counter}; + NR_bin_data=NR_bins_tracked{bin_counter}; + NR_mean_refit=fit(NR_bin_data(NR_bin_data>2)',NR_mean_data(NR_bin_data>2)',g,'startpoint',[ 2.5 -.1]); + NR_mean_line=NR_mean_refit.a.*ER_bins.^(NR_mean_refit.b); + + total_count=length(s1_phe_both_xyz(tritium_cut & s1_phe_both_xyz<50)); + leakage_count=length(s1_phe_both_xyz(tritium_cut & s1_phe_both_xyz<50 & (log10(s2_phe_both_xyz./s1_phe_both_xyz) < NR_mean_refit.a.*s1_phe_both_xyz.^(NR_mean_refit.b)))); + average_leakage(bin_counter)=leakage_count./total_count; + average_leakage_error(bin_counter)=sqrt( (sqrt(leakage_count)./total_count).^2 + (leakage_count.*sqrt(total_count)./(total_count.^2)).^2); + + + figure + plot(s1_phe_both_xyz(tritium_cut),log10(s2_phe_both_xyz(tritium_cut)./s1_phe_both_xyz(tritium_cut)),'.k') + hold on; + plot(ER_bins,ER_mean_fit{bin_counter},'-b'); + plot(ER_bins,ER_lower_fit{bin_counter},'--b'); + plot(ER_bins,ER_upper_fit{bin_counter},'--b'); + plot(ER_bins,NR_mean_line,'-r'); + xlim([0 50]) + title('Drift time 125-175'); + xlabel('S1'); ylabel('Log10(S2/S1)'); myfigview(16); + + + + bin_counter=bin_counter+1; + + %% Move onto next Z slice +max_r=18; +s1_min=0; +s1_max=50; + + +pulse_area_cut= (log10(s1_phe_both)+0.7*log10(s2_phe_both)<4.85) & (log10(s1_phe_both)+0.7*log10(s2_phe_both)>2) & ... + (log10(s1_phe_both)-2*log10(s2_phe_both)<-4.7) & (log10(s1_phe_both)-2*log10(s2_phe_both)>-6.7); +fiducial_cut=inrange(drift_time,[180 225]) & inrange(s2radius_del,[0,max_r]); + +tritium_cut= clean_cut & pulse_area_cut & fiducial_cut; + + + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:0.1:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + clear mean_ER_band_err lower_bound_err upper_bound_err lower_bound mean_ER_band upper_bound ... + gauss_sig_list_err gauss_amp_list gauss_amp_list_err + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=tritium_cut & inrange(s1_phe_both_xyz,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); +% ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + temp_err=confint(Fit_ER,0.68); + mean_ER_band_err(index_i)=abs(temp_err(1,2)-Fit_ER.b1); + lower_bound_err(index_i)=sqrt(mean_ER_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_ER.c1)/sqrt(2)).^2); + upper_bound_err(index_i)=sqrt(mean_ER_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_ER.c1)/sqrt(2)).^2); + + + gauss_sig_list_err(index_i)=abs(temp_err(1,3) - Fit_ER.c1)./sqrt(2); + gauss_amp_list(index_i)=Fit_ER.a1; + gauss_amp_list_err(index_i)=abs(temp_err(1,1)-Fit_ER.a1); + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit{bin_counter}=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + + ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit{bin_counter}=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + + ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit{bin_counter}=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + + ER_mean_fit_points{bin_counter}=mean_ER_band; + ER_lower_fit_points{bin_counter}=lower_bound; + ER_upper_fit_points{bin_counter}=upper_bound; + + ER_mean_fit_points_err{bin_counter}=mean_ER_band_err; + ER_lower_fit_points_err{bin_counter}=lower_bound_err; + ER_upper_fit_points_err{bin_counter}=upper_bound_err; + + ER_bins_tracked{bin_counter}=ER_bins; + + temp_NR_mean=NR_mean_fit_points{bin_counter}; + + + + %Refit the NR band - ER binning is same as NR binning + NR_mean_data=NR_mean_fit{bin_counter}; + NR_bin_data=NR_bins_tracked{bin_counter}; + NR_mean_refit=fit(NR_bin_data(NR_bin_data>2)',NR_mean_data(NR_bin_data>2)',g,'startpoint',[ 2.5 -.1]); + NR_mean_line=NR_mean_refit.a.*ER_bins.^(NR_mean_refit.b); + + total_count=length(s1_phe_both_xyz(tritium_cut & s1_phe_both_xyz<50)); + leakage_count=length(s1_phe_both_xyz(tritium_cut & s1_phe_both_xyz<50 & (log10(s2_phe_both_xyz./s1_phe_both_xyz) < NR_mean_refit.a.*s1_phe_both_xyz.^(NR_mean_refit.b)))); + average_leakage(bin_counter)=leakage_count./total_count; + average_leakage_error(bin_counter)=sqrt( (sqrt(leakage_count)./total_count).^2 + (leakage_count.*sqrt(total_count)./(total_count.^2)).^2); + + figure + plot(s1_phe_both_xyz(tritium_cut),log10(s2_phe_both_xyz(tritium_cut)./s1_phe_both_xyz(tritium_cut)),'.k') + hold on; + plot(ER_bins,ER_mean_fit{bin_counter},'-b'); + plot(ER_bins,ER_lower_fit{bin_counter},'--b'); + plot(ER_bins,ER_upper_fit{bin_counter},'--b'); + plot(ER_bins,NR_mean_line,'-r'); + xlim([0 50]) + title('Drift time 180-225'); + xlabel('S1'); ylabel('Log10(S2/S1)'); myfigview(16); + + + bin_counter=bin_counter+1; + + %% Move onto next Z slice +max_r=18; +s1_min=0; +s1_max=50; + + +pulse_area_cut= (log10(s1_phe_both)+0.7*log10(s2_phe_both)<4.85) & (log10(s1_phe_both)+0.7*log10(s2_phe_both)>2) & ... + (log10(s1_phe_both)-2*log10(s2_phe_both)<-4.7) & (log10(s1_phe_both)-2*log10(s2_phe_both)>-6.7); +fiducial_cut=inrange(drift_time,[235 280]) & inrange(s2radius_del,[0,max_r]); + +tritium_cut= clean_cut & pulse_area_cut & fiducial_cut; + + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:0.1:5; + ER_bin_size=3; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + clear mean_ER_band_err lower_bound_err upper_bound_err lower_bound mean_ER_band upper_bound ... + gauss_sig_list_err gauss_amp_list gauss_amp_list_err + + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=tritium_cut & inrange(s1_phe_both_xyz,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); +% ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + temp_err=confint(Fit_ER,0.68); + mean_ER_band_err(index_i)=abs(temp_err(1,2)-Fit_ER.b1); + lower_bound_err(index_i)=sqrt(mean_ER_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_ER.c1)/sqrt(2)).^2); + upper_bound_err(index_i)=sqrt(mean_ER_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_ER.c1)/sqrt(2)).^2); + + + gauss_sig_list_err(index_i)=abs(temp_err(1,3) - Fit_ER.c1)./sqrt(2); + gauss_amp_list(index_i)=Fit_ER.a1; + gauss_amp_list_err(index_i)=abs(temp_err(1,1)-Fit_ER.a1); + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit{bin_counter}=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + + ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit{bin_counter}=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + + ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit{bin_counter}=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + + ER_mean_fit_points{bin_counter}=mean_ER_band; + ER_lower_fit_points{bin_counter}=lower_bound; + ER_upper_fit_points{bin_counter}=upper_bound; + + ER_mean_fit_points_err{bin_counter}=mean_ER_band_err; + ER_lower_fit_points_err{bin_counter}=lower_bound_err; + ER_upper_fit_points_err{bin_counter}=upper_bound_err; + + ER_bins_tracked{bin_counter}=ER_bins; + + temp_NR_mean=NR_mean_fit_points{bin_counter}; + + + + %Refit the NR band - ER binning is same as NR binning + NR_mean_data=NR_mean_fit{bin_counter}; + NR_bin_data=NR_bins_tracked{bin_counter}; + NR_mean_refit=fit(NR_bin_data(NR_bin_data>2)',NR_mean_data(NR_bin_data>2)',g,'startpoint',[ 2.5 -.1]); + NR_mean_line=NR_mean_refit.a.*ER_bins.^(NR_mean_refit.b); + + total_count=length(s1_phe_both_xyz(tritium_cut & s1_phe_both_xyz<50)); + leakage_count=length(s1_phe_both_xyz(tritium_cut & s1_phe_both_xyz<50 & (log10(s2_phe_both_xyz./s1_phe_both_xyz) < NR_mean_refit.a.*s1_phe_both_xyz.^(NR_mean_refit.b)))); + average_leakage(bin_counter)=leakage_count./total_count; + average_leakage_error(bin_counter)=sqrt( (sqrt(leakage_count)./total_count).^2 + (leakage_count.*sqrt(total_count)./(total_count.^2)).^2); + + figure + plot(s1_phe_both_xyz(tritium_cut),log10(s2_phe_both_xyz(tritium_cut)./s1_phe_both_xyz(tritium_cut)),'.k') + hold on; + plot(ER_bins,ER_mean_fit{bin_counter},'-b'); + plot(ER_bins,ER_lower_fit{bin_counter},'--b'); + plot(ER_bins,ER_upper_fit{bin_counter},'--b'); + plot(ER_bins,NR_mean_line,'-r'); + xlim([0 50]) + title('Drift time 235-280'); + xlabel('S1'); ylabel('Log10(S2/S1)'); myfigview(16); + +%% +figure +average_drift=[(35+75)/2,(75+125)/2,(125+175)/2,(180+225)/2,(235+280)/2]; +errorbar(average_drift,average_leakage,average_leakage_error,'.k') +xlabel('Average Drift Time (uSec)'); ylabel('Leakage Fraction'); +myfigview(16); + + +save('AverageLeakage_NoFieldCorrection','average_drift','average_leakage','average_leakage_error'); \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/Discrimination/DataDrivenApproach/Discrimination_ZDependence_DataDrivenApproach.m b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/Discrimination/DataDrivenApproach/Discrimination_ZDependence_DataDrivenApproach.m new file mode 100644 index 0000000..b379d6a --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/Discrimination/DataDrivenApproach/Discrimination_ZDependence_DataDrivenApproach.m @@ -0,0 +1,3244 @@ +%% First Get the DD Band in Z Slices + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\KrypCal2p21_QualityChecks\Discrimination\MappingParametersFit_Start_DD'); + %% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % Removing field dependence from S1 and S2 + % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + %Hardcoded numbers from Energy Chi2 Fit + + + +s1ab_s2_xyz_fit_map.p1=-0.4988; +s1ab_s2_xyz_fit_map.p2=1.484; +c1=1-s1ab_s2_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s2_xyz_fit_map.p2; +s1ab_s2_xyz_fit_map.p3=c1; + +s1ab_s1_xyz_fit_map.p1=0.065; +s1ab_s1_xyz_fit_map.p2=0.02; +c2=1-s1ab_s1_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s1_xyz_fit_map.p2; +s1ab_s1_xyz_fit_map.p3=c2; + + + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else %Only do 1D in this case +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval); + + + + end + + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S1 Z-dependence (Both PMT arrays) +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + +% +% light_correction_fig = figure; +% errorbar(mean_index,means,means_error,'.k'); +% hold on +% [yplot_s1_both] = polyval(P_s1_both,dT_fit); +% [center_s1_both, center_s1_both_err] = polyval(P_s1_both,z_center, S); %160[us]*1.51[\mus/us] +% plot(dT_fit,yplot_s1_both,'-r','LineWidth',1); +% xlabel('Depth (\mus)', 'FontSize',16); ylabel('Mean (Pulse Area Phe)', 'FontSize', 16); +% title(strcat('.Kr83m. S1 Mean vs. Z'), 'FontSize', 16,'Interpreter','none'); +% line([0 det_edge],[center_s1_both center_s1_both],'linestyle','--'); +% line([z_center; z_center;],[min(means) max(means)],'linestyle','--'); +% legend('S1\_both Mean', strcat('y=', num2str(P_s1_both(1),'%10.2e'), '*Z^2 + ', num2str(P_s1_both(2),'%10.2e')... +% , '*Z + ', num2str(P_s1_both(3),4)),strcat('Det center = ',num2str(center_s1_both,4), ' [Phe]'),'location','northwest') +% +% box on; +% myfigview(16); +% xlim([0 det_edge]); +% ylim([0.8*min(means) 1.15*max(means)]); + + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + + + + + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + + %%calculate S2/S1 also, just to double check the lifetime from S2 only + % hist_s2_both_s1(:,bin)= hist(s2_phe_both(time_cut)./s1_phe_both_z(time_cut),x3)'; + % temp_hist=hist_s2_both_s1(:,bin); + %Fit_s2_both_s1{bin}=fit(x3(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + % means_s2_s1(bin)=Fit_s2_both_s1{bin}.b1; + % means_error_s2_s1(bin) = Fit_s2_both_s1{bin}.c1/2/sqrt(sum(hist_s2_both_s1(:,bin))); % == sigma/sqrt(N); + % mean_index_s2_s1(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + + dT_range= inrange( mean_index,[5+bin_size,500] );%from 50 to 300us for the fit + + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + %%Tracker for pseudo-lifetime + s2_at_bottom_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_both=-320/log(s2_at_bottom_both/s2_at_top_both); + + dT_fit=0:1:det_edge; + + Fit_EL= fit(mean_index(dT_range),means(dT_range),'exp1'); + yfitEL = Fit_EL.a.*exp(Fit_EL.b.*dT_fit); + + e_lifetime_both=-1/Fit_EL.b; + s2_z0_both=Fit_EL.a; + + b=confint(Fit_EL, 0.683);%1 sigma matrix + sigma_e_lifetime_both=(1/b(1,2)-1/b(2,2))/2; + sigma_s2_z0_both=(b(2,1)-b(1,1))/2; + +% lifetime_fig_both = figure; +% errorbar(mean_index(2:end),means(2:end),means_error(2:end),'.k'); %first bin is anode, skip it +% hold on +% plot(dT_fit,yfitEL,'-r','LineWidth',1); +% xlabel('Time (\mus)', 'FontSize',16); ylabel('Mean S2 (Pulse Area Phe)', 'FontSize', 16); +% title(strcat('.Kr83m. S2_both Electron Lifetime'), 'FontSize', 16,'Interpreter','none'); +% legend('S2\_both Mean', strcat( '\lambda= ', num2str(e_lifetime_both,4), ' \pm ', num2str(sigma_e_lifetime_both,2), ' \mus' )... +% ,'location','northeast'); +% myfigview(16); +% xlim([0 det_edge]); + + + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_ybins),floor(s2_xbins)); +Sigma_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); +Count_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + +color_range_max=max(max(mean_S2_both_xy)); +color_range_min=min(min(mean_S2_both_xy(mean_S2_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; +% +% s2_xy_both_fig = figure; +% contourf(s2xbins,s2ybins,mean_S2_both_xy,vc,'LineColor','none'); +% xlabel('x (cm)','fontsize', 18); +% ylabel('y (cm)','fontsize', 18); +% title(strcat('. S2 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +% caxis([color_range_min color_range_max]) +% g=colorbar; +% ylabel(g,'phe','FontSize',16) +% set(g,'FontSize',18) +% hold on +% LUXPlotTopPMTs +% axis([-25 25 -25 25]) +% myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_ybins),floor(s1_xbins)); +Sigma_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); +Count_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +color_range_max=max(max(mean_S1_both_xy)); +color_range_min=min(min(mean_S1_both_xy(mean_S1_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + +% +% s1_xy_both_fig = figure; +% contourf(s1xbins,s1ybins,mean_S1_both_xy,vc,'LineColor','none'); +% xlabel('x (cm)','fontsize', 18); +% ylabel('y (cm)','fontsize', 18); +% title(strcat('. S1 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +% caxis([color_range_min color_range_max]) +% g=colorbar; +% ylabel(g,'phe','FontSize',16) +% set(g,'FontSize',18) +% hold on +% LUXPlotTopPMTs +% axis([-25 25 -25 25]) +% myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%% Apply corrections to 7p5 DD data and calculate the NRband + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\KrypCal2p21_QualityChecks\NRBand_Z_Dependence\MutliZ_DD_7p5.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +%% Make NR Band +max_r=18; +s1_min=0; +s1_max=50; + + +pulse_area_cut=s2_phe_both_xyz>150 & s2_phe_both<10000 & s1_phe_both<300; +NR_beam_cut=inrange(drift_time,[35 75]) & inrange(s2radius_del,[0,max_r]) & ... + (s2y < -8.*s2x+70) & (s2y>-20.*s2x+10); + + +bin_counter=1; + +DD_cut= clean_cut & pulse_area_cut & NR_beam_cut; + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:0.05:5; + NR_bin_size=2; %3 works + + index_i=1; + NR_bins=NR_bin_size/2+s1_min:NR_bin_size:s1_max; + lower_bound=ones(size(NR_bins)); + mean_NR_band=ones(size(NR_bins)); + upper_bound=ones(size(NR_bins)); + counts_NR_hist=ones(size(NR_bins)); + NR_sigma=ones(size(NR_bins)); + NR_sigma_sigma=ones(size(NR_bins)); + +% temporary, for calculating correct E-lifetime + clear mean_NR_band_err lower_bound_err upper_bound_err lower_bound mean_NR_band upper_bound + + for NR_bin = (NR_bin_size/2)+s1_min:NR_bin_size:(s1_max); %HIST uses bin centers + + + NR_fit_cut=DD_cut & inrange(s1_phe_both_xyz,[NR_bin-NR_bin_size/2,NR_bin+NR_bin_size/2]); + + NR_band_hist=hist(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + counts_NR_hist(index_i)=sum(NR_band_hist); + + Fit_NR=fit(s2_s1_bin',NR_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + + %band=confint(Fit_NR,.1); +% NR_sigma(index_i)= Fit_NR.c1/sqrt(2); + NR_sigma(index_i)= sqrt(rms_fit.sig2); + NR_sigma_sigma(index_i)=NR_sigma(index_i)/sqrt(2*counts_NR_hist(index_i)); + + lower_bound(index_i)=Fit_NR.b1-NR_sigma(index_i)*band_sigma; + mean_NR_band(index_i)=Fit_NR.b1; + upper_bound(index_i)=Fit_NR.b1+NR_sigma(index_i)*band_sigma; + + temp_err=confint(Fit_NR,0.68); + mean_NR_band_err(index_i)=abs(temp_err(1,2)-Fit_NR.b1); + lower_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + upper_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + + + %mean_NR_band_sim(index_i)=Fit_NR_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + NR_mean_power_fit=fit(NR_bins(NR_bins>1)',mean_NR_band(NR_bins>1)',g,'startpoint',[ 2.5 -.1]); + NR_mean_fit{bin_counter}=NR_mean_power_fit.a.*NR_bins.^(NR_mean_power_fit.b); + + NR_lower_power_fit=fit(NR_bins(NR_bins>1)',lower_bound(NR_bins>1)',g,'startpoint',[ 2.5 -.1]); + NR_lower_fit{bin_counter}=NR_lower_power_fit.a.*NR_bins.^(NR_lower_power_fit.b); + + NR_upper_power_fit=fit(NR_bins(NR_bins>1)',upper_bound(NR_bins>1)',g,'startpoint',[ 2.5 -.1]); + NR_upper_fit{bin_counter}=NR_upper_power_fit.a.*NR_bins.^(NR_upper_power_fit.b); + + NR_mean_fit_points{bin_counter}=mean_NR_band; + NR_lower_fit_points{bin_counter}=lower_bound; + NR_upper_fit_points{bin_counter}=upper_bound; + + NR_mean_fit_points_err{bin_counter}=mean_NR_band_err; + NR_lower_fit_points_err{bin_counter}=lower_bound_err; + NR_upper_fit_points_err{bin_counter}=upper_bound_err; + + NR_bins_tracked{bin_counter}=NR_bins; + + bin_counter=bin_counter+1; +%% +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\KrypCal2p21_QualityChecks\NRBand_Z_Dependence\MutliZ_DD_15.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +%% Make NR Band +max_r=18; +s1_min=0; +s1_max=50; + + +pulse_area_cut=s2_phe_both_xyz>150 & s2_phe_both<10000 & s1_phe_both<300; +NR_beam_cut=inrange(drift_time,[75 125]) & inrange(s2radius_del,[0,max_r]) & ... + (s2y < -8.*s2x+70) & (s2y>-20.*s2x+10); + + + + +DD_cut= clean_cut & pulse_area_cut & NR_beam_cut; + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + s2_s1_bin= 1:0.05:5; + NR_bin_size=2; %3 works + + index_i=1; + NR_bins=NR_bin_size/2+s1_min:NR_bin_size:s1_max; + lower_bound=ones(size(NR_bins)); + mean_NR_band=ones(size(NR_bins)); + upper_bound=ones(size(NR_bins)); + counts_NR_hist=ones(size(NR_bins)); + NR_sigma=ones(size(NR_bins)); + NR_sigma_sigma=ones(size(NR_bins)); + clear mean_NR_band_err lower_bound_err upper_bound_err lower_bound mean_NR_band upper_bound + +% temporary, for calculating correct E-lifetime + for NR_bin = (NR_bin_size/2)+s1_min:NR_bin_size:(s1_max); %HIST uses bin centers + + + NR_fit_cut=DD_cut & inrange(s1_phe_both_xyz,[NR_bin-NR_bin_size/2,NR_bin+NR_bin_size/2]); + + NR_band_hist=hist(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + counts_NR_hist(index_i)=sum(NR_band_hist); + + Fit_NR=fit(s2_s1_bin',NR_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + + %band=confint(Fit_NR,.1); +% NR_sigma(index_i)= Fit_NR.c1/sqrt(2); + NR_sigma(index_i)= sqrt(rms_fit.sig2); + NR_sigma_sigma(index_i)=NR_sigma(index_i)/sqrt(2*counts_NR_hist(index_i)); + + lower_bound(index_i)=Fit_NR.b1-NR_sigma(index_i)*band_sigma; + mean_NR_band(index_i)=Fit_NR.b1; + upper_bound(index_i)=Fit_NR.b1+NR_sigma(index_i)*band_sigma; + + temp_err=confint(Fit_NR,0.68); + mean_NR_band_err(index_i)=abs(temp_err(1,2)-Fit_NR.b1); + lower_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + upper_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + + + %mean_NR_band_sim(index_i)=Fit_NR_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + NR_mean_power_fit=fit(NR_bins(NR_bins>1)',mean_NR_band(NR_bins>1)',g,'startpoint',[ 2.5 -.1]); + NR_mean_fit{bin_counter}=NR_mean_power_fit.a.*NR_bins.^(NR_mean_power_fit.b); + + NR_lower_power_fit=fit(NR_bins(NR_bins>1)',lower_bound(NR_bins>1)',g,'startpoint',[ 2.5 -.1]); + NR_lower_fit{bin_counter}=NR_lower_power_fit.a.*NR_bins.^(NR_lower_power_fit.b); + + NR_upper_power_fit=fit(NR_bins(NR_bins>1)',upper_bound(NR_bins>1)',g,'startpoint',[ 2.5 -.1]); + NR_upper_fit{bin_counter}=NR_upper_power_fit.a.*NR_bins.^(NR_upper_power_fit.b); + + NR_mean_fit_points{bin_counter}=mean_NR_band; + NR_lower_fit_points{bin_counter}=lower_bound; + NR_upper_fit_points{bin_counter}=upper_bound; + + NR_mean_fit_points_err{bin_counter}=mean_NR_band_err; + NR_lower_fit_points_err{bin_counter}=lower_bound_err; + NR_upper_fit_points_err{bin_counter}=upper_bound_err; + + NR_bins_tracked{bin_counter}=NR_bins; + bin_counter=bin_counter+1; + + +%% +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\KrypCal2p21_QualityChecks\NRBand_Z_Dependence\MutliZ_DD_22p5.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +%% Make NR Band +max_r=21; +s1_min=0; +s1_max=50; + + +pulse_area_cut=s2_phe_both_xyz>150 & s2_phe_both<10000 & s1_phe_both<300; +NR_beam_cut=inrange(drift_time,[125 175]) & inrange(s2radius_del,[0,max_r]) & ... + (s2y < -8.*s2x+50) & (s2y>-20.*s2x+10); + + + + +DD_cut= clean_cut & pulse_area_cut & NR_beam_cut; + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + s2_s1_bin= 1:0.05:5; + NR_bin_size=2; %3 works + + index_i=1; + NR_bins=NR_bin_size/2+s1_min:NR_bin_size:s1_max; + lower_bound=ones(size(NR_bins)); + mean_NR_band=ones(size(NR_bins)); + upper_bound=ones(size(NR_bins)); + counts_NR_hist=ones(size(NR_bins)); + NR_sigma=ones(size(NR_bins)); + NR_sigma_sigma=ones(size(NR_bins)); +% temporary, for calculating correct E-lifetime + clear mean_NR_band_err lower_bound_err upper_bound_err lower_bound mean_NR_band upper_bound + + for NR_bin = (NR_bin_size/2)+s1_min:NR_bin_size:(s1_max); %HIST uses bin centers + + + NR_fit_cut=DD_cut & inrange(s1_phe_both_xyz,[NR_bin-NR_bin_size/2,NR_bin+NR_bin_size/2]); + + NR_band_hist=hist(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + counts_NR_hist(index_i)=sum(NR_band_hist); + + Fit_NR=fit(s2_s1_bin',NR_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + + %band=confint(Fit_NR,.1); +% NR_sigma(index_i)= Fit_NR.c1/sqrt(2); + NR_sigma(index_i)= sqrt(rms_fit.sig2); + NR_sigma_sigma(index_i)=NR_sigma(index_i)/sqrt(2*counts_NR_hist(index_i)); + + lower_bound(index_i)=Fit_NR.b1-NR_sigma(index_i)*band_sigma; + mean_NR_band(index_i)=Fit_NR.b1; + upper_bound(index_i)=Fit_NR.b1+NR_sigma(index_i)*band_sigma; + + temp_err=confint(Fit_NR,0.68); + mean_NR_band_err(index_i)=abs(temp_err(1,2)-Fit_NR.b1); + lower_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + upper_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + + + %mean_NR_band_sim(index_i)=Fit_NR_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + NR_mean_power_fit=fit(NR_bins(NR_bins>1)',mean_NR_band(NR_bins>1)',g,'startpoint',[ 2.5 -.1]); + NR_mean_fit{bin_counter}=NR_mean_power_fit.a.*NR_bins.^(NR_mean_power_fit.b); + + NR_lower_power_fit=fit(NR_bins(NR_bins>1)',lower_bound(NR_bins>1)',g,'startpoint',[ 2.5 -.1]); + NR_lower_fit{bin_counter}=NR_lower_power_fit.a.*NR_bins.^(NR_lower_power_fit.b); + + NR_upper_power_fit=fit(NR_bins(NR_bins>1)',upper_bound(NR_bins>1)',g,'startpoint',[ 2.5 -.1]); + NR_upper_fit{bin_counter}=NR_upper_power_fit.a.*NR_bins.^(NR_upper_power_fit.b); + + NR_mean_fit_points{bin_counter}=mean_NR_band; + NR_lower_fit_points{bin_counter}=lower_bound; + NR_upper_fit_points{bin_counter}=upper_bound; + + NR_mean_fit_points_err{bin_counter}=mean_NR_band_err; + NR_lower_fit_points_err{bin_counter}=lower_bound_err; + NR_upper_fit_points_err{bin_counter}=upper_bound_err; + + NR_bins_tracked{bin_counter}=NR_bins; + bin_counter=bin_counter+1; + +%% +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\KrypCal2p21_QualityChecks\NRBand_Z_Dependence\MutliZ_DD_30.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +%% Make NR Band +max_r=18; +s1_min=0; +s1_max=50; + + +pulse_area_cut=s2_phe_both_xyz>150 & s2_phe_both<10000 & s1_phe_both<300; +NR_beam_cut=inrange(drift_time,[180 225]) & inrange(s2radius_del,[0,max_r]) & ... + (s2y < -8.*s2x+36) & (s2y>-20.*s2x+5); + + + + +DD_cut= clean_cut & pulse_area_cut & NR_beam_cut; + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:0.05:5; + NR_bin_size=2; %3 works + + index_i=1; + NR_bins=NR_bin_size/2+s1_min:NR_bin_size:s1_max; + lower_bound=ones(size(NR_bins)); + mean_NR_band=ones(size(NR_bins)); + upper_bound=ones(size(NR_bins)); + counts_NR_hist=ones(size(NR_bins)); + NR_sigma=ones(size(NR_bins)); + NR_sigma_sigma=ones(size(NR_bins)); + clear mean_NR_band_err lower_bound_err upper_bound_err lower_bound mean_NR_band upper_bound + +% temporary, for calculating correct E-lifetime + for NR_bin = (NR_bin_size/2)+s1_min:NR_bin_size:(s1_max); %HIST uses bin centers + + + NR_fit_cut=DD_cut & inrange(s1_phe_both_xyz,[NR_bin-NR_bin_size/2,NR_bin+NR_bin_size/2]); + + NR_band_hist=hist(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + counts_NR_hist(index_i)=sum(NR_band_hist); + + Fit_NR=fit(s2_s1_bin',NR_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + + %band=confint(Fit_NR,.1); +% NR_sigma(index_i)= Fit_NR.c1/sqrt(2); + NR_sigma(index_i)= sqrt(rms_fit.sig2); + NR_sigma_sigma(index_i)=NR_sigma(index_i)/sqrt(2*counts_NR_hist(index_i)); + + + lower_bound(index_i)=Fit_NR.b1-NR_sigma(index_i)*band_sigma; + mean_NR_band(index_i)=Fit_NR.b1; + upper_bound(index_i)=Fit_NR.b1+NR_sigma(index_i)*band_sigma; + + temp_err=confint(Fit_NR,0.68); + mean_NR_band_err(index_i)=abs(temp_err(1,2)-Fit_NR.b1); + lower_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + upper_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + + + %mean_NR_band_sim(index_i)=Fit_NR_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + NR_mean_power_fit=fit(NR_bins(NR_bins>1)',mean_NR_band(NR_bins>1)',g,'startpoint',[ 2.5 -.1]); + NR_mean_fit{bin_counter}=NR_mean_power_fit.a.*NR_bins.^(NR_mean_power_fit.b); + + NR_lower_power_fit=fit(NR_bins(NR_bins>1)',lower_bound(NR_bins>1)',g,'startpoint',[ 2.5 -.1]); + NR_lower_fit{bin_counter}=NR_lower_power_fit.a.*NR_bins.^(NR_lower_power_fit.b); + + NR_upper_power_fit=fit(NR_bins(NR_bins>1)',upper_bound(NR_bins>1)',g,'startpoint',[ 2.5 -.1]); + NR_upper_fit{bin_counter}=NR_upper_power_fit.a.*NR_bins.^(NR_upper_power_fit.b); + + NR_mean_fit_points{bin_counter}=mean_NR_band; + NR_lower_fit_points{bin_counter}=lower_bound; + NR_upper_fit_points{bin_counter}=upper_bound; + + NR_mean_fit_points_err{bin_counter}=mean_NR_band_err; + NR_lower_fit_points_err{bin_counter}=lower_bound_err; + NR_upper_fit_points_err{bin_counter}=upper_bound_err; + + NR_bins_tracked{bin_counter}=NR_bins; + bin_counter=bin_counter+1; + +%% +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\KrypCal2p21_QualityChecks\NRBand_Z_Dependence\MutliZ_DD_37p5.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +%% Make NR Band +max_r=18; +s1_min=0; +s1_max=50; + + +pulse_area_cut=s2_phe_both_xyz>150 & s2_phe_both<10000 & s1_phe_both<300; +NR_beam_cut=inrange(drift_time,[235 280]) & inrange(s2radius_del,[0,max_r]) & ... + (s2y < -8.*s2x+36) & (s2y>-15.*s2x-5); + + + + +DD_cut= clean_cut & pulse_area_cut & NR_beam_cut; + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:0.05:5; + NR_bin_size=2; %3 works + + index_i=1; + NR_bins=NR_bin_size/2+s1_min:NR_bin_size:s1_max; + lower_bound=ones(size(NR_bins)); + mean_NR_band=ones(size(NR_bins)); + upper_bound=ones(size(NR_bins)); + counts_NR_hist=ones(size(NR_bins)); + NR_sigma=ones(size(NR_bins)); + NR_sigma_sigma=ones(size(NR_bins)); + clear mean_NR_band_err lower_bound_err upper_bound_err lower_bound mean_NR_band upper_bound + +% temporary, for calculating correct E-lifetime + for NR_bin = (NR_bin_size/2)+s1_min:NR_bin_size:(s1_max); %HIST uses bin centers + + + NR_fit_cut=DD_cut & inrange(s1_phe_both_xyz,[NR_bin-NR_bin_size/2,NR_bin+NR_bin_size/2]); + + NR_band_hist=hist(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + counts_NR_hist(index_i)=sum(NR_band_hist); + + Fit_NR=fit(s2_s1_bin',NR_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + + %band=confint(Fit_NR,.1); +% NR_sigma(index_i)= Fit_NR.c1/sqrt(2); + NR_sigma(index_i)= sqrt(rms_fit.sig2); + NR_sigma_sigma(index_i)=NR_sigma(index_i)/sqrt(2*counts_NR_hist(index_i)); + + lower_bound(index_i)=Fit_NR.b1-NR_sigma(index_i)*band_sigma; + mean_NR_band(index_i)=Fit_NR.b1; + upper_bound(index_i)=Fit_NR.b1+NR_sigma(index_i)*band_sigma; + + temp_err=confint(Fit_NR,0.68); + mean_NR_band_err(index_i)=abs(temp_err(1,2)-Fit_NR.b1); + lower_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + upper_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + + + %mean_NR_band_sim(index_i)=Fit_NR_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + NR_mean_power_fit=fit(NR_bins(NR_bins>1)',mean_NR_band(NR_bins>1)',g,'startpoint',[ 2.5 -.1]); + NR_mean_fit{bin_counter}=NR_mean_power_fit.a.*NR_bins.^(NR_mean_power_fit.b); + + NR_lower_power_fit=fit(NR_bins(NR_bins>1)',lower_bound(NR_bins>1)',g,'startpoint',[ 2.5 -.1]); + NR_lower_fit{bin_counter}=NR_lower_power_fit.a.*NR_bins.^(NR_lower_power_fit.b); + + NR_upper_power_fit=fit(NR_bins(NR_bins>1)',upper_bound(NR_bins>1)',g,'startpoint',[ 2.5 -.1]); + NR_upper_fit{bin_counter}=NR_upper_power_fit.a.*NR_bins.^(NR_upper_power_fit.b); + + NR_mean_fit_points{bin_counter}=mean_NR_band; + NR_lower_fit_points{bin_counter}=lower_bound; + NR_upper_fit_points{bin_counter}=upper_bound; + + NR_mean_fit_points_err{bin_counter}=mean_NR_band_err; + NR_lower_fit_points_err{bin_counter}=lower_bound_err; + NR_upper_fit_points_err{bin_counter}=upper_bound_err; + + NR_bins_tracked{bin_counter}=NR_bins; + +% bin_counter=bin_counter+1; + + %% + %Make Plot + + figure; + hold on + ylabel('Corrected log10(S2/S1)'); xlabel('S1 corrected (Pulse Area Phe)'); + title(sprintf('Run 04 NR Band, R<%d cm',max_r),'fontsize',16,'Interpreter','none'); + myfigview(16); + ylim([0 3.5]);xlim([0 s1_max]); + + colors={[1 0 0],[0 1 0],[0 0 1],[0 0 0],[1 1 0]}; + color_counter=1; + for i=[1:1:5]; + plot(NR_bins_tracked{i},NR_lower_fit{i},'--','Color',colors{color_counter},'markersize',14,'linewidth',2) + plot(NR_bins_tracked{i},NR_mean_fit{i},'-','Color',colors{color_counter},'markersize',20,'linewidth',2) + plot(NR_bins_tracked{i},NR_upper_fit{i},'--','Color',colors{color_counter},'markersize',14,'linewidth',2) + +% tempx=NR_bins_tracked{i}; +% tempy=NR_mean_fit_points{i}; +% tempy_err=NR_mean_fit_points_err{i}; +% +% if i ~= 4 +% errorbar(tempx(2:end-1),tempy(2:end-1),tempy_err(2:end-1),'Color',colors{color_counter}) +% else +% errorbar(tempx(2:end-2),tempy(2:end-2),tempy_err(2:end-2),'Color',colors{color_counter}) +% end +% + color_counter=color_counter+1; + end + +%% Next, get the ER band in the same z-slices from the closest CH3T data set (Sep 2014) + +clearvars -except NR_bins_tracked NR_lower_fit NR_mean_fit NR_upper_fit ... + NR_mean_fit NR_lower_fit NR_upper_fit NR_mean_fit_points NR_lower_fit_points NR_upper_fit_points ... + NR_mean_fit_points_err NR_lower_fit_points_err NR_upper_fit_points_err + + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\KrypCal2p21_QualityChecks\Discrimination\MappingParametersFit_Start_CH3T'); + + %% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % Removing field dependence from S1 and S2 + % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + %Hardcoded numbers from Energy Chi2 Fit + + + +s1ab_s2_xyz_fit_map.p1=-0.4988; +s1ab_s2_xyz_fit_map.p2=1.484; +c1=1-s1ab_s2_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s2_xyz_fit_map.p2; +s1ab_s2_xyz_fit_map.p3=c1; + +s1ab_s1_xyz_fit_map.p1=0.065; +s1ab_s1_xyz_fit_map.p2=0.02; +c2=1-s1ab_s1_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s1_xyz_fit_map.p2; +s1ab_s1_xyz_fit_map.p3=c2; + + + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else %Only do 1D in this case +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval); + + + + end + + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S1 Z-dependence (Both PMT arrays) +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + +% light_correction_fig = figure; +% errorbar(mean_index,means,means_error,'.k'); +% hold on +% [yplot_s1_both] = polyval(P_s1_both,dT_fit); +% [center_s1_both, center_s1_both_err] = polyval(P_s1_both,z_center, S); %160[us]*1.51[\mus/us] +% plot(dT_fit,yplot_s1_both,'-r','LineWidth',1); +% xlabel('Depth (\mus)', 'FontSize',16); ylabel('Mean (Pulse Area Phe)', 'FontSize', 16); +% title(strcat('.Kr83m. S1 Mean vs. Z'), 'FontSize', 16,'Interpreter','none'); +% line([0 det_edge],[center_s1_both center_s1_both],'linestyle','--'); +% line([z_center; z_center;],[min(means) max(means)],'linestyle','--'); +% legend('S1\_both Mean', strcat('y=', num2str(P_s1_both(1),'%10.2e'), '*Z^2 + ', num2str(P_s1_both(2),'%10.2e')... +% , '*Z + ', num2str(P_s1_both(3),4)),strcat('Det center = ',num2str(center_s1_both,4), ' [Phe]'),'location','northwest') +% +% box on; +% myfigview(16); +% xlim([0 det_edge]); +% ylim([0.8*min(means) 1.15*max(means)]); + + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + + + + + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + + %%calculate S2/S1 also, just to double check the lifetime from S2 only + % hist_s2_both_s1(:,bin)= hist(s2_phe_both(time_cut)./s1_phe_both_z(time_cut),x3)'; + % temp_hist=hist_s2_both_s1(:,bin); + %Fit_s2_both_s1{bin}=fit(x3(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + % means_s2_s1(bin)=Fit_s2_both_s1{bin}.b1; + % means_error_s2_s1(bin) = Fit_s2_both_s1{bin}.c1/2/sqrt(sum(hist_s2_both_s1(:,bin))); % == sigma/sqrt(N); + % mean_index_s2_s1(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + + dT_range= inrange( mean_index,[5+bin_size,500] );%from 50 to 300us for the fit + + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + %%Tracker for pseudo-lifetime + s2_at_bottom_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_both=-320/log(s2_at_bottom_both/s2_at_top_both); + + dT_fit=0:1:det_edge; + + Fit_EL= fit(mean_index(dT_range),means(dT_range),'exp1'); + yfitEL = Fit_EL.a.*exp(Fit_EL.b.*dT_fit); + + e_lifetime_both=-1/Fit_EL.b; + s2_z0_both=Fit_EL.a; + + b=confint(Fit_EL, 0.683);%1 sigma matrix + sigma_e_lifetime_both=(1/b(1,2)-1/b(2,2))/2; + sigma_s2_z0_both=(b(2,1)-b(1,1))/2; +% +% lifetime_fig_both = figure; +% errorbar(mean_index(2:end),means(2:end),means_error(2:end),'.k'); %first bin is anode, skip it +% hold on +% plot(dT_fit,yfitEL,'-r','LineWidth',1); +% xlabel('Time (\mus)', 'FontSize',16); ylabel('Mean S2 (Pulse Area Phe)', 'FontSize', 16); +% title(strcat('.Kr83m. S2_both Electron Lifetime'), 'FontSize', 16,'Interpreter','none'); +% legend('S2\_both Mean', strcat( '\lambda= ', num2str(e_lifetime_both,4), ' \pm ', num2str(sigma_e_lifetime_both,2), ' \mus' )... +% ,'location','northeast'); +% myfigview(16); +% xlim([0 det_edge]); + + + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_ybins),floor(s2_xbins)); +Sigma_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); +Count_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + +color_range_max=max(max(mean_S2_both_xy)); +color_range_min=min(min(mean_S2_both_xy(mean_S2_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; +% +% s2_xy_both_fig = figure; +% contourf(s2xbins,s2ybins,mean_S2_both_xy,vc,'LineColor','none'); +% xlabel('x (cm)','fontsize', 18); +% ylabel('y (cm)','fontsize', 18); +% title(strcat('. S2 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +% caxis([color_range_min color_range_max]) +% g=colorbar; +% ylabel(g,'phe','FontSize',16) +% set(g,'FontSize',18) +% hold on +% LUXPlotTopPMTs +% axis([-25 25 -25 25]) +% myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_ybins),floor(s1_xbins)); +Sigma_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); +Count_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +color_range_max=max(max(mean_S1_both_xy)); +color_range_min=min(min(mean_S1_both_xy(mean_S1_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + +% +% s1_xy_both_fig = figure; +% contourf(s1xbins,s1ybins,mean_S1_both_xy,vc,'LineColor','none'); +% xlabel('x (cm)','fontsize', 18); +% ylabel('y (cm)','fontsize', 18); +% title(strcat('. S1 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +% caxis([color_range_min color_range_max]) +% g=colorbar; +% ylabel(g,'phe','FontSize',16) +% set(g,'FontSize',18) +% hold on +% LUXPlotTopPMTs +% axis([-25 25 -25 25]) +% myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%% Apply corrections to ER data and calculate the ERband + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\Run04_CH3T\KrypCal2p18_IQs\MakePlots\CH3T_Sep2014_Kr2p18.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +%% Make ER Band +max_r=18; +s1_min=0; +s1_max=50; + + +pulse_area_cut= (log10(s1_phe_both)+0.7*log10(s2_phe_both)<4.85) & (log10(s1_phe_both)+0.7*log10(s2_phe_both)>2) & ... + (log10(s1_phe_both)-2*log10(s2_phe_both_xyz)<-4.7) & (log10(s1_phe_both)-2*log10(s2_phe_both)>-6.7); +fiducial_cut=inrange(drift_time,[35 75]) & inrange(s2radius_del,[0,max_r]); + +tritium_cut= clean_cut & pulse_area_cut & fiducial_cut; + +bin_counter=1; + + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:0.05:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + clear mean_ER_band_err lower_bound_err upper_bound_err lower_bound mean_ER_band upper_bound ... + gauss_sig_list_err gauss_amp_list gauss_amp_list_err + + %Refit the NR band - ER binning is same as NR binning + NR_mean_data=NR_mean_fit_points{bin_counter}; + NR_mean_data_err=NR_mean_fit_points_err{bin_counter}; + + + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=tritium_cut & inrange(s1_phe_both_xyz,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); +% ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + + ER_bin_count(index_i)=length(s1_phe_both_xyz(ER_fit_cut)); + ER_bin_belowNR_count(index_i)=length(s1_phe_both_xyz(ER_fit_cut & log10(s2_phe_both_xyz./s1_phe_both_xyz)1)',mean_ER_band(ER_bins>1)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit{bin_counter}=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + + ER_lower_power_fit=fit(ER_bins(ER_bins>1)',lower_bound(ER_bins>1)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit{bin_counter}=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + + ER_upper_power_fit=fit(ER_bins(ER_bins>1)',upper_bound(ER_bins>1)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit{bin_counter}=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + + ER_mean_fit_points{bin_counter}=mean_ER_band; + ER_lower_fit_points{bin_counter}=lower_bound; + ER_upper_fit_points{bin_counter}=upper_bound; + + ER_mean_fit_points_err{bin_counter}=mean_ER_band_err; + ER_lower_fit_points_err{bin_counter}=lower_bound_err; + ER_upper_fit_points_err{bin_counter}=upper_bound_err; + + ER_bins_tracked{bin_counter}=ER_bins; + + + + + NR_bin_data=NR_bins_tracked{bin_counter}; + NR_mean_refit=fit(NR_bin_data(NR_bin_data>2)',NR_mean_data(NR_bin_data>2)',g,'startpoint',[ 2.5 -.1]); + + + %Gaussian Assumption + clear gauss_mean gauss_sig gauss_amp gauss_amp_err gauss_mean_err gauss_sig_err leakage_frac_err leakage_frac NR_mean + for i=1:length(mean_ER_band) + + NR_mean=NR_mean_data(i); + gauss_mean= mean_ER_band(i); + gauss_sig= ER_sigma(i); + gauss_amp=amp(i); %estimate gaussian amplitude from the individual bins + gauss_amp_err=amp_err(i); %estimate gaussian amplitude error from the individual bins + gauss_mean_err=mean_ER_band_err(i); %estimate mean err from the individual bins + gauss_sig_err=ER_sigma_sigma(i); %estimate sigma error from the individual bins + + %Using solution of definite integral so that I can propogate errors with analytic approach + total_count=sqrt(pi./2).*gauss_amp.*gauss_sig.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) + 1 ); + leakage_count=sqrt(pi./2).*gauss_amp.*gauss_sig.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) - erf((gauss_mean-NR_mean)./(sqrt(2).*gauss_sig))); + + %derivative w.r.t amplitude + total_count_damp = sqrt(pi/2).*gauss_sig.*(erf(gauss_mean/(sqrt(2)*gauss_sig)) +1); + leakage_count_damp= sqrt(pi/2).*gauss_sig.*(erf(gauss_mean/(sqrt(2)*gauss_sig)) - erf((gauss_mean - NR_mean)/(sqrt(2)*gauss_sig))); + + %derivative w.r.t mean + total_count_dmean = gauss_amp.*exp(-(gauss_mean.^2)./(2.*gauss_sig.^2)); + leakage_count_dmean = sqrt(pi/2).*gauss_amp.*gauss_sig.*( ( sqrt(2/pi).*exp(-(gauss_mean.^2)./(2.*gauss_sig.^2)))./gauss_sig - sqrt(2/pi).*exp(-((gauss_mean-NR_mean).^2)./(2.*gauss_sig.^2))./gauss_sig); + + %derivative w.r.t sigma + total_count_dsig=sqrt(pi/2).*gauss_amp.* (erf ( gauss_mean./(sqrt(2).*gauss_sig)) + 1) - (gauss_amp .* gauss_mean .* exp( - (gauss_mean.^2)./(2.*gauss_sig.^2)))./gauss_sig; + leakage_count_dsig=sqrt(pi/2).*gauss_amp.*gauss_sig.*( (sqrt(2/pi).*(gauss_mean-NR_mean).*exp( (-(gauss_mean-NR_mean).^2)./(2.*gauss_sig.^2)))./(gauss_sig.^2) ... + - (sqrt(2/pi).*(gauss_mean).*exp( (-(gauss_mean).^2)./(2.*gauss_sig.^2)))./(gauss_sig.^2)) + ... + sqrt(pi/2).*gauss_amp.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) - erf((gauss_mean-NR_mean)./(sqrt(2).*gauss_sig))); + + total_count_err=sqrt( (total_count_damp.*gauss_amp_err).^2 + (total_count_dmean.*gauss_mean_err).^2 + (total_count_dsig.*gauss_sig_err).^2); + leakage_count_err=sqrt( (leakage_count_damp.*gauss_amp_err).^2 + (leakage_count_dmean.*gauss_mean_err).^2 + (leakage_count_dsig.*gauss_sig_err).^2); + + leakage_frac(i)=leakage_count./total_count; + leakage_frac_err(i)=sqrt( (leakage_count_err./total_count).^2 + (leakage_count.*total_count_err./(total_count.^2)).^2); + + end + + + gaussian_leakage_frac_tracker{bin_counter}=leakage_frac; + gaussian_leakage_frac_err_tracker{bin_counter}=leakage_frac_err; + + + %Counting Data Approach + clear gauss_mean gauss_sig gauss_amp gauss_amp_err gauss_mean_err gauss_sig_err leakage_frac_err leakage_frac NR_mean + for i=1:length(mean_ER_band) + + %Number of events in S1 bin + total_count=ER_bin_count(i); + leakage_count=ER_bin_belowNR_count(i); + + total_count_err=sqrt(total_count); + leakage_count_err=sqrt(leakage_count); + + leakage_frac(i)=leakage_count./total_count; + leakage_frac_err(i)=sqrt( (leakage_count_err./total_count).^2 + (leakage_count.*total_count_err./(total_count.^2)).^2); + + end + + + counting_leakage_frac_tracker{bin_counter}=leakage_frac; + counting_leakage_frac_err_tracker{bin_counter}=leakage_frac_err; + %Based on ER Fit Approach + i=1; + clear gauss_mean gauss_sig gauss_amp gauss_amp_err gauss_mean_err gauss_sig_err leakage_frac_err leakage_frac NR_mean + for S1_val=1:1:49 + + NR_mean=NR_mean_refit.a.*S1_val.^(NR_mean_refit.b); + + gauss_mean= ER_mean_power_fit.a.*S1_val.^(ER_mean_power_fit.b); + gauss_sig= abs((ER_upper_power_fit.a.*S1_val.^(ER_upper_power_fit.b)) - gauss_mean)/1.28; + gauss_amp=interp1(ER_bins,gauss_amp_list,S1_val); %estimate gaussian amplitude from the individual bins + gauss_amp_err=interp1(ER_bins,gauss_amp_list_err,S1_val); %estimate gaussian amplitude error from the individual bins + gauss_mean_err=interp1(ER_bins,mean_ER_band_err,S1_val); %estimate mean err from the individual bins + gauss_sig_err=interp1(ER_bins,gauss_sig_list_err,S1_val); %estimate sigma error from the individual bins + + %Using solution of definite integral so that I can propogate errors with analytic approach + total_count=sqrt(pi./2).*gauss_amp.*gauss_sig.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) + 1 ); + leakage_count=sqrt(pi./2).*gauss_amp.*gauss_sig.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) - erf((gauss_mean-NR_mean)./(sqrt(2).*gauss_sig))); + + %derivative w.r.t amplitude + total_count_damp = sqrt(pi/2).*gauss_sig.*(erf(gauss_mean/(sqrt(2)*gauss_sig)) +1); + leakage_count_damp= sqrt(pi/2).*gauss_sig.*(erf(gauss_mean/(sqrt(2)*gauss_sig)) - erf((gauss_mean - NR_mean)/(sqrt(2)*gauss_sig))); + + %derivative w.r.t mean + total_count_dmean = gauss_amp.*exp(-(gauss_mean.^2)./(2.*gauss_sig.^2)); + leakage_count_dmean = sqrt(pi/2).*gauss_amp.*gauss_sig.*( ( sqrt(2/pi).*exp(-(gauss_mean.^2)./(2.*gauss_sig.^2)))./gauss_sig - sqrt(2/pi).*exp(-((gauss_mean-NR_mean).^2)./(2.*gauss_sig.^2))./gauss_sig); + + %derivative w.r.t sigma + total_count_dsig=sqrt(pi/2).*gauss_amp.* (erf ( gauss_mean./(sqrt(2).*gauss_sig)) + 1) - (gauss_amp .* gauss_mean .* exp( - (gauss_mean.^2)./(2.*gauss_sig.^2)))./gauss_sig; + leakage_count_dsig=sqrt(pi/2).*gauss_amp.*gauss_sig.*( (sqrt(2/pi).*(gauss_mean-NR_mean).*exp( (-(gauss_mean-NR_mean).^2)./(2.*gauss_sig.^2)))./(gauss_sig.^2) ... + - (sqrt(2/pi).*(gauss_mean).*exp( (-(gauss_mean).^2)./(2.*gauss_sig.^2)))./(gauss_sig.^2)) + ... + sqrt(pi/2).*gauss_amp.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) - erf((gauss_mean-NR_mean)./(sqrt(2).*gauss_sig))); + + total_count_err=sqrt( (total_count_damp.*gauss_amp_err).^2 + (total_count_dmean.*gauss_mean_err).^2 + (total_count_dsig.*gauss_sig_err).^2); + leakage_count_err=sqrt( (leakage_count_damp.*gauss_amp_err).^2 + (leakage_count_dmean.*gauss_mean_err).^2 + (leakage_count_dsig.*gauss_sig_err).^2); + + leakage_frac(i)=leakage_count./total_count; + leakage_frac_err(i)=sqrt( (leakage_count_err./total_count).^2 + (leakage_count.*total_count_err./(total_count.^2)).^2); + i=i+1; + + end + + Fit_leakage_frac_tracker{bin_counter}=leakage_frac; + Fit_leakage_frac_err_tracker{bin_counter}=leakage_frac_err; + + bin_counter=bin_counter+1; + + %% Move onto next Z slice +max_r=18; +s1_min=0; +s1_max=50; + + +pulse_area_cut= (log10(s1_phe_both)+0.7*log10(s2_phe_both)<4.85) & (log10(s1_phe_both)+0.7*log10(s2_phe_both)>2) & ... + (log10(s1_phe_both)-2*log10(s2_phe_both_xyz)<-4.7) & (log10(s1_phe_both)-2*log10(s2_phe_both)>-6.7); +fiducial_cut=inrange(drift_time,[75 125]) & inrange(s2radius_del,[0,max_r]); + +tritium_cut= clean_cut & pulse_area_cut & fiducial_cut; + + + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:0.05:5; + ER_bin_size=2; %3 works + + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + clear mean_ER_band_err lower_bound_err upper_bound_err lower_bound mean_ER_band upper_bound ... + gauss_sig_list_err gauss_amp_list gauss_amp_list_err + + %Refit the NR band - ER binning is same as NR binning + NR_mean_data=NR_mean_fit_points{bin_counter}; + NR_mean_data_err=NR_mean_fit_points_err{bin_counter}; + + + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=tritium_cut & inrange(s1_phe_both_xyz,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); +% ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + + ER_bin_count(index_i)=length(s1_phe_both_xyz(ER_fit_cut)); + ER_bin_belowNR_count(index_i)=length(s1_phe_both_xyz(ER_fit_cut & log10(s2_phe_both_xyz./s1_phe_both_xyz)1)',mean_ER_band(ER_bins>1)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit{bin_counter}=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + + ER_lower_power_fit=fit(ER_bins(ER_bins>1)',lower_bound(ER_bins>1)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit{bin_counter}=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + + ER_upper_power_fit=fit(ER_bins(ER_bins>1)',upper_bound(ER_bins>1)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit{bin_counter}=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + + ER_mean_fit_points{bin_counter}=mean_ER_band; + ER_lower_fit_points{bin_counter}=lower_bound; + ER_upper_fit_points{bin_counter}=upper_bound; + + ER_mean_fit_points_err{bin_counter}=mean_ER_band_err; + ER_lower_fit_points_err{bin_counter}=lower_bound_err; + ER_upper_fit_points_err{bin_counter}=upper_bound_err; + + ER_bins_tracked{bin_counter}=ER_bins; + + + + + NR_bin_data=NR_bins_tracked{bin_counter}; + NR_mean_refit=fit(NR_bin_data(NR_bin_data>2)',NR_mean_data(NR_bin_data>2)',g,'startpoint',[ 2.5 -.1]); + + + %Gaussian Assumption + clear gauss_mean gauss_sig gauss_amp gauss_amp_err gauss_mean_err gauss_sig_err leakage_frac_err leakage_frac NR_mean + for i=1:length(mean_ER_band) + + NR_mean=NR_mean_data(i); + gauss_mean= mean_ER_band(i); + gauss_sig= ER_sigma(i); + gauss_amp=amp(i); %estimate gaussian amplitude from the individual bins + gauss_amp_err=amp_err(i); %estimate gaussian amplitude error from the individual bins + gauss_mean_err=mean_ER_band_err(i); %estimate mean err from the individual bins + gauss_sig_err=ER_sigma_sigma(i); %estimate sigma error from the individual bins + + %Using solution of definite integral so that I can propogate errors with analytic approach + total_count=sqrt(pi./2).*gauss_amp.*gauss_sig.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) + 1 ); + leakage_count=sqrt(pi./2).*gauss_amp.*gauss_sig.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) - erf((gauss_mean-NR_mean)./(sqrt(2).*gauss_sig))); + + %derivative w.r.t amplitude + total_count_damp = sqrt(pi/2).*gauss_sig.*(erf(gauss_mean/(sqrt(2)*gauss_sig)) +1); + leakage_count_damp= sqrt(pi/2).*gauss_sig.*(erf(gauss_mean/(sqrt(2)*gauss_sig)) - erf((gauss_mean - NR_mean)/(sqrt(2)*gauss_sig))); + + %derivative w.r.t mean + total_count_dmean = gauss_amp.*exp(-(gauss_mean.^2)./(2.*gauss_sig.^2)); + leakage_count_dmean = sqrt(pi/2).*gauss_amp.*gauss_sig.*( ( sqrt(2/pi).*exp(-(gauss_mean.^2)./(2.*gauss_sig.^2)))./gauss_sig - sqrt(2/pi).*exp(-((gauss_mean-NR_mean).^2)./(2.*gauss_sig.^2))./gauss_sig); + + %derivative w.r.t sigma + total_count_dsig=sqrt(pi/2).*gauss_amp.* (erf ( gauss_mean./(sqrt(2).*gauss_sig)) + 1) - (gauss_amp .* gauss_mean .* exp( - (gauss_mean.^2)./(2.*gauss_sig.^2)))./gauss_sig; + leakage_count_dsig=sqrt(pi/2).*gauss_amp.*gauss_sig.*( (sqrt(2/pi).*(gauss_mean-NR_mean).*exp( (-(gauss_mean-NR_mean).^2)./(2.*gauss_sig.^2)))./(gauss_sig.^2) ... + - (sqrt(2/pi).*(gauss_mean).*exp( (-(gauss_mean).^2)./(2.*gauss_sig.^2)))./(gauss_sig.^2)) + ... + sqrt(pi/2).*gauss_amp.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) - erf((gauss_mean-NR_mean)./(sqrt(2).*gauss_sig))); + + total_count_err=sqrt( (total_count_damp.*gauss_amp_err).^2 + (total_count_dmean.*gauss_mean_err).^2 + (total_count_dsig.*gauss_sig_err).^2); + leakage_count_err=sqrt( (leakage_count_damp.*gauss_amp_err).^2 + (leakage_count_dmean.*gauss_mean_err).^2 + (leakage_count_dsig.*gauss_sig_err).^2); + + leakage_frac(i)=leakage_count./total_count; + leakage_frac_err(i)=sqrt( (leakage_count_err./total_count).^2 + (leakage_count.*total_count_err./(total_count.^2)).^2); + + end + + + gaussian_leakage_frac_tracker{bin_counter}=leakage_frac; + gaussian_leakage_frac_err_tracker{bin_counter}=leakage_frac_err; + + + %Counting Data Approach + clear gauss_mean gauss_sig gauss_amp gauss_amp_err gauss_mean_err gauss_sig_err leakage_frac_err leakage_frac NR_mean + for i=1:length(mean_ER_band) + + %Number of events in S1 bin + total_count=ER_bin_count(i); + leakage_count=ER_bin_belowNR_count(i); + + total_count_err=sqrt(total_count); + leakage_count_err=sqrt(leakage_count); + + leakage_frac(i)=leakage_count./total_count; + leakage_frac_err(i)=sqrt( (leakage_count_err./total_count).^2 + (leakage_count.*total_count_err./(total_count.^2)).^2); + + end + + + counting_leakage_frac_tracker{bin_counter}=leakage_frac; + counting_leakage_frac_err_tracker{bin_counter}=leakage_frac_err; + + %Based on ER Fit Approach + i=1; + clear gauss_mean gauss_sig gauss_amp gauss_amp_err gauss_mean_err gauss_sig_err leakage_frac_err leakage_frac NR_mean + for S1_val=1:1:49 + + NR_mean=NR_mean_refit.a.*S1_val.^(NR_mean_refit.b); + + gauss_mean= ER_mean_power_fit.a.*S1_val.^(ER_mean_power_fit.b); + gauss_sig= abs((ER_upper_power_fit.a.*S1_val.^(ER_upper_power_fit.b)) - gauss_mean)/1.28; + gauss_amp=interp1(ER_bins,gauss_amp_list,S1_val); %estimate gaussian amplitude from the individual bins + gauss_amp_err=interp1(ER_bins,gauss_amp_list_err,S1_val); %estimate gaussian amplitude error from the individual bins + gauss_mean_err=interp1(ER_bins,mean_ER_band_err,S1_val); %estimate mean err from the individual bins + gauss_sig_err=interp1(ER_bins,gauss_sig_list_err,S1_val); %estimate sigma error from the individual bins + + %Using solution of definite integral so that I can propogate errors with analytic approach + total_count=sqrt(pi./2).*gauss_amp.*gauss_sig.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) + 1 ); + leakage_count=sqrt(pi./2).*gauss_amp.*gauss_sig.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) - erf((gauss_mean-NR_mean)./(sqrt(2).*gauss_sig))); + + %derivative w.r.t amplitude + total_count_damp = sqrt(pi/2).*gauss_sig.*(erf(gauss_mean/(sqrt(2)*gauss_sig)) +1); + leakage_count_damp= sqrt(pi/2).*gauss_sig.*(erf(gauss_mean/(sqrt(2)*gauss_sig)) - erf((gauss_mean - NR_mean)/(sqrt(2)*gauss_sig))); + + %derivative w.r.t mean + total_count_dmean = gauss_amp.*exp(-(gauss_mean.^2)./(2.*gauss_sig.^2)); + leakage_count_dmean = sqrt(pi/2).*gauss_amp.*gauss_sig.*( ( sqrt(2/pi).*exp(-(gauss_mean.^2)./(2.*gauss_sig.^2)))./gauss_sig - sqrt(2/pi).*exp(-((gauss_mean-NR_mean).^2)./(2.*gauss_sig.^2))./gauss_sig); + + %derivative w.r.t sigma + total_count_dsig=sqrt(pi/2).*gauss_amp.* (erf ( gauss_mean./(sqrt(2).*gauss_sig)) + 1) - (gauss_amp .* gauss_mean .* exp( - (gauss_mean.^2)./(2.*gauss_sig.^2)))./gauss_sig; + leakage_count_dsig=sqrt(pi/2).*gauss_amp.*gauss_sig.*( (sqrt(2/pi).*(gauss_mean-NR_mean).*exp( (-(gauss_mean-NR_mean).^2)./(2.*gauss_sig.^2)))./(gauss_sig.^2) ... + - (sqrt(2/pi).*(gauss_mean).*exp( (-(gauss_mean).^2)./(2.*gauss_sig.^2)))./(gauss_sig.^2)) + ... + sqrt(pi/2).*gauss_amp.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) - erf((gauss_mean-NR_mean)./(sqrt(2).*gauss_sig))); + + total_count_err=sqrt( (total_count_damp.*gauss_amp_err).^2 + (total_count_dmean.*gauss_mean_err).^2 + (total_count_dsig.*gauss_sig_err).^2); + leakage_count_err=sqrt( (leakage_count_damp.*gauss_amp_err).^2 + (leakage_count_dmean.*gauss_mean_err).^2 + (leakage_count_dsig.*gauss_sig_err).^2); + + leakage_frac(i)=leakage_count./total_count; + leakage_frac_err(i)=sqrt( (leakage_count_err./total_count).^2 + (leakage_count.*total_count_err./(total_count.^2)).^2); + i=i+1; + + end + + Fit_leakage_frac_tracker{bin_counter}=leakage_frac; + Fit_leakage_frac_err_tracker{bin_counter}=leakage_frac_err; + bin_counter=bin_counter+1; + + %% Move onto next Z slice +max_r=18; +s1_min=0; +s1_max=50; + + +pulse_area_cut= (log10(s1_phe_both)+0.7*log10(s2_phe_both)<4.85) & (log10(s1_phe_both)+0.7*log10(s2_phe_both)>2) & ... + (log10(s1_phe_both)-2*log10(s2_phe_both_xyz)<-4.7) & (log10(s1_phe_both)-2*log10(s2_phe_both)>-6.7); +fiducial_cut=inrange(drift_time,[125 175]) & inrange(s2radius_del,[0,max_r]); + +tritium_cut= clean_cut & pulse_area_cut & fiducial_cut; + + + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:0.05:5; + ER_bin_size=2; %3 works + + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + clear mean_ER_band_err lower_bound_err upper_bound_err lower_bound mean_ER_band upper_bound ... + gauss_sig_list_err gauss_amp_list gauss_amp_list_err + + %Refit the NR band - ER binning is same as NR binning + NR_mean_data=NR_mean_fit_points{bin_counter}; + NR_mean_data_err=NR_mean_fit_points_err{bin_counter}; + + + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=tritium_cut & inrange(s1_phe_both_xyz,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); +% ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + + ER_bin_count(index_i)=length(s1_phe_both_xyz(ER_fit_cut)); + ER_bin_belowNR_count(index_i)=length(s1_phe_both_xyz(ER_fit_cut & log10(s2_phe_both_xyz./s1_phe_both_xyz)1)',mean_ER_band(ER_bins>1)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit{bin_counter}=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + + ER_lower_power_fit=fit(ER_bins(ER_bins>1)',lower_bound(ER_bins>1)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit{bin_counter}=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + + ER_upper_power_fit=fit(ER_bins(ER_bins>1)',upper_bound(ER_bins>1)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit{bin_counter}=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + + ER_mean_fit_points{bin_counter}=mean_ER_band; + ER_lower_fit_points{bin_counter}=lower_bound; + ER_upper_fit_points{bin_counter}=upper_bound; + + ER_mean_fit_points_err{bin_counter}=mean_ER_band_err; + ER_lower_fit_points_err{bin_counter}=lower_bound_err; + ER_upper_fit_points_err{bin_counter}=upper_bound_err; + + ER_bins_tracked{bin_counter}=ER_bins; + + + + + NR_bin_data=NR_bins_tracked{bin_counter}; + NR_mean_refit=fit(NR_bin_data(NR_bin_data>2)',NR_mean_data(NR_bin_data>2)',g,'startpoint',[ 2.5 -.1]); + + + %Gaussian Assumption + clear gauss_mean gauss_sig gauss_amp gauss_amp_err gauss_mean_err gauss_sig_err leakage_frac_err leakage_frac NR_mean + for i=1:length(mean_ER_band) + + NR_mean=NR_mean_data(i); + gauss_mean= mean_ER_band(i); + gauss_sig= ER_sigma(i); + gauss_amp=amp(i); %estimate gaussian amplitude from the individual bins + gauss_amp_err=amp_err(i); %estimate gaussian amplitude error from the individual bins + gauss_mean_err=mean_ER_band_err(i); %estimate mean err from the individual bins + gauss_sig_err=ER_sigma_sigma(i); %estimate sigma error from the individual bins + + %Using solution of definite integral so that I can propogate errors with analytic approach + total_count=sqrt(pi./2).*gauss_amp.*gauss_sig.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) + 1 ); + leakage_count=sqrt(pi./2).*gauss_amp.*gauss_sig.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) - erf((gauss_mean-NR_mean)./(sqrt(2).*gauss_sig))); + + %derivative w.r.t amplitude + total_count_damp = sqrt(pi/2).*gauss_sig.*(erf(gauss_mean/(sqrt(2)*gauss_sig)) +1); + leakage_count_damp= sqrt(pi/2).*gauss_sig.*(erf(gauss_mean/(sqrt(2)*gauss_sig)) - erf((gauss_mean - NR_mean)/(sqrt(2)*gauss_sig))); + + %derivative w.r.t mean + total_count_dmean = gauss_amp.*exp(-(gauss_mean.^2)./(2.*gauss_sig.^2)); + leakage_count_dmean = sqrt(pi/2).*gauss_amp.*gauss_sig.*( ( sqrt(2/pi).*exp(-(gauss_mean.^2)./(2.*gauss_sig.^2)))./gauss_sig - sqrt(2/pi).*exp(-((gauss_mean-NR_mean).^2)./(2.*gauss_sig.^2))./gauss_sig); + + %derivative w.r.t sigma + total_count_dsig=sqrt(pi/2).*gauss_amp.* (erf ( gauss_mean./(sqrt(2).*gauss_sig)) + 1) - (gauss_amp .* gauss_mean .* exp( - (gauss_mean.^2)./(2.*gauss_sig.^2)))./gauss_sig; + leakage_count_dsig=sqrt(pi/2).*gauss_amp.*gauss_sig.*( (sqrt(2/pi).*(gauss_mean-NR_mean).*exp( (-(gauss_mean-NR_mean).^2)./(2.*gauss_sig.^2)))./(gauss_sig.^2) ... + - (sqrt(2/pi).*(gauss_mean).*exp( (-(gauss_mean).^2)./(2.*gauss_sig.^2)))./(gauss_sig.^2)) + ... + sqrt(pi/2).*gauss_amp.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) - erf((gauss_mean-NR_mean)./(sqrt(2).*gauss_sig))); + + total_count_err=sqrt( (total_count_damp.*gauss_amp_err).^2 + (total_count_dmean.*gauss_mean_err).^2 + (total_count_dsig.*gauss_sig_err).^2); + leakage_count_err=sqrt( (leakage_count_damp.*gauss_amp_err).^2 + (leakage_count_dmean.*gauss_mean_err).^2 + (leakage_count_dsig.*gauss_sig_err).^2); + + leakage_frac(i)=leakage_count./total_count; + leakage_frac_err(i)=sqrt( (leakage_count_err./total_count).^2 + (leakage_count.*total_count_err./(total_count.^2)).^2); + + end + + + gaussian_leakage_frac_tracker{bin_counter}=leakage_frac; + gaussian_leakage_frac_err_tracker{bin_counter}=leakage_frac_err; + + + %Counting Data Approach + clear gauss_mean gauss_sig gauss_amp gauss_amp_err gauss_mean_err gauss_sig_err leakage_frac_err leakage_frac NR_mean + for i=1:length(mean_ER_band) + + %Number of events in S1 bin + total_count=ER_bin_count(i); + leakage_count=ER_bin_belowNR_count(i); + + total_count_err=sqrt(total_count); + leakage_count_err=sqrt(leakage_count); + + leakage_frac(i)=leakage_count./total_count; + leakage_frac_err(i)=sqrt( (leakage_count_err./total_count).^2 + (leakage_count.*total_count_err./(total_count.^2)).^2); + + end + + + counting_leakage_frac_tracker{bin_counter}=leakage_frac; + counting_leakage_frac_err_tracker{bin_counter}=leakage_frac_err; + + %Based on ER Fit Approach + i=1; + clear gauss_mean gauss_sig gauss_amp gauss_amp_err gauss_mean_err gauss_sig_err leakage_frac_err leakage_frac NR_mean + for S1_val=1:1:49 + + NR_mean=NR_mean_refit.a.*S1_val.^(NR_mean_refit.b); + + gauss_mean= ER_mean_power_fit.a.*S1_val.^(ER_mean_power_fit.b); + gauss_sig= abs((ER_upper_power_fit.a.*S1_val.^(ER_upper_power_fit.b)) - gauss_mean)/1.28; + gauss_amp=interp1(ER_bins,gauss_amp_list,S1_val); %estimate gaussian amplitude from the individual bins + gauss_amp_err=interp1(ER_bins,gauss_amp_list_err,S1_val); %estimate gaussian amplitude error from the individual bins + gauss_mean_err=interp1(ER_bins,mean_ER_band_err,S1_val); %estimate mean err from the individual bins + gauss_sig_err=interp1(ER_bins,gauss_sig_list_err,S1_val); %estimate sigma error from the individual bins + + %Using solution of definite integral so that I can propogate errors with analytic approach + total_count=sqrt(pi./2).*gauss_amp.*gauss_sig.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) + 1 ); + leakage_count=sqrt(pi./2).*gauss_amp.*gauss_sig.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) - erf((gauss_mean-NR_mean)./(sqrt(2).*gauss_sig))); + + %derivative w.r.t amplitude + total_count_damp = sqrt(pi/2).*gauss_sig.*(erf(gauss_mean/(sqrt(2)*gauss_sig)) +1); + leakage_count_damp= sqrt(pi/2).*gauss_sig.*(erf(gauss_mean/(sqrt(2)*gauss_sig)) - erf((gauss_mean - NR_mean)/(sqrt(2)*gauss_sig))); + + %derivative w.r.t mean + total_count_dmean = gauss_amp.*exp(-(gauss_mean.^2)./(2.*gauss_sig.^2)); + leakage_count_dmean = sqrt(pi/2).*gauss_amp.*gauss_sig.*( ( sqrt(2/pi).*exp(-(gauss_mean.^2)./(2.*gauss_sig.^2)))./gauss_sig - sqrt(2/pi).*exp(-((gauss_mean-NR_mean).^2)./(2.*gauss_sig.^2))./gauss_sig); + + %derivative w.r.t sigma + total_count_dsig=sqrt(pi/2).*gauss_amp.* (erf ( gauss_mean./(sqrt(2).*gauss_sig)) + 1) - (gauss_amp .* gauss_mean .* exp( - (gauss_mean.^2)./(2.*gauss_sig.^2)))./gauss_sig; + leakage_count_dsig=sqrt(pi/2).*gauss_amp.*gauss_sig.*( (sqrt(2/pi).*(gauss_mean-NR_mean).*exp( (-(gauss_mean-NR_mean).^2)./(2.*gauss_sig.^2)))./(gauss_sig.^2) ... + - (sqrt(2/pi).*(gauss_mean).*exp( (-(gauss_mean).^2)./(2.*gauss_sig.^2)))./(gauss_sig.^2)) + ... + sqrt(pi/2).*gauss_amp.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) - erf((gauss_mean-NR_mean)./(sqrt(2).*gauss_sig))); + + total_count_err=sqrt( (total_count_damp.*gauss_amp_err).^2 + (total_count_dmean.*gauss_mean_err).^2 + (total_count_dsig.*gauss_sig_err).^2); + leakage_count_err=sqrt( (leakage_count_damp.*gauss_amp_err).^2 + (leakage_count_dmean.*gauss_mean_err).^2 + (leakage_count_dsig.*gauss_sig_err).^2); + + leakage_frac(i)=leakage_count./total_count; + leakage_frac_err(i)=sqrt( (leakage_count_err./total_count).^2 + (leakage_count.*total_count_err./(total_count.^2)).^2); + i=i+1; + + end + + Fit_leakage_frac_tracker{bin_counter}=leakage_frac; + Fit_leakage_frac_err_tracker{bin_counter}=leakage_frac_err; + + bin_counter=bin_counter+1; + + %% Move onto next Z slice +max_r=18; +s1_min=0; +s1_max=50; + + +pulse_area_cut= (log10(s1_phe_both)+0.7*log10(s2_phe_both)<4.85) & (log10(s1_phe_both)+0.7*log10(s2_phe_both)>2) & ... + (log10(s1_phe_both)-2*log10(s2_phe_both_xyz)<-4.7) & (log10(s1_phe_both)-2*log10(s2_phe_both)>-6.7); +fiducial_cut=inrange(drift_time,[180 225]) & inrange(s2radius_del,[0,max_r]); + +tritium_cut= clean_cut & pulse_area_cut & fiducial_cut; + + + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:0.05:5; + ER_bin_size=2; %3 works + + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + clear mean_ER_band_err lower_bound_err upper_bound_err lower_bound mean_ER_band upper_bound ... + gauss_sig_list_err gauss_amp_list gauss_amp_list_err + + %Refit the NR band - ER binning is same as NR binning + NR_mean_data=NR_mean_fit_points{bin_counter}; + NR_mean_data_err=NR_mean_fit_points_err{bin_counter}; + + + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=tritium_cut & inrange(s1_phe_both_xyz,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); +% ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + + ER_bin_count(index_i)=length(s1_phe_both_xyz(ER_fit_cut)); + ER_bin_belowNR_count(index_i)=length(s1_phe_both_xyz(ER_fit_cut & log10(s2_phe_both_xyz./s1_phe_both_xyz)1)',mean_ER_band(ER_bins>1)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit{bin_counter}=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + + ER_lower_power_fit=fit(ER_bins(ER_bins>1)',lower_bound(ER_bins>1)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit{bin_counter}=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + + ER_upper_power_fit=fit(ER_bins(ER_bins>1)',upper_bound(ER_bins>1)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit{bin_counter}=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + + ER_mean_fit_points{bin_counter}=mean_ER_band; + ER_lower_fit_points{bin_counter}=lower_bound; + ER_upper_fit_points{bin_counter}=upper_bound; + + ER_mean_fit_points_err{bin_counter}=mean_ER_band_err; + ER_lower_fit_points_err{bin_counter}=lower_bound_err; + ER_upper_fit_points_err{bin_counter}=upper_bound_err; + + ER_bins_tracked{bin_counter}=ER_bins; + + + + + NR_bin_data=NR_bins_tracked{bin_counter}; + NR_mean_refit=fit(NR_bin_data(NR_bin_data>2)',NR_mean_data(NR_bin_data>2)',g,'startpoint',[ 2.5 -.1]); + + + %Gaussian Assumption + clear gauss_mean gauss_sig gauss_amp gauss_amp_err gauss_mean_err gauss_sig_err leakage_frac_err leakage_frac NR_mean + for i=1:length(mean_ER_band) + + NR_mean=NR_mean_data(i); + gauss_mean= mean_ER_band(i); + gauss_sig= ER_sigma(i); + gauss_amp=amp(i); %estimate gaussian amplitude from the individual bins + gauss_amp_err=amp_err(i); %estimate gaussian amplitude error from the individual bins + gauss_mean_err=mean_ER_band_err(i); %estimate mean err from the individual bins + gauss_sig_err=ER_sigma_sigma(i); %estimate sigma error from the individual bins + + %Using solution of definite integral so that I can propogate errors with analytic approach + total_count=sqrt(pi./2).*gauss_amp.*gauss_sig.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) + 1 ); + leakage_count=sqrt(pi./2).*gauss_amp.*gauss_sig.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) - erf((gauss_mean-NR_mean)./(sqrt(2).*gauss_sig))); + + %derivative w.r.t amplitude + total_count_damp = sqrt(pi/2).*gauss_sig.*(erf(gauss_mean/(sqrt(2)*gauss_sig)) +1); + leakage_count_damp= sqrt(pi/2).*gauss_sig.*(erf(gauss_mean/(sqrt(2)*gauss_sig)) - erf((gauss_mean - NR_mean)/(sqrt(2)*gauss_sig))); + + %derivative w.r.t mean + total_count_dmean = gauss_amp.*exp(-(gauss_mean.^2)./(2.*gauss_sig.^2)); + leakage_count_dmean = sqrt(pi/2).*gauss_amp.*gauss_sig.*( ( sqrt(2/pi).*exp(-(gauss_mean.^2)./(2.*gauss_sig.^2)))./gauss_sig - sqrt(2/pi).*exp(-((gauss_mean-NR_mean).^2)./(2.*gauss_sig.^2))./gauss_sig); + + %derivative w.r.t sigma + total_count_dsig=sqrt(pi/2).*gauss_amp.* (erf ( gauss_mean./(sqrt(2).*gauss_sig)) + 1) - (gauss_amp .* gauss_mean .* exp( - (gauss_mean.^2)./(2.*gauss_sig.^2)))./gauss_sig; + leakage_count_dsig=sqrt(pi/2).*gauss_amp.*gauss_sig.*( (sqrt(2/pi).*(gauss_mean-NR_mean).*exp( (-(gauss_mean-NR_mean).^2)./(2.*gauss_sig.^2)))./(gauss_sig.^2) ... + - (sqrt(2/pi).*(gauss_mean).*exp( (-(gauss_mean).^2)./(2.*gauss_sig.^2)))./(gauss_sig.^2)) + ... + sqrt(pi/2).*gauss_amp.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) - erf((gauss_mean-NR_mean)./(sqrt(2).*gauss_sig))); + + total_count_err=sqrt( (total_count_damp.*gauss_amp_err).^2 + (total_count_dmean.*gauss_mean_err).^2 + (total_count_dsig.*gauss_sig_err).^2); + leakage_count_err=sqrt( (leakage_count_damp.*gauss_amp_err).^2 + (leakage_count_dmean.*gauss_mean_err).^2 + (leakage_count_dsig.*gauss_sig_err).^2); + + leakage_frac(i)=leakage_count./total_count; + leakage_frac_err(i)=sqrt( (leakage_count_err./total_count).^2 + (leakage_count.*total_count_err./(total_count.^2)).^2); + + end + + + gaussian_leakage_frac_tracker{bin_counter}=leakage_frac; + gaussian_leakage_frac_err_tracker{bin_counter}=leakage_frac_err; + + + %Counting Data Approach + clear gauss_mean gauss_sig gauss_amp gauss_amp_err gauss_mean_err gauss_sig_err leakage_frac_err leakage_frac NR_mean + for i=1:length(mean_ER_band) + + %Number of events in S1 bin + total_count=ER_bin_count(i); + leakage_count=ER_bin_belowNR_count(i); + + total_count_err=sqrt(total_count); + leakage_count_err=sqrt(leakage_count); + + leakage_frac(i)=leakage_count./total_count; + leakage_frac_err(i)=sqrt( (leakage_count_err./total_count).^2 + (leakage_count.*total_count_err./(total_count.^2)).^2); + + end + + + counting_leakage_frac_tracker{bin_counter}=leakage_frac; + counting_leakage_frac_err_tracker{bin_counter}=leakage_frac_err; + + %Based on ER Fit Approach + i=1; + clear gauss_mean gauss_sig gauss_amp gauss_amp_err gauss_mean_err gauss_sig_err leakage_frac_err leakage_frac NR_mean + for S1_val=1:1:49 + + NR_mean=NR_mean_refit.a.*S1_val.^(NR_mean_refit.b); + + gauss_mean= ER_mean_power_fit.a.*S1_val.^(ER_mean_power_fit.b); + gauss_sig= abs((ER_upper_power_fit.a.*S1_val.^(ER_upper_power_fit.b)) - gauss_mean)/1.28; + gauss_amp=interp1(ER_bins,gauss_amp_list,S1_val); %estimate gaussian amplitude from the individual bins + gauss_amp_err=interp1(ER_bins,gauss_amp_list_err,S1_val); %estimate gaussian amplitude error from the individual bins + gauss_mean_err=interp1(ER_bins,mean_ER_band_err,S1_val); %estimate mean err from the individual bins + gauss_sig_err=interp1(ER_bins,gauss_sig_list_err,S1_val); %estimate sigma error from the individual bins + + %Using solution of definite integral so that I can propogate errors with analytic approach + total_count=sqrt(pi./2).*gauss_amp.*gauss_sig.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) + 1 ); + leakage_count=sqrt(pi./2).*gauss_amp.*gauss_sig.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) - erf((gauss_mean-NR_mean)./(sqrt(2).*gauss_sig))); + + %derivative w.r.t amplitude + total_count_damp = sqrt(pi/2).*gauss_sig.*(erf(gauss_mean/(sqrt(2)*gauss_sig)) +1); + leakage_count_damp= sqrt(pi/2).*gauss_sig.*(erf(gauss_mean/(sqrt(2)*gauss_sig)) - erf((gauss_mean - NR_mean)/(sqrt(2)*gauss_sig))); + + %derivative w.r.t mean + total_count_dmean = gauss_amp.*exp(-(gauss_mean.^2)./(2.*gauss_sig.^2)); + leakage_count_dmean = sqrt(pi/2).*gauss_amp.*gauss_sig.*( ( sqrt(2/pi).*exp(-(gauss_mean.^2)./(2.*gauss_sig.^2)))./gauss_sig - sqrt(2/pi).*exp(-((gauss_mean-NR_mean).^2)./(2.*gauss_sig.^2))./gauss_sig); + + %derivative w.r.t sigma + total_count_dsig=sqrt(pi/2).*gauss_amp.* (erf ( gauss_mean./(sqrt(2).*gauss_sig)) + 1) - (gauss_amp .* gauss_mean .* exp( - (gauss_mean.^2)./(2.*gauss_sig.^2)))./gauss_sig; + leakage_count_dsig=sqrt(pi/2).*gauss_amp.*gauss_sig.*( (sqrt(2/pi).*(gauss_mean-NR_mean).*exp( (-(gauss_mean-NR_mean).^2)./(2.*gauss_sig.^2)))./(gauss_sig.^2) ... + - (sqrt(2/pi).*(gauss_mean).*exp( (-(gauss_mean).^2)./(2.*gauss_sig.^2)))./(gauss_sig.^2)) + ... + sqrt(pi/2).*gauss_amp.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) - erf((gauss_mean-NR_mean)./(sqrt(2).*gauss_sig))); + + total_count_err=sqrt( (total_count_damp.*gauss_amp_err).^2 + (total_count_dmean.*gauss_mean_err).^2 + (total_count_dsig.*gauss_sig_err).^2); + leakage_count_err=sqrt( (leakage_count_damp.*gauss_amp_err).^2 + (leakage_count_dmean.*gauss_mean_err).^2 + (leakage_count_dsig.*gauss_sig_err).^2); + + leakage_frac(i)=leakage_count./total_count; + leakage_frac_err(i)=sqrt( (leakage_count_err./total_count).^2 + (leakage_count.*total_count_err./(total_count.^2)).^2); + i=i+1; + + end + + Fit_leakage_frac_tracker{bin_counter}=leakage_frac; + Fit_leakage_frac_err_tracker{bin_counter}=leakage_frac_err; + + bin_counter=bin_counter+1; + + %% Move onto next Z slice +max_r=18; +s1_min=0; +s1_max=50; + + +pulse_area_cut= (log10(s1_phe_both)+0.7*log10(s2_phe_both)<4.85) & (log10(s1_phe_both)+0.7*log10(s2_phe_both)>2) & ... + (log10(s1_phe_both)-2*log10(s2_phe_both_xyz)<-4.7) & (log10(s1_phe_both)-2*log10(s2_phe_both)>-6.7); +fiducial_cut=inrange(drift_time,[235 280]) & inrange(s2radius_del,[0,max_r]); + +tritium_cut= clean_cut & pulse_area_cut & fiducial_cut; + + + + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:0.05:5; + ER_bin_size=2; %3 works + + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + clear mean_ER_band_err lower_bound_err upper_bound_err lower_bound mean_ER_band upper_bound ... + gauss_sig_list_err gauss_amp_list gauss_amp_list_err + + %Refit the NR band - ER binning is same as NR binning + NR_mean_data=NR_mean_fit_points{bin_counter}; + NR_mean_data_err=NR_mean_fit_points_err{bin_counter}; + + + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=tritium_cut & inrange(s1_phe_both_xyz,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); +% ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + + ER_bin_count(index_i)=length(s1_phe_both_xyz(ER_fit_cut)); + ER_bin_belowNR_count(index_i)=length(s1_phe_both_xyz(ER_fit_cut & log10(s2_phe_both_xyz./s1_phe_both_xyz)1)',mean_ER_band(ER_bins>1)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit{bin_counter}=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + + ER_lower_power_fit=fit(ER_bins(ER_bins>1)',lower_bound(ER_bins>1)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit{bin_counter}=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + + ER_upper_power_fit=fit(ER_bins(ER_bins>1)',upper_bound(ER_bins>1)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit{bin_counter}=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + + ER_mean_fit_points{bin_counter}=mean_ER_band; + ER_lower_fit_points{bin_counter}=lower_bound; + ER_upper_fit_points{bin_counter}=upper_bound; + + ER_mean_fit_points_err{bin_counter}=mean_ER_band_err; + ER_lower_fit_points_err{bin_counter}=lower_bound_err; + ER_upper_fit_points_err{bin_counter}=upper_bound_err; + + ER_bins_tracked{bin_counter}=ER_bins; + + + + + NR_bin_data=NR_bins_tracked{bin_counter}; + NR_mean_refit=fit(NR_bin_data(NR_bin_data>2)',NR_mean_data(NR_bin_data>2)',g,'startpoint',[ 2.5 -.1]); + + + %Gaussian Assumption + clear gauss_mean gauss_sig gauss_amp gauss_amp_err gauss_mean_err gauss_sig_err leakage_frac_err leakage_frac NR_mean + for i=1:length(mean_ER_band) + + NR_mean=NR_mean_data(i); + gauss_mean= mean_ER_band(i); + gauss_sig= ER_sigma(i); + gauss_amp=amp(i); %estimate gaussian amplitude from the individual bins + gauss_amp_err=amp_err(i); %estimate gaussian amplitude error from the individual bins + gauss_mean_err=mean_ER_band_err(i); %estimate mean err from the individual bins + gauss_sig_err=ER_sigma_sigma(i); %estimate sigma error from the individual bins + + %Using solution of definite integral so that I can propogate errors with analytic approach + total_count=sqrt(pi./2).*gauss_amp.*gauss_sig.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) + 1 ); + leakage_count=sqrt(pi./2).*gauss_amp.*gauss_sig.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) - erf((gauss_mean-NR_mean)./(sqrt(2).*gauss_sig))); + + %derivative w.r.t amplitude + total_count_damp = sqrt(pi/2).*gauss_sig.*(erf(gauss_mean/(sqrt(2)*gauss_sig)) +1); + leakage_count_damp= sqrt(pi/2).*gauss_sig.*(erf(gauss_mean/(sqrt(2)*gauss_sig)) - erf((gauss_mean - NR_mean)/(sqrt(2)*gauss_sig))); + + %derivative w.r.t mean + total_count_dmean = gauss_amp.*exp(-(gauss_mean.^2)./(2.*gauss_sig.^2)); + leakage_count_dmean = sqrt(pi/2).*gauss_amp.*gauss_sig.*( ( sqrt(2/pi).*exp(-(gauss_mean.^2)./(2.*gauss_sig.^2)))./gauss_sig - sqrt(2/pi).*exp(-((gauss_mean-NR_mean).^2)./(2.*gauss_sig.^2))./gauss_sig); + + %derivative w.r.t sigma + total_count_dsig=sqrt(pi/2).*gauss_amp.* (erf ( gauss_mean./(sqrt(2).*gauss_sig)) + 1) - (gauss_amp .* gauss_mean .* exp( - (gauss_mean.^2)./(2.*gauss_sig.^2)))./gauss_sig; + leakage_count_dsig=sqrt(pi/2).*gauss_amp.*gauss_sig.*( (sqrt(2/pi).*(gauss_mean-NR_mean).*exp( (-(gauss_mean-NR_mean).^2)./(2.*gauss_sig.^2)))./(gauss_sig.^2) ... + - (sqrt(2/pi).*(gauss_mean).*exp( (-(gauss_mean).^2)./(2.*gauss_sig.^2)))./(gauss_sig.^2)) + ... + sqrt(pi/2).*gauss_amp.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) - erf((gauss_mean-NR_mean)./(sqrt(2).*gauss_sig))); + + total_count_err=sqrt( (total_count_damp.*gauss_amp_err).^2 + (total_count_dmean.*gauss_mean_err).^2 + (total_count_dsig.*gauss_sig_err).^2); + leakage_count_err=sqrt( (leakage_count_damp.*gauss_amp_err).^2 + (leakage_count_dmean.*gauss_mean_err).^2 + (leakage_count_dsig.*gauss_sig_err).^2); + + leakage_frac(i)=leakage_count./total_count; + leakage_frac_err(i)=sqrt( (leakage_count_err./total_count).^2 + (leakage_count.*total_count_err./(total_count.^2)).^2); + + end + + + gaussian_leakage_frac_tracker{bin_counter}=leakage_frac; + gaussian_leakage_frac_err_tracker{bin_counter}=leakage_frac_err; + + + %Counting Data Approach + clear gauss_mean gauss_sig gauss_amp gauss_amp_err gauss_mean_err gauss_sig_err leakage_frac_err leakage_frac NR_mean + for i=1:length(mean_ER_band) + + %Number of events in S1 bin + total_count=ER_bin_count(i); + leakage_count=ER_bin_belowNR_count(i); + + total_count_err=sqrt(total_count); + leakage_count_err=sqrt(leakage_count); + + leakage_frac(i)=leakage_count./total_count; + leakage_frac_err(i)=sqrt( (leakage_count_err./total_count).^2 + (leakage_count.*total_count_err./(total_count.^2)).^2); + + end + + + counting_leakage_frac_tracker{bin_counter}=leakage_frac; + counting_leakage_frac_err_tracker{bin_counter}=leakage_frac_err; + + %Based on ER Fit Approach + i=1; + clear gauss_mean gauss_sig gauss_amp gauss_amp_err gauss_mean_err gauss_sig_err leakage_frac_err leakage_frac NR_mean + for S1_val=1:1:49 + + NR_mean=NR_mean_refit.a.*S1_val.^(NR_mean_refit.b); + + gauss_mean= ER_mean_power_fit.a.*S1_val.^(ER_mean_power_fit.b); + gauss_sig= abs((ER_upper_power_fit.a.*S1_val.^(ER_upper_power_fit.b)) - gauss_mean)/1.28; + gauss_amp=interp1(ER_bins,gauss_amp_list,S1_val); %estimate gaussian amplitude from the individual bins + gauss_amp_err=interp1(ER_bins,gauss_amp_list_err,S1_val); %estimate gaussian amplitude error from the individual bins + gauss_mean_err=interp1(ER_bins,mean_ER_band_err,S1_val); %estimate mean err from the individual bins + gauss_sig_err=interp1(ER_bins,gauss_sig_list_err,S1_val); %estimate sigma error from the individual bins + + %Using solution of definite integral so that I can propogate errors with analytic approach + total_count=sqrt(pi./2).*gauss_amp.*gauss_sig.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) + 1 ); + leakage_count=sqrt(pi./2).*gauss_amp.*gauss_sig.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) - erf((gauss_mean-NR_mean)./(sqrt(2).*gauss_sig))); + + %derivative w.r.t amplitude + total_count_damp = sqrt(pi/2).*gauss_sig.*(erf(gauss_mean/(sqrt(2)*gauss_sig)) +1); + leakage_count_damp= sqrt(pi/2).*gauss_sig.*(erf(gauss_mean/(sqrt(2)*gauss_sig)) - erf((gauss_mean - NR_mean)/(sqrt(2)*gauss_sig))); + + %derivative w.r.t mean + total_count_dmean = gauss_amp.*exp(-(gauss_mean.^2)./(2.*gauss_sig.^2)); + leakage_count_dmean = sqrt(pi/2).*gauss_amp.*gauss_sig.*( ( sqrt(2/pi).*exp(-(gauss_mean.^2)./(2.*gauss_sig.^2)))./gauss_sig - sqrt(2/pi).*exp(-((gauss_mean-NR_mean).^2)./(2.*gauss_sig.^2))./gauss_sig); + + %derivative w.r.t sigma + total_count_dsig=sqrt(pi/2).*gauss_amp.* (erf ( gauss_mean./(sqrt(2).*gauss_sig)) + 1) - (gauss_amp .* gauss_mean .* exp( - (gauss_mean.^2)./(2.*gauss_sig.^2)))./gauss_sig; + leakage_count_dsig=sqrt(pi/2).*gauss_amp.*gauss_sig.*( (sqrt(2/pi).*(gauss_mean-NR_mean).*exp( (-(gauss_mean-NR_mean).^2)./(2.*gauss_sig.^2)))./(gauss_sig.^2) ... + - (sqrt(2/pi).*(gauss_mean).*exp( (-(gauss_mean).^2)./(2.*gauss_sig.^2)))./(gauss_sig.^2)) + ... + sqrt(pi/2).*gauss_amp.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) - erf((gauss_mean-NR_mean)./(sqrt(2).*gauss_sig))); + + total_count_err=sqrt( (total_count_damp.*gauss_amp_err).^2 + (total_count_dmean.*gauss_mean_err).^2 + (total_count_dsig.*gauss_sig_err).^2); + leakage_count_err=sqrt( (leakage_count_damp.*gauss_amp_err).^2 + (leakage_count_dmean.*gauss_mean_err).^2 + (leakage_count_dsig.*gauss_sig_err).^2); + + leakage_frac(i)=leakage_count./total_count; + leakage_frac_err(i)=sqrt( (leakage_count_err./total_count).^2 + (leakage_count.*total_count_err./(total_count.^2)).^2); + i=i+1; + + end + + Fit_leakage_frac_tracker{bin_counter}=leakage_frac; + Fit_leakage_frac_err_tracker{bin_counter}=leakage_frac_err; + + %% Plot the final result + colors={[1 0 0],[0 1 0],[0 0 1],[0 0 0],[0.8 0.5 0]}; + + figure; + hold on + ylabel('Counting Leakage Fraction'); xlabel('S1 corrected (Pulse Area Phe)'); + myfigview(16); +% ylim([0 3.5]);xlim([0 s1_max]); + + for i=1:length(counting_leakage_frac_tracker) + errorbar(NR_bins_tracked{i},counting_leakage_frac_tracker{i},counting_leakage_frac_err_tracker{i},'Color',colors{i}) + end + + + figure; + hold on + ylabel('Gaussian Leakage Fraction'); xlabel('S1 corrected (Pulse Area Phe)'); + myfigview(16); +% ylim([0 3.5]);xlim([0 s1_max]); + + for i=1:length(counting_leakage_frac_tracker) + errorbar(NR_bins_tracked{i},gaussian_leakage_frac_tracker{i},gaussian_leakage_frac_err_tracker{i},'Color',colors{i}) + end + + figure; + hold on + ylabel('Fit Leakage Fraction'); xlabel('S1 corrected (Pulse Area Phe)'); + myfigview(16); +% ylim([0 3.5]);xlim([0 s1_max]); + + for i=1:length(counting_leakage_frac_tracker) + errorbar([1:1:49],Fit_leakage_frac_tracker{i},Fit_leakage_frac_err_tracker{i},'Color',colors{i}) + end + + legend('35-75 uSec','75-125 uSec','125-175 uSec','180-225 uSec','235-280 uSec') \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/Discrimination/DataDrivenApproach_ConstantDDBand/Discrimination_ZDependence_DataDrivenApproach_ConstantDDBand.m b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/Discrimination/DataDrivenApproach_ConstantDDBand/Discrimination_ZDependence_DataDrivenApproach_ConstantDDBand.m new file mode 100644 index 0000000..402dc00 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/Discrimination/DataDrivenApproach_ConstantDDBand/Discrimination_ZDependence_DataDrivenApproach_ConstantDDBand.m @@ -0,0 +1,2943 @@ +%% First Get the DD Band in Z Slices + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\KrypCal2p21_QualityChecks\Discrimination\MappingParametersFit_Start_DD'); + %% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % Removing field dependence from S1 and S2 + % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + %Hardcoded numbers from Energy Chi2 Fit + + + +s1ab_s2_xyz_fit_map.p1=-0.4988; +s1ab_s2_xyz_fit_map.p2=1.484; +c1=1-s1ab_s2_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s2_xyz_fit_map.p2; +s1ab_s2_xyz_fit_map.p3=c1; + +s1ab_s1_xyz_fit_map.p1=0.065; +s1ab_s1_xyz_fit_map.p2=0.02; +c2=1-s1ab_s1_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s1_xyz_fit_map.p2; +s1ab_s1_xyz_fit_map.p3=c2; + + + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else %Only do 1D in this case +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval); + + + + end + + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S1 Z-dependence (Both PMT arrays) +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + +% +% light_correction_fig = figure; +% errorbar(mean_index,means,means_error,'.k'); +% hold on +% [yplot_s1_both] = polyval(P_s1_both,dT_fit); +% [center_s1_both, center_s1_both_err] = polyval(P_s1_both,z_center, S); %160[us]*1.51[\mus/us] +% plot(dT_fit,yplot_s1_both,'-r','LineWidth',1); +% xlabel('Depth (\mus)', 'FontSize',16); ylabel('Mean (Pulse Area Phe)', 'FontSize', 16); +% title(strcat('.Kr83m. S1 Mean vs. Z'), 'FontSize', 16,'Interpreter','none'); +% line([0 det_edge],[center_s1_both center_s1_both],'linestyle','--'); +% line([z_center; z_center;],[min(means) max(means)],'linestyle','--'); +% legend('S1\_both Mean', strcat('y=', num2str(P_s1_both(1),'%10.2e'), '*Z^2 + ', num2str(P_s1_both(2),'%10.2e')... +% , '*Z + ', num2str(P_s1_both(3),4)),strcat('Det center = ',num2str(center_s1_both,4), ' [Phe]'),'location','northwest') +% +% box on; +% myfigview(16); +% xlim([0 det_edge]); +% ylim([0.8*min(means) 1.15*max(means)]); + + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + + + + + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + + %%calculate S2/S1 also, just to double check the lifetime from S2 only + % hist_s2_both_s1(:,bin)= hist(s2_phe_both(time_cut)./s1_phe_both_z(time_cut),x3)'; + % temp_hist=hist_s2_both_s1(:,bin); + %Fit_s2_both_s1{bin}=fit(x3(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + % means_s2_s1(bin)=Fit_s2_both_s1{bin}.b1; + % means_error_s2_s1(bin) = Fit_s2_both_s1{bin}.c1/2/sqrt(sum(hist_s2_both_s1(:,bin))); % == sigma/sqrt(N); + % mean_index_s2_s1(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + + dT_range= inrange( mean_index,[5+bin_size,500] );%from 50 to 300us for the fit + + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + %%Tracker for pseudo-lifetime + s2_at_bottom_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_both=-320/log(s2_at_bottom_both/s2_at_top_both); + + dT_fit=0:1:det_edge; + + Fit_EL= fit(mean_index(dT_range),means(dT_range),'exp1'); + yfitEL = Fit_EL.a.*exp(Fit_EL.b.*dT_fit); + + e_lifetime_both=-1/Fit_EL.b; + s2_z0_both=Fit_EL.a; + + b=confint(Fit_EL, 0.683);%1 sigma matrix + sigma_e_lifetime_both=(1/b(1,2)-1/b(2,2))/2; + sigma_s2_z0_both=(b(2,1)-b(1,1))/2; +% +% lifetime_fig_both = figure; +% errorbar(mean_index(2:end),means(2:end),means_error(2:end),'.k'); %first bin is anode, skip it +% hold on +% plot(dT_fit,yfitEL,'-r','LineWidth',1); +% xlabel('Time (\mus)', 'FontSize',16); ylabel('Mean S2 (Pulse Area Phe)', 'FontSize', 16); +% title(strcat('.Kr83m. S2_both Electron Lifetime'), 'FontSize', 16,'Interpreter','none'); +% legend('S2\_both Mean', strcat( '\lambda= ', num2str(e_lifetime_both,4), ' \pm ', num2str(sigma_e_lifetime_both,2), ' \mus' )... +% ,'location','northeast'); +% myfigview(16); +% xlim([0 det_edge]); +% +% + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_ybins),floor(s2_xbins)); +Sigma_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); +Count_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + +color_range_max=max(max(mean_S2_both_xy)); +color_range_min=min(min(mean_S2_both_xy(mean_S2_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; +% +% s2_xy_both_fig = figure; +% contourf(s2xbins,s2ybins,mean_S2_both_xy,vc,'LineColor','none'); +% xlabel('x (cm)','fontsize', 18); +% ylabel('y (cm)','fontsize', 18); +% title(strcat('. S2 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +% caxis([color_range_min color_range_max]) +% g=colorbar; +% ylabel(g,'phe','FontSize',16) +% set(g,'FontSize',18) +% hold on +% LUXPlotTopPMTs +% axis([-25 25 -25 25]) +% myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_ybins),floor(s1_xbins)); +Sigma_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); +Count_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +color_range_max=max(max(mean_S1_both_xy)); +color_range_min=min(min(mean_S1_both_xy(mean_S1_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + +% +% s1_xy_both_fig = figure; +% contourf(s1xbins,s1ybins,mean_S1_both_xy,vc,'LineColor','none'); +% xlabel('x (cm)','fontsize', 18); +% ylabel('y (cm)','fontsize', 18); +% title(strcat('. S1 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +% caxis([color_range_min color_range_max]) +% g=colorbar; +% ylabel(g,'phe','FontSize',16) +% set(g,'FontSize',18) +% hold on +% LUXPlotTopPMTs +% axis([-25 25 -25 25]) +% myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%% Apply corrections to 7p5 DD data and calculate the NRband + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\KrypCal2p21_QualityChecks\NRBand_Z_Dependence\MutliZ_DD_7p5.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +%% Make NR Band +max_r=18; +s1_min=0; +s1_max=50; + + +pulse_area_cut=s2_phe_both_xyz>150 & s2_phe_both<10000 & s1_phe_both<300; +NR_beam_cut=inrange(drift_time,[35 75]) & inrange(s2radius_del,[0,max_r]) & ... + (s2y < -8.*s2x+70) & (s2y>-20.*s2x+10); + + +bin_counter=1; + +DD_cut= clean_cut & pulse_area_cut & NR_beam_cut; + +DD_s1_all=s1_phe_both_xyz(DD_cut); +DD_s2_all=s2_phe_both_xyz(DD_cut); + +%% +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\KrypCal2p21_QualityChecks\NRBand_Z_Dependence\MutliZ_DD_15.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +%% Make NR Band +max_r=18; +s1_min=0; +s1_max=50; + + +pulse_area_cut=s2_phe_both_xyz>150 & s2_phe_both<10000 & s1_phe_both<300; +NR_beam_cut=inrange(drift_time,[75 125]) & inrange(s2radius_del,[0,max_r]) & ... + (s2y < -8.*s2x+70) & (s2y>-20.*s2x+10); + + + + +DD_cut= clean_cut & pulse_area_cut & NR_beam_cut; + +DD_s1_all=[DD_s1_all; s1_phe_both_xyz(DD_cut)]; +DD_s2_all=[DD_s2_all; s2_phe_both_xyz(DD_cut)]; + + +%% +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\KrypCal2p21_QualityChecks\NRBand_Z_Dependence\MutliZ_DD_22p5.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +%% Make NR Band +max_r=21; +s1_min=0; +s1_max=50; + + +pulse_area_cut=s2_phe_both_xyz>150 & s2_phe_both<10000 & s1_phe_both<300; +NR_beam_cut=inrange(drift_time,[125 175]) & inrange(s2radius_del,[0,max_r]) & ... + (s2y < -8.*s2x+50) & (s2y>-20.*s2x+10); + + + + +DD_cut= clean_cut & pulse_area_cut & NR_beam_cut; + +DD_s1_all=[DD_s1_all; s1_phe_both_xyz(DD_cut)]; +DD_s2_all=[DD_s2_all; s2_phe_both_xyz(DD_cut)]; + +%% +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\KrypCal2p21_QualityChecks\NRBand_Z_Dependence\MutliZ_DD_30.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +%% Make NR Band +max_r=18; +s1_min=0; +s1_max=50; + + +pulse_area_cut=s2_phe_both_xyz>150 & s2_phe_both<10000 & s1_phe_both<300; +NR_beam_cut=inrange(drift_time,[180 225]) & inrange(s2radius_del,[0,max_r]) & ... + (s2y < -8.*s2x+36) & (s2y>-20.*s2x+5); + + + + +DD_cut= clean_cut & pulse_area_cut & NR_beam_cut; + +DD_s1_all=[DD_s1_all; s1_phe_both_xyz(DD_cut)]; +DD_s2_all=[DD_s2_all; s2_phe_both_xyz(DD_cut)]; + +%% +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\KrypCal2p21_QualityChecks\NRBand_Z_Dependence\MutliZ_DD_37p5.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +%% Make NR Band +max_r=18; +s1_min=0; +s1_max=50; + + +pulse_area_cut=s2_phe_both_xyz>150 & s2_phe_both<10000 & s1_phe_both<300; +NR_beam_cut=inrange(drift_time,[235 280]) & inrange(s2radius_del,[0,max_r]) & ... + (s2y < -8.*s2x+36) & (s2y>-15.*s2x-5); + + + + +DD_cut= clean_cut & pulse_area_cut & NR_beam_cut; + +DD_s1_all=[DD_s1_all; s1_phe_both_xyz(DD_cut)]; +DD_s2_all=[DD_s2_all; s2_phe_both_xyz(DD_cut)]; + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:0.05:5; + NR_bin_size=3; %3 works + index_i=1; + NR_bins=NR_bin_size/2+s1_min:NR_bin_size:s1_max; + lower_bound=ones(size(NR_bins)); + mean_NR_band=ones(size(NR_bins)); + upper_bound=ones(size(NR_bins)); + counts_NR_hist=ones(size(NR_bins)); + NR_sigma=ones(size(NR_bins)); + NR_sigma_sigma=ones(size(NR_bins)); + clear mean_NR_band_err lower_bound_err upper_bound_err lower_bound mean_NR_band upper_bound + +% temporary, for calculating correct E-lifetime + for NR_bin = (NR_bin_size/2)+s1_min:NR_bin_size:(s1_max); %HIST uses bin centers + + + NR_fit_cut=inrange(DD_s1_all,[NR_bin-NR_bin_size/2,NR_bin+NR_bin_size/2]); + + NR_band_hist=hist(log10(DD_s2_all(NR_fit_cut)./DD_s1_all(NR_fit_cut)),s2_s1_bin); + counts_NR_hist(index_i)=sum(NR_band_hist); + + Fit_NR=fit(s2_s1_bin',NR_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(DD_s2_all(NR_fit_cut)./DD_s1_all(NR_fit_cut)),s2_s1_bin); + + %band=confint(Fit_NR,.1); +% NR_sigma(index_i)= Fit_NR.c1/sqrt(2); + NR_sigma(index_i)= sqrt(rms_fit.sig2); + NR_sigma_sigma(index_i)=NR_sigma(index_i)/sqrt(2*counts_NR_hist(index_i)); + + lower_bound(index_i)=Fit_NR.b1-NR_sigma(index_i)*band_sigma; + mean_NR_band(index_i)=Fit_NR.b1; + upper_bound(index_i)=Fit_NR.b1+NR_sigma(index_i)*band_sigma; + + temp_err=confint(Fit_NR,0.68); + mean_NR_band_err(index_i)=abs(temp_err(1,2)-Fit_NR.b1); + lower_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + upper_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + + + %mean_NR_band_sim(index_i)=Fit_NR_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + NR_mean_power_fit=fit(NR_bins(NR_bins>1)',mean_NR_band(NR_bins>1)',g,'startpoint',[ 2.5 -.1]); + NR_mean_fit=NR_mean_power_fit.a.*NR_bins.^(NR_mean_power_fit.b); + + NR_lower_power_fit=fit(NR_bins(NR_bins>1)',lower_bound(NR_bins>1)',g,'startpoint',[ 2.5 -.1]); + NR_lower_fit=NR_lower_power_fit.a.*NR_bins.^(NR_lower_power_fit.b); + + NR_upper_power_fit=fit(NR_bins(NR_bins>1)',upper_bound(NR_bins>1)',g,'startpoint',[ 2.5 -.1]); + NR_upper_fit=NR_upper_power_fit.a.*NR_bins.^(NR_upper_power_fit.b); + + NR_mean_fit_points=mean_NR_band; + NR_lower_fit_points=lower_bound; + NR_upper_fit_points=upper_bound; + + NR_mean_fit_points_err=mean_NR_band_err; + NR_lower_fit_points_err=lower_bound_err; + NR_upper_fit_points_err=upper_bound_err; + + NR_bins_tracked=NR_bins; + + %% + %Make Plot + + figure; + hold on + ylabel('Corrected log10(S2/S1)'); xlabel('S1 corrected (Pulse Area Phe)'); + title(sprintf('Run 04 NR Band, R<%d cm',max_r),'fontsize',16,'Interpreter','none'); + myfigview(16); + ylim([0 3.5]);xlim([0 s1_max]); + + plot(DD_s1_all,log10(DD_s2_all./DD_s1_all),'.k'); + plot(NR_bins,NR_lower_fit,'--r','markersize',14,'linewidth',2) + plot(NR_bins,NR_mean_fit,'-r','markersize',20,'linewidth',2) + plot(NR_bins,NR_upper_fit,'--r','markersize',14,'linewidth',2) + +%% Next, get the ER band in the same z-slices from the closest CH3T data set (Sep 2014) + +clearvars -except NR_bins_tracked NR_lower_fit NR_mean_fit NR_upper_fit ... + NR_mean_fit NR_lower_fit NR_upper_fit NR_mean_fit_points NR_lower_fit_points NR_upper_fit_points ... + NR_mean_fit_points_err NR_lower_fit_points_err NR_upper_fit_points_err + + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\KrypCal2p21_QualityChecks\Discrimination\MappingParametersFit_Start_CH3T'); + + %% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % Removing field dependence from S1 and S2 + % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + %Hardcoded numbers from Energy Chi2 Fit + + + +s1ab_s2_xyz_fit_map.p1=-0.4988; +s1ab_s2_xyz_fit_map.p2=1.484; +c1=1-s1ab_s2_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s2_xyz_fit_map.p2; +s1ab_s2_xyz_fit_map.p3=c1; + +s1ab_s1_xyz_fit_map.p1=0.065; +s1ab_s1_xyz_fit_map.p2=0.02; +c2=1-s1ab_s1_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s1_xyz_fit_map.p2; +s1ab_s1_xyz_fit_map.p3=c2; + + + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else %Only do 1D in this case +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval); + + + + end + + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S1 Z-dependence (Both PMT arrays) +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + +% +% light_correction_fig = figure; +% errorbar(mean_index,means,means_error,'.k'); +% hold on +% [yplot_s1_both] = polyval(P_s1_both,dT_fit); +% [center_s1_both, center_s1_both_err] = polyval(P_s1_both,z_center, S); %160[us]*1.51[\mus/us] +% plot(dT_fit,yplot_s1_both,'-r','LineWidth',1); +% xlabel('Depth (\mus)', 'FontSize',16); ylabel('Mean (Pulse Area Phe)', 'FontSize', 16); +% title(strcat('.Kr83m. S1 Mean vs. Z'), 'FontSize', 16,'Interpreter','none'); +% line([0 det_edge],[center_s1_both center_s1_both],'linestyle','--'); +% line([z_center; z_center;],[min(means) max(means)],'linestyle','--'); +% legend('S1\_both Mean', strcat('y=', num2str(P_s1_both(1),'%10.2e'), '*Z^2 + ', num2str(P_s1_both(2),'%10.2e')... +% , '*Z + ', num2str(P_s1_both(3),4)),strcat('Det center = ',num2str(center_s1_both,4), ' [Phe]'),'location','northwest') +% +% box on; +% myfigview(16); +% xlim([0 det_edge]); +% ylim([0.8*min(means) 1.15*max(means)]); + + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + + + + + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + + %%calculate S2/S1 also, just to double check the lifetime from S2 only + % hist_s2_both_s1(:,bin)= hist(s2_phe_both(time_cut)./s1_phe_both_z(time_cut),x3)'; + % temp_hist=hist_s2_both_s1(:,bin); + %Fit_s2_both_s1{bin}=fit(x3(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + % means_s2_s1(bin)=Fit_s2_both_s1{bin}.b1; + % means_error_s2_s1(bin) = Fit_s2_both_s1{bin}.c1/2/sqrt(sum(hist_s2_both_s1(:,bin))); % == sigma/sqrt(N); + % mean_index_s2_s1(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + + dT_range= inrange( mean_index,[5+bin_size,500] );%from 50 to 300us for the fit + + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + %%Tracker for pseudo-lifetime + s2_at_bottom_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_both=-320/log(s2_at_bottom_both/s2_at_top_both); + + dT_fit=0:1:det_edge; + + Fit_EL= fit(mean_index(dT_range),means(dT_range),'exp1'); + yfitEL = Fit_EL.a.*exp(Fit_EL.b.*dT_fit); + + e_lifetime_both=-1/Fit_EL.b; + s2_z0_both=Fit_EL.a; + + b=confint(Fit_EL, 0.683);%1 sigma matrix + sigma_e_lifetime_both=(1/b(1,2)-1/b(2,2))/2; + sigma_s2_z0_both=(b(2,1)-b(1,1))/2; +% +% lifetime_fig_both = figure; +% errorbar(mean_index(2:end),means(2:end),means_error(2:end),'.k'); %first bin is anode, skip it +% hold on +% plot(dT_fit,yfitEL,'-r','LineWidth',1); +% xlabel('Time (\mus)', 'FontSize',16); ylabel('Mean S2 (Pulse Area Phe)', 'FontSize', 16); +% title(strcat('.Kr83m. S2_both Electron Lifetime'), 'FontSize', 16,'Interpreter','none'); +% legend('S2\_both Mean', strcat( '\lambda= ', num2str(e_lifetime_both,4), ' \pm ', num2str(sigma_e_lifetime_both,2), ' \mus' )... +% ,'location','northeast'); +% myfigview(16); +% xlim([0 det_edge]); + + + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_ybins),floor(s2_xbins)); +Sigma_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); +Count_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + +color_range_max=max(max(mean_S2_both_xy)); +color_range_min=min(min(mean_S2_both_xy(mean_S2_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + +% s2_xy_both_fig = figure; +% contourf(s2xbins,s2ybins,mean_S2_both_xy,vc,'LineColor','none'); +% xlabel('x (cm)','fontsize', 18); +% ylabel('y (cm)','fontsize', 18); +% title(strcat('. S2 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +% caxis([color_range_min color_range_max]) +% g=colorbar; +% ylabel(g,'phe','FontSize',16) +% set(g,'FontSize',18) +% hold on +% LUXPlotTopPMTs +% axis([-25 25 -25 25]) +% myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_ybins),floor(s1_xbins)); +Sigma_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); +Count_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +color_range_max=max(max(mean_S1_both_xy)); +color_range_min=min(min(mean_S1_both_xy(mean_S1_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + +% +% s1_xy_both_fig = figure; +% contourf(s1xbins,s1ybins,mean_S1_both_xy,vc,'LineColor','none'); +% xlabel('x (cm)','fontsize', 18); +% ylabel('y (cm)','fontsize', 18); +% title(strcat('. S1 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +% caxis([color_range_min color_range_max]) +% g=colorbar; +% ylabel(g,'phe','FontSize',16) +% set(g,'FontSize',18) +% hold on +% LUXPlotTopPMTs +% axis([-25 25 -25 25]) +% myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%% Apply corrections to ER data and calculate the ERband + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\Run04_CH3T\KrypCal2p18_IQs\MakePlots\CH3T_Sep2014_Kr2p18.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +%% Make ER Band +max_r=18; +s1_min=0; +s1_max=50; + + +pulse_area_cut= (log10(s1_phe_both)+0.7*log10(s2_phe_both)<4.85) & (log10(s1_phe_both)+0.7*log10(s2_phe_both)>2) & ... + (log10(s1_phe_both)-2*log10(s2_phe_both_xyz)<-4.7) & (log10(s1_phe_both)-2*log10(s2_phe_both)>-6.7); +fiducial_cut=inrange(drift_time,[35 75]) & inrange(s2radius_del,[0,max_r]); + +tritium_cut= clean_cut & pulse_area_cut & fiducial_cut; + +bin_counter=1; + + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:0.05:5; + ER_bin_size=3; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + clear mean_ER_band_err lower_bound_err upper_bound_err lower_bound mean_ER_band upper_bound ... + gauss_sig_list_err gauss_amp_list gauss_amp_list_err + + %Refit the NR band - ER binning is same as NR binning + NR_mean_data=NR_mean_fit_points; + NR_mean_data_err=NR_mean_fit_points_err; + + + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=tritium_cut & inrange(s1_phe_both_xyz,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); +% ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + + ER_bin_count(index_i)=length(s1_phe_both_xyz(ER_fit_cut)); + ER_bin_belowNR_count(index_i)=length(s1_phe_both_xyz(ER_fit_cut & log10(s2_phe_both_xyz./s1_phe_both_xyz)1)',mean_ER_band(ER_bins>1)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit{bin_counter}=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + + ER_lower_power_fit=fit(ER_bins(ER_bins>1)',lower_bound(ER_bins>1)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit{bin_counter}=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + + ER_upper_power_fit=fit(ER_bins(ER_bins>1)',upper_bound(ER_bins>1)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit{bin_counter}=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + + ER_mean_fit_points{bin_counter}=mean_ER_band; + ER_lower_fit_points{bin_counter}=lower_bound; + ER_upper_fit_points{bin_counter}=upper_bound; + + ER_mean_fit_points_err{bin_counter}=mean_ER_band_err; + ER_lower_fit_points_err{bin_counter}=lower_bound_err; + ER_upper_fit_points_err{bin_counter}=upper_bound_err; + + ER_bins_tracked{bin_counter}=ER_bins; + + + + + NR_bin_data=NR_bins_tracked; + NR_mean_refit=fit(NR_bin_data(NR_bin_data>1)',NR_mean_data(NR_bin_data>1)',g,'startpoint',[ 2.5 -.1]); + + + %Gaussian Assumption + clear gauss_mean gauss_sig gauss_amp gauss_amp_err gauss_mean_err gauss_sig_err leakage_frac_err leakage_frac NR_mean + for i=1:length(mean_ER_band) + + NR_mean=NR_mean_data(i); + gauss_mean= mean_ER_band(i); + gauss_sig= ER_sigma(i); + gauss_amp=amp(i); %estimate gaussian amplitude from the individual bins + gauss_amp_err=amp_err(i); %estimate gaussian amplitude error from the individual bins + gauss_mean_err=mean_ER_band_err(i); %estimate mean err from the individual bins + gauss_sig_err=ER_sigma_sigma(i); %estimate sigma error from the individual bins + + %Using solution of definite integral so that I can propogate errors with analytic approach + total_count=sqrt(pi./2).*gauss_amp.*gauss_sig.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) + 1 ); + leakage_count=sqrt(pi./2).*gauss_amp.*gauss_sig.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) - erf((gauss_mean-NR_mean)./(sqrt(2).*gauss_sig))); + + %derivative w.r.t amplitude + total_count_damp = sqrt(pi/2).*gauss_sig.*(erf(gauss_mean/(sqrt(2)*gauss_sig)) +1); + leakage_count_damp= sqrt(pi/2).*gauss_sig.*(erf(gauss_mean/(sqrt(2)*gauss_sig)) - erf((gauss_mean - NR_mean)/(sqrt(2)*gauss_sig))); + + %derivative w.r.t mean + total_count_dmean = gauss_amp.*exp(-(gauss_mean.^2)./(2.*gauss_sig.^2)); + leakage_count_dmean = sqrt(pi/2).*gauss_amp.*gauss_sig.*( ( sqrt(2/pi).*exp(-(gauss_mean.^2)./(2.*gauss_sig.^2)))./gauss_sig - sqrt(2/pi).*exp(-((gauss_mean-NR_mean).^2)./(2.*gauss_sig.^2))./gauss_sig); + + %derivative w.r.t sigma + total_count_dsig=sqrt(pi/2).*gauss_amp.* (erf ( gauss_mean./(sqrt(2).*gauss_sig)) + 1) - (gauss_amp .* gauss_mean .* exp( - (gauss_mean.^2)./(2.*gauss_sig.^2)))./gauss_sig; + leakage_count_dsig=sqrt(pi/2).*gauss_amp.*gauss_sig.*( (sqrt(2/pi).*(gauss_mean-NR_mean).*exp( (-(gauss_mean-NR_mean).^2)./(2.*gauss_sig.^2)))./(gauss_sig.^2) ... + - (sqrt(2/pi).*(gauss_mean).*exp( (-(gauss_mean).^2)./(2.*gauss_sig.^2)))./(gauss_sig.^2)) + ... + sqrt(pi/2).*gauss_amp.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) - erf((gauss_mean-NR_mean)./(sqrt(2).*gauss_sig))); + + total_count_err=sqrt( (total_count_damp.*gauss_amp_err).^2 + (total_count_dmean.*gauss_mean_err).^2 + (total_count_dsig.*gauss_sig_err).^2); + leakage_count_err=sqrt( (leakage_count_damp.*gauss_amp_err).^2 + (leakage_count_dmean.*gauss_mean_err).^2 + (leakage_count_dsig.*gauss_sig_err).^2); + + leakage_frac(i)=leakage_count./total_count; + leakage_frac_err(i)=sqrt( (leakage_count_err./total_count).^2 + (leakage_count.*total_count_err./(total_count.^2)).^2); + + end + + + gaussian_leakage_frac_tracker{bin_counter}=leakage_frac; + gaussian_leakage_frac_err_tracker{bin_counter}=leakage_frac_err; + + + %Counting Data Approach + clear gauss_mean gauss_sig gauss_amp gauss_amp_err gauss_mean_err gauss_sig_err leakage_frac_err leakage_frac NR_mean + for i=1:length(mean_ER_band) + + %Number of events in S1 bin + total_count=ER_bin_count(i); + leakage_count=ER_bin_belowNR_count(i); + + total_count_err=sqrt(total_count); + leakage_count_err=sqrt(leakage_count); + + leakage_frac(i)=leakage_count./total_count; + leakage_frac_err(i)=sqrt( (leakage_count_err./total_count).^2 + (leakage_count.*total_count_err./(total_count.^2)).^2); + + end + + + counting_leakage_frac_tracker{bin_counter}=leakage_frac; + counting_leakage_frac_err_tracker{bin_counter}=leakage_frac_err; + + %Based on ER Fit Approach + i=1; + clear gauss_mean gauss_sig gauss_amp gauss_amp_err gauss_mean_err gauss_sig_err leakage_frac_err leakage_frac NR_mean + for S1_val=1:1:49 + + NR_mean=NR_mean_refit.a.*S1_val.^(NR_mean_refit.b); + + gauss_mean= ER_mean_power_fit.a.*S1_val.^(ER_mean_power_fit.b); + gauss_sig= abs((ER_upper_power_fit.a.*S1_val.^(ER_upper_power_fit.b)) - gauss_mean)/1.28; + gauss_amp=interp1(ER_bins,gauss_amp_list,S1_val); %estimate gaussian amplitude from the individual bins + gauss_amp_err=interp1(ER_bins,gauss_amp_list_err,S1_val); %estimate gaussian amplitude error from the individual bins + gauss_mean_err=interp1(ER_bins,mean_ER_band_err,S1_val); %estimate mean err from the individual bins + gauss_sig_err=interp1(ER_bins,gauss_sig_list_err,S1_val); %estimate sigma error from the individual bins + + %Using solution of definite integral so that I can propogate errors with analytic approach + total_count=sqrt(pi./2).*gauss_amp.*gauss_sig.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) + 1 ); + leakage_count=sqrt(pi./2).*gauss_amp.*gauss_sig.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) - erf((gauss_mean-NR_mean)./(sqrt(2).*gauss_sig))); + + %derivative w.r.t amplitude + total_count_damp = sqrt(pi/2).*gauss_sig.*(erf(gauss_mean/(sqrt(2)*gauss_sig)) +1); + leakage_count_damp= sqrt(pi/2).*gauss_sig.*(erf(gauss_mean/(sqrt(2)*gauss_sig)) - erf((gauss_mean - NR_mean)/(sqrt(2)*gauss_sig))); + + %derivative w.r.t mean + total_count_dmean = gauss_amp.*exp(-(gauss_mean.^2)./(2.*gauss_sig.^2)); + leakage_count_dmean = sqrt(pi/2).*gauss_amp.*gauss_sig.*( ( sqrt(2/pi).*exp(-(gauss_mean.^2)./(2.*gauss_sig.^2)))./gauss_sig - sqrt(2/pi).*exp(-((gauss_mean-NR_mean).^2)./(2.*gauss_sig.^2))./gauss_sig); + + %derivative w.r.t sigma + total_count_dsig=sqrt(pi/2).*gauss_amp.* (erf ( gauss_mean./(sqrt(2).*gauss_sig)) + 1) - (gauss_amp .* gauss_mean .* exp( - (gauss_mean.^2)./(2.*gauss_sig.^2)))./gauss_sig; + leakage_count_dsig=sqrt(pi/2).*gauss_amp.*gauss_sig.*( (sqrt(2/pi).*(gauss_mean-NR_mean).*exp( (-(gauss_mean-NR_mean).^2)./(2.*gauss_sig.^2)))./(gauss_sig.^2) ... + - (sqrt(2/pi).*(gauss_mean).*exp( (-(gauss_mean).^2)./(2.*gauss_sig.^2)))./(gauss_sig.^2)) + ... + sqrt(pi/2).*gauss_amp.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) - erf((gauss_mean-NR_mean)./(sqrt(2).*gauss_sig))); + + total_count_err=sqrt( (total_count_damp.*gauss_amp_err).^2 + (total_count_dmean.*gauss_mean_err).^2 + (total_count_dsig.*gauss_sig_err).^2); + leakage_count_err=sqrt( (leakage_count_damp.*gauss_amp_err).^2 + (leakage_count_dmean.*gauss_mean_err).^2 + (leakage_count_dsig.*gauss_sig_err).^2); + + leakage_frac(i)=leakage_count./total_count; + leakage_frac_err(i)=sqrt( (leakage_count_err./total_count).^2 + (leakage_count.*total_count_err./(total_count.^2)).^2); + i=i+1; + + end + + Fit_leakage_frac_tracker{bin_counter}=leakage_frac; + Fit_leakage_frac_err_tracker{bin_counter}=leakage_frac_err; + + bin_counter=bin_counter+1; + + %% Move onto next Z slice +max_r=18; +s1_min=0; +s1_max=50; + + +pulse_area_cut= (log10(s1_phe_both)+0.7*log10(s2_phe_both)<4.85) & (log10(s1_phe_both)+0.7*log10(s2_phe_both)>2) & ... + (log10(s1_phe_both)-2*log10(s2_phe_both_xyz)<-4.7) & (log10(s1_phe_both)-2*log10(s2_phe_both)>-6.7); +fiducial_cut=inrange(drift_time,[75 125]) & inrange(s2radius_del,[0,max_r]); + +tritium_cut= clean_cut & pulse_area_cut & fiducial_cut; + + + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:0.05:5; + ER_bin_size=3; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + clear mean_ER_band_err lower_bound_err upper_bound_err lower_bound mean_ER_band upper_bound ... + gauss_sig_list_err gauss_amp_list gauss_amp_list_err + + %Refit the NR band - ER binning is same as NR binning + NR_mean_data=NR_mean_fit_points; + NR_mean_data_err=NR_mean_fit_points_err; + + + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=tritium_cut & inrange(s1_phe_both_xyz,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); +% ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + + ER_bin_count(index_i)=length(s1_phe_both_xyz(ER_fit_cut)); + ER_bin_belowNR_count(index_i)=length(s1_phe_both_xyz(ER_fit_cut & log10(s2_phe_both_xyz./s1_phe_both_xyz)1)',mean_ER_band(ER_bins>1)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit{bin_counter}=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + + ER_lower_power_fit=fit(ER_bins(ER_bins>1)',lower_bound(ER_bins>1)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit{bin_counter}=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + + ER_upper_power_fit=fit(ER_bins(ER_bins>1)',upper_bound(ER_bins>1)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit{bin_counter}=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + + ER_mean_fit_points{bin_counter}=mean_ER_band; + ER_lower_fit_points{bin_counter}=lower_bound; + ER_upper_fit_points{bin_counter}=upper_bound; + + ER_mean_fit_points_err{bin_counter}=mean_ER_band_err; + ER_lower_fit_points_err{bin_counter}=lower_bound_err; + ER_upper_fit_points_err{bin_counter}=upper_bound_err; + + ER_bins_tracked{bin_counter}=ER_bins; + + + + + NR_bin_data=NR_bins_tracked; + NR_mean_refit=fit(NR_bin_data(NR_bin_data>1)',NR_mean_data(NR_bin_data>1)',g,'startpoint',[ 2.5 -.1]); + + + %Gaussian Assumption + clear gauss_mean gauss_sig gauss_amp gauss_amp_err gauss_mean_err gauss_sig_err leakage_frac_err leakage_frac NR_mean + for i=1:length(mean_ER_band) + + NR_mean=NR_mean_data(i); + gauss_mean= mean_ER_band(i); + gauss_sig= ER_sigma(i); + gauss_amp=amp(i); %estimate gaussian amplitude from the individual bins + gauss_amp_err=amp_err(i); %estimate gaussian amplitude error from the individual bins + gauss_mean_err=mean_ER_band_err(i); %estimate mean err from the individual bins + gauss_sig_err=ER_sigma_sigma(i); %estimate sigma error from the individual bins + + %Using solution of definite integral so that I can propogate errors with analytic approach + total_count=sqrt(pi./2).*gauss_amp.*gauss_sig.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) + 1 ); + leakage_count=sqrt(pi./2).*gauss_amp.*gauss_sig.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) - erf((gauss_mean-NR_mean)./(sqrt(2).*gauss_sig))); + + %derivative w.r.t amplitude + total_count_damp = sqrt(pi/2).*gauss_sig.*(erf(gauss_mean/(sqrt(2)*gauss_sig)) +1); + leakage_count_damp= sqrt(pi/2).*gauss_sig.*(erf(gauss_mean/(sqrt(2)*gauss_sig)) - erf((gauss_mean - NR_mean)/(sqrt(2)*gauss_sig))); + + %derivative w.r.t mean + total_count_dmean = gauss_amp.*exp(-(gauss_mean.^2)./(2.*gauss_sig.^2)); + leakage_count_dmean = sqrt(pi/2).*gauss_amp.*gauss_sig.*( ( sqrt(2/pi).*exp(-(gauss_mean.^2)./(2.*gauss_sig.^2)))./gauss_sig - sqrt(2/pi).*exp(-((gauss_mean-NR_mean).^2)./(2.*gauss_sig.^2))./gauss_sig); + + %derivative w.r.t sigma + total_count_dsig=sqrt(pi/2).*gauss_amp.* (erf ( gauss_mean./(sqrt(2).*gauss_sig)) + 1) - (gauss_amp .* gauss_mean .* exp( - (gauss_mean.^2)./(2.*gauss_sig.^2)))./gauss_sig; + leakage_count_dsig=sqrt(pi/2).*gauss_amp.*gauss_sig.*( (sqrt(2/pi).*(gauss_mean-NR_mean).*exp( (-(gauss_mean-NR_mean).^2)./(2.*gauss_sig.^2)))./(gauss_sig.^2) ... + - (sqrt(2/pi).*(gauss_mean).*exp( (-(gauss_mean).^2)./(2.*gauss_sig.^2)))./(gauss_sig.^2)) + ... + sqrt(pi/2).*gauss_amp.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) - erf((gauss_mean-NR_mean)./(sqrt(2).*gauss_sig))); + + total_count_err=sqrt( (total_count_damp.*gauss_amp_err).^2 + (total_count_dmean.*gauss_mean_err).^2 + (total_count_dsig.*gauss_sig_err).^2); + leakage_count_err=sqrt( (leakage_count_damp.*gauss_amp_err).^2 + (leakage_count_dmean.*gauss_mean_err).^2 + (leakage_count_dsig.*gauss_sig_err).^2); + + leakage_frac(i)=leakage_count./total_count; + leakage_frac_err(i)=sqrt( (leakage_count_err./total_count).^2 + (leakage_count.*total_count_err./(total_count.^2)).^2); + + end + + + gaussian_leakage_frac_tracker{bin_counter}=leakage_frac; + gaussian_leakage_frac_err_tracker{bin_counter}=leakage_frac_err; + + + %Counting Data Approach + clear gauss_mean gauss_sig gauss_amp gauss_amp_err gauss_mean_err gauss_sig_err leakage_frac_err leakage_frac NR_mean + for i=1:length(mean_ER_band) + + %Number of events in S1 bin + total_count=ER_bin_count(i); + leakage_count=ER_bin_belowNR_count(i); + + total_count_err=sqrt(total_count); + leakage_count_err=sqrt(leakage_count); + + leakage_frac(i)=leakage_count./total_count; + leakage_frac_err(i)=sqrt( (leakage_count_err./total_count).^2 + (leakage_count.*total_count_err./(total_count.^2)).^2); + + end + + + counting_leakage_frac_tracker{bin_counter}=leakage_frac; + counting_leakage_frac_err_tracker{bin_counter}=leakage_frac_err; + %Based on ER Fit Approach + i=1; + clear gauss_mean gauss_sig gauss_amp gauss_amp_err gauss_mean_err gauss_sig_err leakage_frac_err leakage_frac NR_mean + for S1_val=1:1:49 + + NR_mean=NR_mean_refit.a.*S1_val.^(NR_mean_refit.b); + + gauss_mean= ER_mean_power_fit.a.*S1_val.^(ER_mean_power_fit.b); + gauss_sig= abs((ER_upper_power_fit.a.*S1_val.^(ER_upper_power_fit.b)) - gauss_mean)/1.28; + gauss_amp=interp1(ER_bins,gauss_amp_list,S1_val); %estimate gaussian amplitude from the individual bins + gauss_amp_err=interp1(ER_bins,gauss_amp_list_err,S1_val); %estimate gaussian amplitude error from the individual bins + gauss_mean_err=interp1(ER_bins,mean_ER_band_err,S1_val); %estimate mean err from the individual bins + gauss_sig_err=interp1(ER_bins,gauss_sig_list_err,S1_val); %estimate sigma error from the individual bins + + %Using solution of definite integral so that I can propogate errors with analytic approach + total_count=sqrt(pi./2).*gauss_amp.*gauss_sig.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) + 1 ); + leakage_count=sqrt(pi./2).*gauss_amp.*gauss_sig.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) - erf((gauss_mean-NR_mean)./(sqrt(2).*gauss_sig))); + + %derivative w.r.t amplitude + total_count_damp = sqrt(pi/2).*gauss_sig.*(erf(gauss_mean/(sqrt(2)*gauss_sig)) +1); + leakage_count_damp= sqrt(pi/2).*gauss_sig.*(erf(gauss_mean/(sqrt(2)*gauss_sig)) - erf((gauss_mean - NR_mean)/(sqrt(2)*gauss_sig))); + + %derivative w.r.t mean + total_count_dmean = gauss_amp.*exp(-(gauss_mean.^2)./(2.*gauss_sig.^2)); + leakage_count_dmean = sqrt(pi/2).*gauss_amp.*gauss_sig.*( ( sqrt(2/pi).*exp(-(gauss_mean.^2)./(2.*gauss_sig.^2)))./gauss_sig - sqrt(2/pi).*exp(-((gauss_mean-NR_mean).^2)./(2.*gauss_sig.^2))./gauss_sig); + + %derivative w.r.t sigma + total_count_dsig=sqrt(pi/2).*gauss_amp.* (erf ( gauss_mean./(sqrt(2).*gauss_sig)) + 1) - (gauss_amp .* gauss_mean .* exp( - (gauss_mean.^2)./(2.*gauss_sig.^2)))./gauss_sig; + leakage_count_dsig=sqrt(pi/2).*gauss_amp.*gauss_sig.*( (sqrt(2/pi).*(gauss_mean-NR_mean).*exp( (-(gauss_mean-NR_mean).^2)./(2.*gauss_sig.^2)))./(gauss_sig.^2) ... + - (sqrt(2/pi).*(gauss_mean).*exp( (-(gauss_mean).^2)./(2.*gauss_sig.^2)))./(gauss_sig.^2)) + ... + sqrt(pi/2).*gauss_amp.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) - erf((gauss_mean-NR_mean)./(sqrt(2).*gauss_sig))); + + total_count_err=sqrt( (total_count_damp.*gauss_amp_err).^2 + (total_count_dmean.*gauss_mean_err).^2 + (total_count_dsig.*gauss_sig_err).^2); + leakage_count_err=sqrt( (leakage_count_damp.*gauss_amp_err).^2 + (leakage_count_dmean.*gauss_mean_err).^2 + (leakage_count_dsig.*gauss_sig_err).^2); + + leakage_frac(i)=leakage_count./total_count; + leakage_frac_err(i)=sqrt( (leakage_count_err./total_count).^2 + (leakage_count.*total_count_err./(total_count.^2)).^2); + i=i+1; + + end + + Fit_leakage_frac_tracker{bin_counter}=leakage_frac; + Fit_leakage_frac_err_tracker{bin_counter}=leakage_frac_err; + + bin_counter=bin_counter+1; + + %% Move onto next Z slice +max_r=18; +s1_min=0; +s1_max=50; + + +pulse_area_cut= (log10(s1_phe_both)+0.7*log10(s2_phe_both)<4.85) & (log10(s1_phe_both)+0.7*log10(s2_phe_both)>2) & ... + (log10(s1_phe_both)-2*log10(s2_phe_both_xyz)<-4.7) & (log10(s1_phe_both)-2*log10(s2_phe_both)>-6.7); +fiducial_cut=inrange(drift_time,[125 175]) & inrange(s2radius_del,[0,max_r]); + +tritium_cut= clean_cut & pulse_area_cut & fiducial_cut; + + + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:0.05:5; + ER_bin_size=3; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + clear mean_ER_band_err lower_bound_err upper_bound_err lower_bound mean_ER_band upper_bound ... + gauss_sig_list_err gauss_amp_list gauss_amp_list_err + + %Refit the NR band - ER binning is same as NR binning + NR_mean_data=NR_mean_fit_points; + NR_mean_data_err=NR_mean_fit_points_err; + + + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=tritium_cut & inrange(s1_phe_both_xyz,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); +% ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + + ER_bin_count(index_i)=length(s1_phe_both_xyz(ER_fit_cut)); + ER_bin_belowNR_count(index_i)=length(s1_phe_both_xyz(ER_fit_cut & log10(s2_phe_both_xyz./s1_phe_both_xyz)1)',mean_ER_band(ER_bins>1)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit{bin_counter}=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + + ER_lower_power_fit=fit(ER_bins(ER_bins>1)',lower_bound(ER_bins>1)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit{bin_counter}=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + + ER_upper_power_fit=fit(ER_bins(ER_bins>1)',upper_bound(ER_bins>1)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit{bin_counter}=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + + ER_mean_fit_points{bin_counter}=mean_ER_band; + ER_lower_fit_points{bin_counter}=lower_bound; + ER_upper_fit_points{bin_counter}=upper_bound; + + ER_mean_fit_points_err{bin_counter}=mean_ER_band_err; + ER_lower_fit_points_err{bin_counter}=lower_bound_err; + ER_upper_fit_points_err{bin_counter}=upper_bound_err; + + ER_bins_tracked{bin_counter}=ER_bins; + + + + + NR_bin_data=NR_bins_tracked; + NR_mean_refit=fit(NR_bin_data(NR_bin_data>1)',NR_mean_data(NR_bin_data>1)',g,'startpoint',[ 2.5 -.1]); + + + %Gaussian Assumption + clear gauss_mean gauss_sig gauss_amp gauss_amp_err gauss_mean_err gauss_sig_err leakage_frac_err leakage_frac NR_mean + for i=1:length(mean_ER_band) + + NR_mean=NR_mean_data(i); + gauss_mean= mean_ER_band(i); + gauss_sig= ER_sigma(i); + gauss_amp=amp(i); %estimate gaussian amplitude from the individual bins + gauss_amp_err=amp_err(i); %estimate gaussian amplitude error from the individual bins + gauss_mean_err=mean_ER_band_err(i); %estimate mean err from the individual bins + gauss_sig_err=ER_sigma_sigma(i); %estimate sigma error from the individual bins + + %Using solution of definite integral so that I can propogate errors with analytic approach + total_count=sqrt(pi./2).*gauss_amp.*gauss_sig.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) + 1 ); + leakage_count=sqrt(pi./2).*gauss_amp.*gauss_sig.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) - erf((gauss_mean-NR_mean)./(sqrt(2).*gauss_sig))); + + %derivative w.r.t amplitude + total_count_damp = sqrt(pi/2).*gauss_sig.*(erf(gauss_mean/(sqrt(2)*gauss_sig)) +1); + leakage_count_damp= sqrt(pi/2).*gauss_sig.*(erf(gauss_mean/(sqrt(2)*gauss_sig)) - erf((gauss_mean - NR_mean)/(sqrt(2)*gauss_sig))); + + %derivative w.r.t mean + total_count_dmean = gauss_amp.*exp(-(gauss_mean.^2)./(2.*gauss_sig.^2)); + leakage_count_dmean = sqrt(pi/2).*gauss_amp.*gauss_sig.*( ( sqrt(2/pi).*exp(-(gauss_mean.^2)./(2.*gauss_sig.^2)))./gauss_sig - sqrt(2/pi).*exp(-((gauss_mean-NR_mean).^2)./(2.*gauss_sig.^2))./gauss_sig); + + %derivative w.r.t sigma + total_count_dsig=sqrt(pi/2).*gauss_amp.* (erf ( gauss_mean./(sqrt(2).*gauss_sig)) + 1) - (gauss_amp .* gauss_mean .* exp( - (gauss_mean.^2)./(2.*gauss_sig.^2)))./gauss_sig; + leakage_count_dsig=sqrt(pi/2).*gauss_amp.*gauss_sig.*( (sqrt(2/pi).*(gauss_mean-NR_mean).*exp( (-(gauss_mean-NR_mean).^2)./(2.*gauss_sig.^2)))./(gauss_sig.^2) ... + - (sqrt(2/pi).*(gauss_mean).*exp( (-(gauss_mean).^2)./(2.*gauss_sig.^2)))./(gauss_sig.^2)) + ... + sqrt(pi/2).*gauss_amp.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) - erf((gauss_mean-NR_mean)./(sqrt(2).*gauss_sig))); + + total_count_err=sqrt( (total_count_damp.*gauss_amp_err).^2 + (total_count_dmean.*gauss_mean_err).^2 + (total_count_dsig.*gauss_sig_err).^2); + leakage_count_err=sqrt( (leakage_count_damp.*gauss_amp_err).^2 + (leakage_count_dmean.*gauss_mean_err).^2 + (leakage_count_dsig.*gauss_sig_err).^2); + + leakage_frac(i)=leakage_count./total_count; + leakage_frac_err(i)=sqrt( (leakage_count_err./total_count).^2 + (leakage_count.*total_count_err./(total_count.^2)).^2); + + end + + + gaussian_leakage_frac_tracker{bin_counter}=leakage_frac; + gaussian_leakage_frac_err_tracker{bin_counter}=leakage_frac_err; + + + %Counting Data Approach + clear gauss_mean gauss_sig gauss_amp gauss_amp_err gauss_mean_err gauss_sig_err leakage_frac_err leakage_frac NR_mean + for i=1:length(mean_ER_band) + + %Number of events in S1 bin + total_count=ER_bin_count(i); + leakage_count=ER_bin_belowNR_count(i); + + total_count_err=sqrt(total_count); + leakage_count_err=sqrt(leakage_count); + + leakage_frac(i)=leakage_count./total_count; + leakage_frac_err(i)=sqrt( (leakage_count_err./total_count).^2 + (leakage_count.*total_count_err./(total_count.^2)).^2); + + end + + + counting_leakage_frac_tracker{bin_counter}=leakage_frac; + counting_leakage_frac_err_tracker{bin_counter}=leakage_frac_err; + %Based on ER Fit Approach + i=1; + clear gauss_mean gauss_sig gauss_amp gauss_amp_err gauss_mean_err gauss_sig_err leakage_frac_err leakage_frac NR_mean + for S1_val=1:1:49 + + NR_mean=NR_mean_refit.a.*S1_val.^(NR_mean_refit.b); + + gauss_mean= ER_mean_power_fit.a.*S1_val.^(ER_mean_power_fit.b); + gauss_sig= abs((ER_upper_power_fit.a.*S1_val.^(ER_upper_power_fit.b)) - gauss_mean)/1.28; + gauss_amp=interp1(ER_bins,gauss_amp_list,S1_val); %estimate gaussian amplitude from the individual bins + gauss_amp_err=interp1(ER_bins,gauss_amp_list_err,S1_val); %estimate gaussian amplitude error from the individual bins + gauss_mean_err=interp1(ER_bins,mean_ER_band_err,S1_val); %estimate mean err from the individual bins + gauss_sig_err=interp1(ER_bins,gauss_sig_list_err,S1_val); %estimate sigma error from the individual bins + + %Using solution of definite integral so that I can propogate errors with analytic approach + total_count=sqrt(pi./2).*gauss_amp.*gauss_sig.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) + 1 ); + leakage_count=sqrt(pi./2).*gauss_amp.*gauss_sig.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) - erf((gauss_mean-NR_mean)./(sqrt(2).*gauss_sig))); + + %derivative w.r.t amplitude + total_count_damp = sqrt(pi/2).*gauss_sig.*(erf(gauss_mean/(sqrt(2)*gauss_sig)) +1); + leakage_count_damp= sqrt(pi/2).*gauss_sig.*(erf(gauss_mean/(sqrt(2)*gauss_sig)) - erf((gauss_mean - NR_mean)/(sqrt(2)*gauss_sig))); + + %derivative w.r.t mean + total_count_dmean = gauss_amp.*exp(-(gauss_mean.^2)./(2.*gauss_sig.^2)); + leakage_count_dmean = sqrt(pi/2).*gauss_amp.*gauss_sig.*( ( sqrt(2/pi).*exp(-(gauss_mean.^2)./(2.*gauss_sig.^2)))./gauss_sig - sqrt(2/pi).*exp(-((gauss_mean-NR_mean).^2)./(2.*gauss_sig.^2))./gauss_sig); + + %derivative w.r.t sigma + total_count_dsig=sqrt(pi/2).*gauss_amp.* (erf ( gauss_mean./(sqrt(2).*gauss_sig)) + 1) - (gauss_amp .* gauss_mean .* exp( - (gauss_mean.^2)./(2.*gauss_sig.^2)))./gauss_sig; + leakage_count_dsig=sqrt(pi/2).*gauss_amp.*gauss_sig.*( (sqrt(2/pi).*(gauss_mean-NR_mean).*exp( (-(gauss_mean-NR_mean).^2)./(2.*gauss_sig.^2)))./(gauss_sig.^2) ... + - (sqrt(2/pi).*(gauss_mean).*exp( (-(gauss_mean).^2)./(2.*gauss_sig.^2)))./(gauss_sig.^2)) + ... + sqrt(pi/2).*gauss_amp.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) - erf((gauss_mean-NR_mean)./(sqrt(2).*gauss_sig))); + + total_count_err=sqrt( (total_count_damp.*gauss_amp_err).^2 + (total_count_dmean.*gauss_mean_err).^2 + (total_count_dsig.*gauss_sig_err).^2); + leakage_count_err=sqrt( (leakage_count_damp.*gauss_amp_err).^2 + (leakage_count_dmean.*gauss_mean_err).^2 + (leakage_count_dsig.*gauss_sig_err).^2); + + leakage_frac(i)=leakage_count./total_count; + leakage_frac_err(i)=sqrt( (leakage_count_err./total_count).^2 + (leakage_count.*total_count_err./(total_count.^2)).^2); + i=i+1; + + end + + Fit_leakage_frac_tracker{bin_counter}=leakage_frac; + Fit_leakage_frac_err_tracker{bin_counter}=leakage_frac_err; + + bin_counter=bin_counter+1; + + %% Move onto next Z slice +max_r=18; +s1_min=0; +s1_max=50; + + +pulse_area_cut= (log10(s1_phe_both)+0.7*log10(s2_phe_both)<4.85) & (log10(s1_phe_both)+0.7*log10(s2_phe_both)>2) & ... + (log10(s1_phe_both)-2*log10(s2_phe_both_xyz)<-4.7) & (log10(s1_phe_both)-2*log10(s2_phe_both)>-6.7); +fiducial_cut=inrange(drift_time,[180 225]) & inrange(s2radius_del,[0,max_r]); + +tritium_cut= clean_cut & pulse_area_cut & fiducial_cut; + + + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + + s2_s1_bin= 1:0.05:5; + ER_bin_size=3; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + clear mean_ER_band_err lower_bound_err upper_bound_err lower_bound mean_ER_band upper_bound ... + gauss_sig_list_err gauss_amp_list gauss_amp_list_err + + %Refit the NR band - ER binning is same as NR binning + NR_mean_data=NR_mean_fit_points; + NR_mean_data_err=NR_mean_fit_points_err; + + + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=tritium_cut & inrange(s1_phe_both_xyz,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); +% ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + + ER_bin_count(index_i)=length(s1_phe_both_xyz(ER_fit_cut)); + ER_bin_belowNR_count(index_i)=length(s1_phe_both_xyz(ER_fit_cut & log10(s2_phe_both_xyz./s1_phe_both_xyz)1)',mean_ER_band(ER_bins>1)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit{bin_counter}=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + + ER_lower_power_fit=fit(ER_bins(ER_bins>1)',lower_bound(ER_bins>1)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit{bin_counter}=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + + ER_upper_power_fit=fit(ER_bins(ER_bins>1)',upper_bound(ER_bins>1)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit{bin_counter}=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + + ER_mean_fit_points{bin_counter}=mean_ER_band; + ER_lower_fit_points{bin_counter}=lower_bound; + ER_upper_fit_points{bin_counter}=upper_bound; + + ER_mean_fit_points_err{bin_counter}=mean_ER_band_err; + ER_lower_fit_points_err{bin_counter}=lower_bound_err; + ER_upper_fit_points_err{bin_counter}=upper_bound_err; + + ER_bins_tracked{bin_counter}=ER_bins; + + + + + NR_bin_data=NR_bins_tracked; + NR_mean_refit=fit(NR_bin_data(NR_bin_data>1)',NR_mean_data(NR_bin_data>1)',g,'startpoint',[ 2.5 -.1]); + + + %Gaussian Assumption + clear gauss_mean gauss_sig gauss_amp gauss_amp_err gauss_mean_err gauss_sig_err leakage_frac_err leakage_frac NR_mean + for i=1:length(mean_ER_band) + + NR_mean=NR_mean_data(i); + gauss_mean= mean_ER_band(i); + gauss_sig= ER_sigma(i); + gauss_amp=amp(i); %estimate gaussian amplitude from the individual bins + gauss_amp_err=amp_err(i); %estimate gaussian amplitude error from the individual bins + gauss_mean_err=mean_ER_band_err(i); %estimate mean err from the individual bins + gauss_sig_err=ER_sigma_sigma(i); %estimate sigma error from the individual bins + + %Using solution of definite integral so that I can propogate errors with analytic approach + total_count=sqrt(pi./2).*gauss_amp.*gauss_sig.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) + 1 ); + leakage_count=sqrt(pi./2).*gauss_amp.*gauss_sig.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) - erf((gauss_mean-NR_mean)./(sqrt(2).*gauss_sig))); + + %derivative w.r.t amplitude + total_count_damp = sqrt(pi/2).*gauss_sig.*(erf(gauss_mean/(sqrt(2)*gauss_sig)) +1); + leakage_count_damp= sqrt(pi/2).*gauss_sig.*(erf(gauss_mean/(sqrt(2)*gauss_sig)) - erf((gauss_mean - NR_mean)/(sqrt(2)*gauss_sig))); + + %derivative w.r.t mean + total_count_dmean = gauss_amp.*exp(-(gauss_mean.^2)./(2.*gauss_sig.^2)); + leakage_count_dmean = sqrt(pi/2).*gauss_amp.*gauss_sig.*( ( sqrt(2/pi).*exp(-(gauss_mean.^2)./(2.*gauss_sig.^2)))./gauss_sig - sqrt(2/pi).*exp(-((gauss_mean-NR_mean).^2)./(2.*gauss_sig.^2))./gauss_sig); + + %derivative w.r.t sigma + total_count_dsig=sqrt(pi/2).*gauss_amp.* (erf ( gauss_mean./(sqrt(2).*gauss_sig)) + 1) - (gauss_amp .* gauss_mean .* exp( - (gauss_mean.^2)./(2.*gauss_sig.^2)))./gauss_sig; + leakage_count_dsig=sqrt(pi/2).*gauss_amp.*gauss_sig.*( (sqrt(2/pi).*(gauss_mean-NR_mean).*exp( (-(gauss_mean-NR_mean).^2)./(2.*gauss_sig.^2)))./(gauss_sig.^2) ... + - (sqrt(2/pi).*(gauss_mean).*exp( (-(gauss_mean).^2)./(2.*gauss_sig.^2)))./(gauss_sig.^2)) + ... + sqrt(pi/2).*gauss_amp.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) - erf((gauss_mean-NR_mean)./(sqrt(2).*gauss_sig))); + + total_count_err=sqrt( (total_count_damp.*gauss_amp_err).^2 + (total_count_dmean.*gauss_mean_err).^2 + (total_count_dsig.*gauss_sig_err).^2); + leakage_count_err=sqrt( (leakage_count_damp.*gauss_amp_err).^2 + (leakage_count_dmean.*gauss_mean_err).^2 + (leakage_count_dsig.*gauss_sig_err).^2); + + leakage_frac(i)=leakage_count./total_count; + leakage_frac_err(i)=sqrt( (leakage_count_err./total_count).^2 + (leakage_count.*total_count_err./(total_count.^2)).^2); + + end + + + gaussian_leakage_frac_tracker{bin_counter}=leakage_frac; + gaussian_leakage_frac_err_tracker{bin_counter}=leakage_frac_err; + + + %Counting Data Approach + clear gauss_mean gauss_sig gauss_amp gauss_amp_err gauss_mean_err gauss_sig_err leakage_frac_err leakage_frac NR_mean + for i=1:length(mean_ER_band) + + %Number of events in S1 bin + total_count=ER_bin_count(i); + leakage_count=ER_bin_belowNR_count(i); + + total_count_err=sqrt(total_count); + leakage_count_err=sqrt(leakage_count); + + leakage_frac(i)=leakage_count./total_count; + leakage_frac_err(i)=sqrt( (leakage_count_err./total_count).^2 + (leakage_count.*total_count_err./(total_count.^2)).^2); + + end + + + counting_leakage_frac_tracker{bin_counter}=leakage_frac; + counting_leakage_frac_err_tracker{bin_counter}=leakage_frac_err; + %Based on ER Fit Approach + i=1; + clear gauss_mean gauss_sig gauss_amp gauss_amp_err gauss_mean_err gauss_sig_err leakage_frac_err leakage_frac NR_mean + for S1_val=1:1:49 + + NR_mean=NR_mean_refit.a.*S1_val.^(NR_mean_refit.b); + + gauss_mean= ER_mean_power_fit.a.*S1_val.^(ER_mean_power_fit.b); + gauss_sig= abs((ER_upper_power_fit.a.*S1_val.^(ER_upper_power_fit.b)) - gauss_mean)/1.28; + gauss_amp=interp1(ER_bins,gauss_amp_list,S1_val); %estimate gaussian amplitude from the individual bins + gauss_amp_err=interp1(ER_bins,gauss_amp_list_err,S1_val); %estimate gaussian amplitude error from the individual bins + gauss_mean_err=interp1(ER_bins,mean_ER_band_err,S1_val); %estimate mean err from the individual bins + gauss_sig_err=interp1(ER_bins,gauss_sig_list_err,S1_val); %estimate sigma error from the individual bins + + %Using solution of definite integral so that I can propogate errors with analytic approach + total_count=sqrt(pi./2).*gauss_amp.*gauss_sig.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) + 1 ); + leakage_count=sqrt(pi./2).*gauss_amp.*gauss_sig.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) - erf((gauss_mean-NR_mean)./(sqrt(2).*gauss_sig))); + + %derivative w.r.t amplitude + total_count_damp = sqrt(pi/2).*gauss_sig.*(erf(gauss_mean/(sqrt(2)*gauss_sig)) +1); + leakage_count_damp= sqrt(pi/2).*gauss_sig.*(erf(gauss_mean/(sqrt(2)*gauss_sig)) - erf((gauss_mean - NR_mean)/(sqrt(2)*gauss_sig))); + + %derivative w.r.t mean + total_count_dmean = gauss_amp.*exp(-(gauss_mean.^2)./(2.*gauss_sig.^2)); + leakage_count_dmean = sqrt(pi/2).*gauss_amp.*gauss_sig.*( ( sqrt(2/pi).*exp(-(gauss_mean.^2)./(2.*gauss_sig.^2)))./gauss_sig - sqrt(2/pi).*exp(-((gauss_mean-NR_mean).^2)./(2.*gauss_sig.^2))./gauss_sig); + + %derivative w.r.t sigma + total_count_dsig=sqrt(pi/2).*gauss_amp.* (erf ( gauss_mean./(sqrt(2).*gauss_sig)) + 1) - (gauss_amp .* gauss_mean .* exp( - (gauss_mean.^2)./(2.*gauss_sig.^2)))./gauss_sig; + leakage_count_dsig=sqrt(pi/2).*gauss_amp.*gauss_sig.*( (sqrt(2/pi).*(gauss_mean-NR_mean).*exp( (-(gauss_mean-NR_mean).^2)./(2.*gauss_sig.^2)))./(gauss_sig.^2) ... + - (sqrt(2/pi).*(gauss_mean).*exp( (-(gauss_mean).^2)./(2.*gauss_sig.^2)))./(gauss_sig.^2)) + ... + sqrt(pi/2).*gauss_amp.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) - erf((gauss_mean-NR_mean)./(sqrt(2).*gauss_sig))); + + total_count_err=sqrt( (total_count_damp.*gauss_amp_err).^2 + (total_count_dmean.*gauss_mean_err).^2 + (total_count_dsig.*gauss_sig_err).^2); + leakage_count_err=sqrt( (leakage_count_damp.*gauss_amp_err).^2 + (leakage_count_dmean.*gauss_mean_err).^2 + (leakage_count_dsig.*gauss_sig_err).^2); + + leakage_frac(i)=leakage_count./total_count; + leakage_frac_err(i)=sqrt( (leakage_count_err./total_count).^2 + (leakage_count.*total_count_err./(total_count.^2)).^2); + i=i+1; + + end + + Fit_leakage_frac_tracker{bin_counter}=leakage_frac; + Fit_leakage_frac_err_tracker{bin_counter}=leakage_frac_err; + + bin_counter=bin_counter+1; + + %% Move onto next Z slice +max_r=18; +s1_min=0; +s1_max=50; + + +pulse_area_cut= (log10(s1_phe_both)+0.7*log10(s2_phe_both)<4.85) & (log10(s1_phe_both)+0.7*log10(s2_phe_both)>2) & ... + (log10(s1_phe_both)-2*log10(s2_phe_both_xyz)<-4.7) & (log10(s1_phe_both)-2*log10(s2_phe_both)>-6.7); +fiducial_cut=inrange(drift_time,[235 280]) & inrange(s2radius_del,[0,max_r]); + +tritium_cut= clean_cut & pulse_area_cut & fiducial_cut; + + + + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + + s2_s1_bin= 1:0.05:5; + ER_bin_size=3; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + clear mean_ER_band_err lower_bound_err upper_bound_err lower_bound mean_ER_band upper_bound ... + gauss_sig_list_err gauss_amp_list gauss_amp_list_err + + %Refit the NR band - ER binning is same as NR binning + NR_mean_data=NR_mean_fit_points; + NR_mean_data_err=NR_mean_fit_points_err; + + + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=tritium_cut & inrange(s1_phe_both_xyz,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); +% ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + + ER_bin_count(index_i)=length(s1_phe_both_xyz(ER_fit_cut)); + ER_bin_belowNR_count(index_i)=length(s1_phe_both_xyz(ER_fit_cut & log10(s2_phe_both_xyz./s1_phe_both_xyz)1)',mean_ER_band(ER_bins>1)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit{bin_counter}=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + + ER_lower_power_fit=fit(ER_bins(ER_bins>1)',lower_bound(ER_bins>1)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit{bin_counter}=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + + ER_upper_power_fit=fit(ER_bins(ER_bins>1)',upper_bound(ER_bins>1)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit{bin_counter}=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + + ER_mean_fit_points{bin_counter}=mean_ER_band; + ER_lower_fit_points{bin_counter}=lower_bound; + ER_upper_fit_points{bin_counter}=upper_bound; + + ER_mean_fit_points_err{bin_counter}=mean_ER_band_err; + ER_lower_fit_points_err{bin_counter}=lower_bound_err; + ER_upper_fit_points_err{bin_counter}=upper_bound_err; + + ER_bins_tracked{bin_counter}=ER_bins; + + + + + NR_bin_data=NR_bins_tracked; + NR_mean_refit=fit(NR_bin_data(NR_bin_data>1)',NR_mean_data(NR_bin_data>1)',g,'startpoint',[ 2.5 -.1]); + + + %Gaussian Assumption + clear gauss_mean gauss_sig gauss_amp gauss_amp_err gauss_mean_err gauss_sig_err leakage_frac_err leakage_frac NR_mean + for i=1:length(mean_ER_band) + + NR_mean=NR_mean_data(i); + gauss_mean= mean_ER_band(i); + gauss_sig= ER_sigma(i); + gauss_amp=amp(i); %estimate gaussian amplitude from the individual bins + gauss_amp_err=amp_err(i); %estimate gaussian amplitude error from the individual bins + gauss_mean_err=mean_ER_band_err(i); %estimate mean err from the individual bins + gauss_sig_err=ER_sigma_sigma(i); %estimate sigma error from the individual bins + + %Using solution of definite integral so that I can propogate errors with analytic approach + total_count=sqrt(pi./2).*gauss_amp.*gauss_sig.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) + 1 ); + leakage_count=sqrt(pi./2).*gauss_amp.*gauss_sig.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) - erf((gauss_mean-NR_mean)./(sqrt(2).*gauss_sig))); + + %derivative w.r.t amplitude + total_count_damp = sqrt(pi/2).*gauss_sig.*(erf(gauss_mean/(sqrt(2)*gauss_sig)) +1); + leakage_count_damp= sqrt(pi/2).*gauss_sig.*(erf(gauss_mean/(sqrt(2)*gauss_sig)) - erf((gauss_mean - NR_mean)/(sqrt(2)*gauss_sig))); + + %derivative w.r.t mean + total_count_dmean = gauss_amp.*exp(-(gauss_mean.^2)./(2.*gauss_sig.^2)); + leakage_count_dmean = sqrt(pi/2).*gauss_amp.*gauss_sig.*( ( sqrt(2/pi).*exp(-(gauss_mean.^2)./(2.*gauss_sig.^2)))./gauss_sig - sqrt(2/pi).*exp(-((gauss_mean-NR_mean).^2)./(2.*gauss_sig.^2))./gauss_sig); + + %derivative w.r.t sigma + total_count_dsig=sqrt(pi/2).*gauss_amp.* (erf ( gauss_mean./(sqrt(2).*gauss_sig)) + 1) - (gauss_amp .* gauss_mean .* exp( - (gauss_mean.^2)./(2.*gauss_sig.^2)))./gauss_sig; + leakage_count_dsig=sqrt(pi/2).*gauss_amp.*gauss_sig.*( (sqrt(2/pi).*(gauss_mean-NR_mean).*exp( (-(gauss_mean-NR_mean).^2)./(2.*gauss_sig.^2)))./(gauss_sig.^2) ... + - (sqrt(2/pi).*(gauss_mean).*exp( (-(gauss_mean).^2)./(2.*gauss_sig.^2)))./(gauss_sig.^2)) + ... + sqrt(pi/2).*gauss_amp.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) - erf((gauss_mean-NR_mean)./(sqrt(2).*gauss_sig))); + + total_count_err=sqrt( (total_count_damp.*gauss_amp_err).^2 + (total_count_dmean.*gauss_mean_err).^2 + (total_count_dsig.*gauss_sig_err).^2); + leakage_count_err=sqrt( (leakage_count_damp.*gauss_amp_err).^2 + (leakage_count_dmean.*gauss_mean_err).^2 + (leakage_count_dsig.*gauss_sig_err).^2); + + leakage_frac(i)=leakage_count./total_count; + leakage_frac_err(i)=sqrt( (leakage_count_err./total_count).^2 + (leakage_count.*total_count_err./(total_count.^2)).^2); + + end + + + gaussian_leakage_frac_tracker{bin_counter}=leakage_frac; + gaussian_leakage_frac_err_tracker{bin_counter}=leakage_frac_err; + + + %Counting Data Approach + clear gauss_mean gauss_sig gauss_amp gauss_amp_err gauss_mean_err gauss_sig_err leakage_frac_err leakage_frac NR_mean + for i=1:length(mean_ER_band) + + %Number of events in S1 bin + total_count=ER_bin_count(i); + leakage_count=ER_bin_belowNR_count(i); + + total_count_err=sqrt(total_count); + leakage_count_err=sqrt(leakage_count); + + leakage_frac(i)=leakage_count./total_count; + leakage_frac_err(i)=sqrt( (leakage_count_err./total_count).^2 + (leakage_count.*total_count_err./(total_count.^2)).^2); + + end + + + counting_leakage_frac_tracker{bin_counter}=leakage_frac; + counting_leakage_frac_err_tracker{bin_counter}=leakage_frac_err; + + %Based on ER Fit Approach + i=1; + clear gauss_mean gauss_sig gauss_amp gauss_amp_err gauss_mean_err gauss_sig_err leakage_frac_err leakage_frac NR_mean + for S1_val=1:1:49 + + NR_mean=NR_mean_refit.a.*S1_val.^(NR_mean_refit.b); + + gauss_mean= ER_mean_power_fit.a.*S1_val.^(ER_mean_power_fit.b); + gauss_sig= abs((ER_upper_power_fit.a.*S1_val.^(ER_upper_power_fit.b)) - gauss_mean)/1.28; + gauss_amp=interp1(ER_bins,gauss_amp_list,S1_val); %estimate gaussian amplitude from the individual bins + gauss_amp_err=interp1(ER_bins,gauss_amp_list_err,S1_val); %estimate gaussian amplitude error from the individual bins + gauss_mean_err=interp1(ER_bins,mean_ER_band_err,S1_val); %estimate mean err from the individual bins + gauss_sig_err=interp1(ER_bins,gauss_sig_list_err,S1_val); %estimate sigma error from the individual bins + + %Using solution of definite integral so that I can propogate errors with analytic approach + total_count=sqrt(pi./2).*gauss_amp.*gauss_sig.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) + 1 ); + leakage_count=sqrt(pi./2).*gauss_amp.*gauss_sig.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) - erf((gauss_mean-NR_mean)./(sqrt(2).*gauss_sig))); + + %derivative w.r.t amplitude + total_count_damp = sqrt(pi/2).*gauss_sig.*(erf(gauss_mean/(sqrt(2)*gauss_sig)) +1); + leakage_count_damp= sqrt(pi/2).*gauss_sig.*(erf(gauss_mean/(sqrt(2)*gauss_sig)) - erf((gauss_mean - NR_mean)/(sqrt(2)*gauss_sig))); + + %derivative w.r.t mean + total_count_dmean = gauss_amp.*exp(-(gauss_mean.^2)./(2.*gauss_sig.^2)); + leakage_count_dmean = sqrt(pi/2).*gauss_amp.*gauss_sig.*( ( sqrt(2/pi).*exp(-(gauss_mean.^2)./(2.*gauss_sig.^2)))./gauss_sig - sqrt(2/pi).*exp(-((gauss_mean-NR_mean).^2)./(2.*gauss_sig.^2))./gauss_sig); + + %derivative w.r.t sigma + total_count_dsig=sqrt(pi/2).*gauss_amp.* (erf ( gauss_mean./(sqrt(2).*gauss_sig)) + 1) - (gauss_amp .* gauss_mean .* exp( - (gauss_mean.^2)./(2.*gauss_sig.^2)))./gauss_sig; + leakage_count_dsig=sqrt(pi/2).*gauss_amp.*gauss_sig.*( (sqrt(2/pi).*(gauss_mean-NR_mean).*exp( (-(gauss_mean-NR_mean).^2)./(2.*gauss_sig.^2)))./(gauss_sig.^2) ... + - (sqrt(2/pi).*(gauss_mean).*exp( (-(gauss_mean).^2)./(2.*gauss_sig.^2)))./(gauss_sig.^2)) + ... + sqrt(pi/2).*gauss_amp.*( erf(gauss_mean./(sqrt(2).*gauss_sig)) - erf((gauss_mean-NR_mean)./(sqrt(2).*gauss_sig))); + + total_count_err=sqrt( (total_count_damp.*gauss_amp_err).^2 + (total_count_dmean.*gauss_mean_err).^2 + (total_count_dsig.*gauss_sig_err).^2); + leakage_count_err=sqrt( (leakage_count_damp.*gauss_amp_err).^2 + (leakage_count_dmean.*gauss_mean_err).^2 + (leakage_count_dsig.*gauss_sig_err).^2); + + leakage_frac(i)=leakage_count./total_count; + leakage_frac_err(i)=sqrt( (leakage_count_err./total_count).^2 + (leakage_count.*total_count_err./(total_count.^2)).^2); + i=i+1; + + end + + Fit_leakage_frac_tracker{bin_counter}=leakage_frac; + Fit_leakage_frac_err_tracker{bin_counter}=leakage_frac_err; + + %% Plot the final result + colors={[1 0 0],[0 1 0],[0 0 1],[0 0 0],[0.8 0.5 0]}; + + figure; + hold on + ylabel('Counting Leakage Fraction'); xlabel('S1 corrected (Pulse Area Phe)'); + myfigview(16); +% ylim([0 3.5]);xlim([0 s1_max]); + + for i=1:length(counting_leakage_frac_tracker) + errorbar(ER_bins_tracked{i},counting_leakage_frac_tracker{i},counting_leakage_frac_err_tracker{i},'Color',colors{i}) + end + legend('35-75 uSec','75-125 uSec','125-175 uSec','180-225 uSec','235-280 uSec') + + figure; + hold on + ylabel('Gaussian Leakage Fraction'); xlabel('S1 corrected (Pulse Area Phe)'); + myfigview(16); +% ylim([0 3.5]);xlim([0 s1_max]); + + for i=1:length(counting_leakage_frac_tracker) + errorbar(ER_bins_tracked{i},gaussian_leakage_frac_tracker{i},gaussian_leakage_frac_err_tracker{i},'Color',colors{i}) + end + + legend('35-75 uSec','75-125 uSec','125-175 uSec','180-225 uSec','235-280 uSec') + + figure; + hold on + ylabel('Fit Leakage Fraction'); xlabel('S1 corrected (Pulse Area Phe)'); + myfigview(16); +% ylim([0 3.5]);xlim([0 s1_max]); + + for i=1:length(counting_leakage_frac_tracker) + errorbar([1:1:49],Fit_leakage_frac_tracker{i},Fit_leakage_frac_err_tracker{i},'Color',colors{i}) + end + + legend('35-75 uSec','75-125 uSec','125-175 uSec','180-225 uSec','235-280 uSec') \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/Discrimination/MakeMappingParamStart_CH3T.m b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/Discrimination/MakeMappingParamStart_CH3T.m new file mode 100644 index 0000000..a609ba1 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/Discrimination/MakeMappingParamStart_CH3T.m @@ -0,0 +1,415 @@ +path='C:\Users\Richard\Desktop\LUX Analysis\lux10_20140903T1918_cp17059'; + + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm','x_cm_tmplt','y_cm_tmplt'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +delay_min=0; +file_id_cp='test'; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 70000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + + + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + + zcut_min = 10; %field changes at 4 uSec + zcut_max = 0.95*det_edge; + + + if Kr_events < 30000 %then create a 10x10 grid. Otherwise 25x25. Want about 30 evts per bin + + S1xybinsize = sqrt((50*50)/(Kr_events/150)); + S1_xbin_min = -25; + S1_xbin_max = 25; + S1_ybin_min = -25; + S1_ybin_max = 25; + SE_ybin_min = -25; + SE_ybin_max = 25; + + S2xybinsize = sqrt((50*50)/(Kr_events/150));%cm +% SExybinsize = 5; DEFINED LATER, based on number of SE events + S2_xbin_min = -25; + S2_xbin_max = 25; + S2_ybin_min = -25; + S2_ybin_max = 25; + SE_xbin_min = -25; + SE_xbin_max = 25; + + + end + + s1_xbins = (S1_xbin_max-S1_xbin_min)./S1xybinsize; + s1_ybins = (S1_ybin_max-S1_ybin_min)./S1xybinsize; + + s2_xbins = (S2_xbin_max-S2_xbin_min)./S2xybinsize; + s2_ybins = (S2_ybin_max-S2_ybin_min)./S2xybinsize; + + %% Kr S1a/S2b map + +%Set up cuts and variables + s1ab_cut=logical(sum(s1_single_cut(:,:),1)); + s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); + s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); + s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); + s1ab_x=d.x_cm(s2_single_cut); + s1ab_y=d.y_cm(s2_single_cut); + s1ab_z=d.z_drift_samples(s2_single_cut)/100; + s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); + s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<25; + %plotting x=s1a v y=s1a/s1b cuts: y<0.035x-1, y>-0.035.*x+5; y>0.01.*x; %y<4.2; x<255 +% s1ab_areacut= (s1a_phe_both./s1b_phe_both-0.035.*s1a_phe_both<-1) & (s1a_phe_both./s1b_phe_both+0.035.*s1a_phe_both>5)... +% & (s1a_phe_both./s1b_phe_both > 0.01.* s1a_phe_both) & (s1a_phe_both./s1b_phe_both<4.2) & (s1a_phe_both<255); + + s1ab_x=s1ab_x(s1ab_timing_cut); + s1ab_y=s1ab_y(s1ab_timing_cut); + s1ab_z=s1ab_z(s1ab_timing_cut); + s1a_phe_both=s1a_phe_both(s1ab_timing_cut); + s1b_phe_both=s1b_phe_both(s1ab_timing_cut); + s1ab_radius=s1ab_radius(s1ab_timing_cut); + + %fidicual Z cut for s1ab_xy measurement + [s1ab_z_hist s1ab_z_hist_bins]=hist(s1ab_z(inrange(s1ab_z,[0,400])),[0:1:400]); + frac_hist=cumsum(s1ab_z_hist)./sum(s1ab_z_hist); + s1ab_z_cut_lower= min(s1ab_z_hist_bins(frac_hist>.10)); + s1ab_z_cut_upper= max(s1ab_z_hist_bins(frac_hist<.90)); + s1ab_z_cut=inrange(s1ab_z,[s1ab_z_cut_lower,s1ab_z_cut_upper]); + + %R cut for s1ab_Z measurement + [upperz_r_hist upperz_r_hist_bins]=hist(s1ab_radius(s1ab_z>s1ab_z_cut_upper & s1ab_radius<=26),[0:1:26]); + [lowerz_r_hist lowerz_r_hist_bins]=hist(s1ab_radius(s1ab_z0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:400]).','gauss1'); + s1b_fit=fit([0:2:300].',hist(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:300]).','gauss1'); + s1a_z_means(i)=s1a_fit.b1; + s1a_z_means_err(i)=s1a_fit.c1/sqrt(2)/sqrt(length(s1a_phe_both(s1ab_r_cut.' & s1a_phe_both>0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1b_z_means(i)=s1b_fit.b1; + s1b_z_means_err(i)=s1b_fit.c1/sqrt(2)/sqrt(length(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1ab_bincenters(i)=z_max-dT_step/2; + i=i+1; + end + +s1ab_z_means=s1a_z_means./s1b_z_means; +s1ab_z_means_err=sqrt( (s1b_z_means_err.*s1a_z_means./(s1b_z_means.^2)).^2 + (s1a_z_means_err./s1b_z_means).^2); + +%fit polynomial to s1az and s1bz, to remove z dependence later in xy fit +[s1a_P, s1a_S]=polyfit(s1ab_bincenters,s1a_z_means,3); +[s1b_P, s1b_S]=polyfit(s1ab_bincenters,s1b_z_means,3); +[s1ab_P, s1ab_S]=polyfit(s1ab_bincenters,s1ab_z_means,2); + +%S1a z dependence plot +s1az_plot=figure; +errorbar(s1ab_bincenters,s1a_z_means,s1a_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a Mean (phe)'); title('S1a Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1a_P,[10:1:320]),'-r','LineWidth',2) + +%S1b z dependence plot +s1bz_plot=figure; +errorbar(s1ab_bincenters,s1b_z_means,s1b_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1b Mean (phe)'); title('S1b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1b_P,[10:1:320]),'-r','LineWidth',2) + +%S1a/b z dependence plot +s1a_over_bz_plot=figure; +errorbar(s1ab_bincenters,s1ab_z_means,s1ab_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a/b'); title('S1 a/b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1ab_P,[10:1:320]),'-r','LineWidth',2) + + +%Correcting z dependence to get XY dependence in same manner that Kr/CH3T +%map does + s1a_phe_both_z=s1a_phe_both.'.*polyval(s1a_P,z_center)./polyval(s1a_P,s1ab_z); + s1b_phe_both_z=s1b_phe_both.'.*polyval(s1b_P,z_center)./polyval(s1b_P,s1ab_z); + + %% S1a/b XY map (after z correction) +s1ab_xbin_min=-25; +s1ab_ybin_min=-25; +s1ab_xbin_max=25; +s1ab_ybin_max=25; +s1ab_xybinsize=sqrt((50*50)/(length(s1ab_z)/300)); +clear s1a_xy_mean s1a_xy_mean_err s1b_xy_mean s1b_xy_mean_err + +s1ab_xbins=s1ab_xbin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_xbin_max; +s1ab_ybins=s1ab_ybin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_ybin_max; + +s1a_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); +s1b_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); + + for x_bin=s1ab_xbin_min:s1ab_xybinsize:(s1ab_xbin_max-s1ab_xybinsize/2); + for y_bin=s1ab_ybin_min:s1ab_xybinsize:(s1ab_ybin_max-s1ab_xybinsize/2); + x_min = x_bin; x_max = x_bin+s1ab_xybinsize; + y_min = y_bin; y_max = y_bin+s1ab_xybinsize; + + x_count=int32(1+x_bin/s1ab_xybinsize+s1ab_xbin_max/s1ab_xybinsize); + y_count=int32(1+y_bin/s1ab_xybinsize+s1ab_ybin_max/s1ab_xybinsize); + + bin_cut = s1ab_z_cut.' & inrange(s1ab_z,[10 330]).' & s1a_phe_both>0 & s1b_phe_both>0 & inrange(s1ab_x,[x_min,x_max]).' & inrange(s1ab_y,[y_min,y_max]).'; + if length(s1a_phe_both_z(bin_cut))>100; + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400])),[0:2:400]).','gauss1'); + s1a_xy_mean(y_count,x_count)=s1a_z_fit.b1; + s1a_xy_mean_err(y_count,x_count)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300])),[0:2:300]).','gauss1'); + s1b_xy_mean(y_count,x_count)=s1b_z_fit.b1; + s1b_xy_mean_err(y_count,x_count)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300]))); + else + s1a_xy_mean(y_count,x_count)=0; + s1a_xy_mean_err(y_count,x_count)=0; + s1b_xy_mean(y_count,x_count)=0; + s1b_xy_mean_err(y_count,x_count)=0; + end + + end + end + s1ab_xy_mean=s1a_xy_mean./s1b_xy_mean; + s1ab_xy_mean_err=sqrt( (s1b_xy_mean_err.*s1a_xy_mean./(s1b_xy_mean.^2)).^2 + (s1a_xy_mean_err./s1b_xy_mean).^2); + + + %Plot s1a XY means + color_range_max=max(max(s1a_xy_mean)); + color_range_min=min(min(s1a_xy_mean(s1a_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1a_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1a_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %Plot s1a XY means + color_range_max=max(max(s1b_xy_mean)); + color_range_min=min(min(s1b_xy_mean(s1b_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1b_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1b_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1b Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1b Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %s1a/b XY Ratio + color_range_max=max(max(s1ab_xy_mean)); + color_range_min=min(min(s1ab_xy_mean(s1ab_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1ab_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a/b Ratio vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a/b Ratio','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + +%% 3D Kr s1a/s1b map +if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +s1ab_xyz_numbins=floor((length(s1ab_z)/200)^(1/3)); %number of bins in one direction +s1ab_xyz_zstep=det_edge/s1ab_xyz_numbins; +s1ab_xyz_xstep=50/s1ab_xyz_numbins; +s1ab_xyz_ystep=50/s1ab_xyz_numbins; +s1ab_xyz_xmax=25; +r_max=25; + +s1ab_xyz_zbins=10+s1ab_xyz_zstep/2:s1ab_xyz_zstep:10+s1ab_xyz_zstep/2+s1ab_xyz_zstep*s1ab_xyz_numbins; %20 us +s1ab_xyz_xbins=(-r_max+s1ab_xyz_xstep/2):s1ab_xyz_xstep:r_max; +s1ab_xyz_ybins=(-r_max+s1ab_xyz_ystep/2):s1ab_xyz_ystep:r_max; + +s1a_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + + %Count the number of events per bin + Count_S1ab_3D(l,m,n)=length(s1a_phe_both(q)); + + if (Count_S1ab_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_xyz_mean(l,m,n)=s1a_z_fit.b1; + s1a_xyz_mean_err(l,m,n)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]) ),[0:2:300]).','gauss1'); + s1b_xyz_mean(l,m,n)=s1b_z_fit.b1; + s1b_xyz_mean_err(l,m,n)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); + else %not enough stats to do the fit + s1a_xyz_mean(l,m,n)=0; + s1a_xyz_mean_err(l,m,n)=0; + s1b_xyz_mean(l,m,n)=0; + s1b_xyz_mean_err(l,m,n)=0; + end + + end + end +k +end + + s1ab_xyz_mean=s1a_xyz_mean./s1b_xyz_mean; + s1ab_xyz_mean_err=sqrt( (s1b_xyz_mean_err.*s1a_xyz_mean./(s1b_xyz_mean.^2)).^2 + (s1a_xyz_mean_err./s1b_xyz_mean).^2); + +end + +save('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\KrypCal2p21_QualityChecks\Discrimination\MappingParametersFit_Start_CH3T','s1ab_xyz_xbins','s1ab_xyz_ybins','s1ab_xyz_zbins','s1ab_xyz_mean','Kr_events','S1_xbin_max','S1_xbin_min','S1_ybin_max','S1_ybin_min','S1xybinsize','S2_xbin_max','S2_xbin_min','S2_ybin_max','S2_ybin_min','S2xybinsize','det_edge','drift_time','g','grid_size','i','max_num_bins','min_evts_per_bin','rcut_max','rcut_min','s1_phe_both','s1_phe_bottom','s1_width','s1_xbins','s1_ybins','s1a_P','s1a_S','s1a_fit','s1a_over_bz_plot','s1a_xy_fig','s1a_xy_mean','s1a_xy_mean_err','s1a_z_fit','s1a_z_means','s1a_z_means_err','s1ab_P','s1ab_S','s1ab_bincenters','s1ab_x','s1ab_xbin_max','s1ab_xbin_min','s1ab_xbins','s1ab_xy_fig','s1ab_xy_mean','s1ab_xy_mean_err','s1ab_xybinsize','s1ab_y','s1ab_ybin_max','s1ab_ybin_min','s1ab_ybins','s1ab_z','s1ab_z_means','s1ab_z_means_err','s1area_bound_max','s1area_bound_min','s1az_plot','s1b_P','s1b_S','s1b_fit','s1b_xy_fig','s1b_xy_mean','s1b_xy_mean_err','s1b_z_fit','s1b_z_means','s1b_z_means_err','s1bz_plot','s2_phe_both','s2_phe_bottom','s2_width','s2_xbins','s2_ybins','s2area_bound_max','s2area_bound_min','s2radius','s2x','s2y','x_bin','x_center','x_count','x_max','x_min','y_bin','y_center','y_count','y_max','y_min','z_center','z_max','zcut_max','zcut_min'); \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/Discrimination/MakeMappingParamStart_DD.m b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/Discrimination/MakeMappingParamStart_DD.m new file mode 100644 index 0000000..9f9592e --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/Discrimination/MakeMappingParamStart_DD.m @@ -0,0 +1,415 @@ +path='C:\Users\Richard\Desktop\LUX Analysis\MultiZDD_KrData\lux10_20140920T1613_cp13946'; + + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm','x_cm_tmplt','y_cm_tmplt'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +delay_min=0; +file_id_cp='test'; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 70000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + + + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + + zcut_min = 10; %field changes at 4 uSec + zcut_max = 0.95*det_edge; + + + if Kr_events < 30000 %then create a 10x10 grid. Otherwise 25x25. Want about 30 evts per bin + + S1xybinsize = sqrt((50*50)/(Kr_events/150)); + S1_xbin_min = -25; + S1_xbin_max = 25; + S1_ybin_min = -25; + S1_ybin_max = 25; + SE_ybin_min = -25; + SE_ybin_max = 25; + + S2xybinsize = sqrt((50*50)/(Kr_events/150));%cm +% SExybinsize = 5; DEFINED LATER, based on number of SE events + S2_xbin_min = -25; + S2_xbin_max = 25; + S2_ybin_min = -25; + S2_ybin_max = 25; + SE_xbin_min = -25; + SE_xbin_max = 25; + + + end + + s1_xbins = (S1_xbin_max-S1_xbin_min)./S1xybinsize; + s1_ybins = (S1_ybin_max-S1_ybin_min)./S1xybinsize; + + s2_xbins = (S2_xbin_max-S2_xbin_min)./S2xybinsize; + s2_ybins = (S2_ybin_max-S2_ybin_min)./S2xybinsize; + + %% Kr S1a/S2b map + +%Set up cuts and variables + s1ab_cut=logical(sum(s1_single_cut(:,:),1)); + s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); + s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); + s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); + s1ab_x=d.x_cm(s2_single_cut); + s1ab_y=d.y_cm(s2_single_cut); + s1ab_z=d.z_drift_samples(s2_single_cut)/100; + s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); + s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<25; + %plotting x=s1a v y=s1a/s1b cuts: y<0.035x-1, y>-0.035.*x+5; y>0.01.*x; %y<4.2; x<255 +% s1ab_areacut= (s1a_phe_both./s1b_phe_both-0.035.*s1a_phe_both<-1) & (s1a_phe_both./s1b_phe_both+0.035.*s1a_phe_both>5)... +% & (s1a_phe_both./s1b_phe_both > 0.01.* s1a_phe_both) & (s1a_phe_both./s1b_phe_both<4.2) & (s1a_phe_both<255); + + s1ab_x=s1ab_x(s1ab_timing_cut); + s1ab_y=s1ab_y(s1ab_timing_cut); + s1ab_z=s1ab_z(s1ab_timing_cut); + s1a_phe_both=s1a_phe_both(s1ab_timing_cut); + s1b_phe_both=s1b_phe_both(s1ab_timing_cut); + s1ab_radius=s1ab_radius(s1ab_timing_cut); + + %fidicual Z cut for s1ab_xy measurement + [s1ab_z_hist s1ab_z_hist_bins]=hist(s1ab_z(inrange(s1ab_z,[0,400])),[0:1:400]); + frac_hist=cumsum(s1ab_z_hist)./sum(s1ab_z_hist); + s1ab_z_cut_lower= min(s1ab_z_hist_bins(frac_hist>.10)); + s1ab_z_cut_upper= max(s1ab_z_hist_bins(frac_hist<.90)); + s1ab_z_cut=inrange(s1ab_z,[s1ab_z_cut_lower,s1ab_z_cut_upper]); + + %R cut for s1ab_Z measurement + [upperz_r_hist upperz_r_hist_bins]=hist(s1ab_radius(s1ab_z>s1ab_z_cut_upper & s1ab_radius<=26),[0:1:26]); + [lowerz_r_hist lowerz_r_hist_bins]=hist(s1ab_radius(s1ab_z0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:400]).','gauss1'); + s1b_fit=fit([0:2:300].',hist(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:300]).','gauss1'); + s1a_z_means(i)=s1a_fit.b1; + s1a_z_means_err(i)=s1a_fit.c1/sqrt(2)/sqrt(length(s1a_phe_both(s1ab_r_cut.' & s1a_phe_both>0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1b_z_means(i)=s1b_fit.b1; + s1b_z_means_err(i)=s1b_fit.c1/sqrt(2)/sqrt(length(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1ab_bincenters(i)=z_max-dT_step/2; + i=i+1; + end + +s1ab_z_means=s1a_z_means./s1b_z_means; +s1ab_z_means_err=sqrt( (s1b_z_means_err.*s1a_z_means./(s1b_z_means.^2)).^2 + (s1a_z_means_err./s1b_z_means).^2); + +%fit polynomial to s1az and s1bz, to remove z dependence later in xy fit +[s1a_P, s1a_S]=polyfit(s1ab_bincenters,s1a_z_means,3); +[s1b_P, s1b_S]=polyfit(s1ab_bincenters,s1b_z_means,3); +[s1ab_P, s1ab_S]=polyfit(s1ab_bincenters,s1ab_z_means,2); + +%S1a z dependence plot +s1az_plot=figure; +errorbar(s1ab_bincenters,s1a_z_means,s1a_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a Mean (phe)'); title('S1a Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1a_P,[10:1:320]),'-r','LineWidth',2) + +%S1b z dependence plot +s1bz_plot=figure; +errorbar(s1ab_bincenters,s1b_z_means,s1b_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1b Mean (phe)'); title('S1b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1b_P,[10:1:320]),'-r','LineWidth',2) + +%S1a/b z dependence plot +s1a_over_bz_plot=figure; +errorbar(s1ab_bincenters,s1ab_z_means,s1ab_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a/b'); title('S1 a/b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1ab_P,[10:1:320]),'-r','LineWidth',2) + + +%Correcting z dependence to get XY dependence in same manner that Kr/CH3T +%map does + s1a_phe_both_z=s1a_phe_both.'.*polyval(s1a_P,z_center)./polyval(s1a_P,s1ab_z); + s1b_phe_both_z=s1b_phe_both.'.*polyval(s1b_P,z_center)./polyval(s1b_P,s1ab_z); + + %% S1a/b XY map (after z correction) +s1ab_xbin_min=-25; +s1ab_ybin_min=-25; +s1ab_xbin_max=25; +s1ab_ybin_max=25; +s1ab_xybinsize=sqrt((50*50)/(length(s1ab_z)/300)); +clear s1a_xy_mean s1a_xy_mean_err s1b_xy_mean s1b_xy_mean_err + +s1ab_xbins=s1ab_xbin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_xbin_max; +s1ab_ybins=s1ab_ybin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_ybin_max; + +s1a_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); +s1b_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); + + for x_bin=s1ab_xbin_min:s1ab_xybinsize:(s1ab_xbin_max-s1ab_xybinsize/2); + for y_bin=s1ab_ybin_min:s1ab_xybinsize:(s1ab_ybin_max-s1ab_xybinsize/2); + x_min = x_bin; x_max = x_bin+s1ab_xybinsize; + y_min = y_bin; y_max = y_bin+s1ab_xybinsize; + + x_count=int32(1+x_bin/s1ab_xybinsize+s1ab_xbin_max/s1ab_xybinsize); + y_count=int32(1+y_bin/s1ab_xybinsize+s1ab_ybin_max/s1ab_xybinsize); + + bin_cut = s1ab_z_cut.' & inrange(s1ab_z,[10 330]).' & s1a_phe_both>0 & s1b_phe_both>0 & inrange(s1ab_x,[x_min,x_max]).' & inrange(s1ab_y,[y_min,y_max]).'; + if length(s1a_phe_both_z(bin_cut))>100; + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400])),[0:2:400]).','gauss1'); + s1a_xy_mean(y_count,x_count)=s1a_z_fit.b1; + s1a_xy_mean_err(y_count,x_count)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300])),[0:2:300]).','gauss1'); + s1b_xy_mean(y_count,x_count)=s1b_z_fit.b1; + s1b_xy_mean_err(y_count,x_count)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300]))); + else + s1a_xy_mean(y_count,x_count)=0; + s1a_xy_mean_err(y_count,x_count)=0; + s1b_xy_mean(y_count,x_count)=0; + s1b_xy_mean_err(y_count,x_count)=0; + end + + end + end + s1ab_xy_mean=s1a_xy_mean./s1b_xy_mean; + s1ab_xy_mean_err=sqrt( (s1b_xy_mean_err.*s1a_xy_mean./(s1b_xy_mean.^2)).^2 + (s1a_xy_mean_err./s1b_xy_mean).^2); + + + %Plot s1a XY means + color_range_max=max(max(s1a_xy_mean)); + color_range_min=min(min(s1a_xy_mean(s1a_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1a_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1a_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %Plot s1a XY means + color_range_max=max(max(s1b_xy_mean)); + color_range_min=min(min(s1b_xy_mean(s1b_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1b_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1b_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1b Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1b Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %s1a/b XY Ratio + color_range_max=max(max(s1ab_xy_mean)); + color_range_min=min(min(s1ab_xy_mean(s1ab_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1ab_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a/b Ratio vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a/b Ratio','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + +%% 3D Kr s1a/s1b map +if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +s1ab_xyz_numbins=floor((length(s1ab_z)/200)^(1/3)); %number of bins in one direction +s1ab_xyz_zstep=det_edge/s1ab_xyz_numbins; +s1ab_xyz_xstep=50/s1ab_xyz_numbins; +s1ab_xyz_ystep=50/s1ab_xyz_numbins; +s1ab_xyz_xmax=25; +r_max=25; + +s1ab_xyz_zbins=10+s1ab_xyz_zstep/2:s1ab_xyz_zstep:10+s1ab_xyz_zstep/2+s1ab_xyz_zstep*s1ab_xyz_numbins; %20 us +s1ab_xyz_xbins=(-r_max+s1ab_xyz_xstep/2):s1ab_xyz_xstep:r_max; +s1ab_xyz_ybins=(-r_max+s1ab_xyz_ystep/2):s1ab_xyz_ystep:r_max; + +s1a_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + + %Count the number of events per bin + Count_S1ab_3D(l,m,n)=length(s1a_phe_both(q)); + + if (Count_S1ab_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_xyz_mean(l,m,n)=s1a_z_fit.b1; + s1a_xyz_mean_err(l,m,n)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]) ),[0:2:300]).','gauss1'); + s1b_xyz_mean(l,m,n)=s1b_z_fit.b1; + s1b_xyz_mean_err(l,m,n)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); + else %not enough stats to do the fit + s1a_xyz_mean(l,m,n)=0; + s1a_xyz_mean_err(l,m,n)=0; + s1b_xyz_mean(l,m,n)=0; + s1b_xyz_mean_err(l,m,n)=0; + end + + end + end +k +end + + s1ab_xyz_mean=s1a_xyz_mean./s1b_xyz_mean; + s1ab_xyz_mean_err=sqrt( (s1b_xyz_mean_err.*s1a_xyz_mean./(s1b_xyz_mean.^2)).^2 + (s1a_xyz_mean_err./s1b_xyz_mean).^2); + +end + +save('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\KrypCal2p21_QualityChecks\Discrimination\MappingParametersFit_Start_DD','Kr_events','S1_xbin_max','S1_xbin_min','S1_ybin_max','S1_ybin_min','S1xybinsize','S2_xbin_max','S2_xbin_min','S2_ybin_max','S2_ybin_min','S2xybinsize','det_edge','drift_time','g','grid_size','i','max_num_bins','min_evts_per_bin','rcut_max','rcut_min','s1_phe_both','s1_phe_bottom','s1_width','s1_xbins','s1_ybins','s1a_P','s1a_S','s1a_fit','s1a_over_bz_plot','s1a_xy_fig','s1a_xy_mean','s1a_xy_mean_err','s1a_z_fit','s1a_z_means','s1a_z_means_err','s1ab_P','s1ab_S','s1ab_bincenters','s1ab_x','s1ab_xbin_max','s1ab_xbin_min','s1ab_xbins','s1ab_xy_fig','s1ab_xy_mean','s1ab_xy_mean_err','s1ab_xybinsize','s1ab_y','s1ab_ybin_max','s1ab_ybin_min','s1ab_ybins','s1ab_z','s1ab_z_means','s1ab_z_means_err','s1area_bound_max','s1area_bound_min','s1az_plot','s1b_P','s1b_S','s1b_fit','s1b_xy_fig','s1b_xy_mean','s1b_xy_mean_err','s1b_z_fit','s1b_z_means','s1b_z_means_err','s1bz_plot','s2_phe_both','s2_phe_bottom','s2_width','s2_xbins','s2_ybins','s2area_bound_max','s2area_bound_min','s2radius','s2x','s2y','x_bin','x_center','x_count','x_max','x_min','y_bin','y_center','y_count','y_max','y_min','z_center','z_max','zcut_max','zcut_min'); \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/MakeMappingParamStart_Feb2015.m b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/MakeMappingParamStart_Feb2015.m new file mode 100644 index 0000000..9651a1b --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/MakeMappingParamStart_Feb2015.m @@ -0,0 +1,416 @@ +path='C:\Users\Richard\Desktop\LUX Analysis\lux10_20150226T1943_cp18525'; + + + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm','x_cm_tmplt','y_cm_tmplt'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +delay_min=0; +file_id_cp='test'; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 70000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + + + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + + zcut_min = 10; %field changes at 4 uSec + zcut_max = 0.95*det_edge; + + + if Kr_events < 30000 %then create a 10x10 grid. Otherwise 25x25. Want about 30 evts per bin + + S1xybinsize = sqrt((50*50)/(Kr_events/150)); + S1_xbin_min = -25; + S1_xbin_max = 25; + S1_ybin_min = -25; + S1_ybin_max = 25; + SE_ybin_min = -25; + SE_ybin_max = 25; + + S2xybinsize = sqrt((50*50)/(Kr_events/150));%cm +% SExybinsize = 5; DEFINED LATER, based on number of SE events + S2_xbin_min = -25; + S2_xbin_max = 25; + S2_ybin_min = -25; + S2_ybin_max = 25; + SE_xbin_min = -25; + SE_xbin_max = 25; + + + end + + s1_xbins = (S1_xbin_max-S1_xbin_min)./S1xybinsize; + s1_ybins = (S1_ybin_max-S1_ybin_min)./S1xybinsize; + + s2_xbins = (S2_xbin_max-S2_xbin_min)./S2xybinsize; + s2_ybins = (S2_ybin_max-S2_ybin_min)./S2xybinsize; + + %% Kr S1a/S2b map + +%Set up cuts and variables + s1ab_cut=logical(sum(s1_single_cut(:,:),1)); + s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); + s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); + s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); + s1ab_x=d.x_cm(s2_single_cut); + s1ab_y=d.y_cm(s2_single_cut); + s1ab_z=d.z_drift_samples(s2_single_cut)/100; + s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); + s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<25; + %plotting x=s1a v y=s1a/s1b cuts: y<0.035x-1, y>-0.035.*x+5; y>0.01.*x; %y<4.2; x<255 +% s1ab_areacut= (s1a_phe_both./s1b_phe_both-0.035.*s1a_phe_both<-1) & (s1a_phe_both./s1b_phe_both+0.035.*s1a_phe_both>5)... +% & (s1a_phe_both./s1b_phe_both > 0.01.* s1a_phe_both) & (s1a_phe_both./s1b_phe_both<4.2) & (s1a_phe_both<255); + + s1ab_x=s1ab_x(s1ab_timing_cut); + s1ab_y=s1ab_y(s1ab_timing_cut); + s1ab_z=s1ab_z(s1ab_timing_cut); + s1a_phe_both=s1a_phe_both(s1ab_timing_cut); + s1b_phe_both=s1b_phe_both(s1ab_timing_cut); + s1ab_radius=s1ab_radius(s1ab_timing_cut); + + %fidicual Z cut for s1ab_xy measurement + [s1ab_z_hist s1ab_z_hist_bins]=hist(s1ab_z(inrange(s1ab_z,[0,400])),[0:1:400]); + frac_hist=cumsum(s1ab_z_hist)./sum(s1ab_z_hist); + s1ab_z_cut_lower= min(s1ab_z_hist_bins(frac_hist>.10)); + s1ab_z_cut_upper= max(s1ab_z_hist_bins(frac_hist<.90)); + s1ab_z_cut=inrange(s1ab_z,[s1ab_z_cut_lower,s1ab_z_cut_upper]); + + %R cut for s1ab_Z measurement + [upperz_r_hist upperz_r_hist_bins]=hist(s1ab_radius(s1ab_z>s1ab_z_cut_upper & s1ab_radius<=26),[0:1:26]); + [lowerz_r_hist lowerz_r_hist_bins]=hist(s1ab_radius(s1ab_z0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:400]).','gauss1'); + s1b_fit=fit([0:2:300].',hist(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:300]).','gauss1'); + s1a_z_means(i)=s1a_fit.b1; + s1a_z_means_err(i)=s1a_fit.c1/sqrt(2)/sqrt(length(s1a_phe_both(s1ab_r_cut.' & s1a_phe_both>0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1b_z_means(i)=s1b_fit.b1; + s1b_z_means_err(i)=s1b_fit.c1/sqrt(2)/sqrt(length(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1ab_bincenters(i)=z_max-dT_step/2; + i=i+1; + end + +s1ab_z_means=s1a_z_means./s1b_z_means; +s1ab_z_means_err=sqrt( (s1b_z_means_err.*s1a_z_means./(s1b_z_means.^2)).^2 + (s1a_z_means_err./s1b_z_means).^2); + +%fit polynomial to s1az and s1bz, to remove z dependence later in xy fit +[s1a_P, s1a_S]=polyfit(s1ab_bincenters,s1a_z_means,3); +[s1b_P, s1b_S]=polyfit(s1ab_bincenters,s1b_z_means,3); +[s1ab_P, s1ab_S]=polyfit(s1ab_bincenters,s1ab_z_means,2); + +%S1a z dependence plot +s1az_plot=figure; +errorbar(s1ab_bincenters,s1a_z_means,s1a_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a Mean (phe)'); title('S1a Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1a_P,[10:1:320]),'-r','LineWidth',2) + +%S1b z dependence plot +s1bz_plot=figure; +errorbar(s1ab_bincenters,s1b_z_means,s1b_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1b Mean (phe)'); title('S1b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1b_P,[10:1:320]),'-r','LineWidth',2) + +%S1a/b z dependence plot +s1a_over_bz_plot=figure; +errorbar(s1ab_bincenters,s1ab_z_means,s1ab_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a/b'); title('S1 a/b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1ab_P,[10:1:320]),'-r','LineWidth',2) + + +%Correcting z dependence to get XY dependence in same manner that Kr/CH3T +%map does + s1a_phe_both_z=s1a_phe_both.'.*polyval(s1a_P,z_center)./polyval(s1a_P,s1ab_z); + s1b_phe_both_z=s1b_phe_both.'.*polyval(s1b_P,z_center)./polyval(s1b_P,s1ab_z); + + %% S1a/b XY map (after z correction) +s1ab_xbin_min=-25; +s1ab_ybin_min=-25; +s1ab_xbin_max=25; +s1ab_ybin_max=25; +s1ab_xybinsize=sqrt((50*50)/(length(s1ab_z)/300)); +clear s1a_xy_mean s1a_xy_mean_err s1b_xy_mean s1b_xy_mean_err + +s1ab_xbins=s1ab_xbin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_xbin_max; +s1ab_ybins=s1ab_ybin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_ybin_max; + +s1a_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); +s1b_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); + + for x_bin=s1ab_xbin_min:s1ab_xybinsize:(s1ab_xbin_max-s1ab_xybinsize/2); + for y_bin=s1ab_ybin_min:s1ab_xybinsize:(s1ab_ybin_max-s1ab_xybinsize/2); + x_min = x_bin; x_max = x_bin+s1ab_xybinsize; + y_min = y_bin; y_max = y_bin+s1ab_xybinsize; + + x_count=int32(1+x_bin/s1ab_xybinsize+s1ab_xbin_max/s1ab_xybinsize); + y_count=int32(1+y_bin/s1ab_xybinsize+s1ab_ybin_max/s1ab_xybinsize); + + bin_cut = s1ab_z_cut.' & inrange(s1ab_z,[10 330]).' & s1a_phe_both>0 & s1b_phe_both>0 & inrange(s1ab_x,[x_min,x_max]).' & inrange(s1ab_y,[y_min,y_max]).'; + if length(s1a_phe_both_z(bin_cut))>100; + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400])),[0:2:400]).','gauss1'); + s1a_xy_mean(y_count,x_count)=s1a_z_fit.b1; + s1a_xy_mean_err(y_count,x_count)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300])),[0:2:300]).','gauss1'); + s1b_xy_mean(y_count,x_count)=s1b_z_fit.b1; + s1b_xy_mean_err(y_count,x_count)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300]))); + else + s1a_xy_mean(y_count,x_count)=0; + s1a_xy_mean_err(y_count,x_count)=0; + s1b_xy_mean(y_count,x_count)=0; + s1b_xy_mean_err(y_count,x_count)=0; + end + + end + end + s1ab_xy_mean=s1a_xy_mean./s1b_xy_mean; + s1ab_xy_mean_err=sqrt( (s1b_xy_mean_err.*s1a_xy_mean./(s1b_xy_mean.^2)).^2 + (s1a_xy_mean_err./s1b_xy_mean).^2); + + + %Plot s1a XY means + color_range_max=max(max(s1a_xy_mean)); + color_range_min=min(min(s1a_xy_mean(s1a_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1a_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1a_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %Plot s1a XY means + color_range_max=max(max(s1b_xy_mean)); + color_range_min=min(min(s1b_xy_mean(s1b_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1b_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1b_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1b Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1b Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %s1a/b XY Ratio + color_range_max=max(max(s1ab_xy_mean)); + color_range_min=min(min(s1ab_xy_mean(s1ab_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1ab_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a/b Ratio vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a/b Ratio','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + +%% 3D Kr s1a/s1b map +if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +s1ab_xyz_numbins=floor((length(s1ab_z)/200)^(1/3)); %number of bins in one direction +s1ab_xyz_zstep=det_edge/s1ab_xyz_numbins; +s1ab_xyz_xstep=50/s1ab_xyz_numbins; +s1ab_xyz_ystep=50/s1ab_xyz_numbins; +s1ab_xyz_xmax=25; +r_max=25; + +s1ab_xyz_zbins=10+s1ab_xyz_zstep/2:s1ab_xyz_zstep:10+s1ab_xyz_zstep/2+s1ab_xyz_zstep*s1ab_xyz_numbins; %20 us +s1ab_xyz_xbins=(-r_max+s1ab_xyz_xstep/2):s1ab_xyz_xstep:r_max; +s1ab_xyz_ybins=(-r_max+s1ab_xyz_ystep/2):s1ab_xyz_ystep:r_max; + +s1a_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + + %Count the number of events per bin + Count_S1ab_3D(l,m,n)=length(s1a_phe_both(q)); + + if (Count_S1ab_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_xyz_mean(l,m,n)=s1a_z_fit.b1; + s1a_xyz_mean_err(l,m,n)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]) ),[0:2:300]).','gauss1'); + s1b_xyz_mean(l,m,n)=s1b_z_fit.b1; + s1b_xyz_mean_err(l,m,n)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); + else %not enough stats to do the fit + s1a_xyz_mean(l,m,n)=0; + s1a_xyz_mean_err(l,m,n)=0; + s1b_xyz_mean(l,m,n)=0; + s1b_xyz_mean_err(l,m,n)=0; + end + + end + end +k +end + + s1ab_xyz_mean=s1a_xyz_mean./s1b_xyz_mean; + s1ab_xyz_mean_err=sqrt( (s1b_xyz_mean_err.*s1a_xyz_mean./(s1b_xyz_mean.^2)).^2 + (s1a_xyz_mean_err./s1b_xyz_mean).^2); + +end + +save('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\KrypCal2p21_QualityChecks\ERBand_Prediction\MappingParametersStart_Feb2015','s1ab_xyz_xbins','s1ab_xyz_ybins','s1ab_xyz_zbins','s1ab_xyz_mean','Kr_events','S1_xbin_max','S1_xbin_min','S1_ybin_max','S1_ybin_min','S1xybinsize','S2_xbin_max','S2_xbin_min','S2_ybin_max','S2_ybin_min','S2xybinsize','det_edge','drift_time','g','grid_size','i','max_num_bins','min_evts_per_bin','rcut_max','rcut_min','s1_phe_both','s1_phe_bottom','s1_width','s1_xbins','s1_ybins','s1a_P','s1a_S','s1a_fit','s1a_over_bz_plot','s1a_xy_fig','s1a_xy_mean','s1a_xy_mean_err','s1a_z_fit','s1a_z_means','s1a_z_means_err','s1ab_P','s1ab_S','s1ab_bincenters','s1ab_x','s1ab_xbin_max','s1ab_xbin_min','s1ab_xbins','s1ab_xy_fig','s1ab_xy_mean','s1ab_xy_mean_err','s1ab_xybinsize','s1ab_y','s1ab_ybin_max','s1ab_ybin_min','s1ab_ybins','s1ab_z','s1ab_z_means','s1ab_z_means_err','s1area_bound_max','s1area_bound_min','s1az_plot','s1b_P','s1b_S','s1b_fit','s1b_xy_fig','s1b_xy_mean','s1b_xy_mean_err','s1b_z_fit','s1b_z_means','s1b_z_means_err','s1bz_plot','s2_phe_both','s2_phe_bottom','s2_width','s2_xbins','s2_ybins','s2area_bound_max','s2area_bound_min','s2radius','s2x','s2y','x_bin','x_center','x_count','x_max','x_min','y_bin','y_center','y_count','y_max','y_min','z_center','z_max','zcut_max','zcut_min'); \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/MakeMappingParamStart_Feb2016.m b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/MakeMappingParamStart_Feb2016.m new file mode 100644 index 0000000..e482fd0 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/MakeMappingParamStart_Feb2016.m @@ -0,0 +1,416 @@ +path='C:\Users\Richard\Desktop\LUX Analysis\lux10_20160208T0930_cp19837'; + + + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm','x_cm_tmplt','y_cm_tmplt'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +delay_min=0; +file_id_cp='test'; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 70000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + + + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + + zcut_min = 10; %field changes at 4 uSec + zcut_max = 0.95*det_edge; + + + if Kr_events < 30000 %then create a 10x10 grid. Otherwise 25x25. Want about 30 evts per bin + + S1xybinsize = sqrt((50*50)/(Kr_events/150)); + S1_xbin_min = -25; + S1_xbin_max = 25; + S1_ybin_min = -25; + S1_ybin_max = 25; + SE_ybin_min = -25; + SE_ybin_max = 25; + + S2xybinsize = sqrt((50*50)/(Kr_events/150));%cm +% SExybinsize = 5; DEFINED LATER, based on number of SE events + S2_xbin_min = -25; + S2_xbin_max = 25; + S2_ybin_min = -25; + S2_ybin_max = 25; + SE_xbin_min = -25; + SE_xbin_max = 25; + + + end + + s1_xbins = (S1_xbin_max-S1_xbin_min)./S1xybinsize; + s1_ybins = (S1_ybin_max-S1_ybin_min)./S1xybinsize; + + s2_xbins = (S2_xbin_max-S2_xbin_min)./S2xybinsize; + s2_ybins = (S2_ybin_max-S2_ybin_min)./S2xybinsize; + + %% Kr S1a/S2b map + +%Set up cuts and variables + s1ab_cut=logical(sum(s1_single_cut(:,:),1)); + s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); + s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); + s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); + s1ab_x=d.x_cm(s2_single_cut); + s1ab_y=d.y_cm(s2_single_cut); + s1ab_z=d.z_drift_samples(s2_single_cut)/100; + s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); + s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<25; + %plotting x=s1a v y=s1a/s1b cuts: y<0.035x-1, y>-0.035.*x+5; y>0.01.*x; %y<4.2; x<255 +% s1ab_areacut= (s1a_phe_both./s1b_phe_both-0.035.*s1a_phe_both<-1) & (s1a_phe_both./s1b_phe_both+0.035.*s1a_phe_both>5)... +% & (s1a_phe_both./s1b_phe_both > 0.01.* s1a_phe_both) & (s1a_phe_both./s1b_phe_both<4.2) & (s1a_phe_both<255); + + s1ab_x=s1ab_x(s1ab_timing_cut); + s1ab_y=s1ab_y(s1ab_timing_cut); + s1ab_z=s1ab_z(s1ab_timing_cut); + s1a_phe_both=s1a_phe_both(s1ab_timing_cut); + s1b_phe_both=s1b_phe_both(s1ab_timing_cut); + s1ab_radius=s1ab_radius(s1ab_timing_cut); + + %fidicual Z cut for s1ab_xy measurement + [s1ab_z_hist s1ab_z_hist_bins]=hist(s1ab_z(inrange(s1ab_z,[0,400])),[0:1:400]); + frac_hist=cumsum(s1ab_z_hist)./sum(s1ab_z_hist); + s1ab_z_cut_lower= min(s1ab_z_hist_bins(frac_hist>.10)); + s1ab_z_cut_upper= max(s1ab_z_hist_bins(frac_hist<.90)); + s1ab_z_cut=inrange(s1ab_z,[s1ab_z_cut_lower,s1ab_z_cut_upper]); + + %R cut for s1ab_Z measurement + [upperz_r_hist upperz_r_hist_bins]=hist(s1ab_radius(s1ab_z>s1ab_z_cut_upper & s1ab_radius<=26),[0:1:26]); + [lowerz_r_hist lowerz_r_hist_bins]=hist(s1ab_radius(s1ab_z0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:400]).','gauss1'); + s1b_fit=fit([0:2:300].',hist(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:300]).','gauss1'); + s1a_z_means(i)=s1a_fit.b1; + s1a_z_means_err(i)=s1a_fit.c1/sqrt(2)/sqrt(length(s1a_phe_both(s1ab_r_cut.' & s1a_phe_both>0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1b_z_means(i)=s1b_fit.b1; + s1b_z_means_err(i)=s1b_fit.c1/sqrt(2)/sqrt(length(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1ab_bincenters(i)=z_max-dT_step/2; + i=i+1; + end + +s1ab_z_means=s1a_z_means./s1b_z_means; +s1ab_z_means_err=sqrt( (s1b_z_means_err.*s1a_z_means./(s1b_z_means.^2)).^2 + (s1a_z_means_err./s1b_z_means).^2); + +%fit polynomial to s1az and s1bz, to remove z dependence later in xy fit +[s1a_P, s1a_S]=polyfit(s1ab_bincenters,s1a_z_means,3); +[s1b_P, s1b_S]=polyfit(s1ab_bincenters,s1b_z_means,3); +[s1ab_P, s1ab_S]=polyfit(s1ab_bincenters,s1ab_z_means,2); + +%S1a z dependence plot +s1az_plot=figure; +errorbar(s1ab_bincenters,s1a_z_means,s1a_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a Mean (phe)'); title('S1a Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1a_P,[10:1:320]),'-r','LineWidth',2) + +%S1b z dependence plot +s1bz_plot=figure; +errorbar(s1ab_bincenters,s1b_z_means,s1b_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1b Mean (phe)'); title('S1b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1b_P,[10:1:320]),'-r','LineWidth',2) + +%S1a/b z dependence plot +s1a_over_bz_plot=figure; +errorbar(s1ab_bincenters,s1ab_z_means,s1ab_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a/b'); title('S1 a/b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1ab_P,[10:1:320]),'-r','LineWidth',2) + + +%Correcting z dependence to get XY dependence in same manner that Kr/CH3T +%map does + s1a_phe_both_z=s1a_phe_both.'.*polyval(s1a_P,z_center)./polyval(s1a_P,s1ab_z); + s1b_phe_both_z=s1b_phe_both.'.*polyval(s1b_P,z_center)./polyval(s1b_P,s1ab_z); + + %% S1a/b XY map (after z correction) +s1ab_xbin_min=-25; +s1ab_ybin_min=-25; +s1ab_xbin_max=25; +s1ab_ybin_max=25; +s1ab_xybinsize=sqrt((50*50)/(length(s1ab_z)/300)); +clear s1a_xy_mean s1a_xy_mean_err s1b_xy_mean s1b_xy_mean_err + +s1ab_xbins=s1ab_xbin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_xbin_max; +s1ab_ybins=s1ab_ybin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_ybin_max; + +s1a_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); +s1b_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); + + for x_bin=s1ab_xbin_min:s1ab_xybinsize:(s1ab_xbin_max-s1ab_xybinsize/2); + for y_bin=s1ab_ybin_min:s1ab_xybinsize:(s1ab_ybin_max-s1ab_xybinsize/2); + x_min = x_bin; x_max = x_bin+s1ab_xybinsize; + y_min = y_bin; y_max = y_bin+s1ab_xybinsize; + + x_count=int32(1+x_bin/s1ab_xybinsize+s1ab_xbin_max/s1ab_xybinsize); + y_count=int32(1+y_bin/s1ab_xybinsize+s1ab_ybin_max/s1ab_xybinsize); + + bin_cut = s1ab_z_cut.' & inrange(s1ab_z,[10 330]).' & s1a_phe_both>0 & s1b_phe_both>0 & inrange(s1ab_x,[x_min,x_max]).' & inrange(s1ab_y,[y_min,y_max]).'; + if length(s1a_phe_both_z(bin_cut))>100; + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400])),[0:2:400]).','gauss1'); + s1a_xy_mean(y_count,x_count)=s1a_z_fit.b1; + s1a_xy_mean_err(y_count,x_count)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300])),[0:2:300]).','gauss1'); + s1b_xy_mean(y_count,x_count)=s1b_z_fit.b1; + s1b_xy_mean_err(y_count,x_count)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300]))); + else + s1a_xy_mean(y_count,x_count)=0; + s1a_xy_mean_err(y_count,x_count)=0; + s1b_xy_mean(y_count,x_count)=0; + s1b_xy_mean_err(y_count,x_count)=0; + end + + end + end + s1ab_xy_mean=s1a_xy_mean./s1b_xy_mean; + s1ab_xy_mean_err=sqrt( (s1b_xy_mean_err.*s1a_xy_mean./(s1b_xy_mean.^2)).^2 + (s1a_xy_mean_err./s1b_xy_mean).^2); + + + %Plot s1a XY means + color_range_max=max(max(s1a_xy_mean)); + color_range_min=min(min(s1a_xy_mean(s1a_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1a_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1a_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %Plot s1a XY means + color_range_max=max(max(s1b_xy_mean)); + color_range_min=min(min(s1b_xy_mean(s1b_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1b_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1b_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1b Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1b Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %s1a/b XY Ratio + color_range_max=max(max(s1ab_xy_mean)); + color_range_min=min(min(s1ab_xy_mean(s1ab_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1ab_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a/b Ratio vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a/b Ratio','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + +%% 3D Kr s1a/s1b map +if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +s1ab_xyz_numbins=floor((length(s1ab_z)/200)^(1/3)); %number of bins in one direction +s1ab_xyz_zstep=det_edge/s1ab_xyz_numbins; +s1ab_xyz_xstep=50/s1ab_xyz_numbins; +s1ab_xyz_ystep=50/s1ab_xyz_numbins; +s1ab_xyz_xmax=25; +r_max=25; + +s1ab_xyz_zbins=10+s1ab_xyz_zstep/2:s1ab_xyz_zstep:10+s1ab_xyz_zstep/2+s1ab_xyz_zstep*s1ab_xyz_numbins; %20 us +s1ab_xyz_xbins=(-r_max+s1ab_xyz_xstep/2):s1ab_xyz_xstep:r_max; +s1ab_xyz_ybins=(-r_max+s1ab_xyz_ystep/2):s1ab_xyz_ystep:r_max; + +s1a_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + + %Count the number of events per bin + Count_S1ab_3D(l,m,n)=length(s1a_phe_both(q)); + + if (Count_S1ab_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_xyz_mean(l,m,n)=s1a_z_fit.b1; + s1a_xyz_mean_err(l,m,n)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]) ),[0:2:300]).','gauss1'); + s1b_xyz_mean(l,m,n)=s1b_z_fit.b1; + s1b_xyz_mean_err(l,m,n)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); + else %not enough stats to do the fit + s1a_xyz_mean(l,m,n)=0; + s1a_xyz_mean_err(l,m,n)=0; + s1b_xyz_mean(l,m,n)=0; + s1b_xyz_mean_err(l,m,n)=0; + end + + end + end +k +end + + s1ab_xyz_mean=s1a_xyz_mean./s1b_xyz_mean; + s1ab_xyz_mean_err=sqrt( (s1b_xyz_mean_err.*s1a_xyz_mean./(s1b_xyz_mean.^2)).^2 + (s1a_xyz_mean_err./s1b_xyz_mean).^2); + +end + +save('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\KrypCal2p21_QualityChecks\ERBand_Prediction\MappingParametersStart_Feb2016','Kr_events','S1_xbin_max','S1_xbin_min','S1_ybin_max','S1_ybin_min','S1xybinsize','S2_xbin_max','S2_xbin_min','S2_ybin_max','S2_ybin_min','S2xybinsize','det_edge','drift_time','g','grid_size','i','max_num_bins','min_evts_per_bin','rcut_max','rcut_min','s1_phe_both','s1_phe_bottom','s1_width','s1_xbins','s1_ybins','s1a_P','s1a_S','s1a_fit','s1a_over_bz_plot','s1a_xy_fig','s1a_xy_mean','s1a_xy_mean_err','s1a_z_fit','s1a_z_means','s1a_z_means_err','s1ab_P','s1ab_S','s1ab_bincenters','s1ab_x','s1ab_xbin_max','s1ab_xbin_min','s1ab_xbins','s1ab_xy_fig','s1ab_xy_mean','s1ab_xy_mean_err','s1ab_xybinsize','s1ab_y','s1ab_ybin_max','s1ab_ybin_min','s1ab_ybins','s1ab_z','s1ab_z_means','s1ab_z_means_err','s1area_bound_max','s1area_bound_min','s1az_plot','s1b_P','s1b_S','s1b_fit','s1b_xy_fig','s1b_xy_mean','s1b_xy_mean_err','s1b_z_fit','s1b_z_means','s1b_z_means_err','s1bz_plot','s2_phe_both','s2_phe_bottom','s2_width','s2_xbins','s2_ybins','s2area_bound_max','s2area_bound_min','s2radius','s2x','s2y','x_bin','x_center','x_count','x_max','x_min','y_bin','y_center','y_count','y_max','y_min','z_center','z_max','zcut_max','zcut_min'); \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/MakeMappingParamStart_Nov2014.m b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/MakeMappingParamStart_Nov2014.m new file mode 100644 index 0000000..bdf4ced --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/MakeMappingParamStart_Nov2014.m @@ -0,0 +1,416 @@ +path='C:\Users\Richard\Desktop\LUX Analysis\lux10_20141104T1748_cp18524'; + + + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm','x_cm_tmplt','y_cm_tmplt'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +delay_min=0; +file_id_cp='test'; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 70000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + + + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + + zcut_min = 10; %field changes at 4 uSec + zcut_max = 0.95*det_edge; + + + if Kr_events < 30000 %then create a 10x10 grid. Otherwise 25x25. Want about 30 evts per bin + + S1xybinsize = sqrt((50*50)/(Kr_events/150)); + S1_xbin_min = -25; + S1_xbin_max = 25; + S1_ybin_min = -25; + S1_ybin_max = 25; + SE_ybin_min = -25; + SE_ybin_max = 25; + + S2xybinsize = sqrt((50*50)/(Kr_events/150));%cm +% SExybinsize = 5; DEFINED LATER, based on number of SE events + S2_xbin_min = -25; + S2_xbin_max = 25; + S2_ybin_min = -25; + S2_ybin_max = 25; + SE_xbin_min = -25; + SE_xbin_max = 25; + + + end + + s1_xbins = (S1_xbin_max-S1_xbin_min)./S1xybinsize; + s1_ybins = (S1_ybin_max-S1_ybin_min)./S1xybinsize; + + s2_xbins = (S2_xbin_max-S2_xbin_min)./S2xybinsize; + s2_ybins = (S2_ybin_max-S2_ybin_min)./S2xybinsize; + + %% Kr S1a/S2b map + +%Set up cuts and variables + s1ab_cut=logical(sum(s1_single_cut(:,:),1)); + s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); + s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); + s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); + s1ab_x=d.x_cm(s2_single_cut); + s1ab_y=d.y_cm(s2_single_cut); + s1ab_z=d.z_drift_samples(s2_single_cut)/100; + s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); + s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<25; + %plotting x=s1a v y=s1a/s1b cuts: y<0.035x-1, y>-0.035.*x+5; y>0.01.*x; %y<4.2; x<255 +% s1ab_areacut= (s1a_phe_both./s1b_phe_both-0.035.*s1a_phe_both<-1) & (s1a_phe_both./s1b_phe_both+0.035.*s1a_phe_both>5)... +% & (s1a_phe_both./s1b_phe_both > 0.01.* s1a_phe_both) & (s1a_phe_both./s1b_phe_both<4.2) & (s1a_phe_both<255); + + s1ab_x=s1ab_x(s1ab_timing_cut); + s1ab_y=s1ab_y(s1ab_timing_cut); + s1ab_z=s1ab_z(s1ab_timing_cut); + s1a_phe_both=s1a_phe_both(s1ab_timing_cut); + s1b_phe_both=s1b_phe_both(s1ab_timing_cut); + s1ab_radius=s1ab_radius(s1ab_timing_cut); + + %fidicual Z cut for s1ab_xy measurement + [s1ab_z_hist s1ab_z_hist_bins]=hist(s1ab_z(inrange(s1ab_z,[0,400])),[0:1:400]); + frac_hist=cumsum(s1ab_z_hist)./sum(s1ab_z_hist); + s1ab_z_cut_lower= min(s1ab_z_hist_bins(frac_hist>.10)); + s1ab_z_cut_upper= max(s1ab_z_hist_bins(frac_hist<.90)); + s1ab_z_cut=inrange(s1ab_z,[s1ab_z_cut_lower,s1ab_z_cut_upper]); + + %R cut for s1ab_Z measurement + [upperz_r_hist upperz_r_hist_bins]=hist(s1ab_radius(s1ab_z>s1ab_z_cut_upper & s1ab_radius<=26),[0:1:26]); + [lowerz_r_hist lowerz_r_hist_bins]=hist(s1ab_radius(s1ab_z0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:400]).','gauss1'); + s1b_fit=fit([0:2:300].',hist(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:300]).','gauss1'); + s1a_z_means(i)=s1a_fit.b1; + s1a_z_means_err(i)=s1a_fit.c1/sqrt(2)/sqrt(length(s1a_phe_both(s1ab_r_cut.' & s1a_phe_both>0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1b_z_means(i)=s1b_fit.b1; + s1b_z_means_err(i)=s1b_fit.c1/sqrt(2)/sqrt(length(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1ab_bincenters(i)=z_max-dT_step/2; + i=i+1; + end + +s1ab_z_means=s1a_z_means./s1b_z_means; +s1ab_z_means_err=sqrt( (s1b_z_means_err.*s1a_z_means./(s1b_z_means.^2)).^2 + (s1a_z_means_err./s1b_z_means).^2); + +%fit polynomial to s1az and s1bz, to remove z dependence later in xy fit +[s1a_P, s1a_S]=polyfit(s1ab_bincenters,s1a_z_means,3); +[s1b_P, s1b_S]=polyfit(s1ab_bincenters,s1b_z_means,3); +[s1ab_P, s1ab_S]=polyfit(s1ab_bincenters,s1ab_z_means,2); + +%S1a z dependence plot +s1az_plot=figure; +errorbar(s1ab_bincenters,s1a_z_means,s1a_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a Mean (phe)'); title('S1a Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1a_P,[10:1:320]),'-r','LineWidth',2) + +%S1b z dependence plot +s1bz_plot=figure; +errorbar(s1ab_bincenters,s1b_z_means,s1b_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1b Mean (phe)'); title('S1b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1b_P,[10:1:320]),'-r','LineWidth',2) + +%S1a/b z dependence plot +s1a_over_bz_plot=figure; +errorbar(s1ab_bincenters,s1ab_z_means,s1ab_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a/b'); title('S1 a/b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1ab_P,[10:1:320]),'-r','LineWidth',2) + + +%Correcting z dependence to get XY dependence in same manner that Kr/CH3T +%map does + s1a_phe_both_z=s1a_phe_both.'.*polyval(s1a_P,z_center)./polyval(s1a_P,s1ab_z); + s1b_phe_both_z=s1b_phe_both.'.*polyval(s1b_P,z_center)./polyval(s1b_P,s1ab_z); + + %% S1a/b XY map (after z correction) +s1ab_xbin_min=-25; +s1ab_ybin_min=-25; +s1ab_xbin_max=25; +s1ab_ybin_max=25; +s1ab_xybinsize=sqrt((50*50)/(length(s1ab_z)/300)); +clear s1a_xy_mean s1a_xy_mean_err s1b_xy_mean s1b_xy_mean_err + +s1ab_xbins=s1ab_xbin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_xbin_max; +s1ab_ybins=s1ab_ybin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_ybin_max; + +s1a_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); +s1b_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); + + for x_bin=s1ab_xbin_min:s1ab_xybinsize:(s1ab_xbin_max-s1ab_xybinsize/2); + for y_bin=s1ab_ybin_min:s1ab_xybinsize:(s1ab_ybin_max-s1ab_xybinsize/2); + x_min = x_bin; x_max = x_bin+s1ab_xybinsize; + y_min = y_bin; y_max = y_bin+s1ab_xybinsize; + + x_count=int32(1+x_bin/s1ab_xybinsize+s1ab_xbin_max/s1ab_xybinsize); + y_count=int32(1+y_bin/s1ab_xybinsize+s1ab_ybin_max/s1ab_xybinsize); + + bin_cut = s1ab_z_cut.' & inrange(s1ab_z,[10 330]).' & s1a_phe_both>0 & s1b_phe_both>0 & inrange(s1ab_x,[x_min,x_max]).' & inrange(s1ab_y,[y_min,y_max]).'; + if length(s1a_phe_both_z(bin_cut))>100; + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400])),[0:2:400]).','gauss1'); + s1a_xy_mean(y_count,x_count)=s1a_z_fit.b1; + s1a_xy_mean_err(y_count,x_count)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300])),[0:2:300]).','gauss1'); + s1b_xy_mean(y_count,x_count)=s1b_z_fit.b1; + s1b_xy_mean_err(y_count,x_count)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300]))); + else + s1a_xy_mean(y_count,x_count)=0; + s1a_xy_mean_err(y_count,x_count)=0; + s1b_xy_mean(y_count,x_count)=0; + s1b_xy_mean_err(y_count,x_count)=0; + end + + end + end + s1ab_xy_mean=s1a_xy_mean./s1b_xy_mean; + s1ab_xy_mean_err=sqrt( (s1b_xy_mean_err.*s1a_xy_mean./(s1b_xy_mean.^2)).^2 + (s1a_xy_mean_err./s1b_xy_mean).^2); + + + %Plot s1a XY means + color_range_max=max(max(s1a_xy_mean)); + color_range_min=min(min(s1a_xy_mean(s1a_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1a_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1a_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %Plot s1a XY means + color_range_max=max(max(s1b_xy_mean)); + color_range_min=min(min(s1b_xy_mean(s1b_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1b_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1b_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1b Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1b Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %s1a/b XY Ratio + color_range_max=max(max(s1ab_xy_mean)); + color_range_min=min(min(s1ab_xy_mean(s1ab_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1ab_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a/b Ratio vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a/b Ratio','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + +%% 3D Kr s1a/s1b map +if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +s1ab_xyz_numbins=floor((length(s1ab_z)/200)^(1/3)); %number of bins in one direction +s1ab_xyz_zstep=det_edge/s1ab_xyz_numbins; +s1ab_xyz_xstep=50/s1ab_xyz_numbins; +s1ab_xyz_ystep=50/s1ab_xyz_numbins; +s1ab_xyz_xmax=25; +r_max=25; + +s1ab_xyz_zbins=10+s1ab_xyz_zstep/2:s1ab_xyz_zstep:10+s1ab_xyz_zstep/2+s1ab_xyz_zstep*s1ab_xyz_numbins; %20 us +s1ab_xyz_xbins=(-r_max+s1ab_xyz_xstep/2):s1ab_xyz_xstep:r_max; +s1ab_xyz_ybins=(-r_max+s1ab_xyz_ystep/2):s1ab_xyz_ystep:r_max; + +s1a_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + + %Count the number of events per bin + Count_S1ab_3D(l,m,n)=length(s1a_phe_both(q)); + + if (Count_S1ab_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_xyz_mean(l,m,n)=s1a_z_fit.b1; + s1a_xyz_mean_err(l,m,n)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]) ),[0:2:300]).','gauss1'); + s1b_xyz_mean(l,m,n)=s1b_z_fit.b1; + s1b_xyz_mean_err(l,m,n)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); + else %not enough stats to do the fit + s1a_xyz_mean(l,m,n)=0; + s1a_xyz_mean_err(l,m,n)=0; + s1b_xyz_mean(l,m,n)=0; + s1b_xyz_mean_err(l,m,n)=0; + end + + end + end +k +end + + s1ab_xyz_mean=s1a_xyz_mean./s1b_xyz_mean; + s1ab_xyz_mean_err=sqrt( (s1b_xyz_mean_err.*s1a_xyz_mean./(s1b_xyz_mean.^2)).^2 + (s1a_xyz_mean_err./s1b_xyz_mean).^2); + +end + +save('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\KrypCal2p21_QualityChecks\ERBand_Prediction\MappingParametersStart_Nov2014','Kr_events','S1_xbin_max','S1_xbin_min','S1_ybin_max','S1_ybin_min','S1xybinsize','S2_xbin_max','S2_xbin_min','S2_ybin_max','S2_ybin_min','S2xybinsize','det_edge','drift_time','g','grid_size','i','max_num_bins','min_evts_per_bin','rcut_max','rcut_min','s1_phe_both','s1_phe_bottom','s1_width','s1_xbins','s1_ybins','s1a_P','s1a_S','s1a_fit','s1a_over_bz_plot','s1a_xy_fig','s1a_xy_mean','s1a_xy_mean_err','s1a_z_fit','s1a_z_means','s1a_z_means_err','s1ab_P','s1ab_S','s1ab_bincenters','s1ab_x','s1ab_xbin_max','s1ab_xbin_min','s1ab_xbins','s1ab_xy_fig','s1ab_xy_mean','s1ab_xy_mean_err','s1ab_xybinsize','s1ab_y','s1ab_ybin_max','s1ab_ybin_min','s1ab_ybins','s1ab_z','s1ab_z_means','s1ab_z_means_err','s1area_bound_max','s1area_bound_min','s1az_plot','s1b_P','s1b_S','s1b_fit','s1b_xy_fig','s1b_xy_mean','s1b_xy_mean_err','s1b_z_fit','s1b_z_means','s1b_z_means_err','s1bz_plot','s2_phe_both','s2_phe_bottom','s2_width','s2_xbins','s2_ybins','s2area_bound_max','s2area_bound_min','s2radius','s2x','s2y','x_bin','x_center','x_count','x_max','x_min','y_bin','y_center','y_count','y_max','y_min','z_center','z_max','zcut_max','zcut_min'); \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/MakeMappingParamStart_Sep2014.m b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/MakeMappingParamStart_Sep2014.m new file mode 100644 index 0000000..3069c6d --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/MakeMappingParamStart_Sep2014.m @@ -0,0 +1,416 @@ +path='C:\Users\Richard\Desktop\LUX Analysis\lux10_20140903T1918_cp17059'; + + + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm','x_cm_tmplt','y_cm_tmplt'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +delay_min=0; +file_id_cp='test'; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 70000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + + + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + + zcut_min = 10; %field changes at 4 uSec + zcut_max = 0.95*det_edge; + + + if Kr_events < 30000 %then create a 10x10 grid. Otherwise 25x25. Want about 30 evts per bin + + S1xybinsize = sqrt((50*50)/(Kr_events/150)); + S1_xbin_min = -25; + S1_xbin_max = 25; + S1_ybin_min = -25; + S1_ybin_max = 25; + SE_ybin_min = -25; + SE_ybin_max = 25; + + S2xybinsize = sqrt((50*50)/(Kr_events/150));%cm +% SExybinsize = 5; DEFINED LATER, based on number of SE events + S2_xbin_min = -25; + S2_xbin_max = 25; + S2_ybin_min = -25; + S2_ybin_max = 25; + SE_xbin_min = -25; + SE_xbin_max = 25; + + + end + + s1_xbins = (S1_xbin_max-S1_xbin_min)./S1xybinsize; + s1_ybins = (S1_ybin_max-S1_ybin_min)./S1xybinsize; + + s2_xbins = (S2_xbin_max-S2_xbin_min)./S2xybinsize; + s2_ybins = (S2_ybin_max-S2_ybin_min)./S2xybinsize; + + %% Kr S1a/S2b map + +%Set up cuts and variables + s1ab_cut=logical(sum(s1_single_cut(:,:),1)); + s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); + s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); + s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); + s1ab_x=d.x_cm(s2_single_cut); + s1ab_y=d.y_cm(s2_single_cut); + s1ab_z=d.z_drift_samples(s2_single_cut)/100; + s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); + s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<25; + %plotting x=s1a v y=s1a/s1b cuts: y<0.035x-1, y>-0.035.*x+5; y>0.01.*x; %y<4.2; x<255 +% s1ab_areacut= (s1a_phe_both./s1b_phe_both-0.035.*s1a_phe_both<-1) & (s1a_phe_both./s1b_phe_both+0.035.*s1a_phe_both>5)... +% & (s1a_phe_both./s1b_phe_both > 0.01.* s1a_phe_both) & (s1a_phe_both./s1b_phe_both<4.2) & (s1a_phe_both<255); + + s1ab_x=s1ab_x(s1ab_timing_cut); + s1ab_y=s1ab_y(s1ab_timing_cut); + s1ab_z=s1ab_z(s1ab_timing_cut); + s1a_phe_both=s1a_phe_both(s1ab_timing_cut); + s1b_phe_both=s1b_phe_both(s1ab_timing_cut); + s1ab_radius=s1ab_radius(s1ab_timing_cut); + + %fidicual Z cut for s1ab_xy measurement + [s1ab_z_hist s1ab_z_hist_bins]=hist(s1ab_z(inrange(s1ab_z,[0,400])),[0:1:400]); + frac_hist=cumsum(s1ab_z_hist)./sum(s1ab_z_hist); + s1ab_z_cut_lower= min(s1ab_z_hist_bins(frac_hist>.10)); + s1ab_z_cut_upper= max(s1ab_z_hist_bins(frac_hist<.90)); + s1ab_z_cut=inrange(s1ab_z,[s1ab_z_cut_lower,s1ab_z_cut_upper]); + + %R cut for s1ab_Z measurement + [upperz_r_hist upperz_r_hist_bins]=hist(s1ab_radius(s1ab_z>s1ab_z_cut_upper & s1ab_radius<=26),[0:1:26]); + [lowerz_r_hist lowerz_r_hist_bins]=hist(s1ab_radius(s1ab_z0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:400]).','gauss1'); + s1b_fit=fit([0:2:300].',hist(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:300]).','gauss1'); + s1a_z_means(i)=s1a_fit.b1; + s1a_z_means_err(i)=s1a_fit.c1/sqrt(2)/sqrt(length(s1a_phe_both(s1ab_r_cut.' & s1a_phe_both>0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1b_z_means(i)=s1b_fit.b1; + s1b_z_means_err(i)=s1b_fit.c1/sqrt(2)/sqrt(length(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1ab_bincenters(i)=z_max-dT_step/2; + i=i+1; + end + +s1ab_z_means=s1a_z_means./s1b_z_means; +s1ab_z_means_err=sqrt( (s1b_z_means_err.*s1a_z_means./(s1b_z_means.^2)).^2 + (s1a_z_means_err./s1b_z_means).^2); + +%fit polynomial to s1az and s1bz, to remove z dependence later in xy fit +[s1a_P, s1a_S]=polyfit(s1ab_bincenters,s1a_z_means,3); +[s1b_P, s1b_S]=polyfit(s1ab_bincenters,s1b_z_means,3); +[s1ab_P, s1ab_S]=polyfit(s1ab_bincenters,s1ab_z_means,2); + +%S1a z dependence plot +s1az_plot=figure; +errorbar(s1ab_bincenters,s1a_z_means,s1a_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a Mean (phe)'); title('S1a Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1a_P,[10:1:320]),'-r','LineWidth',2) + +%S1b z dependence plot +s1bz_plot=figure; +errorbar(s1ab_bincenters,s1b_z_means,s1b_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1b Mean (phe)'); title('S1b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1b_P,[10:1:320]),'-r','LineWidth',2) + +%S1a/b z dependence plot +s1a_over_bz_plot=figure; +errorbar(s1ab_bincenters,s1ab_z_means,s1ab_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a/b'); title('S1 a/b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1ab_P,[10:1:320]),'-r','LineWidth',2) + + +%Correcting z dependence to get XY dependence in same manner that Kr/CH3T +%map does + s1a_phe_both_z=s1a_phe_both.'.*polyval(s1a_P,z_center)./polyval(s1a_P,s1ab_z); + s1b_phe_both_z=s1b_phe_both.'.*polyval(s1b_P,z_center)./polyval(s1b_P,s1ab_z); + + %% S1a/b XY map (after z correction) +s1ab_xbin_min=-25; +s1ab_ybin_min=-25; +s1ab_xbin_max=25; +s1ab_ybin_max=25; +s1ab_xybinsize=sqrt((50*50)/(length(s1ab_z)/300)); +clear s1a_xy_mean s1a_xy_mean_err s1b_xy_mean s1b_xy_mean_err + +s1ab_xbins=s1ab_xbin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_xbin_max; +s1ab_ybins=s1ab_ybin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_ybin_max; + +s1a_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); +s1b_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); + + for x_bin=s1ab_xbin_min:s1ab_xybinsize:(s1ab_xbin_max-s1ab_xybinsize/2); + for y_bin=s1ab_ybin_min:s1ab_xybinsize:(s1ab_ybin_max-s1ab_xybinsize/2); + x_min = x_bin; x_max = x_bin+s1ab_xybinsize; + y_min = y_bin; y_max = y_bin+s1ab_xybinsize; + + x_count=int32(1+x_bin/s1ab_xybinsize+s1ab_xbin_max/s1ab_xybinsize); + y_count=int32(1+y_bin/s1ab_xybinsize+s1ab_ybin_max/s1ab_xybinsize); + + bin_cut = s1ab_z_cut.' & inrange(s1ab_z,[10 330]).' & s1a_phe_both>0 & s1b_phe_both>0 & inrange(s1ab_x,[x_min,x_max]).' & inrange(s1ab_y,[y_min,y_max]).'; + if length(s1a_phe_both_z(bin_cut))>100; + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400])),[0:2:400]).','gauss1'); + s1a_xy_mean(y_count,x_count)=s1a_z_fit.b1; + s1a_xy_mean_err(y_count,x_count)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300])),[0:2:300]).','gauss1'); + s1b_xy_mean(y_count,x_count)=s1b_z_fit.b1; + s1b_xy_mean_err(y_count,x_count)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300]))); + else + s1a_xy_mean(y_count,x_count)=0; + s1a_xy_mean_err(y_count,x_count)=0; + s1b_xy_mean(y_count,x_count)=0; + s1b_xy_mean_err(y_count,x_count)=0; + end + + end + end + s1ab_xy_mean=s1a_xy_mean./s1b_xy_mean; + s1ab_xy_mean_err=sqrt( (s1b_xy_mean_err.*s1a_xy_mean./(s1b_xy_mean.^2)).^2 + (s1a_xy_mean_err./s1b_xy_mean).^2); + + + %Plot s1a XY means + color_range_max=max(max(s1a_xy_mean)); + color_range_min=min(min(s1a_xy_mean(s1a_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1a_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1a_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %Plot s1a XY means + color_range_max=max(max(s1b_xy_mean)); + color_range_min=min(min(s1b_xy_mean(s1b_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1b_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1b_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1b Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1b Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %s1a/b XY Ratio + color_range_max=max(max(s1ab_xy_mean)); + color_range_min=min(min(s1ab_xy_mean(s1ab_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1ab_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a/b Ratio vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a/b Ratio','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + +%% 3D Kr s1a/s1b map +if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +s1ab_xyz_numbins=floor((length(s1ab_z)/200)^(1/3)); %number of bins in one direction +s1ab_xyz_zstep=det_edge/s1ab_xyz_numbins; +s1ab_xyz_xstep=50/s1ab_xyz_numbins; +s1ab_xyz_ystep=50/s1ab_xyz_numbins; +s1ab_xyz_xmax=25; +r_max=25; + +s1ab_xyz_zbins=10+s1ab_xyz_zstep/2:s1ab_xyz_zstep:10+s1ab_xyz_zstep/2+s1ab_xyz_zstep*s1ab_xyz_numbins; %20 us +s1ab_xyz_xbins=(-r_max+s1ab_xyz_xstep/2):s1ab_xyz_xstep:r_max; +s1ab_xyz_ybins=(-r_max+s1ab_xyz_ystep/2):s1ab_xyz_ystep:r_max; + +s1a_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + + %Count the number of events per bin + Count_S1ab_3D(l,m,n)=length(s1a_phe_both(q)); + + if (Count_S1ab_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_xyz_mean(l,m,n)=s1a_z_fit.b1; + s1a_xyz_mean_err(l,m,n)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]) ),[0:2:300]).','gauss1'); + s1b_xyz_mean(l,m,n)=s1b_z_fit.b1; + s1b_xyz_mean_err(l,m,n)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); + else %not enough stats to do the fit + s1a_xyz_mean(l,m,n)=0; + s1a_xyz_mean_err(l,m,n)=0; + s1b_xyz_mean(l,m,n)=0; + s1b_xyz_mean_err(l,m,n)=0; + end + + end + end +k +end + + s1ab_xyz_mean=s1a_xyz_mean./s1b_xyz_mean; + s1ab_xyz_mean_err=sqrt( (s1b_xyz_mean_err.*s1a_xyz_mean./(s1b_xyz_mean.^2)).^2 + (s1a_xyz_mean_err./s1b_xyz_mean).^2); + +end + +save('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\KrypCal2p21_QualityChecks\ERBand_Prediction\MappingParametersStart_Sep2014','s1ab_xyz_xbins','s1ab_xyz_ybins','s1ab_xyz_zbins','s1ab_xyz_mean','Kr_events','S1_xbin_max','S1_xbin_min','S1_ybin_max','S1_ybin_min','S1xybinsize','S2_xbin_max','S2_xbin_min','S2_ybin_max','S2_ybin_min','S2xybinsize','det_edge','drift_time','g','grid_size','i','max_num_bins','min_evts_per_bin','rcut_max','rcut_min','s1_phe_both','s1_phe_bottom','s1_width','s1_xbins','s1_ybins','s1a_P','s1a_S','s1a_fit','s1a_over_bz_plot','s1a_xy_fig','s1a_xy_mean','s1a_xy_mean_err','s1a_z_fit','s1a_z_means','s1a_z_means_err','s1ab_P','s1ab_S','s1ab_bincenters','s1ab_x','s1ab_xbin_max','s1ab_xbin_min','s1ab_xbins','s1ab_xy_fig','s1ab_xy_mean','s1ab_xy_mean_err','s1ab_xybinsize','s1ab_y','s1ab_ybin_max','s1ab_ybin_min','s1ab_ybins','s1ab_z','s1ab_z_means','s1ab_z_means_err','s1area_bound_max','s1area_bound_min','s1az_plot','s1b_P','s1b_S','s1b_fit','s1b_xy_fig','s1b_xy_mean','s1b_xy_mean_err','s1b_z_fit','s1b_z_means','s1b_z_means_err','s1bz_plot','s2_phe_both','s2_phe_bottom','s2_width','s2_xbins','s2_ybins','s2area_bound_max','s2area_bound_min','s2radius','s2x','s2y','x_bin','x_center','x_count','x_max','x_min','y_bin','y_center','y_count','y_max','y_min','z_center','z_max','zcut_max','zcut_min'); \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/MakeMappingParamStart_Sep2015.m b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/MakeMappingParamStart_Sep2015.m new file mode 100644 index 0000000..b273c26 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/MakeMappingParamStart_Sep2015.m @@ -0,0 +1,416 @@ +path='C:\Users\Richard\Desktop\LUX Analysis\lux10_20150929T1905_cp18197'; + + + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm','x_cm_tmplt','y_cm_tmplt'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +delay_min=0; +file_id_cp='test'; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 70000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + + + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + + zcut_min = 10; %field changes at 4 uSec + zcut_max = 0.95*det_edge; + + + if Kr_events < 30000 %then create a 10x10 grid. Otherwise 25x25. Want about 30 evts per bin + + S1xybinsize = sqrt((50*50)/(Kr_events/150)); + S1_xbin_min = -25; + S1_xbin_max = 25; + S1_ybin_min = -25; + S1_ybin_max = 25; + SE_ybin_min = -25; + SE_ybin_max = 25; + + S2xybinsize = sqrt((50*50)/(Kr_events/150));%cm +% SExybinsize = 5; DEFINED LATER, based on number of SE events + S2_xbin_min = -25; + S2_xbin_max = 25; + S2_ybin_min = -25; + S2_ybin_max = 25; + SE_xbin_min = -25; + SE_xbin_max = 25; + + + end + + s1_xbins = (S1_xbin_max-S1_xbin_min)./S1xybinsize; + s1_ybins = (S1_ybin_max-S1_ybin_min)./S1xybinsize; + + s2_xbins = (S2_xbin_max-S2_xbin_min)./S2xybinsize; + s2_ybins = (S2_ybin_max-S2_ybin_min)./S2xybinsize; + + %% Kr S1a/S2b map + +%Set up cuts and variables + s1ab_cut=logical(sum(s1_single_cut(:,:),1)); + s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); + s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); + s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); + s1ab_x=d.x_cm(s2_single_cut); + s1ab_y=d.y_cm(s2_single_cut); + s1ab_z=d.z_drift_samples(s2_single_cut)/100; + s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); + s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<25; + %plotting x=s1a v y=s1a/s1b cuts: y<0.035x-1, y>-0.035.*x+5; y>0.01.*x; %y<4.2; x<255 +% s1ab_areacut= (s1a_phe_both./s1b_phe_both-0.035.*s1a_phe_both<-1) & (s1a_phe_both./s1b_phe_both+0.035.*s1a_phe_both>5)... +% & (s1a_phe_both./s1b_phe_both > 0.01.* s1a_phe_both) & (s1a_phe_both./s1b_phe_both<4.2) & (s1a_phe_both<255); + + s1ab_x=s1ab_x(s1ab_timing_cut); + s1ab_y=s1ab_y(s1ab_timing_cut); + s1ab_z=s1ab_z(s1ab_timing_cut); + s1a_phe_both=s1a_phe_both(s1ab_timing_cut); + s1b_phe_both=s1b_phe_both(s1ab_timing_cut); + s1ab_radius=s1ab_radius(s1ab_timing_cut); + + %fidicual Z cut for s1ab_xy measurement + [s1ab_z_hist s1ab_z_hist_bins]=hist(s1ab_z(inrange(s1ab_z,[0,400])),[0:1:400]); + frac_hist=cumsum(s1ab_z_hist)./sum(s1ab_z_hist); + s1ab_z_cut_lower= min(s1ab_z_hist_bins(frac_hist>.10)); + s1ab_z_cut_upper= max(s1ab_z_hist_bins(frac_hist<.90)); + s1ab_z_cut=inrange(s1ab_z,[s1ab_z_cut_lower,s1ab_z_cut_upper]); + + %R cut for s1ab_Z measurement + [upperz_r_hist upperz_r_hist_bins]=hist(s1ab_radius(s1ab_z>s1ab_z_cut_upper & s1ab_radius<=26),[0:1:26]); + [lowerz_r_hist lowerz_r_hist_bins]=hist(s1ab_radius(s1ab_z0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:400]).','gauss1'); + s1b_fit=fit([0:2:300].',hist(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:300]).','gauss1'); + s1a_z_means(i)=s1a_fit.b1; + s1a_z_means_err(i)=s1a_fit.c1/sqrt(2)/sqrt(length(s1a_phe_both(s1ab_r_cut.' & s1a_phe_both>0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1b_z_means(i)=s1b_fit.b1; + s1b_z_means_err(i)=s1b_fit.c1/sqrt(2)/sqrt(length(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1ab_bincenters(i)=z_max-dT_step/2; + i=i+1; + end + +s1ab_z_means=s1a_z_means./s1b_z_means; +s1ab_z_means_err=sqrt( (s1b_z_means_err.*s1a_z_means./(s1b_z_means.^2)).^2 + (s1a_z_means_err./s1b_z_means).^2); + +%fit polynomial to s1az and s1bz, to remove z dependence later in xy fit +[s1a_P, s1a_S]=polyfit(s1ab_bincenters,s1a_z_means,3); +[s1b_P, s1b_S]=polyfit(s1ab_bincenters,s1b_z_means,3); +[s1ab_P, s1ab_S]=polyfit(s1ab_bincenters,s1ab_z_means,2); + +%S1a z dependence plot +s1az_plot=figure; +errorbar(s1ab_bincenters,s1a_z_means,s1a_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a Mean (phe)'); title('S1a Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1a_P,[10:1:320]),'-r','LineWidth',2) + +%S1b z dependence plot +s1bz_plot=figure; +errorbar(s1ab_bincenters,s1b_z_means,s1b_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1b Mean (phe)'); title('S1b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1b_P,[10:1:320]),'-r','LineWidth',2) + +%S1a/b z dependence plot +s1a_over_bz_plot=figure; +errorbar(s1ab_bincenters,s1ab_z_means,s1ab_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a/b'); title('S1 a/b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1ab_P,[10:1:320]),'-r','LineWidth',2) + + +%Correcting z dependence to get XY dependence in same manner that Kr/CH3T +%map does + s1a_phe_both_z=s1a_phe_both.'.*polyval(s1a_P,z_center)./polyval(s1a_P,s1ab_z); + s1b_phe_both_z=s1b_phe_both.'.*polyval(s1b_P,z_center)./polyval(s1b_P,s1ab_z); + + %% S1a/b XY map (after z correction) +s1ab_xbin_min=-25; +s1ab_ybin_min=-25; +s1ab_xbin_max=25; +s1ab_ybin_max=25; +s1ab_xybinsize=sqrt((50*50)/(length(s1ab_z)/300)); +clear s1a_xy_mean s1a_xy_mean_err s1b_xy_mean s1b_xy_mean_err + +s1ab_xbins=s1ab_xbin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_xbin_max; +s1ab_ybins=s1ab_ybin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_ybin_max; + +s1a_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); +s1b_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); + + for x_bin=s1ab_xbin_min:s1ab_xybinsize:(s1ab_xbin_max-s1ab_xybinsize/2); + for y_bin=s1ab_ybin_min:s1ab_xybinsize:(s1ab_ybin_max-s1ab_xybinsize/2); + x_min = x_bin; x_max = x_bin+s1ab_xybinsize; + y_min = y_bin; y_max = y_bin+s1ab_xybinsize; + + x_count=int32(1+x_bin/s1ab_xybinsize+s1ab_xbin_max/s1ab_xybinsize); + y_count=int32(1+y_bin/s1ab_xybinsize+s1ab_ybin_max/s1ab_xybinsize); + + bin_cut = s1ab_z_cut.' & inrange(s1ab_z,[10 330]).' & s1a_phe_both>0 & s1b_phe_both>0 & inrange(s1ab_x,[x_min,x_max]).' & inrange(s1ab_y,[y_min,y_max]).'; + if length(s1a_phe_both_z(bin_cut))>100; + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400])),[0:2:400]).','gauss1'); + s1a_xy_mean(y_count,x_count)=s1a_z_fit.b1; + s1a_xy_mean_err(y_count,x_count)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300])),[0:2:300]).','gauss1'); + s1b_xy_mean(y_count,x_count)=s1b_z_fit.b1; + s1b_xy_mean_err(y_count,x_count)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300]))); + else + s1a_xy_mean(y_count,x_count)=0; + s1a_xy_mean_err(y_count,x_count)=0; + s1b_xy_mean(y_count,x_count)=0; + s1b_xy_mean_err(y_count,x_count)=0; + end + + end + end + s1ab_xy_mean=s1a_xy_mean./s1b_xy_mean; + s1ab_xy_mean_err=sqrt( (s1b_xy_mean_err.*s1a_xy_mean./(s1b_xy_mean.^2)).^2 + (s1a_xy_mean_err./s1b_xy_mean).^2); + + + %Plot s1a XY means + color_range_max=max(max(s1a_xy_mean)); + color_range_min=min(min(s1a_xy_mean(s1a_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1a_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1a_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %Plot s1a XY means + color_range_max=max(max(s1b_xy_mean)); + color_range_min=min(min(s1b_xy_mean(s1b_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1b_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1b_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1b Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1b Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %s1a/b XY Ratio + color_range_max=max(max(s1ab_xy_mean)); + color_range_min=min(min(s1ab_xy_mean(s1ab_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1ab_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a/b Ratio vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a/b Ratio','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + +%% 3D Kr s1a/s1b map +if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +s1ab_xyz_numbins=floor((length(s1ab_z)/200)^(1/3)); %number of bins in one direction +s1ab_xyz_zstep=det_edge/s1ab_xyz_numbins; +s1ab_xyz_xstep=50/s1ab_xyz_numbins; +s1ab_xyz_ystep=50/s1ab_xyz_numbins; +s1ab_xyz_xmax=25; +r_max=25; + +s1ab_xyz_zbins=10+s1ab_xyz_zstep/2:s1ab_xyz_zstep:10+s1ab_xyz_zstep/2+s1ab_xyz_zstep*s1ab_xyz_numbins; %20 us +s1ab_xyz_xbins=(-r_max+s1ab_xyz_xstep/2):s1ab_xyz_xstep:r_max; +s1ab_xyz_ybins=(-r_max+s1ab_xyz_ystep/2):s1ab_xyz_ystep:r_max; + +s1a_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + + %Count the number of events per bin + Count_S1ab_3D(l,m,n)=length(s1a_phe_both(q)); + + if (Count_S1ab_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_xyz_mean(l,m,n)=s1a_z_fit.b1; + s1a_xyz_mean_err(l,m,n)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]) ),[0:2:300]).','gauss1'); + s1b_xyz_mean(l,m,n)=s1b_z_fit.b1; + s1b_xyz_mean_err(l,m,n)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); + else %not enough stats to do the fit + s1a_xyz_mean(l,m,n)=0; + s1a_xyz_mean_err(l,m,n)=0; + s1b_xyz_mean(l,m,n)=0; + s1b_xyz_mean_err(l,m,n)=0; + end + + end + end +k +end + + s1ab_xyz_mean=s1a_xyz_mean./s1b_xyz_mean; + s1ab_xyz_mean_err=sqrt( (s1b_xyz_mean_err.*s1a_xyz_mean./(s1b_xyz_mean.^2)).^2 + (s1a_xyz_mean_err./s1b_xyz_mean).^2); + +end + +save('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\KrypCal2p21_QualityChecks\ERBand_Prediction\MappingParametersStart_Sep2015','Kr_events','S1_xbin_max','S1_xbin_min','S1_ybin_max','S1_ybin_min','S1xybinsize','S2_xbin_max','S2_xbin_min','S2_ybin_max','S2_ybin_min','S2xybinsize','det_edge','drift_time','g','grid_size','i','max_num_bins','min_evts_per_bin','rcut_max','rcut_min','s1_phe_both','s1_phe_bottom','s1_width','s1_xbins','s1_ybins','s1a_P','s1a_S','s1a_fit','s1a_over_bz_plot','s1a_xy_fig','s1a_xy_mean','s1a_xy_mean_err','s1a_z_fit','s1a_z_means','s1a_z_means_err','s1ab_P','s1ab_S','s1ab_bincenters','s1ab_x','s1ab_xbin_max','s1ab_xbin_min','s1ab_xbins','s1ab_xy_fig','s1ab_xy_mean','s1ab_xy_mean_err','s1ab_xybinsize','s1ab_y','s1ab_ybin_max','s1ab_ybin_min','s1ab_ybins','s1ab_z','s1ab_z_means','s1ab_z_means_err','s1area_bound_max','s1area_bound_min','s1az_plot','s1b_P','s1b_S','s1b_fit','s1b_xy_fig','s1b_xy_mean','s1b_xy_mean_err','s1b_z_fit','s1b_z_means','s1b_z_means_err','s1bz_plot','s2_phe_both','s2_phe_bottom','s2_width','s2_xbins','s2_ybins','s2area_bound_max','s2area_bound_min','s2radius','s2x','s2y','x_bin','x_center','x_count','x_max','x_min','y_bin','y_center','y_count','y_max','y_min','z_center','z_max','zcut_max','zcut_min'); \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/MakeS1aS1bMap_Feb2015.m b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/MakeS1aS1bMap_Feb2015.m new file mode 100644 index 0000000..8514714 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/MakeS1aS1bMap_Feb2015.m @@ -0,0 +1,431 @@ +%% Make corrections with the chosen polynomial +path='C:\Users\Richard\Desktop\LUX Analysis\lux10_20150226T1943_cp18525'; + + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm','x_cm_tmplt','y_cm_tmplt'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +delay_min=0; +file_id_cp='test'; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 70000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + + + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + + zcut_min = 10; %field changes at 4 uSec + zcut_max = 0.95*det_edge; + + + if Kr_events < 30000 %then create a 10x10 grid. Otherwise 25x25. Want about 30 evts per bin + + S1xybinsize = sqrt((50*50)/(Kr_events/150)); + S1_xbin_min = -25; + S1_xbin_max = 25; + S1_ybin_min = -25; + S1_ybin_max = 25; + SE_ybin_min = -25; + SE_ybin_max = 25; + + S2xybinsize = sqrt((50*50)/(Kr_events/150));%cm +% SExybinsize = 5; DEFINED LATER, based on number of SE events + S2_xbin_min = -25; + S2_xbin_max = 25; + S2_ybin_min = -25; + S2_ybin_max = 25; + SE_xbin_min = -25; + SE_xbin_max = 25; + + + end + + s1_xbins = (S1_xbin_max-S1_xbin_min)./S1xybinsize; + s1_ybins = (S1_ybin_max-S1_ybin_min)./S1xybinsize; + + s2_xbins = (S2_xbin_max-S2_xbin_min)./S2xybinsize; + s2_ybins = (S2_ybin_max-S2_ybin_min)./S2xybinsize; + + %% Kr S1a/S2b map + +%Set up cuts and variables + s1ab_cut=logical(sum(s1_single_cut(:,:),1)); + s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); + s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); + s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); + s1ab_x=d.x_cm(s2_single_cut); + s1ab_y=d.y_cm(s2_single_cut); + s1ab_z=d.z_drift_samples(s2_single_cut)/100; + s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); + s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<25; + %plotting x=s1a v y=s1a/s1b cuts: y<0.035x-1, y>-0.035.*x+5; y>0.01.*x; %y<4.2; x<255 +% s1ab_areacut= (s1a_phe_both./s1b_phe_both-0.035.*s1a_phe_both<-1) & (s1a_phe_both./s1b_phe_both+0.035.*s1a_phe_both>5)... +% & (s1a_phe_both./s1b_phe_both > 0.01.* s1a_phe_both) & (s1a_phe_both./s1b_phe_both<4.2) & (s1a_phe_both<255); + + s1ab_x=s1ab_x(s1ab_timing_cut); + s1ab_y=s1ab_y(s1ab_timing_cut); + s1ab_z=s1ab_z(s1ab_timing_cut); + s1a_phe_both=s1a_phe_both(s1ab_timing_cut); + s1b_phe_both=s1b_phe_both(s1ab_timing_cut); + s1ab_radius=s1ab_radius(s1ab_timing_cut); + + %fidicual Z cut for s1ab_xy measurement + [s1ab_z_hist s1ab_z_hist_bins]=hist(s1ab_z(inrange(s1ab_z,[0,400])),[0:1:400]); + frac_hist=cumsum(s1ab_z_hist)./sum(s1ab_z_hist); + s1ab_z_cut_lower= min(s1ab_z_hist_bins(frac_hist>.10)); + s1ab_z_cut_upper= max(s1ab_z_hist_bins(frac_hist<.90)); + s1ab_z_cut=inrange(s1ab_z,[s1ab_z_cut_lower,s1ab_z_cut_upper]); + + %R cut for s1ab_Z measurement + [upperz_r_hist upperz_r_hist_bins]=hist(s1ab_radius(s1ab_z>s1ab_z_cut_upper & s1ab_radius<=26),[0:1:26]); + [lowerz_r_hist lowerz_r_hist_bins]=hist(s1ab_radius(s1ab_z0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:400]).','gauss1'); + s1b_fit=fit([0:2:300].',hist(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:300]).','gauss1'); + s1a_z_means(i)=s1a_fit.b1; + s1a_z_means_err(i)=s1a_fit.c1/sqrt(2)/sqrt(length(s1a_phe_both(s1ab_r_cut.' & s1a_phe_both>0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1b_z_means(i)=s1b_fit.b1; + s1b_z_means_err(i)=s1b_fit.c1/sqrt(2)/sqrt(length(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1ab_bincenters(i)=z_max-dT_step/2; + Kr_count_1D(i)=length(s1_phe_both(inrange(drift_time,[z_max-dT_step,z_max]) & kr_r_cut)); + i=i+1; + end + +s1ab_z_means=s1a_z_means./s1b_z_means; +s1ab_z_means_err=sqrt( (s1b_z_means_err.*s1a_z_means./(s1b_z_means.^2)).^2 + (s1a_z_means_err./s1b_z_means).^2); + +%fit polynomial to s1az and s1bz, to remove z dependence later in xy fit +[s1a_P, s1a_S]=polyfit(s1ab_bincenters,s1a_z_means,3); +[s1b_P, s1b_S]=polyfit(s1ab_bincenters,s1b_z_means,3); +[s1ab_P, s1ab_S]=polyfit(s1ab_bincenters,s1ab_z_means,2); + +%S1a z dependence plot +s1az_plot=figure; +errorbar(s1ab_bincenters,s1a_z_means,s1a_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a Mean (phe)'); title('S1a Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1a_P,[10:1:320]),'-r','LineWidth',2) + +%S1b z dependence plot +s1bz_plot=figure; +errorbar(s1ab_bincenters,s1b_z_means,s1b_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1b Mean (phe)'); title('S1b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1b_P,[10:1:320]),'-r','LineWidth',2) + +%S1a/b z dependence plot +s1a_over_bz_plot=figure; +errorbar(s1ab_bincenters,s1ab_z_means,s1ab_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a/b'); title('S1 a/b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1ab_P,[10:1:320]),'-r','LineWidth',2) + + +%Correcting z dependence to get XY dependence in same manner that Kr/CH3T +%map does + s1a_phe_both_z=s1a_phe_both.'.*polyval(s1a_P,z_center)./polyval(s1a_P,s1ab_z); + s1b_phe_both_z=s1b_phe_both.'.*polyval(s1b_P,z_center)./polyval(s1b_P,s1ab_z); + + %% S1a/b XY map (after z correction) +s1ab_xbin_min=-25; +s1ab_ybin_min=-25; +s1ab_xbin_max=25; +s1ab_ybin_max=25; +s1ab_xybinsize=sqrt((50*50)/(length(s1ab_z)/300)); +clear s1a_xy_mean s1a_xy_mean_err s1b_xy_mean s1b_xy_mean_err + +s1ab_xbins=s1ab_xbin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_xbin_max; +s1ab_ybins=s1ab_ybin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_ybin_max; + +s1a_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); +s1b_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); + + for x_bin=s1ab_xbin_min:s1ab_xybinsize:(s1ab_xbin_max-s1ab_xybinsize/2); + for y_bin=s1ab_ybin_min:s1ab_xybinsize:(s1ab_ybin_max-s1ab_xybinsize/2); + x_min = x_bin; x_max = x_bin+s1ab_xybinsize; + y_min = y_bin; y_max = y_bin+s1ab_xybinsize; + + x_count=int32(1+x_bin/s1ab_xybinsize+s1ab_xbin_max/s1ab_xybinsize); + y_count=int32(1+y_bin/s1ab_xybinsize+s1ab_ybin_max/s1ab_xybinsize); + + bin_cut = s1ab_z_cut.' & inrange(s1ab_z,[10 330]).' & s1a_phe_both>0 & s1b_phe_both>0 & inrange(s1ab_x,[x_min,x_max]).' & inrange(s1ab_y,[y_min,y_max]).'; + if length(s1a_phe_both_z(bin_cut))>100; + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400])),[0:2:400]).','gauss1'); + s1a_xy_mean(y_count,x_count)=s1a_z_fit.b1; + s1a_xy_mean_err(y_count,x_count)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300])),[0:2:300]).','gauss1'); + s1b_xy_mean(y_count,x_count)=s1b_z_fit.b1; + s1b_xy_mean_err(y_count,x_count)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300]))); + else + s1a_xy_mean(y_count,x_count)=0; + s1a_xy_mean_err(y_count,x_count)=0; + s1b_xy_mean(y_count,x_count)=0; + s1b_xy_mean_err(y_count,x_count)=0; + end + + end + end + s1ab_xy_mean=s1a_xy_mean./s1b_xy_mean; + s1ab_xy_mean_err=sqrt( (s1b_xy_mean_err.*s1a_xy_mean./(s1b_xy_mean.^2)).^2 + (s1a_xy_mean_err./s1b_xy_mean).^2); + + + %Plot s1a XY means + color_range_max=max(max(s1a_xy_mean)); + color_range_min=min(min(s1a_xy_mean(s1a_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1a_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1a_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %Plot s1a XY means + color_range_max=max(max(s1b_xy_mean)); + color_range_min=min(min(s1b_xy_mean(s1b_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1b_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1b_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1b Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1b Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %s1a/b XY Ratio + color_range_max=max(max(s1ab_xy_mean)); + color_range_min=min(min(s1ab_xy_mean(s1ab_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1ab_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a/b Ratio vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a/b Ratio','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + +%% 3D Kr s1a/s1b map +if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +s1ab_xyz_numbins=floor((length(s1ab_z)/200)^(1/3)); %number of bins in one direction +s1ab_xyz_zstep=det_edge/s1ab_xyz_numbins; +s1ab_xyz_xstep=50/s1ab_xyz_numbins; +s1ab_xyz_ystep=50/s1ab_xyz_numbins; +s1ab_xyz_xmax=25; +r_max=25; + +s1ab_xyz_zbins=10+s1ab_xyz_zstep/2:s1ab_xyz_zstep:10+s1ab_xyz_zstep/2+s1ab_xyz_zstep*s1ab_xyz_numbins; %20 us +s1ab_xyz_xbins=(-r_max+s1ab_xyz_xstep/2):s1ab_xyz_xstep:r_max; +s1ab_xyz_ybins=(-r_max+s1ab_xyz_ystep/2):s1ab_xyz_ystep:r_max; + +s1a_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +Kr_count_3D=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + kr_q=s2x(j-s1ab_xyz_xstep) & s2y(i-s1ab_xyz_ystep) & inrange(drift_time,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + + %Count the number of events per bin + Count_S1ab_3D(l,m,n)=length(s1a_phe_both(q)); + Kr_count_3D(l,m,n)=length(s1_phe_both(kr_q)); + + if (Count_S1ab_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_xyz_mean(l,m,n)=s1a_z_fit.b1; + s1a_xyz_mean_err(l,m,n)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]) ),[0:2:300]).','gauss1'); + s1b_xyz_mean(l,m,n)=s1b_z_fit.b1; + s1b_xyz_mean_err(l,m,n)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); + else %not enough stats to do the fit + s1a_xyz_mean(l,m,n)=0; + s1a_xyz_mean_err(l,m,n)=0; + s1b_xyz_mean(l,m,n)=0; + s1b_xyz_mean_err(l,m,n)=0; + end + + end + end +k +end + + s1ab_xyz_mean=s1a_xyz_mean./s1b_xyz_mean; + s1ab_xyz_mean_err=sqrt( (s1b_xyz_mean_err.*s1a_xyz_mean./(s1b_xyz_mean.^2)).^2 + (s1a_xyz_mean_err./s1b_xyz_mean).^2); + + + + %Save ER Band fits + save('Feb2015_S1aS1b','s1ab_xyz_mean','s1ab_xyz_xbins','s1ab_xyz_ybins','s1ab_xyz_zbins','s1ab_P','s1ab_z_means','s1ab_bincenters','Kr_count_3D','Kr_count_1D'); + +else + %Save ER Band fits + save('Feb2015_S1aS1b','s1ab_P','s1ab_z_means','s1ab_bincenters','Kr_count_1D'); + +end + + + diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/MakeS1aS1bMap_Feb2016.m b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/MakeS1aS1bMap_Feb2016.m new file mode 100644 index 0000000..ab65759 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/MakeS1aS1bMap_Feb2016.m @@ -0,0 +1,431 @@ +%% Make corrections with the chosen polynomial +path='C:\Users\Richard\Desktop\LUX Analysis\lux10_20160208T0930_cp19837'; + + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm','x_cm_tmplt','y_cm_tmplt'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +delay_min=0; +file_id_cp='test'; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 70000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + + + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + + zcut_min = 10; %field changes at 4 uSec + zcut_max = 0.95*det_edge; + + + if Kr_events < 30000 %then create a 10x10 grid. Otherwise 25x25. Want about 30 evts per bin + + S1xybinsize = sqrt((50*50)/(Kr_events/150)); + S1_xbin_min = -25; + S1_xbin_max = 25; + S1_ybin_min = -25; + S1_ybin_max = 25; + SE_ybin_min = -25; + SE_ybin_max = 25; + + S2xybinsize = sqrt((50*50)/(Kr_events/150));%cm +% SExybinsize = 5; DEFINED LATER, based on number of SE events + S2_xbin_min = -25; + S2_xbin_max = 25; + S2_ybin_min = -25; + S2_ybin_max = 25; + SE_xbin_min = -25; + SE_xbin_max = 25; + + + end + + s1_xbins = (S1_xbin_max-S1_xbin_min)./S1xybinsize; + s1_ybins = (S1_ybin_max-S1_ybin_min)./S1xybinsize; + + s2_xbins = (S2_xbin_max-S2_xbin_min)./S2xybinsize; + s2_ybins = (S2_ybin_max-S2_ybin_min)./S2xybinsize; + + %% Kr S1a/S2b map + +%Set up cuts and variables + s1ab_cut=logical(sum(s1_single_cut(:,:),1)); + s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); + s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); + s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); + s1ab_x=d.x_cm(s2_single_cut); + s1ab_y=d.y_cm(s2_single_cut); + s1ab_z=d.z_drift_samples(s2_single_cut)/100; + s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); + s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<25; + %plotting x=s1a v y=s1a/s1b cuts: y<0.035x-1, y>-0.035.*x+5; y>0.01.*x; %y<4.2; x<255 +% s1ab_areacut= (s1a_phe_both./s1b_phe_both-0.035.*s1a_phe_both<-1) & (s1a_phe_both./s1b_phe_both+0.035.*s1a_phe_both>5)... +% & (s1a_phe_both./s1b_phe_both > 0.01.* s1a_phe_both) & (s1a_phe_both./s1b_phe_both<4.2) & (s1a_phe_both<255); + + s1ab_x=s1ab_x(s1ab_timing_cut); + s1ab_y=s1ab_y(s1ab_timing_cut); + s1ab_z=s1ab_z(s1ab_timing_cut); + s1a_phe_both=s1a_phe_both(s1ab_timing_cut); + s1b_phe_both=s1b_phe_both(s1ab_timing_cut); + s1ab_radius=s1ab_radius(s1ab_timing_cut); + + %fidicual Z cut for s1ab_xy measurement + [s1ab_z_hist s1ab_z_hist_bins]=hist(s1ab_z(inrange(s1ab_z,[0,400])),[0:1:400]); + frac_hist=cumsum(s1ab_z_hist)./sum(s1ab_z_hist); + s1ab_z_cut_lower= min(s1ab_z_hist_bins(frac_hist>.10)); + s1ab_z_cut_upper= max(s1ab_z_hist_bins(frac_hist<.90)); + s1ab_z_cut=inrange(s1ab_z,[s1ab_z_cut_lower,s1ab_z_cut_upper]); + + %R cut for s1ab_Z measurement + [upperz_r_hist upperz_r_hist_bins]=hist(s1ab_radius(s1ab_z>s1ab_z_cut_upper & s1ab_radius<=26),[0:1:26]); + [lowerz_r_hist lowerz_r_hist_bins]=hist(s1ab_radius(s1ab_z0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:400]).','gauss1'); + s1b_fit=fit([0:2:300].',hist(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:300]).','gauss1'); + s1a_z_means(i)=s1a_fit.b1; + s1a_z_means_err(i)=s1a_fit.c1/sqrt(2)/sqrt(length(s1a_phe_both(s1ab_r_cut.' & s1a_phe_both>0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1b_z_means(i)=s1b_fit.b1; + s1b_z_means_err(i)=s1b_fit.c1/sqrt(2)/sqrt(length(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1ab_bincenters(i)=z_max-dT_step/2; + Kr_count_1D(i)=length(s1_phe_both(inrange(drift_time,[z_max-dT_step,z_max]) & kr_r_cut)); + i=i+1; + end + +s1ab_z_means=s1a_z_means./s1b_z_means; +s1ab_z_means_err=sqrt( (s1b_z_means_err.*s1a_z_means./(s1b_z_means.^2)).^2 + (s1a_z_means_err./s1b_z_means).^2); + +%fit polynomial to s1az and s1bz, to remove z dependence later in xy fit +[s1a_P, s1a_S]=polyfit(s1ab_bincenters,s1a_z_means,3); +[s1b_P, s1b_S]=polyfit(s1ab_bincenters,s1b_z_means,3); +[s1ab_P, s1ab_S]=polyfit(s1ab_bincenters,s1ab_z_means,2); + +%S1a z dependence plot +s1az_plot=figure; +errorbar(s1ab_bincenters,s1a_z_means,s1a_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a Mean (phe)'); title('S1a Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1a_P,[10:1:320]),'-r','LineWidth',2) + +%S1b z dependence plot +s1bz_plot=figure; +errorbar(s1ab_bincenters,s1b_z_means,s1b_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1b Mean (phe)'); title('S1b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1b_P,[10:1:320]),'-r','LineWidth',2) + +%S1a/b z dependence plot +s1a_over_bz_plot=figure; +errorbar(s1ab_bincenters,s1ab_z_means,s1ab_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a/b'); title('S1 a/b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1ab_P,[10:1:320]),'-r','LineWidth',2) + + +%Correcting z dependence to get XY dependence in same manner that Kr/CH3T +%map does + s1a_phe_both_z=s1a_phe_both.'.*polyval(s1a_P,z_center)./polyval(s1a_P,s1ab_z); + s1b_phe_both_z=s1b_phe_both.'.*polyval(s1b_P,z_center)./polyval(s1b_P,s1ab_z); + + %% S1a/b XY map (after z correction) +s1ab_xbin_min=-25; +s1ab_ybin_min=-25; +s1ab_xbin_max=25; +s1ab_ybin_max=25; +s1ab_xybinsize=sqrt((50*50)/(length(s1ab_z)/300)); +clear s1a_xy_mean s1a_xy_mean_err s1b_xy_mean s1b_xy_mean_err + +s1ab_xbins=s1ab_xbin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_xbin_max; +s1ab_ybins=s1ab_ybin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_ybin_max; + +s1a_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); +s1b_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); + + for x_bin=s1ab_xbin_min:s1ab_xybinsize:(s1ab_xbin_max-s1ab_xybinsize/2); + for y_bin=s1ab_ybin_min:s1ab_xybinsize:(s1ab_ybin_max-s1ab_xybinsize/2); + x_min = x_bin; x_max = x_bin+s1ab_xybinsize; + y_min = y_bin; y_max = y_bin+s1ab_xybinsize; + + x_count=int32(1+x_bin/s1ab_xybinsize+s1ab_xbin_max/s1ab_xybinsize); + y_count=int32(1+y_bin/s1ab_xybinsize+s1ab_ybin_max/s1ab_xybinsize); + + bin_cut = s1ab_z_cut.' & inrange(s1ab_z,[10 330]).' & s1a_phe_both>0 & s1b_phe_both>0 & inrange(s1ab_x,[x_min,x_max]).' & inrange(s1ab_y,[y_min,y_max]).'; + if length(s1a_phe_both_z(bin_cut))>100; + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400])),[0:2:400]).','gauss1'); + s1a_xy_mean(y_count,x_count)=s1a_z_fit.b1; + s1a_xy_mean_err(y_count,x_count)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300])),[0:2:300]).','gauss1'); + s1b_xy_mean(y_count,x_count)=s1b_z_fit.b1; + s1b_xy_mean_err(y_count,x_count)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300]))); + else + s1a_xy_mean(y_count,x_count)=0; + s1a_xy_mean_err(y_count,x_count)=0; + s1b_xy_mean(y_count,x_count)=0; + s1b_xy_mean_err(y_count,x_count)=0; + end + + end + end + s1ab_xy_mean=s1a_xy_mean./s1b_xy_mean; + s1ab_xy_mean_err=sqrt( (s1b_xy_mean_err.*s1a_xy_mean./(s1b_xy_mean.^2)).^2 + (s1a_xy_mean_err./s1b_xy_mean).^2); + + + %Plot s1a XY means + color_range_max=max(max(s1a_xy_mean)); + color_range_min=min(min(s1a_xy_mean(s1a_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1a_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1a_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %Plot s1a XY means + color_range_max=max(max(s1b_xy_mean)); + color_range_min=min(min(s1b_xy_mean(s1b_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1b_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1b_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1b Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1b Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %s1a/b XY Ratio + color_range_max=max(max(s1ab_xy_mean)); + color_range_min=min(min(s1ab_xy_mean(s1ab_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1ab_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a/b Ratio vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a/b Ratio','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + +%% 3D Kr s1a/s1b map +if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +s1ab_xyz_numbins=floor((length(s1ab_z)/200)^(1/3)); %number of bins in one direction +s1ab_xyz_zstep=det_edge/s1ab_xyz_numbins; +s1ab_xyz_xstep=50/s1ab_xyz_numbins; +s1ab_xyz_ystep=50/s1ab_xyz_numbins; +s1ab_xyz_xmax=25; +r_max=25; + +s1ab_xyz_zbins=10+s1ab_xyz_zstep/2:s1ab_xyz_zstep:10+s1ab_xyz_zstep/2+s1ab_xyz_zstep*s1ab_xyz_numbins; %20 us +s1ab_xyz_xbins=(-r_max+s1ab_xyz_xstep/2):s1ab_xyz_xstep:r_max; +s1ab_xyz_ybins=(-r_max+s1ab_xyz_ystep/2):s1ab_xyz_ystep:r_max; + +s1a_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +Kr_count_3D=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + kr_q=s2x(j-s1ab_xyz_xstep) & s2y(i-s1ab_xyz_ystep) & inrange(drift_time,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + + %Count the number of events per bin + Count_S1ab_3D(l,m,n)=length(s1a_phe_both(q)); + Kr_count_3D(l,m,n)=length(s1_phe_both(kr_q)); + + if (Count_S1ab_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_xyz_mean(l,m,n)=s1a_z_fit.b1; + s1a_xyz_mean_err(l,m,n)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]) ),[0:2:300]).','gauss1'); + s1b_xyz_mean(l,m,n)=s1b_z_fit.b1; + s1b_xyz_mean_err(l,m,n)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); + else %not enough stats to do the fit + s1a_xyz_mean(l,m,n)=0; + s1a_xyz_mean_err(l,m,n)=0; + s1b_xyz_mean(l,m,n)=0; + s1b_xyz_mean_err(l,m,n)=0; + end + + end + end +k +end + + s1ab_xyz_mean=s1a_xyz_mean./s1b_xyz_mean; + s1ab_xyz_mean_err=sqrt( (s1b_xyz_mean_err.*s1a_xyz_mean./(s1b_xyz_mean.^2)).^2 + (s1a_xyz_mean_err./s1b_xyz_mean).^2); + + + + %Save ER Band fits + save('Feb2016_S1aS1b','s1ab_xyz_mean','s1ab_xyz_xbins','s1ab_xyz_ybins','s1ab_xyz_zbins','s1ab_P','s1ab_z_means','s1ab_bincenters','Kr_count_3D','Kr_count_1D'); + +else + %Save ER Band fits + save('Feb2016_S1aS1b','s1ab_P','s1ab_z_means','s1ab_bincenters','Kr_count_1D'); + +end + + + diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/MakeS1aS1bMap_Nov2014.m b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/MakeS1aS1bMap_Nov2014.m new file mode 100644 index 0000000..40e9434 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/MakeS1aS1bMap_Nov2014.m @@ -0,0 +1,430 @@ +%% Make corrections with the chosen polynomial +path='C:\Users\Richard\Desktop\LUX Analysis\lux10_20141104T1748_cp18524'; + + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm','x_cm_tmplt','y_cm_tmplt'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +delay_min=0; +file_id_cp='test'; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 70000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + + + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + + zcut_min = 10; %field changes at 4 uSec + zcut_max = 0.95*det_edge; + + + if Kr_events < 30000 %then create a 10x10 grid. Otherwise 25x25. Want about 30 evts per bin + + S1xybinsize = sqrt((50*50)/(Kr_events/150)); + S1_xbin_min = -25; + S1_xbin_max = 25; + S1_ybin_min = -25; + S1_ybin_max = 25; + SE_ybin_min = -25; + SE_ybin_max = 25; + + S2xybinsize = sqrt((50*50)/(Kr_events/150));%cm +% SExybinsize = 5; DEFINED LATER, based on number of SE events + S2_xbin_min = -25; + S2_xbin_max = 25; + S2_ybin_min = -25; + S2_ybin_max = 25; + SE_xbin_min = -25; + SE_xbin_max = 25; + + + end + + s1_xbins = (S1_xbin_max-S1_xbin_min)./S1xybinsize; + s1_ybins = (S1_ybin_max-S1_ybin_min)./S1xybinsize; + + s2_xbins = (S2_xbin_max-S2_xbin_min)./S2xybinsize; + s2_ybins = (S2_ybin_max-S2_ybin_min)./S2xybinsize; + + %% Kr S1a/S2b map + +%Set up cuts and variables + s1ab_cut=logical(sum(s1_single_cut(:,:),1)); + s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); + s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); + s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); + s1ab_x=d.x_cm(s2_single_cut); + s1ab_y=d.y_cm(s2_single_cut); + s1ab_z=d.z_drift_samples(s2_single_cut)/100; + s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); + s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<25; + %plotting x=s1a v y=s1a/s1b cuts: y<0.035x-1, y>-0.035.*x+5; y>0.01.*x; %y<4.2; x<255 +% s1ab_areacut= (s1a_phe_both./s1b_phe_both-0.035.*s1a_phe_both<-1) & (s1a_phe_both./s1b_phe_both+0.035.*s1a_phe_both>5)... +% & (s1a_phe_both./s1b_phe_both > 0.01.* s1a_phe_both) & (s1a_phe_both./s1b_phe_both<4.2) & (s1a_phe_both<255); + + s1ab_x=s1ab_x(s1ab_timing_cut); + s1ab_y=s1ab_y(s1ab_timing_cut); + s1ab_z=s1ab_z(s1ab_timing_cut); + s1a_phe_both=s1a_phe_both(s1ab_timing_cut); + s1b_phe_both=s1b_phe_both(s1ab_timing_cut); + s1ab_radius=s1ab_radius(s1ab_timing_cut); + + %fidicual Z cut for s1ab_xy measurement + [s1ab_z_hist s1ab_z_hist_bins]=hist(s1ab_z(inrange(s1ab_z,[0,400])),[0:1:400]); + frac_hist=cumsum(s1ab_z_hist)./sum(s1ab_z_hist); + s1ab_z_cut_lower= min(s1ab_z_hist_bins(frac_hist>.10)); + s1ab_z_cut_upper= max(s1ab_z_hist_bins(frac_hist<.90)); + s1ab_z_cut=inrange(s1ab_z,[s1ab_z_cut_lower,s1ab_z_cut_upper]); + + %R cut for s1ab_Z measurement + [upperz_r_hist upperz_r_hist_bins]=hist(s1ab_radius(s1ab_z>s1ab_z_cut_upper & s1ab_radius<=26),[0:1:26]); + [lowerz_r_hist lowerz_r_hist_bins]=hist(s1ab_radius(s1ab_z0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:400]).','gauss1'); + s1b_fit=fit([0:2:300].',hist(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:300]).','gauss1'); + s1a_z_means(i)=s1a_fit.b1; + s1a_z_means_err(i)=s1a_fit.c1/sqrt(2)/sqrt(length(s1a_phe_both(s1ab_r_cut.' & s1a_phe_both>0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1b_z_means(i)=s1b_fit.b1; + s1b_z_means_err(i)=s1b_fit.c1/sqrt(2)/sqrt(length(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1ab_bincenters(i)=z_max-dT_step/2; + Kr_count_1D(i)=length(s1_phe_both(inrange(drift_time,[z_max-dT_step,z_max]) & kr_r_cut)); + i=i+1; + end + +s1ab_z_means=s1a_z_means./s1b_z_means; +s1ab_z_means_err=sqrt( (s1b_z_means_err.*s1a_z_means./(s1b_z_means.^2)).^2 + (s1a_z_means_err./s1b_z_means).^2); + +%fit polynomial to s1az and s1bz, to remove z dependence later in xy fit +[s1a_P, s1a_S]=polyfit(s1ab_bincenters,s1a_z_means,3); +[s1b_P, s1b_S]=polyfit(s1ab_bincenters,s1b_z_means,3); +[s1ab_P, s1ab_S]=polyfit(s1ab_bincenters,s1ab_z_means,2); + +%S1a z dependence plot +s1az_plot=figure; +errorbar(s1ab_bincenters,s1a_z_means,s1a_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a Mean (phe)'); title('S1a Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1a_P,[10:1:320]),'-r','LineWidth',2) + +%S1b z dependence plot +s1bz_plot=figure; +errorbar(s1ab_bincenters,s1b_z_means,s1b_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1b Mean (phe)'); title('S1b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1b_P,[10:1:320]),'-r','LineWidth',2) + +%S1a/b z dependence plot +s1a_over_bz_plot=figure; +errorbar(s1ab_bincenters,s1ab_z_means,s1ab_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a/b'); title('S1 a/b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1ab_P,[10:1:320]),'-r','LineWidth',2) + + +%Correcting z dependence to get XY dependence in same manner that Kr/CH3T +%map does + s1a_phe_both_z=s1a_phe_both.'.*polyval(s1a_P,z_center)./polyval(s1a_P,s1ab_z); + s1b_phe_both_z=s1b_phe_both.'.*polyval(s1b_P,z_center)./polyval(s1b_P,s1ab_z); + + %% S1a/b XY map (after z correction) +s1ab_xbin_min=-25; +s1ab_ybin_min=-25; +s1ab_xbin_max=25; +s1ab_ybin_max=25; +s1ab_xybinsize=sqrt((50*50)/(length(s1ab_z)/300)); +clear s1a_xy_mean s1a_xy_mean_err s1b_xy_mean s1b_xy_mean_err + +s1ab_xbins=s1ab_xbin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_xbin_max; +s1ab_ybins=s1ab_ybin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_ybin_max; + +s1a_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); +s1b_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); + + for x_bin=s1ab_xbin_min:s1ab_xybinsize:(s1ab_xbin_max-s1ab_xybinsize/2); + for y_bin=s1ab_ybin_min:s1ab_xybinsize:(s1ab_ybin_max-s1ab_xybinsize/2); + x_min = x_bin; x_max = x_bin+s1ab_xybinsize; + y_min = y_bin; y_max = y_bin+s1ab_xybinsize; + + x_count=int32(1+x_bin/s1ab_xybinsize+s1ab_xbin_max/s1ab_xybinsize); + y_count=int32(1+y_bin/s1ab_xybinsize+s1ab_ybin_max/s1ab_xybinsize); + + bin_cut = s1ab_z_cut.' & inrange(s1ab_z,[10 330]).' & s1a_phe_both>0 & s1b_phe_both>0 & inrange(s1ab_x,[x_min,x_max]).' & inrange(s1ab_y,[y_min,y_max]).'; + if length(s1a_phe_both_z(bin_cut))>100; + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400])),[0:2:400]).','gauss1'); + s1a_xy_mean(y_count,x_count)=s1a_z_fit.b1; + s1a_xy_mean_err(y_count,x_count)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300])),[0:2:300]).','gauss1'); + s1b_xy_mean(y_count,x_count)=s1b_z_fit.b1; + s1b_xy_mean_err(y_count,x_count)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300]))); + else + s1a_xy_mean(y_count,x_count)=0; + s1a_xy_mean_err(y_count,x_count)=0; + s1b_xy_mean(y_count,x_count)=0; + s1b_xy_mean_err(y_count,x_count)=0; + end + + end + end + s1ab_xy_mean=s1a_xy_mean./s1b_xy_mean; + s1ab_xy_mean_err=sqrt( (s1b_xy_mean_err.*s1a_xy_mean./(s1b_xy_mean.^2)).^2 + (s1a_xy_mean_err./s1b_xy_mean).^2); + + + %Plot s1a XY means + color_range_max=max(max(s1a_xy_mean)); + color_range_min=min(min(s1a_xy_mean(s1a_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1a_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1a_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %Plot s1a XY means + color_range_max=max(max(s1b_xy_mean)); + color_range_min=min(min(s1b_xy_mean(s1b_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1b_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1b_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1b Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1b Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %s1a/b XY Ratio + color_range_max=max(max(s1ab_xy_mean)); + color_range_min=min(min(s1ab_xy_mean(s1ab_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1ab_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a/b Ratio vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a/b Ratio','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + +%% 3D Kr s1a/s1b map +if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +s1ab_xyz_numbins=floor((length(s1ab_z)/200)^(1/3)); %number of bins in one direction +s1ab_xyz_zstep=det_edge/s1ab_xyz_numbins; +s1ab_xyz_xstep=50/s1ab_xyz_numbins; +s1ab_xyz_ystep=50/s1ab_xyz_numbins; +s1ab_xyz_xmax=25; +r_max=25; + +s1ab_xyz_zbins=10+s1ab_xyz_zstep/2:s1ab_xyz_zstep:10+s1ab_xyz_zstep/2+s1ab_xyz_zstep*s1ab_xyz_numbins; %20 us +s1ab_xyz_xbins=(-r_max+s1ab_xyz_xstep/2):s1ab_xyz_xstep:r_max; +s1ab_xyz_ybins=(-r_max+s1ab_xyz_ystep/2):s1ab_xyz_ystep:r_max; + +s1a_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +Kr_count_3D=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + kr_q=s2x(j-s1ab_xyz_xstep) & s2y(i-s1ab_xyz_ystep) & inrange(drift_time,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + + %Count the number of events per bin + Count_S1ab_3D(l,m,n)=length(s1a_phe_both(q)); + Kr_count_3D(l,m,n)=length(s1_phe_both(kr_q)); + + if (Count_S1ab_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_xyz_mean(l,m,n)=s1a_z_fit.b1; + s1a_xyz_mean_err(l,m,n)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]) ),[0:2:300]).','gauss1'); + s1b_xyz_mean(l,m,n)=s1b_z_fit.b1; + s1b_xyz_mean_err(l,m,n)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); + else %not enough stats to do the fit + s1a_xyz_mean(l,m,n)=0; + s1a_xyz_mean_err(l,m,n)=0; + s1b_xyz_mean(l,m,n)=0; + s1b_xyz_mean_err(l,m,n)=0; + end + + end + end +k +end + + s1ab_xyz_mean=s1a_xyz_mean./s1b_xyz_mean; + s1ab_xyz_mean_err=sqrt( (s1b_xyz_mean_err.*s1a_xyz_mean./(s1b_xyz_mean.^2)).^2 + (s1a_xyz_mean_err./s1b_xyz_mean).^2); + + + %Save ER Band fits + save('Nov2014_S1aS1b','s1ab_xyz_mean','s1ab_xyz_xbins','s1ab_xyz_ybins','s1ab_xyz_zbins','s1ab_P','s1ab_z_means','s1ab_bincenters','Kr_count_3D','Kr_count_1D'); + +else + %Save ER Band fits + save('Nov2014_S1aS1b','s1ab_P','s1ab_z_means','s1ab_bincenters','Kr_count_1D'); + +end + + + diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/MakeS1aS1bMap_Sep2014.m b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/MakeS1aS1bMap_Sep2014.m new file mode 100644 index 0000000..292ffb7 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/MakeS1aS1bMap_Sep2014.m @@ -0,0 +1,429 @@ +%% Make corrections with the chosen polynomial +path='C:\Users\Richard\Desktop\LUX Analysis\lux10_20140903T1918_cp17059'; + + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm','x_cm_tmplt','y_cm_tmplt'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +delay_min=0; +file_id_cp='test'; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 70000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + + + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + + zcut_min = 10; %field changes at 4 uSec + zcut_max = 0.95*det_edge; + + + if Kr_events < 30000 %then create a 10x10 grid. Otherwise 25x25. Want about 30 evts per bin + + S1xybinsize = sqrt((50*50)/(Kr_events/150)); + S1_xbin_min = -25; + S1_xbin_max = 25; + S1_ybin_min = -25; + S1_ybin_max = 25; + SE_ybin_min = -25; + SE_ybin_max = 25; + + S2xybinsize = sqrt((50*50)/(Kr_events/150));%cm +% SExybinsize = 5; DEFINED LATER, based on number of SE events + S2_xbin_min = -25; + S2_xbin_max = 25; + S2_ybin_min = -25; + S2_ybin_max = 25; + SE_xbin_min = -25; + SE_xbin_max = 25; + + + end + + s1_xbins = (S1_xbin_max-S1_xbin_min)./S1xybinsize; + s1_ybins = (S1_ybin_max-S1_ybin_min)./S1xybinsize; + + s2_xbins = (S2_xbin_max-S2_xbin_min)./S2xybinsize; + s2_ybins = (S2_ybin_max-S2_ybin_min)./S2xybinsize; + + %% Kr S1a/S2b map + +%Set up cuts and variables + s1ab_cut=logical(sum(s1_single_cut(:,:),1)); + s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); + s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); + s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); + s1ab_x=d.x_cm(s2_single_cut); + s1ab_y=d.y_cm(s2_single_cut); + s1ab_z=d.z_drift_samples(s2_single_cut)/100; + s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); + s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<25; + %plotting x=s1a v y=s1a/s1b cuts: y<0.035x-1, y>-0.035.*x+5; y>0.01.*x; %y<4.2; x<255 +% s1ab_areacut= (s1a_phe_both./s1b_phe_both-0.035.*s1a_phe_both<-1) & (s1a_phe_both./s1b_phe_both+0.035.*s1a_phe_both>5)... +% & (s1a_phe_both./s1b_phe_both > 0.01.* s1a_phe_both) & (s1a_phe_both./s1b_phe_both<4.2) & (s1a_phe_both<255); + + s1ab_x=s1ab_x(s1ab_timing_cut); + s1ab_y=s1ab_y(s1ab_timing_cut); + s1ab_z=s1ab_z(s1ab_timing_cut); + s1a_phe_both=s1a_phe_both(s1ab_timing_cut); + s1b_phe_both=s1b_phe_both(s1ab_timing_cut); + s1ab_radius=s1ab_radius(s1ab_timing_cut); + + %fidicual Z cut for s1ab_xy measurement + [s1ab_z_hist s1ab_z_hist_bins]=hist(s1ab_z(inrange(s1ab_z,[0,400])),[0:1:400]); + frac_hist=cumsum(s1ab_z_hist)./sum(s1ab_z_hist); + s1ab_z_cut_lower= min(s1ab_z_hist_bins(frac_hist>.10)); + s1ab_z_cut_upper= max(s1ab_z_hist_bins(frac_hist<.90)); + s1ab_z_cut=inrange(s1ab_z,[s1ab_z_cut_lower,s1ab_z_cut_upper]); + + %R cut for s1ab_Z measurement + [upperz_r_hist upperz_r_hist_bins]=hist(s1ab_radius(s1ab_z>s1ab_z_cut_upper & s1ab_radius<=26),[0:1:26]); + [lowerz_r_hist lowerz_r_hist_bins]=hist(s1ab_radius(s1ab_z0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:400]).','gauss1'); + s1b_fit=fit([0:2:300].',hist(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:300]).','gauss1'); + s1a_z_means(i)=s1a_fit.b1; + s1a_z_means_err(i)=s1a_fit.c1/sqrt(2)/sqrt(length(s1a_phe_both(s1ab_r_cut.' & s1a_phe_both>0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1b_z_means(i)=s1b_fit.b1; + s1b_z_means_err(i)=s1b_fit.c1/sqrt(2)/sqrt(length(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1ab_bincenters(i)=z_max-dT_step/2; + Kr_count_1D(i)=length(s1_phe_both(inrange(drift_time,[z_max-dT_step,z_max]) & kr_r_cut)); + i=i+1; + end + +s1ab_z_means=s1a_z_means./s1b_z_means; +s1ab_z_means_err=sqrt( (s1b_z_means_err.*s1a_z_means./(s1b_z_means.^2)).^2 + (s1a_z_means_err./s1b_z_means).^2); + +%fit polynomial to s1az and s1bz, to remove z dependence later in xy fit +[s1a_P, s1a_S]=polyfit(s1ab_bincenters,s1a_z_means,3); +[s1b_P, s1b_S]=polyfit(s1ab_bincenters,s1b_z_means,3); +[s1ab_P, s1ab_S]=polyfit(s1ab_bincenters,s1ab_z_means,2); + +%S1a z dependence plot +s1az_plot=figure; +errorbar(s1ab_bincenters,s1a_z_means,s1a_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a Mean (phe)'); title('S1a Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1a_P,[10:1:320]),'-r','LineWidth',2) + +%S1b z dependence plot +s1bz_plot=figure; +errorbar(s1ab_bincenters,s1b_z_means,s1b_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1b Mean (phe)'); title('S1b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1b_P,[10:1:320]),'-r','LineWidth',2) + +%S1a/b z dependence plot +s1a_over_bz_plot=figure; +errorbar(s1ab_bincenters,s1ab_z_means,s1ab_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a/b'); title('S1 a/b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1ab_P,[10:1:320]),'-r','LineWidth',2) + + +%Correcting z dependence to get XY dependence in same manner that Kr/CH3T +%map does + s1a_phe_both_z=s1a_phe_both.'.*polyval(s1a_P,z_center)./polyval(s1a_P,s1ab_z); + s1b_phe_both_z=s1b_phe_both.'.*polyval(s1b_P,z_center)./polyval(s1b_P,s1ab_z); + + %% S1a/b XY map (after z correction) +s1ab_xbin_min=-25; +s1ab_ybin_min=-25; +s1ab_xbin_max=25; +s1ab_ybin_max=25; +s1ab_xybinsize=sqrt((50*50)/(length(s1ab_z)/300)); +clear s1a_xy_mean s1a_xy_mean_err s1b_xy_mean s1b_xy_mean_err + +s1ab_xbins=s1ab_xbin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_xbin_max; +s1ab_ybins=s1ab_ybin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_ybin_max; + +s1a_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); +s1b_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); + + for x_bin=s1ab_xbin_min:s1ab_xybinsize:(s1ab_xbin_max-s1ab_xybinsize/2); + for y_bin=s1ab_ybin_min:s1ab_xybinsize:(s1ab_ybin_max-s1ab_xybinsize/2); + x_min = x_bin; x_max = x_bin+s1ab_xybinsize; + y_min = y_bin; y_max = y_bin+s1ab_xybinsize; + + x_count=int32(1+x_bin/s1ab_xybinsize+s1ab_xbin_max/s1ab_xybinsize); + y_count=int32(1+y_bin/s1ab_xybinsize+s1ab_ybin_max/s1ab_xybinsize); + + bin_cut = s1ab_z_cut.' & inrange(s1ab_z,[10 330]).' & s1a_phe_both>0 & s1b_phe_both>0 & inrange(s1ab_x,[x_min,x_max]).' & inrange(s1ab_y,[y_min,y_max]).'; + if length(s1a_phe_both_z(bin_cut))>100; + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400])),[0:2:400]).','gauss1'); + s1a_xy_mean(y_count,x_count)=s1a_z_fit.b1; + s1a_xy_mean_err(y_count,x_count)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300])),[0:2:300]).','gauss1'); + s1b_xy_mean(y_count,x_count)=s1b_z_fit.b1; + s1b_xy_mean_err(y_count,x_count)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300]))); + else + s1a_xy_mean(y_count,x_count)=0; + s1a_xy_mean_err(y_count,x_count)=0; + s1b_xy_mean(y_count,x_count)=0; + s1b_xy_mean_err(y_count,x_count)=0; + end + + end + end + s1ab_xy_mean=s1a_xy_mean./s1b_xy_mean; + s1ab_xy_mean_err=sqrt( (s1b_xy_mean_err.*s1a_xy_mean./(s1b_xy_mean.^2)).^2 + (s1a_xy_mean_err./s1b_xy_mean).^2); + + + %Plot s1a XY means + color_range_max=max(max(s1a_xy_mean)); + color_range_min=min(min(s1a_xy_mean(s1a_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1a_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1a_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %Plot s1a XY means + color_range_max=max(max(s1b_xy_mean)); + color_range_min=min(min(s1b_xy_mean(s1b_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1b_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1b_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1b Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1b Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %s1a/b XY Ratio + color_range_max=max(max(s1ab_xy_mean)); + color_range_min=min(min(s1ab_xy_mean(s1ab_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1ab_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a/b Ratio vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a/b Ratio','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + +%% 3D Kr s1a/s1b map +if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +s1ab_xyz_numbins=floor((length(s1ab_z)/200)^(1/3)); %number of bins in one direction +s1ab_xyz_zstep=det_edge/s1ab_xyz_numbins; +s1ab_xyz_xstep=50/s1ab_xyz_numbins; +s1ab_xyz_ystep=50/s1ab_xyz_numbins; +s1ab_xyz_xmax=25; +r_max=25; + +s1ab_xyz_zbins=10+s1ab_xyz_zstep/2:s1ab_xyz_zstep:10+s1ab_xyz_zstep/2+s1ab_xyz_zstep*s1ab_xyz_numbins; %20 us +s1ab_xyz_xbins=(-r_max+s1ab_xyz_xstep/2):s1ab_xyz_xstep:r_max; +s1ab_xyz_ybins=(-r_max+s1ab_xyz_ystep/2):s1ab_xyz_ystep:r_max; + +s1a_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +Kr_count_3D=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + kr_q=s2x(j-s1ab_xyz_xstep) & s2y(i-s1ab_xyz_ystep) & inrange(drift_time,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + + %Count the number of events per bin + Count_S1ab_3D(l,m,n)=length(s1a_phe_both(q)); + Kr_count_3D(l,m,n)=length(s1_phe_both(kr_q)); + + if (Count_S1ab_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_xyz_mean(l,m,n)=s1a_z_fit.b1; + s1a_xyz_mean_err(l,m,n)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]) ),[0:2:300]).','gauss1'); + s1b_xyz_mean(l,m,n)=s1b_z_fit.b1; + s1b_xyz_mean_err(l,m,n)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); + else %not enough stats to do the fit + s1a_xyz_mean(l,m,n)=0; + s1a_xyz_mean_err(l,m,n)=0; + s1b_xyz_mean(l,m,n)=0; + s1b_xyz_mean_err(l,m,n)=0; + end + + end + end +k +end + + s1ab_xyz_mean=s1a_xyz_mean./s1b_xyz_mean; + s1ab_xyz_mean_err=sqrt( (s1b_xyz_mean_err.*s1a_xyz_mean./(s1b_xyz_mean.^2)).^2 + (s1a_xyz_mean_err./s1b_xyz_mean).^2); + + + %Save ER Band fits + save('Sep2014_S1aS1b','s1ab_xyz_mean','s1ab_xyz_xbins','s1ab_xyz_ybins','s1ab_xyz_zbins','s1ab_P','s1ab_z_means','s1ab_bincenters','Kr_count_3D','Kr_count_1D'); + +else + %Save ER Band fits + save('Sep2014_S1aS1b','s1ab_P','s1ab_z_means','s1ab_bincenters','Kr_count_1D'); + +end + + diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/MakeS1aS1bMap_Sep2015.m b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/MakeS1aS1bMap_Sep2015.m new file mode 100644 index 0000000..ee5daed --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/MakeS1aS1bMap_Sep2015.m @@ -0,0 +1,427 @@ +%% Make corrections with the chosen polynomial +path='C:\Users\Richard\Desktop\LUX Analysis\lux10_20150929T1905_cp18197'; + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm','x_cm_tmplt','y_cm_tmplt'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +delay_min=0; +file_id_cp='test'; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 70000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + + + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + + zcut_min = 10; %field changes at 4 uSec + zcut_max = 0.95*det_edge; + + + if Kr_events < 30000 %then create a 10x10 grid. Otherwise 25x25. Want about 30 evts per bin + + S1xybinsize = sqrt((50*50)/(Kr_events/150)); + S1_xbin_min = -25; + S1_xbin_max = 25; + S1_ybin_min = -25; + S1_ybin_max = 25; + SE_ybin_min = -25; + SE_ybin_max = 25; + + S2xybinsize = sqrt((50*50)/(Kr_events/150));%cm +% SExybinsize = 5; DEFINED LATER, based on number of SE events + S2_xbin_min = -25; + S2_xbin_max = 25; + S2_ybin_min = -25; + S2_ybin_max = 25; + SE_xbin_min = -25; + SE_xbin_max = 25; + + + end + + s1_xbins = (S1_xbin_max-S1_xbin_min)./S1xybinsize; + s1_ybins = (S1_ybin_max-S1_ybin_min)./S1xybinsize; + + s2_xbins = (S2_xbin_max-S2_xbin_min)./S2xybinsize; + s2_ybins = (S2_ybin_max-S2_ybin_min)./S2xybinsize; + + %% Kr S1a/S2b map + +%Set up cuts and variables + s1ab_cut=logical(sum(s1_single_cut(:,:),1)); + s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); + s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); + s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); + s1ab_x=d.x_cm(s2_single_cut); + s1ab_y=d.y_cm(s2_single_cut); + s1ab_z=d.z_drift_samples(s2_single_cut)/100; + s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); + s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<25; + %plotting x=s1a v y=s1a/s1b cuts: y<0.035x-1, y>-0.035.*x+5; y>0.01.*x; %y<4.2; x<255 +% s1ab_areacut= (s1a_phe_both./s1b_phe_both-0.035.*s1a_phe_both<-1) & (s1a_phe_both./s1b_phe_both+0.035.*s1a_phe_both>5)... +% & (s1a_phe_both./s1b_phe_both > 0.01.* s1a_phe_both) & (s1a_phe_both./s1b_phe_both<4.2) & (s1a_phe_both<255); + + s1ab_x=s1ab_x(s1ab_timing_cut); + s1ab_y=s1ab_y(s1ab_timing_cut); + s1ab_z=s1ab_z(s1ab_timing_cut); + s1a_phe_both=s1a_phe_both(s1ab_timing_cut); + s1b_phe_both=s1b_phe_both(s1ab_timing_cut); + s1ab_radius=s1ab_radius(s1ab_timing_cut); + + %fidicual Z cut for s1ab_xy measurement + [s1ab_z_hist s1ab_z_hist_bins]=hist(s1ab_z(inrange(s1ab_z,[0,400])),[0:1:400]); + frac_hist=cumsum(s1ab_z_hist)./sum(s1ab_z_hist); + s1ab_z_cut_lower= min(s1ab_z_hist_bins(frac_hist>.10)); + s1ab_z_cut_upper= max(s1ab_z_hist_bins(frac_hist<.90)); + s1ab_z_cut=inrange(s1ab_z,[s1ab_z_cut_lower,s1ab_z_cut_upper]); + + %R cut for s1ab_Z measurement + [upperz_r_hist upperz_r_hist_bins]=hist(s1ab_radius(s1ab_z>s1ab_z_cut_upper & s1ab_radius<=26),[0:1:26]); + [lowerz_r_hist lowerz_r_hist_bins]=hist(s1ab_radius(s1ab_z0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:400]).','gauss1'); + s1b_fit=fit([0:2:300].',hist(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:300]).','gauss1'); + s1a_z_means(i)=s1a_fit.b1; + s1a_z_means_err(i)=s1a_fit.c1/sqrt(2)/sqrt(length(s1a_phe_both(s1ab_r_cut.' & s1a_phe_both>0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1b_z_means(i)=s1b_fit.b1; + s1b_z_means_err(i)=s1b_fit.c1/sqrt(2)/sqrt(length(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1ab_bincenters(i)=z_max-dT_step/2; + Kr_count_1D(i)=length(s1_phe_both(inrange(drift_time,[z_max-dT_step,z_max]) & kr_r_cut)); + i=i+1; + end + +s1ab_z_means=s1a_z_means./s1b_z_means; +s1ab_z_means_err=sqrt( (s1b_z_means_err.*s1a_z_means./(s1b_z_means.^2)).^2 + (s1a_z_means_err./s1b_z_means).^2); + +%fit polynomial to s1az and s1bz, to remove z dependence later in xy fit +[s1a_P, s1a_S]=polyfit(s1ab_bincenters,s1a_z_means,3); +[s1b_P, s1b_S]=polyfit(s1ab_bincenters,s1b_z_means,3); +[s1ab_P, s1ab_S]=polyfit(s1ab_bincenters,s1ab_z_means,2); + +%S1a z dependence plot +s1az_plot=figure; +errorbar(s1ab_bincenters,s1a_z_means,s1a_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a Mean (phe)'); title('S1a Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1a_P,[10:1:320]),'-r','LineWidth',2) + +%S1b z dependence plot +s1bz_plot=figure; +errorbar(s1ab_bincenters,s1b_z_means,s1b_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1b Mean (phe)'); title('S1b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1b_P,[10:1:320]),'-r','LineWidth',2) + +%S1a/b z dependence plot +s1a_over_bz_plot=figure; +errorbar(s1ab_bincenters,s1ab_z_means,s1ab_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a/b'); title('S1 a/b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1ab_P,[10:1:320]),'-r','LineWidth',2) + + +%Correcting z dependence to get XY dependence in same manner that Kr/CH3T +%map does + s1a_phe_both_z=s1a_phe_both.'.*polyval(s1a_P,z_center)./polyval(s1a_P,s1ab_z); + s1b_phe_both_z=s1b_phe_both.'.*polyval(s1b_P,z_center)./polyval(s1b_P,s1ab_z); + + %% S1a/b XY map (after z correction) +s1ab_xbin_min=-25; +s1ab_ybin_min=-25; +s1ab_xbin_max=25; +s1ab_ybin_max=25; +s1ab_xybinsize=sqrt((50*50)/(length(s1ab_z)/300)); +clear s1a_xy_mean s1a_xy_mean_err s1b_xy_mean s1b_xy_mean_err + +s1ab_xbins=s1ab_xbin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_xbin_max; +s1ab_ybins=s1ab_ybin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_ybin_max; + +s1a_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); +s1b_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); + + for x_bin=s1ab_xbin_min:s1ab_xybinsize:(s1ab_xbin_max-s1ab_xybinsize/2); + for y_bin=s1ab_ybin_min:s1ab_xybinsize:(s1ab_ybin_max-s1ab_xybinsize/2); + x_min = x_bin; x_max = x_bin+s1ab_xybinsize; + y_min = y_bin; y_max = y_bin+s1ab_xybinsize; + + x_count=int32(1+x_bin/s1ab_xybinsize+s1ab_xbin_max/s1ab_xybinsize); + y_count=int32(1+y_bin/s1ab_xybinsize+s1ab_ybin_max/s1ab_xybinsize); + + bin_cut = s1ab_z_cut.' & inrange(s1ab_z,[10 330]).' & s1a_phe_both>0 & s1b_phe_both>0 & inrange(s1ab_x,[x_min,x_max]).' & inrange(s1ab_y,[y_min,y_max]).'; + if length(s1a_phe_both_z(bin_cut))>100; + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400])),[0:2:400]).','gauss1'); + s1a_xy_mean(y_count,x_count)=s1a_z_fit.b1; + s1a_xy_mean_err(y_count,x_count)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300])),[0:2:300]).','gauss1'); + s1b_xy_mean(y_count,x_count)=s1b_z_fit.b1; + s1b_xy_mean_err(y_count,x_count)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300]))); + else + s1a_xy_mean(y_count,x_count)=0; + s1a_xy_mean_err(y_count,x_count)=0; + s1b_xy_mean(y_count,x_count)=0; + s1b_xy_mean_err(y_count,x_count)=0; + end + + end + end + s1ab_xy_mean=s1a_xy_mean./s1b_xy_mean; + s1ab_xy_mean_err=sqrt( (s1b_xy_mean_err.*s1a_xy_mean./(s1b_xy_mean.^2)).^2 + (s1a_xy_mean_err./s1b_xy_mean).^2); + + + %Plot s1a XY means + color_range_max=max(max(s1a_xy_mean)); + color_range_min=min(min(s1a_xy_mean(s1a_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1a_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1a_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %Plot s1a XY means + color_range_max=max(max(s1b_xy_mean)); + color_range_min=min(min(s1b_xy_mean(s1b_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1b_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1b_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1b Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1b Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %s1a/b XY Ratio + color_range_max=max(max(s1ab_xy_mean)); + color_range_min=min(min(s1ab_xy_mean(s1ab_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1ab_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a/b Ratio vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a/b Ratio','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + +%% 3D Kr s1a/s1b map +if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +s1ab_xyz_numbins=floor((length(s1ab_z)/200)^(1/3)); %number of bins in one direction +s1ab_xyz_zstep=det_edge/s1ab_xyz_numbins; +s1ab_xyz_xstep=50/s1ab_xyz_numbins; +s1ab_xyz_ystep=50/s1ab_xyz_numbins; +s1ab_xyz_xmax=25; +r_max=25; + +s1ab_xyz_zbins=10+s1ab_xyz_zstep/2:s1ab_xyz_zstep:10+s1ab_xyz_zstep/2+s1ab_xyz_zstep*s1ab_xyz_numbins; %20 us +s1ab_xyz_xbins=(-r_max+s1ab_xyz_xstep/2):s1ab_xyz_xstep:r_max; +s1ab_xyz_ybins=(-r_max+s1ab_xyz_ystep/2):s1ab_xyz_ystep:r_max; + +s1a_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +Kr_count_3D=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + kr_q=s2x(j-s1ab_xyz_xstep) & s2y(i-s1ab_xyz_ystep) & inrange(drift_time,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + + %Count the number of events per bin + Count_S1ab_3D(l,m,n)=length(s1a_phe_both(q)); + Kr_count_3D(l,m,n)=length(s1_phe_both(kr_q)); + + if (Count_S1ab_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_xyz_mean(l,m,n)=s1a_z_fit.b1; + s1a_xyz_mean_err(l,m,n)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]) ),[0:2:300]).','gauss1'); + s1b_xyz_mean(l,m,n)=s1b_z_fit.b1; + s1b_xyz_mean_err(l,m,n)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); + else %not enough stats to do the fit + s1a_xyz_mean(l,m,n)=0; + s1a_xyz_mean_err(l,m,n)=0; + s1b_xyz_mean(l,m,n)=0; + s1b_xyz_mean_err(l,m,n)=0; + end + + end + end +k +end + + s1ab_xyz_mean=s1a_xyz_mean./s1b_xyz_mean; + s1ab_xyz_mean_err=sqrt( (s1b_xyz_mean_err.*s1a_xyz_mean./(s1b_xyz_mean.^2)).^2 + (s1a_xyz_mean_err./s1b_xyz_mean).^2); + + %Save ER Band fits + save('Sep2015_S1aS1b','s1ab_xyz_mean','s1ab_xyz_xbins','s1ab_xyz_ybins','s1ab_xyz_zbins','s1ab_P','s1ab_z_means','s1ab_bincenters','Kr_count_3D','Kr_count_1D'); + +else + %Save ER Band fits + save('Sep2015_S1aS1b','s1ab_P','s1ab_z_means','s1ab_bincenters','Kr_count_1D'); + +end + + diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/Nov2014_ER_Band.m b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/Nov2014_ER_Band.m new file mode 100644 index 0000000..04246a0 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/Nov2014_ER_Band.m @@ -0,0 +1,829 @@ +%% Make corrections with the chosen polynomial +load('MappingParametersStart_Nov2014') + +file_id_cp='Nov2014'; + +%% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % Removing field dependence from S1 and S2 + % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + %Hardcoded numbers from Energy Chi2 Fit + + + +s1ab_s2_xyz_fit_map.p1=-0.4988; +s1ab_s2_xyz_fit_map.p2=1.484; +c1=1-s1ab_s2_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s2_xyz_fit_map.p2; +s1ab_s2_xyz_fit_map.p3=c1; + +s1ab_s1_xyz_fit_map.p1=0.065; +s1ab_s1_xyz_fit_map.p2=0.02; +c2=1-s1ab_s1_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s1_xyz_fit_map.p2; +s1ab_s1_xyz_fit_map.p3=c2; + + + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +%Removing zeros from map with cubic neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else %Only do 1D in this case +%Removing zeros from map with cubic neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval); + + + + end + + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S1 Z-dependence (Both PMT arrays) +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to cubic 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + + light_correction_fig = figure; + errorbar(mean_index,means,means_error,'.k'); + hold on + [yplot_s1_both] = polyval(P_s1_both,dT_fit); + [center_s1_both, center_s1_both_err] = polyval(P_s1_both,z_center, S); %160[us]*1.51[\mus/us] + plot(dT_fit,yplot_s1_both,'-r','LineWidth',1); + xlabel('Depth (\mus)', 'FontSize',16); ylabel('Mean (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S1 Mean vs. Z'), 'FontSize', 16,'Interpreter','none'); + line([0 det_edge],[center_s1_both center_s1_both],'linestyle','--'); + line([z_center; z_center;],[min(means) max(means)],'linestyle','--'); + legend('S1\_both Mean', strcat('y=', num2str(P_s1_both(1),'%10.2e'), '*Z^2 + ', num2str(P_s1_both(2),'%10.2e')... + , '*Z + ', num2str(P_s1_both(3),4)),strcat('Det center = ',num2str(center_s1_both,4), ' [Phe]'),'location','northwest') + + box on; + myfigview(16); + xlim([0 det_edge]); + ylim([0.8*min(means) 1.15*max(means)]); + + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + + + + + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to cubic 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + + %%calculate S2/S1 also, just to double check the lifetime from S2 only + % hist_s2_both_s1(:,bin)= hist(s2_phe_both(time_cut)./s1_phe_both_z(time_cut),x3)'; + % temp_hist=hist_s2_both_s1(:,bin); + %Fit_s2_both_s1{bin}=fit(x3(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + % means_s2_s1(bin)=Fit_s2_both_s1{bin}.b1; + % means_error_s2_s1(bin) = Fit_s2_both_s1{bin}.c1/2/sqrt(sum(hist_s2_both_s1(:,bin))); % == sigma/sqrt(N); + % mean_index_s2_s1(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + + dT_range= inrange( mean_index,[5+bin_size,500] );%from 50 to 300us for the fit + + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + %%Tracker for pseudo-lifetime + s2_at_bottom_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_both=-320/log(s2_at_bottom_both/s2_at_top_both); + + dT_fit=0:1:det_edge; + + Fit_EL= fit(mean_index(dT_range),means(dT_range),'exp1'); + yfitEL = Fit_EL.a.*exp(Fit_EL.b.*dT_fit); + + e_lifetime_both=-1/Fit_EL.b; + s2_z0_both=Fit_EL.a; + + b=confint(Fit_EL, 0.683);%1 sigma matrix + sigma_e_lifetime_both=(1/b(1,2)-1/b(2,2))/2; + sigma_s2_z0_both=(b(2,1)-b(1,1))/2; + + lifetime_fig_both = figure; + errorbar(mean_index(2:end),means(2:end),means_error(2:end),'.k'); %first bin is anode, skip it + hold on + plot(dT_fit,yfitEL,'-r','LineWidth',1); + xlabel('Time (\mus)', 'FontSize',16); ylabel('Mean S2 (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S2_both Electron Lifetime'), 'FontSize', 16,'Interpreter','none'); + legend('S2\_both Mean', strcat( '\lambda= ', num2str(e_lifetime_both,4), ' \pm ', num2str(sigma_e_lifetime_both,2), ' \mus' )... + ,'location','northeast'); + myfigview(16); + xlim([0 det_edge]); + + + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_ybins),floor(s2_xbins)); +Sigma_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); +Count_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + +color_range_max=max(max(mean_S2_both_xy)); +color_range_min=min(min(mean_S2_both_xy(mean_S2_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + +s2_xy_both_fig = figure; +contourf(s2xbins,s2ybins,mean_S2_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. S2 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_ybins),floor(s1_xbins)); +Sigma_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); +Count_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +color_range_max=max(max(mean_S1_both_xy)); +color_range_min=min(min(mean_S1_both_xy(mean_S1_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + + +s1_xy_both_fig = figure; +contourf(s1xbins,s1ybins,mean_S1_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp,'. S1 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%% Apply corrections to CH3T and calculate the ER band + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\Run04_CH3T\KrypCal2p18_IQs\MakePlots\CH3T_Nov2014_Kr2p18.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +%% Make ER Band + +s1_min=0; +s1_max=50; + +%% First make plot of CH3T selection + +figure +plot(log10(s2_phe_both_xyz),log10(s1_phe_both_xyz),'.k') +hold on; +xlabel('log10(Corrected S2)'); ylabel ('log10(Corrected S1)'); myfigview(16) +x=[3.629:0.001:4.185]; +y=-0.7.*x+4.8; +plot(x,y,'-r','LineWidth',2); +x=[2.703:0.001:3.26]; +y=-0.7.*x+2; +plot(x,y,'-r','LineWidth',2); +x=[2.703:0.001:3.629]; +y=2.*x-5; +plot(x,y,'-r','LineWidth',2); +x=[3.26:0.001:4.185]; +y=2.*x-6.8; +plot(x,y,'-r','LineWidth',2); +title('Feb2015 CH3T'); + +%% First figure out where the outliers are in space + +pulse_area_cut= (log10(s1_phe_both_xyz)+0.7*log10(s2_phe_both_xyz)<4.8) & (log10(s1_phe_both_xyz)+0.7*log10(s2_phe_both_xyz)>2) & ... + (log10(s1_phe_both_xyz)-2*log10(s2_phe_both_xyz)<-5) & (log10(s1_phe_both_xyz)-2*log10(s2_phe_both_xyz)>-6.8); + + +max_r=21; +fiducial_cut=inrange(drift_time,[40 300]) & inrange(s2radius_del,[0,max_r]); + +tritium_cut= clean_cut & pulse_area_cut & fiducial_cut; + +%% Next, make plot of fiducial cut + +figure +density(s2radius_del.^2,drift_time,[0:10:1000],[0:2:450]) +cc=colorbar; +ylabel(cc,'Count','FontSize',16); +set(gca,'Ydir','reverse') +hold on; +line([441 441],[40 300],'Color','r','LineWidth',2) +line([0 441],[300 300],'Color','r','LineWidth',2) +line([0 441],[40 40],'Color','r','LineWidth',2) +xlabel('Delensed Radius^2 (cm^2)'); ylabel('Drift Time (uSec)'); myfigview(16); +title('Feb2015 CH3T') +% plot(s2radius_del(~fiducial_cut).^2,drift_time(~fiducial_cut),'.k','MarkerSize',2) + + + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:.05:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=tritium_cut & inrange(s1_phe_both_xyz,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); + %ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + b=confint(ER_mean_power_fit,.68); + sigma_a_ER_mean=(b(2,1)-b(1,1))/2; + sigma_b_ER_mean=(b(2,2)-b(1,2))/2; + + ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + b=confint(ER_lower_power_fit,.68); + sigma_a_ER_lower=(b(2,1)-b(1,1))/2; + sigma_b_ER_lower=(b(2,2)-b(1,2))/2; + + ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + b=confint(ER_upper_power_fit,.68); + sigma_a_ER_upper=(b(2,1)-b(1,1))/2; + sigma_b_ER_upper=(b(2,2)-b(1,2))/2; + + + %Make Plot + + no_fid_new=figure; + hold on + %plot(s1_phe_both_xyz(tritium_cut),log10(s2_phe_both_xyz(tritium_cut)./s1_phe_both_xyz(tritium_cut)),'ok','markersize',2) + density(s1_phe_both_xyz(tritium_cut),log10(s2_phe_both_xyz(tritium_cut)./s1_phe_both_xyz(tritium_cut)),[0:.5:100],[0:.05:4]); +% densityplot(s1_phe_both_xyz(tritium_cut),log10(s2_phe_both_xyz(tritium_cut)./s1_phe_both_xyz(tritium_cut)),'rectangle',[.5 .05],'lin'); + cc=colorbar; + ylabel(cc,'Count','FontSize',16); + colormap; + ylabel('Corrected log10(S2/S1)'); xlabel('S1 corrected (Pulse Area Phe)'); + title(sprintf('Run 04 CH3T, R<%d cm',max_r),'fontsize',16,'Interpreter','none'); + myfigview(16); + ylim([0 3.5]);xlim([0 s1_max]); +% plot(ER_bins,lower_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_lower_fit,'--k','markersize',14,'linewidth',2) +% plot(ER_bins,mean_ER_band,'ok','markersize',6,'linewidth',2)%plot mean of ER band + plot(ER_bins,ER_mean_fit,'-k','markersize',20,'linewidth',2) +% plot(ER_bins,upper_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_upper_fit,'--k','markersize',14,'linewidth',2) + + + bin_step=2; + + total_count=length(log10(s2_phe_both_xyz(tritium_cut))); + + + box; + text(10,2.8,strcat('Total Count= ',num2str(total_count)),'fontsize',16); + %text(5,.7,strcat('NEST\_SE_{bot} Fit=',num2str(ER_mean_NEST_fit.SE_ER_fit*73/64*27/max_r,3),'\pm ', num2str(sigma_SE_ER_fit*73/64*27/max_r,2),'[Phe]'),'fontsize',16,'color','m','interpreter','tex'); + %text(5,.8,'NEST Platinum V4-b', 'fontsize',16,'color','m','interpreter','tex' ); + text(5,.55,strcat('+',num2str(band_sigma),'\sigma = (',num2str(ER_upper_power_fit.a,3),'\pm', num2str(sigma_a_ER_upper,1) ,')\times S1_c ^{', num2str(ER_upper_power_fit.b,3),'\pm',num2str(sigma_b_ER_upper,1),'}'),'fontsize',16,'interpreter','tex'); + text(5,.3,strcat('Mean=(',num2str(ER_mean_power_fit.a,3),'\pm', num2str(sigma_a_ER_mean,1),')\times S1_c ^{', num2str(ER_mean_power_fit.b,3),'\pm', num2str(sigma_b_ER_mean,1),'}'),'fontsize',16,'interpreter','tex'); + text(5,.05,strcat('-',num2str(band_sigma),'\sigma = (',num2str(ER_lower_power_fit.a,3),'\pm', num2str(sigma_a_ER_lower,1),')\times S1_c ^{', num2str(ER_lower_power_fit.b,3),'\pm', num2str(sigma_b_ER_lower,1),'}'),'fontsize',16,'interpreter','tex'); + title('feb2015 CH3T') + + s1_phe_both_xyz_all=s1_phe_both_xyz(tritium_cut & inrange(drift_time,[0,110])); + log10_s2s1_xyz_all=log10(s2_phe_both_xyz(tritium_cut & inrange(drift_time,[0,110]))./s1_phe_both_xyz(tritium_cut & inrange(drift_time,[0,110]))); + ER_lower_fit_all=ER_lower_fit; + ER_upper_fit_all=ER_upper_fit; + ER_mean_fit_all=ER_mean_fit; + + + + %Save ER Band fits + save('Nov2014_ERFit','ER_bins','mean_ER_band','ER_sigma','ER_lower_power_fit','ER_upper_power_fit','ER_mean_power_fit','ER_lower_fit','ER_upper_fit','ER_mean_fit'); + \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictERBand_Feb2015.m b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictERBand_Feb2015.m new file mode 100644 index 0000000..24c017f --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictERBand_Feb2015.m @@ -0,0 +1,224 @@ +% Load in the S1a/S1b -> ER Band map + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p22\KrypCal2p22_QualityChecks\ERBand_Prediction\S1aS1b_To_ERBand_RZVoxels.mat') + + +%% Load in Sep2014 ER S1a/S1b + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p22\KrypCal2p22_QualityChecks\ERBand_Prediction\Feb2015_S1aS1b.mat') + + +SE_size_Sep2015=25.64; +SE_size_Sep2014=27.21; +SE_size_Nov2014=26.13; +SE_size_Feb2015=26.23; + + +MC_events=[]; +MC_events_x=[]; + + +for i=1:size(s1ab_xyz_mean,1) + for j=1:size(s1ab_xyz_mean,2) + for k=1:size(s1ab_xyz_mean,3) + if ~isnan(s1ab_xyz_mean(i,j,k)) + [powerlaw_a powerlaw_a_err]=polyval(S1aS1b_to_mean_a_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_mean_a_fit_err); + [powerlaw_b powerlaw_b_err]=polyval(S1aS1b_to_mean_b_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_mean_b_fit_err); + [powerlaw_a_upper powerlaw_a_upper_err]=polyval(S1aS1b_to_upper_a_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_upper_a_fit_err); + [powerlaw_b_upper powerlaw_b_upper_err]=polyval(S1aS1b_to_upper_b_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_upper_b_fit_err); + [powerlaw_a_lower powerlaw_a_lower_err]=polyval(S1aS1b_to_lower_a_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_lower_a_fit_err); + [powerlaw_b_lower powerlaw_b_lower_err]=polyval(S1aS1b_to_lower_b_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_lower_b_fit_err); + + %Make MC of predicted band for the voxel + for counter=1:Kr_count_3D(i,j,k)/10; + xx=50*rand(1); %pick random S1 value + yy= log10((10.^(powerlaw_a.*xx.^powerlaw_b)).*(SE_size_Feb2015/SE_size_Sep2015)); %Get associate log10(S1/S2) mean from power law fit + yy_sigma=abs(yy-log10((10.^(powerlaw_a_upper.*xx.^powerlaw_b_upper)).*(SE_size_Feb2015/SE_size_Sep2015)) )/1.28; %Get associate log10(S1/S2) gaussian width from power law fit + MC_events=[MC_events; normrnd(yy,yy_sigma,1)]; + MC_events_x=[MC_events_x; xx]; + end + end + end + end +end + +%% Fit total MC band +s1_min=0; +s1_max=50; + band_sigma=1.28; %90% confidence bounds + + s2_s1_bin= 1:.05:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + MC_counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut= inrange(MC_events_x,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(MC_events(ER_fit_cut),s2_s1_bin); + MC_counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(MC_events(ER_fit_cut),s2_s1_bin); + + %band=confint(Fit_ER,.1); + %ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*MC_counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + MC_ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + MC_ER_mean_fit=MC_ER_mean_power_fit.a.*ER_bins.^(MC_ER_mean_power_fit.b); + b=confint(MC_ER_mean_power_fit,.68); + MC_sigma_a_ER_mean=(b(2,1)-b(1,1))/2; + MC_sigma_b_ER_mean=(b(2,2)-b(1,2))/2; + + MC_ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + MC_ER_lower_fit=MC_ER_lower_power_fit.a.*ER_bins.^(MC_ER_lower_power_fit.b); + b=confint(MC_ER_lower_power_fit,.68); + MC_sigma_a_ER_lower=(b(2,1)-b(1,1))/2; + MC_sigma_b_ER_lower=(b(2,2)-b(1,2))/2; + + MC_ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + MC_ER_upper_fit=MC_ER_upper_power_fit.a.*ER_bins.^(MC_ER_upper_power_fit.b); + b=confint(MC_ER_upper_power_fit,.68); + MC_sigma_a_ER_upper=(b(2,1)-b(1,1))/2; + MC_sigma_b_ER_upper=(b(2,2)-b(1,2))/2; + + MC_powerlaw_a=MC_ER_mean_power_fit.a; + MC_powerlaw_b=MC_ER_mean_power_fit.b; + MC_powerlaw_a_upper=MC_ER_upper_power_fit.a; + MC_powerlaw_b_upper=MC_ER_upper_power_fit.b; + MC_powerlaw_a_lower=MC_ER_lower_power_fit.a; + MC_powerlaw_b_lower=MC_ER_lower_power_fit.b; + MC_powerlaw_a_err=MC_sigma_a_ER_mean; + MC_powerlaw_b_err=MC_sigma_b_ER_mean; + MC_powerlaw_a_upper_err=MC_sigma_a_ER_upper; + MC_powerlaw_b_upper_err=MC_sigma_b_ER_upper; + MC_powerlaw_a_lower_err=MC_sigma_a_ER_lower; + MC_powerlaw_b_lower_err=MC_sigma_b_ER_lower; + + %% Compare to actual band + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p22\KrypCal2p22_QualityChecks\ERBand_Prediction\Feb2015_ERFit.mat') + + %Make Plot + + no_fid_new=figure; + hold on + plot(MC_events_x,MC_events,'.k','MarkerSize',1) +% cc=colorbar; +% ylabel(cc,'Count','FontSize',16); +% colormap; + ylabel('Corrected log10(S2/S1)'); xlabel('S1 corrected (Pulse Area Phe)'); + title(sprintf('Run 04 CH3T, MonteCarlo Band'),'fontsize',16,'Interpreter','none'); + myfigview(16); + ylim([0 3.5]);xlim([0 s1_max]); +% plot(ER_bins,lower_bound,'ok','markersize',6,'linewidth',2) +plot(ER_bins,MC_ER_mean_fit,'-b','markersize',20,'linewidth',2) +plot(ER_bins,ER_mean_fit,'-r','markersize',14,'linewidth',2) +% plot(ER_bins,mean_ER_band,'ok','markersize',6,'linewidth',2)%plot mean of ER band + plot(ER_bins,ER_lower_fit,'--r','markersize',20,'linewidth',2) +% plot(ER_bins,upper_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_upper_fit,'--r','markersize',14,'linewidth',2) +plot(ER_bins,MC_ER_lower_fit,'--b','markersize',20,'linewidth',2) +plot(ER_bins,MC_ER_upper_fit,'--b','markersize',20,'linewidth',2) + legend('Data','MC Band','Measured ER Band'); + + + bin_step=2; + + total_count=length(log10(MC_events_x)); + +% +% box; +% text(10,2.8,strcat('Total Count= ',num2str(total_count)),'fontsize',16); +% text(5,.55,strcat('+',num2str(band_sigma),'\sigma = (',num2str(ER_upper_power_fit.a,3),'\pm', num2str(sigma_a_ER_upper,1) ,')\times S1_c ^{', num2str(ER_upper_power_fit.b,3),'\pm',num2str(sigma_b_ER_upper,1),'}'),'fontsize',16,'interpreter','tex'); +% text(5,.3,strcat('Mean=(',num2str(ER_mean_power_fit.a,3),'\pm', num2str(sigma_a_ER_mean,1),')\times S1_c ^{', num2str(ER_mean_power_fit.b,3),'\pm', num2str(sigma_b_ER_mean,1),'}'),'fontsize',16,'interpreter','tex'); +% text(5,.05,strcat('-',num2str(band_sigma),'\sigma = (',num2str(ER_lower_power_fit.a,3),'\pm', num2str(sigma_a_ER_lower,1),')\times S1_c ^{', num2str(ER_lower_power_fit.b,3),'\pm', num2str(sigma_b_ER_lower,1),'}'),'fontsize',16,'interpreter','tex'); +% title('Feb2015 CH3T') + + box; + + text(5,.55,strcat('+',num2str(band_sigma),'\sigma = (',num2str(MC_ER_upper_power_fit.a,3),'\pm', num2str(MC_sigma_a_ER_upper,1) ,')\times S1_c ^{', num2str(MC_ER_upper_power_fit.b,3),'\pm',num2str(MC_sigma_b_ER_upper,1),'}'),'fontsize',16,'interpreter','tex'); + text(5,.3,strcat('Mean=(',num2str(MC_ER_mean_power_fit.a,3),'\pm', num2str(MC_sigma_a_ER_mean,1),')\times S1_c ^{', num2str(MC_ER_mean_power_fit.b,3),'\pm', num2str(MC_sigma_b_ER_mean,1),'}'),'fontsize',16,'interpreter','tex'); + text(5,.05,strcat('-',num2str(band_sigma),'\sigma = (',num2str(MC_ER_lower_power_fit.a,3),'\pm', num2str(MC_sigma_a_ER_lower,1),')\times S1_c ^{', num2str(MC_ER_lower_power_fit.b,3),'\pm', num2str(MC_sigma_b_ER_lower,1),'}'),'fontsize',16,'interpreter','tex'); + title('Feb2015 CH3T') + + + + +%% Stats about the difference + + +%Real Data Band +x=[1:0.1:50]; +band_mean_data=ER_mean_power_fit.a*x.^ER_mean_power_fit.b; +band_upper_data=ER_upper_power_fit.a.*x.^ER_upper_power_fit.b; +band_lower_data=ER_lower_power_fit.a.*x.^ER_lower_power_fit.b; +band_width_data=(band_mean_data-band_lower_data)./(1.28); + +%KrypCal Band - uses slightly different ER band than the one in the figures +band_mean_mc=MC_ER_mean_power_fit.a.*x.^MC_ER_mean_power_fit.b; +band_upper_mc=MC_ER_upper_power_fit.a*x.^MC_ER_upper_power_fit.b; +band_lower_mc=MC_ER_lower_power_fit.a*x.^MC_ER_lower_power_fit.b; +band_width_mc=(band_mean_mc-band_lower_mc)./(1.28); + +%Improvement in bands: Negative is worse resolution +width_difference=mean((band_width_data-band_width_mc)./(band_width_data)) + +%Shift in bands: Positive is upward shift +mean_shift=-mean((band_mean_data-band_mean_mc)./(band_mean_data)) + +%Chi2 for band mean +temp=confint(ER_mean_power_fit); +ER_mean_power_fit_a_err=abs(ER_mean_power_fit.a-temp(1,1)); +ER_mean_power_fit_b_err=abs(ER_mean_power_fit.b-temp(1,2)); +band_mean_data_err=sqrt( ((x.^ER_mean_power_fit.b).*(ER_mean_power_fit_a_err)).^2 + (ER_mean_power_fit_b_err.*ER_mean_power_fit.a.*(x.^ER_mean_power_fit.b).*log(x)).^2); +mean_chi2=sum( ((band_mean_mc-band_mean_data)./band_mean_data_err).^2) +mean_p_value=1-chi2cdf(mean_chi2,length(band_mean_data)-1) + +%Chi2 for upper 90% +temp=confint(ER_upper_power_fit); +ER_upper_power_fit_a_err=abs(ER_upper_power_fit.a-temp(1,1)); +ER_upper_power_fit_b_err=abs(ER_upper_power_fit.b-temp(1,2)); +band_upper_data_err=sqrt( ((x.^ER_upper_power_fit.b).*(ER_upper_power_fit_a_err)).^2 + (ER_upper_power_fit_b_err.*ER_upper_power_fit.a.*(x.^ER_upper_power_fit.b).*log(x)).^2); +upper_chi2=sum( ((band_upper_mc-band_upper_data)./band_upper_data_err).^2) +upper_p_value=1-chi2cdf(upper_chi2,length(band_mean_data)-1) + +%Chi2 for lower 90% +temp=confint(ER_lower_power_fit); +ER_lower_power_fit_a_err=abs(ER_lower_power_fit.a-temp(1,1)); +ER_lower_power_fit_b_err=abs(ER_lower_power_fit.b-temp(1,2)); +band_lower_data_err=sqrt( ((x.^ER_lower_power_fit.b).*(ER_lower_power_fit_a_err)).^2 + (ER_lower_power_fit_b_err.*ER_lower_power_fit.a.*(x.^ER_lower_power_fit.b).*log(x)).^2); +lower_chi2=sum( ((band_lower_mc-band_lower_data)./band_lower_data_err).^2) +lower_p_value=1-chi2cdf(lower_chi2,length(band_mean_data)-1) + + +%Chi2 for total width +expected_width=(band_upper_data-band_lower_data); +expected_width_err=sqrt(band_upper_data_err.^2 + band_lower_data_err.^2); +observed_width=(band_upper_mc-band_lower_mc); +width_chi2=sum( ((observed_width-expected_width)./(expected_width_err)).^2) +width_p_value=1-chi2cdf(width_chi2,length(band_mean_data)-1) diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictERBand_Feb2016.m b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictERBand_Feb2016.m new file mode 100644 index 0000000..0aedf4f --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictERBand_Feb2016.m @@ -0,0 +1,246 @@ +% Load in the S1a/S1b -> ER Band map + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p22\KrypCal2p22_QualityChecks\ERBand_Prediction\S1aS1b_To_ERBand_RZVoxels.mat') + + +%% Load in Sep2014 ER S1a/S1b + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p22\KrypCal2p22_QualityChecks\ERBand_Prediction\Feb2016_S1aS1b.mat') + + +SE_size_Sep2015=25.64; +SE_size_Sep2014=27.21; +SE_size_Nov2014=26.13; +SE_size_Feb2015=26.23; +SE_size_Feb2016=25.05; + + +MC_events=[]; +MC_events_x=[]; + +% +% for i=1:size(s1ab_xyz_mean,1) +% for j=1:size(s1ab_xyz_mean,2) +% for k=1:size(s1ab_xyz_mean,3) +% if ~isnan(s1ab_xyz_mean(i,j,k)) +% [powerlaw_a powerlaw_a_err]=polyval(S1aS1b_to_mean_a_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_mean_a_fit_err); +% [powerlaw_b powerlaw_b_err]=polyval(S1aS1b_to_mean_b_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_mean_b_fit_err); +% [powerlaw_a_upper powerlaw_a_upper_err]=polyval(S1aS1b_to_upper_a_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_upper_a_fit_err); +% [powerlaw_b_upper powerlaw_b_upper_err]=polyval(S1aS1b_to_upper_b_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_upper_b_fit_err); +% [powerlaw_a_lower powerlaw_a_lower_err]=polyval(S1aS1b_to_lower_a_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_lower_a_fit_err); +% [powerlaw_b_lower powerlaw_b_lower_err]=polyval(S1aS1b_to_lower_b_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_lower_b_fit_err); +% +% %Make MC of predicted band for the voxel +% for counter=1:Kr_count_3D(i,j,k)/10; +% xx=50*rand(1); %pick random S1 value +% yy= log10((10.^(powerlaw_a.*xx.^powerlaw_b)).*(SE_size_Feb2015/SE_size_Sep2015)); %Get associate log10(S1/S2) mean from power law fit +% yy_sigma=abs(yy-log10((10.^(powerlaw_a_upper.*xx.^powerlaw_b_upper)).*(SE_size_Feb2016/SE_size_Sep2015)) )/1.28; %Get associate log10(S1/S2) gaussian width from power law fit +% MC_events=[MC_events; normrnd(yy,yy_sigma,1)]; +% MC_events_x=[MC_events_x; xx]; +% end +% end +% end +% end +% end + + +for i=1:size(s1ab_z_means,2) + if ~isnan(s1ab_z_means(i)) + [powerlaw_a powerlaw_a_err]=polyval(S1aS1b_to_mean_a_fit,s1ab_z_means(i),S1aS1b_to_mean_a_fit_err); + [powerlaw_b powerlaw_b_err]=polyval(S1aS1b_to_mean_b_fit,s1ab_z_means(i),S1aS1b_to_mean_b_fit_err); + [powerlaw_a_upper powerlaw_a_upper_err]=polyval(S1aS1b_to_upper_a_fit,s1ab_z_means(i),S1aS1b_to_upper_a_fit_err); + [powerlaw_b_upper powerlaw_b_upper_err]=polyval(S1aS1b_to_upper_b_fit,s1ab_z_means(i),S1aS1b_to_upper_b_fit_err); + [powerlaw_a_lower powerlaw_a_lower_err]=polyval(S1aS1b_to_lower_a_fit,s1ab_z_means(i),S1aS1b_to_lower_a_fit_err); + [powerlaw_b_lower powerlaw_b_lower_err]=polyval(S1aS1b_to_lower_b_fit,s1ab_z_means(i),S1aS1b_to_lower_b_fit_err); + + %Make MC of predicted band for the voxel + for counter=1:Kr_count_1D(i); + xx=50*rand(1); %pick random S1 value + yy= log10((10.^(powerlaw_a.*xx.^powerlaw_b)).*(SE_size_Feb2016/SE_size_Sep2015)); %Get associate log10(S1/S2) mean from power law fit + yy_sigma=abs(yy-log10((10.^(powerlaw_a_upper.*xx.^powerlaw_b_upper)).*(SE_size_Feb2016/SE_size_Sep2015)) )/1.28; %Get associate log10(S1/S2) gaussian width from power law fit + MC_events=[MC_events; normrnd(yy,yy_sigma,1)]; + MC_events_x=[MC_events_x; xx]; + end + end +end + +%% Fit total MC band +s1_min=0; +s1_max=50; + band_sigma=1.28; %90% confidence bounds + + s2_s1_bin= 1:.05:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + MC_counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut= inrange(MC_events_x,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(MC_events(ER_fit_cut),s2_s1_bin); + MC_counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(MC_events(ER_fit_cut),s2_s1_bin); + + %band=confint(Fit_ER,.1); + %ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*MC_counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + MC_ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + MC_ER_mean_fit=MC_ER_mean_power_fit.a.*ER_bins.^(MC_ER_mean_power_fit.b); + b=confint(MC_ER_mean_power_fit,.68); + MC_sigma_a_ER_mean=(b(2,1)-b(1,1))/2; + MC_sigma_b_ER_mean=(b(2,2)-b(1,2))/2; + + MC_ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + MC_ER_lower_fit=MC_ER_lower_power_fit.a.*ER_bins.^(MC_ER_lower_power_fit.b); + b=confint(MC_ER_lower_power_fit,.68); + MC_sigma_a_ER_lower=(b(2,1)-b(1,1))/2; + MC_sigma_b_ER_lower=(b(2,2)-b(1,2))/2; + + MC_ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + MC_ER_upper_fit=MC_ER_upper_power_fit.a.*ER_bins.^(MC_ER_upper_power_fit.b); + b=confint(MC_ER_upper_power_fit,.68); + MC_sigma_a_ER_upper=(b(2,1)-b(1,1))/2; + MC_sigma_b_ER_upper=(b(2,2)-b(1,2))/2; + + MC_powerlaw_a=MC_ER_mean_power_fit.a; + MC_powerlaw_b=MC_ER_mean_power_fit.b; + MC_powerlaw_a_upper=MC_ER_upper_power_fit.a; + MC_powerlaw_b_upper=MC_ER_upper_power_fit.b; + MC_powerlaw_a_lower=MC_ER_lower_power_fit.a; + MC_powerlaw_b_lower=MC_ER_lower_power_fit.b; + MC_powerlaw_a_err=MC_sigma_a_ER_mean; + MC_powerlaw_b_err=MC_sigma_b_ER_mean; + MC_powerlaw_a_upper_err=MC_sigma_a_ER_upper; + MC_powerlaw_b_upper_err=MC_sigma_b_ER_upper; + MC_powerlaw_a_lower_err=MC_sigma_a_ER_lower; + MC_powerlaw_b_lower_err=MC_sigma_b_ER_lower; + + %% Compare to actual band + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p22\KrypCal2p22_QualityChecks\ERBand_Prediction\Feb2016_ERFit.mat') + + %Make Plot + + no_fid_new=figure; + hold on + plot(MC_events_x,MC_events,'.k','MarkerSize',1) +% cc=colorbar; +% ylabel(cc,'Count','FontSize',16); +% colormap; + ylabel('Corrected log10(S2/S1)'); xlabel('S1 corrected (Pulse Area Phe)'); + title(sprintf('Run 04 CH3T, MonteCarlo Band'),'fontsize',16,'Interpreter','none'); + myfigview(16); + ylim([0 3.5]);xlim([0 s1_max]); +% plot(ER_bins,lower_bound,'ok','markersize',6,'linewidth',2) +plot(ER_bins,MC_ER_mean_fit,'-b','markersize',20,'linewidth',2) +plot(ER_bins,ER_mean_fit,'-r','markersize',14,'linewidth',2) +% plot(ER_bins,mean_ER_band,'ok','markersize',6,'linewidth',2)%plot mean of ER band + plot(ER_bins,ER_lower_fit,'--r','markersize',20,'linewidth',2) +% plot(ER_bins,upper_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_upper_fit,'--r','markersize',14,'linewidth',2) +plot(ER_bins,MC_ER_lower_fit,'--b','markersize',20,'linewidth',2) +plot(ER_bins,MC_ER_upper_fit,'--b','markersize',20,'linewidth',2) + legend('Data','MC Band','Measured ER Band'); + + + bin_step=2; + + total_count=length(log10(MC_events_x)); + +% +% box; +% text(10,2.8,strcat('Total Count= ',num2str(total_count)),'fontsize',16); +% text(5,.55,strcat('+',num2str(band_sigma),'\sigma = (',num2str(ER_upper_power_fit.a,3),'\pm', num2str(sigma_a_ER_upper,1) ,')\times S1_c ^{', num2str(ER_upper_power_fit.b,3),'\pm',num2str(sigma_b_ER_upper,1),'}'),'fontsize',16,'interpreter','tex'); +% text(5,.3,strcat('Mean=(',num2str(ER_mean_power_fit.a,3),'\pm', num2str(sigma_a_ER_mean,1),')\times S1_c ^{', num2str(ER_mean_power_fit.b,3),'\pm', num2str(sigma_b_ER_mean,1),'}'),'fontsize',16,'interpreter','tex'); +% text(5,.05,strcat('-',num2str(band_sigma),'\sigma = (',num2str(ER_lower_power_fit.a,3),'\pm', num2str(sigma_a_ER_lower,1),')\times S1_c ^{', num2str(ER_lower_power_fit.b,3),'\pm', num2str(sigma_b_ER_lower,1),'}'),'fontsize',16,'interpreter','tex'); +% title('Feb2015 CH3T') + + box; + + text(5,.55,strcat('+',num2str(band_sigma),'\sigma = (',num2str(MC_ER_upper_power_fit.a,3),'\pm', num2str(MC_sigma_a_ER_upper,1) ,')\times S1_c ^{', num2str(MC_ER_upper_power_fit.b,3),'\pm',num2str(MC_sigma_b_ER_upper,1),'}'),'fontsize',16,'interpreter','tex'); + text(5,.3,strcat('Mean=(',num2str(MC_ER_mean_power_fit.a,3),'\pm', num2str(MC_sigma_a_ER_mean,1),')\times S1_c ^{', num2str(MC_ER_mean_power_fit.b,3),'\pm', num2str(MC_sigma_b_ER_mean,1),'}'),'fontsize',16,'interpreter','tex'); + text(5,.05,strcat('-',num2str(band_sigma),'\sigma = (',num2str(MC_ER_lower_power_fit.a,3),'\pm', num2str(MC_sigma_a_ER_lower,1),')\times S1_c ^{', num2str(MC_ER_lower_power_fit.b,3),'\pm', num2str(MC_sigma_b_ER_lower,1),'}'),'fontsize',16,'interpreter','tex'); + title('Feb2016 CH3T') + + + + +%% Stats about the difference + + +%Real Data Band +x=[1:0.1:50]; +band_mean_data=ER_mean_power_fit.a*x.^ER_mean_power_fit.b; +band_upper_data=ER_upper_power_fit.a.*x.^ER_upper_power_fit.b; +band_lower_data=ER_lower_power_fit.a.*x.^ER_lower_power_fit.b; +band_width_data=(band_mean_data-band_lower_data)./(1.28); + +%KrypCal Band - uses slightly different ER band than the one in the figures +band_mean_mc=MC_ER_mean_power_fit.a.*x.^MC_ER_mean_power_fit.b; +band_upper_mc=MC_ER_upper_power_fit.a*x.^MC_ER_upper_power_fit.b; +band_lower_mc=MC_ER_lower_power_fit.a*x.^MC_ER_lower_power_fit.b; +band_width_mc=(band_mean_mc-band_lower_mc)./(1.28); + +%Improvement in bands: Negative is worse resolution +width_difference=mean((band_width_data-band_width_mc)./(band_width_data)) + +%Shift in bands: Positive is upward shift +mean_shift=-mean((band_mean_data-band_mean_mc)./(band_mean_data)) + +%Chi2 for band mean +temp=confint(ER_mean_power_fit); +ER_mean_power_fit_a_err=abs(ER_mean_power_fit.a-temp(1,1)); +ER_mean_power_fit_b_err=abs(ER_mean_power_fit.b-temp(1,2)); +band_mean_data_err=sqrt( ((x.^ER_mean_power_fit.b).*(ER_mean_power_fit_a_err)).^2 + (ER_mean_power_fit_b_err.*ER_mean_power_fit.a.*(x.^ER_mean_power_fit.b).*log(x)).^2); +mean_chi2=sum( ((band_mean_mc-band_mean_data)./band_mean_data_err).^2) +mean_p_value=1-chi2cdf(mean_chi2,length(band_mean_data)-1) + +%Chi2 for upper 90% +temp=confint(ER_upper_power_fit); +ER_upper_power_fit_a_err=abs(ER_upper_power_fit.a-temp(1,1)); +ER_upper_power_fit_b_err=abs(ER_upper_power_fit.b-temp(1,2)); +band_upper_data_err=sqrt( ((x.^ER_upper_power_fit.b).*(ER_upper_power_fit_a_err)).^2 + (ER_upper_power_fit_b_err.*ER_upper_power_fit.a.*(x.^ER_upper_power_fit.b).*log(x)).^2); +upper_chi2=sum( ((band_upper_mc-band_upper_data)./band_upper_data_err).^2) +upper_p_value=1-chi2cdf(upper_chi2,length(band_mean_data)-1) + +%Chi2 for lower 90% +temp=confint(ER_lower_power_fit); +ER_lower_power_fit_a_err=abs(ER_lower_power_fit.a-temp(1,1)); +ER_lower_power_fit_b_err=abs(ER_lower_power_fit.b-temp(1,2)); +band_lower_data_err=sqrt( ((x.^ER_lower_power_fit.b).*(ER_lower_power_fit_a_err)).^2 + (ER_lower_power_fit_b_err.*ER_lower_power_fit.a.*(x.^ER_lower_power_fit.b).*log(x)).^2); +lower_chi2=sum( ((band_lower_mc-band_lower_data)./band_lower_data_err).^2) +lower_p_value=1-chi2cdf(lower_chi2,length(band_mean_data)-1) + + +%Chi2 for total width +expected_width=(band_upper_data-band_lower_data); +expected_width_err=sqrt(band_upper_data_err.^2 + band_lower_data_err.^2); +observed_width=(band_upper_mc-band_lower_mc); +width_chi2=sum( ((observed_width-expected_width)./(expected_width_err)).^2) +width_p_value=1-chi2cdf(width_chi2,length(band_mean_data)-1) diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictERBand_Nov2014.m b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictERBand_Nov2014.m new file mode 100644 index 0000000..fa09b72 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictERBand_Nov2014.m @@ -0,0 +1,245 @@ +% Load in the S1a/S1b -> ER Band map + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p22\KrypCal2p22_QualityChecks\ERBand_Prediction\S1aS1b_To_ERBand_RZVoxels.mat') + + +%% Load in Sep2014 ER S1a/S1b + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p22\KrypCal2p22_QualityChecks\ERBand_Prediction\Nov2014_S1aS1b.mat') + + +SE_size_Sep2015=25.64; +SE_size_Sep2014=27.21; +SE_size_Nov2014=26.13; +SE_size_Feb2015=26.23; + + +MC_events=[]; +MC_events_x=[]; +% +% +% for i=1:size(s1ab_xyz_mean,1) +% for j=1:size(s1ab_xyz_mean,2) +% for k=1:size(s1ab_xyz_mean,3) +% if ~isnan(s1ab_xyz_mean(i,j,k)) +% [powerlaw_a powerlaw_a_err]=polyval(S1aS1b_to_mean_a_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_mean_a_fit_err); +% [powerlaw_b powerlaw_b_err]=polyval(S1aS1b_to_mean_b_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_mean_b_fit_err); +% [powerlaw_a_upper powerlaw_a_upper_err]=polyval(S1aS1b_to_upper_a_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_upper_a_fit_err); +% [powerlaw_b_upper powerlaw_b_upper_err]=polyval(S1aS1b_to_upper_b_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_upper_b_fit_err); +% [powerlaw_a_lower powerlaw_a_lower_err]=polyval(S1aS1b_to_lower_a_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_lower_a_fit_err); +% [powerlaw_b_lower powerlaw_b_lower_err]=polyval(S1aS1b_to_lower_b_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_lower_b_fit_err); +% +% %Make MC of predicted band for the voxel +% for counter=1:Kr_count_3D(i,j,k)/10; +% xx=50*rand(1); %pick random S1 value +% yy= log10((10.^(powerlaw_a.*xx.^powerlaw_b)).*(SE_size_Nov2014/SE_size_Sep2015)); %Get associate log10(S1/S2) mean from power law fit +% yy_sigma=abs(yy-log10((10.^(powerlaw_a_upper.*xx.^powerlaw_b_upper)).*(SE_size_Nov2014/SE_size_Sep2015)) )/1.28; %Get associate log10(S1/S2) gaussian width from power law fit +% MC_events=[MC_events; normrnd(yy,yy_sigma,1)]; +% MC_events_x=[MC_events_x; xx]; +% end +% end +% end +% end +% end +% + + +for i=1:size(s1ab_z_means,2) + if ~isnan(s1ab_z_means(i)) + [powerlaw_a powerlaw_a_err]=polyval(S1aS1b_to_mean_a_fit,s1ab_z_means(i),S1aS1b_to_mean_a_fit_err); + [powerlaw_b powerlaw_b_err]=polyval(S1aS1b_to_mean_b_fit,s1ab_z_means(i),S1aS1b_to_mean_b_fit_err); + [powerlaw_a_upper powerlaw_a_upper_err]=polyval(S1aS1b_to_upper_a_fit,s1ab_z_means(i),S1aS1b_to_upper_a_fit_err); + [powerlaw_b_upper powerlaw_b_upper_err]=polyval(S1aS1b_to_upper_b_fit,s1ab_z_means(i),S1aS1b_to_upper_b_fit_err); + [powerlaw_a_lower powerlaw_a_lower_err]=polyval(S1aS1b_to_lower_a_fit,s1ab_z_means(i),S1aS1b_to_lower_a_fit_err); + [powerlaw_b_lower powerlaw_b_lower_err]=polyval(S1aS1b_to_lower_b_fit,s1ab_z_means(i),S1aS1b_to_lower_b_fit_err); + + %Make MC of predicted band for the voxel + for counter=1:Kr_count_1D(i)*10; + xx=50*rand(1); %pick random S1 value + yy= log10((10.^(powerlaw_a.*xx.^powerlaw_b)).*(SE_size_Nov2014/SE_size_Sep2015)); %Get associate log10(S1/S2) mean from power law fit + yy_sigma=abs(yy-log10((10.^(powerlaw_a_upper.*xx.^powerlaw_b_upper)).*(SE_size_Nov2014/SE_size_Sep2015)) )/1.28; %Get associate log10(S1/S2) gaussian width from power law fit + MC_events=[MC_events; normrnd(yy,yy_sigma,1)]; + MC_events_x=[MC_events_x; xx]; + end + end +end + +%% Fit total MC band +s1_min=0; +s1_max=50; + band_sigma=1.28; %90% confidence bounds + + s2_s1_bin= 1:.05:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + MC_counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut= inrange(MC_events_x,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(MC_events(ER_fit_cut),s2_s1_bin); + MC_counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(MC_events(ER_fit_cut),s2_s1_bin); + + %band=confint(Fit_ER,.1); + %ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*MC_counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + MC_ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + MC_ER_mean_fit=MC_ER_mean_power_fit.a.*ER_bins.^(MC_ER_mean_power_fit.b); + b=confint(MC_ER_mean_power_fit,.68); + MC_sigma_a_ER_mean=(b(2,1)-b(1,1))/2; + MC_sigma_b_ER_mean=(b(2,2)-b(1,2))/2; + + MC_ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + MC_ER_lower_fit=MC_ER_lower_power_fit.a.*ER_bins.^(MC_ER_lower_power_fit.b); + b=confint(MC_ER_lower_power_fit,.68); + MC_sigma_a_ER_lower=(b(2,1)-b(1,1))/2; + MC_sigma_b_ER_lower=(b(2,2)-b(1,2))/2; + + MC_ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + MC_ER_upper_fit=MC_ER_upper_power_fit.a.*ER_bins.^(MC_ER_upper_power_fit.b); + b=confint(MC_ER_upper_power_fit,.68); + MC_sigma_a_ER_upper=(b(2,1)-b(1,1))/2; + MC_sigma_b_ER_upper=(b(2,2)-b(1,2))/2; + + MC_powerlaw_a=MC_ER_mean_power_fit.a; + MC_powerlaw_b=MC_ER_mean_power_fit.b; + MC_powerlaw_a_upper=MC_ER_upper_power_fit.a; + MC_powerlaw_b_upper=MC_ER_upper_power_fit.b; + MC_powerlaw_a_lower=MC_ER_lower_power_fit.a; + MC_powerlaw_b_lower=MC_ER_lower_power_fit.b; + MC_powerlaw_a_err=MC_sigma_a_ER_mean; + MC_powerlaw_b_err=MC_sigma_b_ER_mean; + MC_powerlaw_a_upper_err=MC_sigma_a_ER_upper; + MC_powerlaw_b_upper_err=MC_sigma_b_ER_upper; + MC_powerlaw_a_lower_err=MC_sigma_a_ER_lower; + MC_powerlaw_b_lower_err=MC_sigma_b_ER_lower; + + %% Compare to actual band + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p22\KrypCal2p22_QualityChecks\ERBand_Prediction\Nov2014_ERFit.mat') + + %Make Plot + + no_fid_new=figure; + hold on + plot(MC_events_x,MC_events,'.k','MarkerSize',1) +% cc=colorbar; +% ylabel(cc,'Count','FontSize',16); +% colormap; + ylabel('Corrected log10(S2/S1)'); xlabel('S1 corrected (Pulse Area Phe)'); + title(sprintf('Run 04 CH3T, MonteCarlo Band'),'fontsize',16,'Interpreter','none'); + myfigview(16); + ylim([0 3.5]);xlim([0 s1_max]); +% plot(ER_bins,lower_bound,'ok','markersize',6,'linewidth',2) +plot(ER_bins,MC_ER_mean_fit,'-b','markersize',20,'linewidth',2) +plot(ER_bins,ER_mean_fit,'-r','markersize',14,'linewidth',2) +% plot(ER_bins,mean_ER_band,'ok','markersize',6,'linewidth',2)%plot mean of ER band + plot(ER_bins,ER_lower_fit,'--r','markersize',20,'linewidth',2) +% plot(ER_bins,upper_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_upper_fit,'--r','markersize',14,'linewidth',2) +plot(ER_bins,MC_ER_lower_fit,'--b','markersize',20,'linewidth',2) +plot(ER_bins,MC_ER_upper_fit,'--b','markersize',20,'linewidth',2) + legend('Data','MC Band','Measured ER Band'); + + + bin_step=2; + + total_count=length(log10(MC_events_x)); + +% +% box; +% text(10,2.8,strcat('Total Count= ',num2str(total_count)),'fontsize',16); +% text(5,.55,strcat('+',num2str(band_sigma),'\sigma = (',num2str(ER_upper_power_fit.a,3),'\pm', num2str(sigma_a_ER_upper,1) ,')\times S1_c ^{', num2str(ER_upper_power_fit.b,3),'\pm',num2str(sigma_b_ER_upper,1),'}'),'fontsize',16,'interpreter','tex'); +% text(5,.3,strcat('Mean=(',num2str(ER_mean_power_fit.a,3),'\pm', num2str(sigma_a_ER_mean,1),')\times S1_c ^{', num2str(ER_mean_power_fit.b,3),'\pm', num2str(sigma_b_ER_mean,1),'}'),'fontsize',16,'interpreter','tex'); +% text(5,.05,strcat('-',num2str(band_sigma),'\sigma = (',num2str(ER_lower_power_fit.a,3),'\pm', num2str(sigma_a_ER_lower,1),')\times S1_c ^{', num2str(ER_lower_power_fit.b,3),'\pm', num2str(sigma_b_ER_lower,1),'}'),'fontsize',16,'interpreter','tex'); +% title('Nov2014 CH3T') + + box; + + text(5,.55,strcat('+',num2str(band_sigma),'\sigma = (',num2str(MC_ER_upper_power_fit.a,3),'\pm', num2str(MC_sigma_a_ER_upper,1) ,')\times S1_c ^{', num2str(MC_ER_upper_power_fit.b,3),'\pm',num2str(MC_sigma_b_ER_upper,1),'}'),'fontsize',16,'interpreter','tex'); + text(5,.3,strcat('Mean=(',num2str(MC_ER_mean_power_fit.a,3),'\pm', num2str(MC_sigma_a_ER_mean,1),')\times S1_c ^{', num2str(MC_ER_mean_power_fit.b,3),'\pm', num2str(MC_sigma_b_ER_mean,1),'}'),'fontsize',16,'interpreter','tex'); + text(5,.05,strcat('-',num2str(band_sigma),'\sigma = (',num2str(MC_ER_lower_power_fit.a,3),'\pm', num2str(MC_sigma_a_ER_lower,1),')\times S1_c ^{', num2str(MC_ER_lower_power_fit.b,3),'\pm', num2str(MC_sigma_b_ER_lower,1),'}'),'fontsize',16,'interpreter','tex'); + title('Nov2014 CH3T') + + + +%% Stats about the difference + + +%Real Data Band +x=[1:0.1:50]; +band_mean_data=ER_mean_power_fit.a*x.^ER_mean_power_fit.b; +band_upper_data=ER_upper_power_fit.a.*x.^ER_upper_power_fit.b; +band_lower_data=ER_lower_power_fit.a.*x.^ER_lower_power_fit.b; +band_width_data=(band_mean_data-band_lower_data)./(1.28); + +%KrypCal Band - uses slightly different ER band than the one in the figures +band_mean_mc=MC_ER_mean_power_fit.a.*x.^MC_ER_mean_power_fit.b; +band_upper_mc=MC_ER_upper_power_fit.a*x.^MC_ER_upper_power_fit.b; +band_lower_mc=MC_ER_lower_power_fit.a*x.^MC_ER_lower_power_fit.b; +band_width_mc=(band_mean_mc-band_lower_mc)./(1.28); + +%Improvement in bands: Negative is worse resolution +width_difference=mean((band_width_data-band_width_mc)./(band_width_data)) + +%Shift in bands: Positive is upward shift +mean_shift=-mean((band_mean_data-band_mean_mc)./(band_mean_data)) + +%Chi2 for band mean +temp=confint(ER_mean_power_fit); +ER_mean_power_fit_a_err=abs(ER_mean_power_fit.a-temp(1,1)); +ER_mean_power_fit_b_err=abs(ER_mean_power_fit.b-temp(1,2)); +band_mean_data_err=sqrt( ((x.^ER_mean_power_fit.b).*(ER_mean_power_fit_a_err)).^2 + (ER_mean_power_fit_b_err.*ER_mean_power_fit.a.*(x.^ER_mean_power_fit.b).*log(x)).^2); +mean_chi2=sum( ((band_mean_mc-band_mean_data)./band_mean_data_err).^2) +mean_p_value=1-chi2cdf(mean_chi2,length(band_mean_data)-1) + +%Chi2 for upper 90% +temp=confint(ER_upper_power_fit); +ER_upper_power_fit_a_err=abs(ER_upper_power_fit.a-temp(1,1)); +ER_upper_power_fit_b_err=abs(ER_upper_power_fit.b-temp(1,2)); +band_upper_data_err=sqrt( ((x.^ER_upper_power_fit.b).*(ER_upper_power_fit_a_err)).^2 + (ER_upper_power_fit_b_err.*ER_upper_power_fit.a.*(x.^ER_upper_power_fit.b).*log(x)).^2); +upper_chi2=sum( ((band_upper_mc-band_upper_data)./band_upper_data_err).^2) +upper_p_value=1-chi2cdf(upper_chi2,length(band_mean_data)-1) + +%Chi2 for lower 90% +temp=confint(ER_lower_power_fit); +ER_lower_power_fit_a_err=abs(ER_lower_power_fit.a-temp(1,1)); +ER_lower_power_fit_b_err=abs(ER_lower_power_fit.b-temp(1,2)); +band_lower_data_err=sqrt( ((x.^ER_lower_power_fit.b).*(ER_lower_power_fit_a_err)).^2 + (ER_lower_power_fit_b_err.*ER_lower_power_fit.a.*(x.^ER_lower_power_fit.b).*log(x)).^2); +lower_chi2=sum( ((band_lower_mc-band_lower_data)./band_lower_data_err).^2) +lower_p_value=1-chi2cdf(lower_chi2,length(band_mean_data)-1) + + +%Chi2 for total width +expected_width=(band_upper_data-band_lower_data); +expected_width_err=sqrt(band_upper_data_err.^2 + band_lower_data_err.^2); +observed_width=(band_upper_mc-band_lower_mc); +width_chi2=sum( ((observed_width-expected_width)./(expected_width_err)).^2) +width_p_value=1-chi2cdf(width_chi2,length(band_mean_data)-1) diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictERBand_Nov2014_fromSep2014.m b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictERBand_Nov2014_fromSep2014.m new file mode 100644 index 0000000..93fc098 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictERBand_Nov2014_fromSep2014.m @@ -0,0 +1,245 @@ +% Load in the S1a/S1b -> ER Band map + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p22\KrypCal2p22_QualityChecks\ERBand_Prediction\Sep2014_S1aS1b_To_ERBand_RZVoxels.mat') + + +%% Load in Sep2014 ER S1a/S1b + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p22\KrypCal2p22_QualityChecks\ERBand_Prediction\Nov2014_S1aS1b.mat') + + +SE_size_Sep2015=25.64; +SE_size_Sep2014=27.21; +SE_size_Nov2014=26.13; +SE_size_Feb2015=26.23; + + +MC_events=[]; +MC_events_x=[]; +% +% +% for i=1:size(s1ab_xyz_mean,1) +% for j=1:size(s1ab_xyz_mean,2) +% for k=1:size(s1ab_xyz_mean,3) +% if ~isnan(s1ab_xyz_mean(i,j,k)) +% [powerlaw_a powerlaw_a_err]=polyval(S1aS1b_to_mean_a_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_mean_a_fit_err); +% [powerlaw_b powerlaw_b_err]=polyval(S1aS1b_to_mean_b_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_mean_b_fit_err); +% [powerlaw_a_upper powerlaw_a_upper_err]=polyval(S1aS1b_to_upper_a_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_upper_a_fit_err); +% [powerlaw_b_upper powerlaw_b_upper_err]=polyval(S1aS1b_to_upper_b_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_upper_b_fit_err); +% [powerlaw_a_lower powerlaw_a_lower_err]=polyval(S1aS1b_to_lower_a_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_lower_a_fit_err); +% [powerlaw_b_lower powerlaw_b_lower_err]=polyval(S1aS1b_to_lower_b_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_lower_b_fit_err); +% +% %Make MC of predicted band for the voxel +% for counter=1:Kr_count_3D(i,j,k)/10; +% xx=50*rand(1); %pick random S1 value +% yy= log10((10.^(powerlaw_a.*xx.^powerlaw_b)).*(SE_size_Nov2014/SE_size_Sep2015)); %Get associate log10(S1/S2) mean from power law fit +% yy_sigma=abs(yy-log10((10.^(powerlaw_a_upper.*xx.^powerlaw_b_upper)).*(SE_size_Nov2014/SE_size_Sep2015)) )/1.28; %Get associate log10(S1/S2) gaussian width from power law fit +% MC_events=[MC_events; normrnd(yy,yy_sigma,1)]; +% MC_events_x=[MC_events_x; xx]; +% end +% end +% end +% end +% end +% + + +for i=1:size(s1ab_z_means,2) + if ~isnan(s1ab_z_means(i)) + [powerlaw_a powerlaw_a_err]=polyval(S1aS1b_to_mean_a_fit,s1ab_z_means(i),S1aS1b_to_mean_a_fit_err); + [powerlaw_b powerlaw_b_err]=polyval(S1aS1b_to_mean_b_fit,s1ab_z_means(i),S1aS1b_to_mean_b_fit_err); + [powerlaw_a_upper powerlaw_a_upper_err]=polyval(S1aS1b_to_upper_a_fit,s1ab_z_means(i),S1aS1b_to_upper_a_fit_err); + [powerlaw_b_upper powerlaw_b_upper_err]=polyval(S1aS1b_to_upper_b_fit,s1ab_z_means(i),S1aS1b_to_upper_b_fit_err); + [powerlaw_a_lower powerlaw_a_lower_err]=polyval(S1aS1b_to_lower_a_fit,s1ab_z_means(i),S1aS1b_to_lower_a_fit_err); + [powerlaw_b_lower powerlaw_b_lower_err]=polyval(S1aS1b_to_lower_b_fit,s1ab_z_means(i),S1aS1b_to_lower_b_fit_err); + + %Make MC of predicted band for the voxel + for counter=1:Kr_count_1D(i)*10; + xx=50*rand(1); %pick random S1 value + yy= log10((10.^(powerlaw_a.*xx.^powerlaw_b)).*(SE_size_Nov2014/SE_size_Sep2015)); %Get associate log10(S1/S2) mean from power law fit + yy_sigma=abs(yy-log10((10.^(powerlaw_a_upper.*xx.^powerlaw_b_upper)).*(SE_size_Nov2014/SE_size_Sep2015)) )/1.28; %Get associate log10(S1/S2) gaussian width from power law fit + MC_events=[MC_events; normrnd(yy,yy_sigma,1)]; + MC_events_x=[MC_events_x; xx]; + end + end +end + +%% Fit total MC band +s1_min=0; +s1_max=50; + band_sigma=1.28; %90% confidence bounds + + s2_s1_bin= 1:.05:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + MC_counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut= inrange(MC_events_x,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(MC_events(ER_fit_cut),s2_s1_bin); + MC_counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(MC_events(ER_fit_cut),s2_s1_bin); + + %band=confint(Fit_ER,.1); + %ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*MC_counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + MC_ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + MC_ER_mean_fit=MC_ER_mean_power_fit.a.*ER_bins.^(MC_ER_mean_power_fit.b); + b=confint(MC_ER_mean_power_fit,.68); + MC_sigma_a_ER_mean=(b(2,1)-b(1,1))/2; + MC_sigma_b_ER_mean=(b(2,2)-b(1,2))/2; + + MC_ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + MC_ER_lower_fit=MC_ER_lower_power_fit.a.*ER_bins.^(MC_ER_lower_power_fit.b); + b=confint(MC_ER_lower_power_fit,.68); + MC_sigma_a_ER_lower=(b(2,1)-b(1,1))/2; + MC_sigma_b_ER_lower=(b(2,2)-b(1,2))/2; + + MC_ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + MC_ER_upper_fit=MC_ER_upper_power_fit.a.*ER_bins.^(MC_ER_upper_power_fit.b); + b=confint(MC_ER_upper_power_fit,.68); + MC_sigma_a_ER_upper=(b(2,1)-b(1,1))/2; + MC_sigma_b_ER_upper=(b(2,2)-b(1,2))/2; + + MC_powerlaw_a=MC_ER_mean_power_fit.a; + MC_powerlaw_b=MC_ER_mean_power_fit.b; + MC_powerlaw_a_upper=MC_ER_upper_power_fit.a; + MC_powerlaw_b_upper=MC_ER_upper_power_fit.b; + MC_powerlaw_a_lower=MC_ER_lower_power_fit.a; + MC_powerlaw_b_lower=MC_ER_lower_power_fit.b; + MC_powerlaw_a_err=MC_sigma_a_ER_mean; + MC_powerlaw_b_err=MC_sigma_b_ER_mean; + MC_powerlaw_a_upper_err=MC_sigma_a_ER_upper; + MC_powerlaw_b_upper_err=MC_sigma_b_ER_upper; + MC_powerlaw_a_lower_err=MC_sigma_a_ER_lower; + MC_powerlaw_b_lower_err=MC_sigma_b_ER_lower; + + %% Compare to actual band + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p22\KrypCal2p22_QualityChecks\ERBand_Prediction\Nov2014_ERFit.mat') + + %Make Plot + + no_fid_new=figure; + hold on + plot(MC_events_x,MC_events,'.k','MarkerSize',1) +% cc=colorbar; +% ylabel(cc,'Count','FontSize',16); +% colormap; + ylabel('Corrected log10(S2/S1)'); xlabel('S1 corrected (Pulse Area Phe)'); + title(sprintf('Run 04 CH3T, MonteCarlo Band'),'fontsize',16,'Interpreter','none'); + myfigview(16); + ylim([0 3.5]);xlim([0 s1_max]); +% plot(ER_bins,lower_bound,'ok','markersize',6,'linewidth',2) +plot(ER_bins,MC_ER_mean_fit,'-b','markersize',20,'linewidth',2) +plot(ER_bins,ER_mean_fit,'-r','markersize',14,'linewidth',2) +% plot(ER_bins,mean_ER_band,'ok','markersize',6,'linewidth',2)%plot mean of ER band + plot(ER_bins,ER_lower_fit,'--r','markersize',20,'linewidth',2) +% plot(ER_bins,upper_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_upper_fit,'--r','markersize',14,'linewidth',2) +plot(ER_bins,MC_ER_lower_fit,'--b','markersize',20,'linewidth',2) +plot(ER_bins,MC_ER_upper_fit,'--b','markersize',20,'linewidth',2) + legend('Data','MC Band','Measured ER Band'); + + + bin_step=2; + + total_count=length(log10(MC_events_x)); + +% +% box; +% text(10,2.8,strcat('Total Count= ',num2str(total_count)),'fontsize',16); +% text(5,.55,strcat('+',num2str(band_sigma),'\sigma = (',num2str(ER_upper_power_fit.a,3),'\pm', num2str(sigma_a_ER_upper,1) ,')\times S1_c ^{', num2str(ER_upper_power_fit.b,3),'\pm',num2str(sigma_b_ER_upper,1),'}'),'fontsize',16,'interpreter','tex'); +% text(5,.3,strcat('Mean=(',num2str(ER_mean_power_fit.a,3),'\pm', num2str(sigma_a_ER_mean,1),')\times S1_c ^{', num2str(ER_mean_power_fit.b,3),'\pm', num2str(sigma_b_ER_mean,1),'}'),'fontsize',16,'interpreter','tex'); +% text(5,.05,strcat('-',num2str(band_sigma),'\sigma = (',num2str(ER_lower_power_fit.a,3),'\pm', num2str(sigma_a_ER_lower,1),')\times S1_c ^{', num2str(ER_lower_power_fit.b,3),'\pm', num2str(sigma_b_ER_lower,1),'}'),'fontsize',16,'interpreter','tex'); +% title('Nov2014 CH3T') + + box; + + text(5,.55,strcat('+',num2str(band_sigma),'\sigma = (',num2str(MC_ER_upper_power_fit.a,3),'\pm', num2str(MC_sigma_a_ER_upper,1) ,')\times S1_c ^{', num2str(MC_ER_upper_power_fit.b,3),'\pm',num2str(MC_sigma_b_ER_upper,1),'}'),'fontsize',16,'interpreter','tex'); + text(5,.3,strcat('Mean=(',num2str(MC_ER_mean_power_fit.a,3),'\pm', num2str(MC_sigma_a_ER_mean,1),')\times S1_c ^{', num2str(MC_ER_mean_power_fit.b,3),'\pm', num2str(MC_sigma_b_ER_mean,1),'}'),'fontsize',16,'interpreter','tex'); + text(5,.05,strcat('-',num2str(band_sigma),'\sigma = (',num2str(MC_ER_lower_power_fit.a,3),'\pm', num2str(MC_sigma_a_ER_lower,1),')\times S1_c ^{', num2str(MC_ER_lower_power_fit.b,3),'\pm', num2str(MC_sigma_b_ER_lower,1),'}'),'fontsize',16,'interpreter','tex'); + title('Nov2014 CH3T') + + + +%% Stats about the difference + + +%Real Data Band +x=[1:0.1:50]; +band_mean_data=ER_mean_power_fit.a*x.^ER_mean_power_fit.b; +band_upper_data=ER_upper_power_fit.a.*x.^ER_upper_power_fit.b; +band_lower_data=ER_lower_power_fit.a.*x.^ER_lower_power_fit.b; +band_width_data=(band_mean_data-band_lower_data)./(1.28); + +%KrypCal Band - uses slightly different ER band than the one in the figures +band_mean_mc=MC_ER_mean_power_fit.a.*x.^MC_ER_mean_power_fit.b; +band_upper_mc=MC_ER_upper_power_fit.a*x.^MC_ER_upper_power_fit.b; +band_lower_mc=MC_ER_lower_power_fit.a*x.^MC_ER_lower_power_fit.b; +band_width_mc=(band_mean_mc-band_lower_mc)./(1.28); + +%Improvement in bands: Negative is worse resolution +width_difference=mean((band_width_data-band_width_mc)./(band_width_data)) + +%Shift in bands: Positive is upward shift +mean_shift=-mean((band_mean_data-band_mean_mc)./(band_mean_data)) + +%Chi2 for band mean +temp=confint(ER_mean_power_fit); +ER_mean_power_fit_a_err=abs(ER_mean_power_fit.a-temp(1,1)); +ER_mean_power_fit_b_err=abs(ER_mean_power_fit.b-temp(1,2)); +band_mean_data_err=sqrt( ((x.^ER_mean_power_fit.b).*(ER_mean_power_fit_a_err)).^2 + (ER_mean_power_fit_b_err.*ER_mean_power_fit.a.*(x.^ER_mean_power_fit.b).*log(x)).^2); +mean_chi2=sum( ((band_mean_mc-band_mean_data)./band_mean_data_err).^2) +mean_p_value=1-chi2cdf(mean_chi2,length(band_mean_data)-1) + +%Chi2 for upper 90% +temp=confint(ER_upper_power_fit); +ER_upper_power_fit_a_err=abs(ER_upper_power_fit.a-temp(1,1)); +ER_upper_power_fit_b_err=abs(ER_upper_power_fit.b-temp(1,2)); +band_upper_data_err=sqrt( ((x.^ER_upper_power_fit.b).*(ER_upper_power_fit_a_err)).^2 + (ER_upper_power_fit_b_err.*ER_upper_power_fit.a.*(x.^ER_upper_power_fit.b).*log(x)).^2); +upper_chi2=sum( ((band_upper_mc-band_upper_data)./band_upper_data_err).^2) +upper_p_value=1-chi2cdf(upper_chi2,length(band_mean_data)-1) + +%Chi2 for lower 90% +temp=confint(ER_lower_power_fit); +ER_lower_power_fit_a_err=abs(ER_lower_power_fit.a-temp(1,1)); +ER_lower_power_fit_b_err=abs(ER_lower_power_fit.b-temp(1,2)); +band_lower_data_err=sqrt( ((x.^ER_lower_power_fit.b).*(ER_lower_power_fit_a_err)).^2 + (ER_lower_power_fit_b_err.*ER_lower_power_fit.a.*(x.^ER_lower_power_fit.b).*log(x)).^2); +lower_chi2=sum( ((band_lower_mc-band_lower_data)./band_lower_data_err).^2) +lower_p_value=1-chi2cdf(lower_chi2,length(band_mean_data)-1) + + +%Chi2 for total width +expected_width=(band_upper_data-band_lower_data); +expected_width_err=sqrt(band_upper_data_err.^2 + band_lower_data_err.^2); +observed_width=(band_upper_mc-band_lower_mc); +width_chi2=sum( ((observed_width-expected_width)./(expected_width_err)).^2) +width_p_value=1-chi2cdf(width_chi2,length(band_mean_data)-1) diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictERBand_Sep2014.m b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictERBand_Sep2014.m new file mode 100644 index 0000000..579a51f --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictERBand_Sep2014.m @@ -0,0 +1,225 @@ +% Load in the S1a/S1b -> ER Band map + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p22\KrypCal2p22_QualityChecks\ERBand_Prediction\S1aS1b_To_ERBand_RZVoxels.mat') + + +%% Load in Sep2014 ER S1a/S1b + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p22\KrypCal2p22_QualityChecks\ERBand_Prediction\Sep2014_S1aS1b.mat') + + +SE_size_Sep2015=25.64; +SE_size_Sep2014=27.21; +SE_size_Nov2014=26.13; +SE_size_Feb2015=26.23; + + +MC_events=[]; +MC_events_x=[]; + + +for i=1:size(s1ab_xyz_mean,1) + for j=1:size(s1ab_xyz_mean,2) + for k=1:size(s1ab_xyz_mean,3) + if ~isnan(s1ab_xyz_mean(i,j,k)) + [powerlaw_a powerlaw_a_err]=polyval(S1aS1b_to_mean_a_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_mean_a_fit_err); + [powerlaw_b powerlaw_b_err]=polyval(S1aS1b_to_mean_b_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_mean_b_fit_err); + [powerlaw_a_upper powerlaw_a_upper_err]=polyval(S1aS1b_to_upper_a_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_upper_a_fit_err); + [powerlaw_b_upper powerlaw_b_upper_err]=polyval(S1aS1b_to_upper_b_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_upper_b_fit_err); + [powerlaw_a_lower powerlaw_a_lower_err]=polyval(S1aS1b_to_lower_a_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_lower_a_fit_err); + [powerlaw_b_lower powerlaw_b_lower_err]=polyval(S1aS1b_to_lower_b_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_lower_b_fit_err); + + %Make MC of predicted band for the voxel + for counter=1:Kr_count_3D(i,j,k)/10; + xx=50*rand(1); %pick random S1 value + yy= log10((10.^(powerlaw_a.*xx.^powerlaw_b)).*(SE_size_Sep2014/SE_size_Sep2015)); %Get associate log10(S1/S2) mean from power law fit + yy_sigma=abs(yy-log10((10.^(powerlaw_a_upper.*xx.^powerlaw_b_upper)).*(SE_size_Sep2014/SE_size_Sep2015)) )/1.28; %Get associate log10(S1/S2) gaussian width from power law fit + MC_events=[MC_events; normrnd(yy,yy_sigma,1)]; + MC_events_x=[MC_events_x; xx]; + end + end + end + end +end + +%% Fit total MC band +s1_min=0; +s1_max=50; + band_sigma=1.28; %90% confidence bounds + + s2_s1_bin= 1:.05:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + MC_counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut= inrange(MC_events_x,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(MC_events(ER_fit_cut),s2_s1_bin); + MC_counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(MC_events(ER_fit_cut),s2_s1_bin); + + %band=confint(Fit_ER,.1); + %ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*MC_counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + MC_ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + MC_ER_mean_fit=MC_ER_mean_power_fit.a.*ER_bins.^(MC_ER_mean_power_fit.b); + b=confint(MC_ER_mean_power_fit,.68); + MC_sigma_a_ER_mean=(b(2,1)-b(1,1))/2; + MC_sigma_b_ER_mean=(b(2,2)-b(1,2))/2; + + MC_ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + MC_ER_lower_fit=MC_ER_lower_power_fit.a.*ER_bins.^(MC_ER_lower_power_fit.b); + b=confint(MC_ER_lower_power_fit,.68); + MC_sigma_a_ER_lower=(b(2,1)-b(1,1))/2; + MC_sigma_b_ER_lower=(b(2,2)-b(1,2))/2; + + MC_ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + MC_ER_upper_fit=MC_ER_upper_power_fit.a.*ER_bins.^(MC_ER_upper_power_fit.b); + b=confint(MC_ER_upper_power_fit,.68); + MC_sigma_a_ER_upper=(b(2,1)-b(1,1))/2; + MC_sigma_b_ER_upper=(b(2,2)-b(1,2))/2; + + MC_powerlaw_a=MC_ER_mean_power_fit.a; + MC_powerlaw_b=MC_ER_mean_power_fit.b; + MC_powerlaw_a_upper=MC_ER_upper_power_fit.a; + MC_powerlaw_b_upper=MC_ER_upper_power_fit.b; + MC_powerlaw_a_lower=MC_ER_lower_power_fit.a; + MC_powerlaw_b_lower=MC_ER_lower_power_fit.b; + MC_powerlaw_a_err=MC_sigma_a_ER_mean; + MC_powerlaw_b_err=MC_sigma_b_ER_mean; + MC_powerlaw_a_upper_err=MC_sigma_a_ER_upper; + MC_powerlaw_b_upper_err=MC_sigma_b_ER_upper; + MC_powerlaw_a_lower_err=MC_sigma_a_ER_lower; + MC_powerlaw_b_lower_err=MC_sigma_b_ER_lower; + + %% Compare to actual band + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p22\KrypCal2p22_QualityChecks\ERBand_Prediction\Sep2014_ERFit.mat') + + %Make Plot + + no_fid_new=figure; + hold on + plot(MC_events_x,MC_events,'.k','MarkerSize',1) +% cc=colorbar; +% ylabel(cc,'Count','FontSize',16); +% colormap; + ylabel('Corrected log10(S2/S1)'); xlabel('S1 corrected (Pulse Area Phe)'); + title(sprintf('Run 04 CH3T, MonteCarlo Band'),'fontsize',16,'Interpreter','none'); + myfigview(16); + ylim([0 3.5]);xlim([0 s1_max]); +% plot(ER_bins,lower_bound,'ok','markersize',6,'linewidth',2) +plot(ER_bins,MC_ER_mean_fit,'-b','markersize',20,'linewidth',2) +plot(ER_bins,ER_mean_fit,'-r','markersize',14,'linewidth',2) +% plot(ER_bins,mean_ER_band,'ok','markersize',6,'linewidth',2)%plot mean of ER band + plot(ER_bins,ER_lower_fit,'--r','markersize',20,'linewidth',2) +% plot(ER_bins,upper_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_upper_fit,'--r','markersize',14,'linewidth',2) +plot(ER_bins,MC_ER_lower_fit,'--b','markersize',20,'linewidth',2) +plot(ER_bins,MC_ER_upper_fit,'--b','markersize',20,'linewidth',2) + legend('Data','MC Band','Measured ER Band'); + + + bin_step=2; + + total_count=length(log10(MC_events_x)); + +% +% box; +% text(10,2.8,strcat('Total Count= ',num2str(total_count)),'fontsize',16); +% text(5,.55,strcat('+',num2str(band_sigma),'\sigma = (',num2str(ER_upper_power_fit.a,3),'\pm', num2str(sigma_a_ER_upper,1) ,')\times S1_c ^{', num2str(ER_upper_power_fit.b,3),'\pm',num2str(sigma_b_ER_upper,1),'}'),'fontsize',16,'interpreter','tex'); +% text(5,.3,strcat('Mean=(',num2str(ER_mean_power_fit.a,3),'\pm', num2str(sigma_a_ER_mean,1),')\times S1_c ^{', num2str(ER_mean_power_fit.b,3),'\pm', num2str(sigma_b_ER_mean,1),'}'),'fontsize',16,'interpreter','tex'); +% text(5,.05,strcat('-',num2str(band_sigma),'\sigma = (',num2str(ER_lower_power_fit.a,3),'\pm', num2str(sigma_a_ER_lower,1),')\times S1_c ^{', num2str(ER_lower_power_fit.b,3),'\pm', num2str(sigma_b_ER_lower,1),'}'),'fontsize',16,'interpreter','tex'); +% title('Sep2014 CH3T') + + box; + + text(5,.55,strcat('+',num2str(band_sigma),'\sigma = (',num2str(MC_ER_upper_power_fit.a,3),'\pm', num2str(MC_sigma_a_ER_upper,1) ,')\times S1_c ^{', num2str(MC_ER_upper_power_fit.b,3),'\pm',num2str(MC_sigma_b_ER_upper,1),'}'),'fontsize',16,'interpreter','tex'); + text(5,.3,strcat('Mean=(',num2str(MC_ER_mean_power_fit.a,3),'\pm', num2str(MC_sigma_a_ER_mean,1),')\times S1_c ^{', num2str(MC_ER_mean_power_fit.b,3),'\pm', num2str(MC_sigma_b_ER_mean,1),'}'),'fontsize',16,'interpreter','tex'); + text(5,.05,strcat('-',num2str(band_sigma),'\sigma = (',num2str(MC_ER_lower_power_fit.a,3),'\pm', num2str(MC_sigma_a_ER_lower,1),')\times S1_c ^{', num2str(MC_ER_lower_power_fit.b,3),'\pm', num2str(MC_sigma_b_ER_lower,1),'}'),'fontsize',16,'interpreter','tex'); + title('Sep2014 CH3T') + + + +%% Stats about the difference + +%% Stats about the difference + + +%Real Data Band +x=[1:0.1:50]; +band_mean_data=ER_mean_power_fit.a*x.^ER_mean_power_fit.b; +band_upper_data=ER_upper_power_fit.a.*x.^ER_upper_power_fit.b; +band_lower_data=ER_lower_power_fit.a.*x.^ER_lower_power_fit.b; +band_width_data=(band_mean_data-band_lower_data)./(1.28); + +%KrypCal Band - uses slightly different ER band than the one in the figures +band_mean_mc=MC_ER_mean_power_fit.a.*x.^MC_ER_mean_power_fit.b; +band_upper_mc=MC_ER_upper_power_fit.a*x.^MC_ER_upper_power_fit.b; +band_lower_mc=MC_ER_lower_power_fit.a*x.^MC_ER_lower_power_fit.b; +band_width_mc=(band_mean_mc-band_lower_mc)./(1.28); + +%Improvement in bands: Negative is worse resolution +width_difference=mean((band_width_data-band_width_mc)./(band_width_data)) + +%Shift in bands: Positive is upward shift +mean_shift=-mean((band_mean_data-band_mean_mc)./(band_mean_data)) + +%Chi2 for band mean +temp=confint(ER_mean_power_fit); +ER_mean_power_fit_a_err=abs(ER_mean_power_fit.a-temp(1,1)); +ER_mean_power_fit_b_err=abs(ER_mean_power_fit.b-temp(1,2)); +band_mean_data_err=sqrt( ((x.^ER_mean_power_fit.b).*(ER_mean_power_fit_a_err)).^2 + (ER_mean_power_fit_b_err.*ER_mean_power_fit.a.*(x.^ER_mean_power_fit.b).*log(x)).^2); +mean_chi2=sum( ((band_mean_mc-band_mean_data)./band_mean_data_err).^2) +mean_p_value=1-chi2cdf(mean_chi2,length(band_mean_data)-1) + +%Chi2 for upper 90% +temp=confint(ER_upper_power_fit); +ER_upper_power_fit_a_err=abs(ER_upper_power_fit.a-temp(1,1)); +ER_upper_power_fit_b_err=abs(ER_upper_power_fit.b-temp(1,2)); +band_upper_data_err=sqrt( ((x.^ER_upper_power_fit.b).*(ER_upper_power_fit_a_err)).^2 + (ER_upper_power_fit_b_err.*ER_upper_power_fit.a.*(x.^ER_upper_power_fit.b).*log(x)).^2); +upper_chi2=sum( ((band_upper_mc-band_upper_data)./band_upper_data_err).^2) +upper_p_value=1-chi2cdf(upper_chi2,length(band_mean_data)-1) + +%Chi2 for lower 90% +temp=confint(ER_lower_power_fit); +ER_lower_power_fit_a_err=abs(ER_lower_power_fit.a-temp(1,1)); +ER_lower_power_fit_b_err=abs(ER_lower_power_fit.b-temp(1,2)); +band_lower_data_err=sqrt( ((x.^ER_lower_power_fit.b).*(ER_lower_power_fit_a_err)).^2 + (ER_lower_power_fit_b_err.*ER_lower_power_fit.a.*(x.^ER_lower_power_fit.b).*log(x)).^2); +lower_chi2=sum( ((band_lower_mc-band_lower_data)./band_lower_data_err).^2) +lower_p_value=1-chi2cdf(lower_chi2,length(band_mean_data)-1) + + +%Chi2 for total width +expected_width=(band_upper_data-band_lower_data); +expected_width_err=sqrt(band_upper_data_err.^2 + band_lower_data_err.^2); +observed_width=(band_upper_mc-band_lower_mc); +width_chi2=sum( ((observed_width-expected_width)./(expected_width_err)).^2) +width_p_value=1-chi2cdf(width_chi2,length(band_mean_data)-1) diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictERBand_Sep2015.m b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictERBand_Sep2015.m new file mode 100644 index 0000000..a520926 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictERBand_Sep2015.m @@ -0,0 +1,270 @@ +% Load in the S1a/S1b -> ER Band map + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p22\KrypCal2p22_QualityChecks\ERBand_Prediction\S1aS1b_To_ERBand_RZVoxels.mat') + + +%% Load in Sep2015 ER S1a/S1b + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p22\KrypCal2p22_QualityChecks\ERBand_Prediction\Sep2015_S1aS1b.mat') + + +SE_size_Sep2015=25.64; +SE_size_Sep2014=27.21; +SE_size_Nov2014=26.13; +SE_size_Feb2015=26.23; + + +MC_events=[]; +MC_events_x=[]; + +% +% for i=1:size(s1ab_xyz_mean,1) +% for j=1:size(s1ab_xyz_mean,2) +% for k=1:size(s1ab_xyz_mean,3) +% if ~isnan(s1ab_xyz_mean(i,j,k)) +% [powerlaw_a powerlaw_a_err]=polyval(S1aS1b_to_mean_a_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_mean_a_fit_err); +% [powerlaw_b powerlaw_b_err]=polyval(S1aS1b_to_mean_b_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_mean_b_fit_err); +% [powerlaw_a_upper powerlaw_a_upper_err]=polyval(S1aS1b_to_upper_a_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_upper_a_fit_err); +% [powerlaw_b_upper powerlaw_b_upper_err]=polyval(S1aS1b_to_upper_b_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_upper_b_fit_err); +% [powerlaw_a_lower powerlaw_a_lower_err]=polyval(S1aS1b_to_lower_a_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_lower_a_fit_err); +% [powerlaw_b_lower powerlaw_b_lower_err]=polyval(S1aS1b_to_lower_b_fit,s1ab_xyz_mean(i,j,k),S1aS1b_to_lower_b_fit_err); +% +% %Make MC of predicted band for the voxel +% for counter=1:Kr_count_3D(i,j,k)/10; +% xx=50*rand(1); %pick random S1 value +% yy= powerlaw_a.*xx.^powerlaw_b; %Get associate log10(S1/S2) mean from power law fit +% yy_sigma=abs(yy-(powerlaw_a_upper.*xx.^powerlaw_b_upper))/1.28; %Get associate log10(S1/S2) gaussian width from power law fit +% MC_events=[MC_events; normrnd(yy,yy_sigma,1)]; +% MC_events_x=[MC_events_x; xx]; +% end +% end +% end +% end +% end + + + +% for i=1:size(s1ab_r2z_mean,1) +% for j=1:size(s1ab_r2z_mean,2) +% if ~isnan(s1ab_r2z_mean(i,j)) +% [powerlaw_a powerlaw_a_err]=polyval(S1aS1b_to_mean_a_fit,s1ab_r2z_mean(i,j),S1aS1b_to_mean_a_fit_err); +% [powerlaw_b powerlaw_b_err]=polyval(S1aS1b_to_mean_b_fit,s1ab_r2z_mean(i,j),S1aS1b_to_mean_b_fit_err); +% [powerlaw_a_upper powerlaw_a_upper_err]=polyval(S1aS1b_to_upper_a_fit,s1ab_r2z_mean(i,j),S1aS1b_to_upper_a_fit_err); +% [powerlaw_b_upper powerlaw_b_upper_err]=polyval(S1aS1b_to_upper_b_fit,s1ab_r2z_mean(i,j),S1aS1b_to_upper_b_fit_err); +% [powerlaw_a_lower powerlaw_a_lower_err]=polyval(S1aS1b_to_lower_a_fit,s1ab_r2z_mean(i,j),S1aS1b_to_lower_a_fit_err); +% [powerlaw_b_lower powerlaw_b_lower_err]=polyval(S1aS1b_to_lower_b_fit,s1ab_r2z_mean(i,j),S1aS1b_to_lower_b_fit_err); +% +% %Make MC of predicted band for the voxel +% for counter=1:Kr_count_2D(i,j)/10; +% xx=50*rand(1); %pick random S1 value +% yy= powerlaw_a.*xx.^powerlaw_b; %Get associate log10(S1/S2) mean from power law fit +% yy_sigma=abs(yy-(powerlaw_a_upper.*xx.^powerlaw_b_upper))/1.28; %Get associate log10(S1/S2) gaussian width from power law fit +% MC_events=[MC_events; normrnd(yy,yy_sigma,1)]; +% MC_events_x=[MC_events_x; xx]; +% end +% end +% end +% end + + + +for i=1:size(s1ab_z_means,2) + if ~isnan(s1ab_z_means(i)) + [powerlaw_a powerlaw_a_err]=polyval(S1aS1b_to_mean_a_fit,s1ab_z_means(i),S1aS1b_to_mean_a_fit_err); + [powerlaw_b powerlaw_b_err]=polyval(S1aS1b_to_mean_b_fit,s1ab_z_means(i),S1aS1b_to_mean_b_fit_err); + [powerlaw_a_upper powerlaw_a_upper_err]=polyval(S1aS1b_to_upper_a_fit,s1ab_z_means(i),S1aS1b_to_upper_a_fit_err); + [powerlaw_b_upper powerlaw_b_upper_err]=polyval(S1aS1b_to_upper_b_fit,s1ab_z_means(i),S1aS1b_to_upper_b_fit_err); + [powerlaw_a_lower powerlaw_a_lower_err]=polyval(S1aS1b_to_lower_a_fit,s1ab_z_means(i),S1aS1b_to_lower_a_fit_err); + [powerlaw_b_lower powerlaw_b_lower_err]=polyval(S1aS1b_to_lower_b_fit,s1ab_z_means(i),S1aS1b_to_lower_b_fit_err); + + %Make MC of predicted band for the voxel + for counter=1:Kr_count_1D(i); + xx=50*rand(1); %pick random S1 value + yy= powerlaw_a.*xx.^powerlaw_b; %Get associate log10(S1/S2) mean from power law fit + yy_sigma=abs(yy-(powerlaw_a_upper.*xx.^powerlaw_b_upper))/1.28; %Get associate log10(S1/S2) gaussian width from power law fit + MC_events=[MC_events; normrnd(yy,yy_sigma,1)]; + MC_events_x=[MC_events_x; xx]; + end + end +end + +%% Fit total MC band +s1_min=0; +s1_max=50; + band_sigma=1.28; %90% confidence bounds + + s2_s1_bin= 1:.05:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + MC_counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut= inrange(MC_events_x,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(MC_events(ER_fit_cut),s2_s1_bin); + MC_counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(MC_events(ER_fit_cut),s2_s1_bin); + + %band=confint(Fit_ER,.1); + %ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*MC_counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + MC_ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + MC_ER_mean_fit=MC_ER_mean_power_fit.a.*ER_bins.^(MC_ER_mean_power_fit.b); + b=confint(MC_ER_mean_power_fit,.68); + MC_sigma_a_ER_mean=(b(2,1)-b(1,1))/2; + MC_sigma_b_ER_mean=(b(2,2)-b(1,2))/2; + + MC_ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + MC_ER_lower_fit=MC_ER_lower_power_fit.a.*ER_bins.^(MC_ER_lower_power_fit.b); + b=confint(MC_ER_lower_power_fit,.68); + MC_sigma_a_ER_lower=(b(2,1)-b(1,1))/2; + MC_sigma_b_ER_lower=(b(2,2)-b(1,2))/2; + + MC_ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + MC_ER_upper_fit=MC_ER_upper_power_fit.a.*ER_bins.^(MC_ER_upper_power_fit.b); + b=confint(MC_ER_upper_power_fit,.68); + MC_sigma_a_ER_upper=(b(2,1)-b(1,1))/2; + MC_sigma_b_ER_upper=(b(2,2)-b(1,2))/2; + + MC_powerlaw_a=MC_ER_mean_power_fit.a; + MC_powerlaw_b=MC_ER_mean_power_fit.b; + MC_powerlaw_a_upper=MC_ER_upper_power_fit.a; + MC_powerlaw_b_upper=MC_ER_upper_power_fit.b; + MC_powerlaw_a_lower=MC_ER_lower_power_fit.a; + MC_powerlaw_b_lower=MC_ER_lower_power_fit.b; + MC_powerlaw_a_err=MC_sigma_a_ER_mean; + MC_powerlaw_b_err=MC_sigma_b_ER_mean; + MC_powerlaw_a_upper_err=MC_sigma_a_ER_upper; + MC_powerlaw_b_upper_err=MC_sigma_b_ER_upper; + MC_powerlaw_a_lower_err=MC_sigma_a_ER_lower; + MC_powerlaw_b_lower_err=MC_sigma_b_ER_lower; + + %% Compare to actual band + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p22\KrypCal2p22_QualityChecks\ERBand_Prediction\Sep2015_ERFit.mat') + + %Make Plot + + no_fid_new=figure; + hold on + plot(MC_events_x,MC_events,'.k','MarkerSize',1) +% cc=colorbar; +% ylabel(cc,'Count','FontSize',16); +% colormap; + ylabel('Corrected log10(S2/S1)'); xlabel('S1 corrected (Pulse Area Phe)'); + title(sprintf('Run 04 CH3T, MonteCarlo Band'),'fontsize',16,'Interpreter','none'); + myfigview(16); + ylim([0 3.5]);xlim([0 s1_max]); +% plot(ER_bins,lower_bound,'ok','markersize',6,'linewidth',2) +plot(ER_bins,MC_ER_mean_fit,'-b','markersize',20,'linewidth',2) +plot(ER_bins,ER_mean_fit,'-r','markersize',14,'linewidth',2) +% plot(ER_bins,mean_ER_band,'ok','markersize',6,'linewidth',2)%plot mean of ER band + plot(ER_bins,ER_lower_fit,'--r','markersize',20,'linewidth',2) +% plot(ER_bins,upper_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_upper_fit,'--r','markersize',14,'linewidth',2) +plot(ER_bins,MC_ER_lower_fit,'--b','markersize',20,'linewidth',2) +plot(ER_bins,MC_ER_upper_fit,'--b','markersize',20,'linewidth',2) + legend('Data','MC Band','Measured ER Band'); + + + bin_step=2; + + total_count=length(log10(MC_events_x)); + +% +% box; +% text(10,2.8,strcat('Total Count= ',num2str(total_count)),'fontsize',16); +% text(5,.55,strcat('+',num2str(band_sigma),'\sigma = (',num2str(ER_upper_power_fit.a,3),'\pm', num2str(sigma_a_ER_upper,1) ,')\times S1_c ^{', num2str(ER_upper_power_fit.b,3),'\pm',num2str(sigma_b_ER_upper,1),'}'),'fontsize',16,'interpreter','tex'); +% text(5,.3,strcat('Mean=(',num2str(ER_mean_power_fit.a,3),'\pm', num2str(sigma_a_ER_mean,1),')\times S1_c ^{', num2str(ER_mean_power_fit.b,3),'\pm', num2str(sigma_b_ER_mean,1),'}'),'fontsize',16,'interpreter','tex'); +% text(5,.05,strcat('-',num2str(band_sigma),'\sigma = (',num2str(ER_lower_power_fit.a,3),'\pm', num2str(sigma_a_ER_lower,1),')\times S1_c ^{', num2str(ER_lower_power_fit.b,3),'\pm', num2str(sigma_b_ER_lower,1),'}'),'fontsize',16,'interpreter','tex'); +% title('Sep2015 CH3T') + + box; + + text(5,.55,strcat('+',num2str(band_sigma),'\sigma = (',num2str(MC_ER_upper_power_fit.a,3),'\pm', num2str(MC_sigma_a_ER_upper,1) ,')\times S1_c ^{', num2str(MC_ER_upper_power_fit.b,3),'\pm',num2str(MC_sigma_b_ER_upper,1),'}'),'fontsize',16,'interpreter','tex'); + text(5,.3,strcat('Mean=(',num2str(MC_ER_mean_power_fit.a,3),'\pm', num2str(MC_sigma_a_ER_mean,1),')\times S1_c ^{', num2str(MC_ER_mean_power_fit.b,3),'\pm', num2str(MC_sigma_b_ER_mean,1),'}'),'fontsize',16,'interpreter','tex'); + text(5,.05,strcat('-',num2str(band_sigma),'\sigma = (',num2str(MC_ER_lower_power_fit.a,3),'\pm', num2str(MC_sigma_a_ER_lower,1),')\times S1_c ^{', num2str(MC_ER_lower_power_fit.b,3),'\pm', num2str(MC_sigma_b_ER_lower,1),'}'),'fontsize',16,'interpreter','tex'); + title('Sep2015 CH3T') + + + + +%% Stats about the difference + + +%Real Data Band +x=[1:0.1:50]; +band_mean_data=ER_mean_power_fit.a*x.^ER_mean_power_fit.b; +band_upper_data=ER_upper_power_fit.a.*x.^ER_upper_power_fit.b; +band_lower_data=ER_lower_power_fit.a.*x.^ER_lower_power_fit.b; +band_width_data=(band_mean_data-band_lower_data)./(1.28); + +%KrypCal Band - uses slightly different ER band than the one in the figures +band_mean_mc=MC_ER_mean_power_fit.a.*x.^MC_ER_mean_power_fit.b; +band_upper_mc=MC_ER_upper_power_fit.a*x.^MC_ER_upper_power_fit.b; +band_lower_mc=MC_ER_lower_power_fit.a*x.^MC_ER_lower_power_fit.b; +band_width_mc=(band_mean_mc-band_lower_mc)./(1.28); + +%Improvement in bands: Negative is worse resolution +width_difference=mean((band_width_data-band_width_mc)./(band_width_data)) + +%Shift in bands: Positive is upward shift +mean_shift=-mean((band_mean_data-band_mean_mc)./(band_mean_data)) + +%Chi2 for band mean +temp=confint(ER_mean_power_fit); +ER_mean_power_fit_a_err=abs(ER_mean_power_fit.a-temp(1,1)); +ER_mean_power_fit_b_err=abs(ER_mean_power_fit.b-temp(1,2)); +band_mean_data_err=sqrt( ((x.^ER_mean_power_fit.b).*(ER_mean_power_fit_a_err)).^2 + (ER_mean_power_fit_b_err.*ER_mean_power_fit.a.*(x.^ER_mean_power_fit.b).*log(x)).^2); +mean_chi2=sum( ((band_mean_mc-band_mean_data)./band_mean_data_err).^2) +mean_p_value=1-chi2cdf(mean_chi2,length(band_mean_data)-1) + +%Chi2 for upper 90% +temp=confint(ER_upper_power_fit); +ER_upper_power_fit_a_err=abs(ER_upper_power_fit.a-temp(1,1)); +ER_upper_power_fit_b_err=abs(ER_upper_power_fit.b-temp(1,2)); +band_upper_data_err=sqrt( ((x.^ER_upper_power_fit.b).*(ER_upper_power_fit_a_err)).^2 + (ER_upper_power_fit_b_err.*ER_upper_power_fit.a.*(x.^ER_upper_power_fit.b).*log(x)).^2); +upper_chi2=sum( ((band_upper_mc-band_upper_data)./band_upper_data_err).^2) +upper_p_value=1-chi2cdf(upper_chi2,length(band_mean_data)-1) + +%Chi2 for lower 90% +temp=confint(ER_lower_power_fit); +ER_lower_power_fit_a_err=abs(ER_lower_power_fit.a-temp(1,1)); +ER_lower_power_fit_b_err=abs(ER_lower_power_fit.b-temp(1,2)); +band_lower_data_err=sqrt( ((x.^ER_lower_power_fit.b).*(ER_lower_power_fit_a_err)).^2 + (ER_lower_power_fit_b_err.*ER_lower_power_fit.a.*(x.^ER_lower_power_fit.b).*log(x)).^2); +lower_chi2=sum( ((band_lower_mc-band_lower_data)./band_lower_data_err).^2) +lower_p_value=1-chi2cdf(lower_chi2,length(band_mean_data)-1) + + +%Chi2 for total width +expected_width=(band_upper_data-band_lower_data); +expected_width_err=sqrt(band_upper_data_err.^2 + band_lower_data_err.^2); +observed_width=(band_upper_mc-band_lower_mc); +width_chi2=sum( ((observed_width-expected_width)./(expected_width_err)).^2) +width_p_value=1-chi2cdf(width_chi2,length(band_mean_data)-1) diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictVoxelizedBands/PredictERBand_Feb2015.m b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictVoxelizedBands/PredictERBand_Feb2015.m new file mode 100644 index 0000000..02b1bcb --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictVoxelizedBands/PredictERBand_Feb2015.m @@ -0,0 +1,203 @@ +% Load in the S1a/S1b -> ER Band map + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p22\KrypCal2p22_QualityChecks\ERBand_Prediction\S1aS1b_To_ERBand_RZVoxels.mat') + + +%% Load in Sep2015 ER S1a/S1b + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p22\KrypCal2p22_QualityChecks\ERBand_Prediction\PredictVoxelizedBands\Feb2015_S1aS1b_Vox.mat') + + +SE_size_Sep2015=25.64; +SE_size_Sep2014=27.21; +SE_size_Nov2014=26.13; +SE_size_Feb2015=26.23; +SE_size_Feb2016=25.05; + + +voxel_counter=1; +for i=1:size(s1ab_z_means,2) + MC_events=[]; + MC_events_x=[]; + + if ~isnan(s1ab_z_means(i)) + [powerlaw_a powerlaw_a_err]=polyval(S1aS1b_to_mean_a_fit,s1ab_z_means(i),S1aS1b_to_mean_a_fit_err); + [powerlaw_b powerlaw_b_err]=polyval(S1aS1b_to_mean_b_fit,s1ab_z_means(i),S1aS1b_to_mean_b_fit_err); + [powerlaw_a_upper powerlaw_a_upper_err]=polyval(S1aS1b_to_upper_a_fit,s1ab_z_means(i),S1aS1b_to_upper_a_fit_err); + [powerlaw_b_upper powerlaw_b_upper_err]=polyval(S1aS1b_to_upper_b_fit,s1ab_z_means(i),S1aS1b_to_upper_b_fit_err); + [powerlaw_a_lower powerlaw_a_lower_err]=polyval(S1aS1b_to_lower_a_fit,s1ab_z_means(i),S1aS1b_to_lower_a_fit_err); + [powerlaw_b_lower powerlaw_b_lower_err]=polyval(S1aS1b_to_lower_b_fit,s1ab_z_means(i),S1aS1b_to_lower_b_fit_err); + + %Make MC of predicted band for the voxel + for counter=1:10000; + xx=50*rand(1); %pick random S1 value + yy= log10((10.^(powerlaw_a.*xx.^powerlaw_b)).*(SE_size_Feb2015/SE_size_Sep2015)); %Get associate log10(S1/S2) mean from power law fit + yy_sigma=abs(yy-log10((10.^(powerlaw_a_upper.*xx.^powerlaw_b_upper)).*(SE_size_Feb2016/SE_size_Sep2015)) )/1.28; %Get associate log10(S1/S2) gaussian width from power law fit + MC_events=[MC_events; normrnd(yy,yy_sigma,1)]; + MC_events_x=[MC_events_x; xx]; + end + end + + %Fit to the Zslice MC Band + s1_min=0; + s1_max=50; + band_sigma=1.28; %90% confidence bounds + + s2_s1_bin= 1:.05:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + MC_counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut= inrange(MC_events_x,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(MC_events(ER_fit_cut),s2_s1_bin); + MC_counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(MC_events(ER_fit_cut),s2_s1_bin); + + %band=confint(Fit_ER,.1); + %ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*MC_counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + MC_ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + MC_ER_mean_fit=MC_ER_mean_power_fit.a.*ER_bins.^(MC_ER_mean_power_fit.b); + b=confint(MC_ER_mean_power_fit,.68); + MC_sigma_a_ER_mean=(b(2,1)-b(1,1))/2; + MC_sigma_b_ER_mean=(b(2,2)-b(1,2))/2; + + MC_ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + MC_ER_lower_fit=MC_ER_lower_power_fit.a.*ER_bins.^(MC_ER_lower_power_fit.b); + b=confint(MC_ER_lower_power_fit,.68); + MC_sigma_a_ER_lower=(b(2,1)-b(1,1))/2; + MC_sigma_b_ER_lower=(b(2,2)-b(1,2))/2; + + MC_ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + MC_ER_upper_fit=MC_ER_upper_power_fit.a.*ER_bins.^(MC_ER_upper_power_fit.b); + b=confint(MC_ER_upper_power_fit,.68); + MC_sigma_a_ER_upper=(b(2,1)-b(1,1))/2; + MC_sigma_b_ER_upper=(b(2,2)-b(1,2))/2; + + + MC_ER_lower_power_fit_vox{voxel_counter}=MC_ER_lower_power_fit; + MC_ER_upper_power_fit_vox{voxel_counter}=MC_ER_upper_power_fit; + MC_ER_mean_power_fit_vox{voxel_counter}=MC_ER_mean_power_fit; + MC_ydata{voxel_counter}=MC_events; + MC_xdata{voxel_counter}=MC_events_x; + + voxel_counter=voxel_counter+1; +end + +%% Plot Each Z Slice band and prediction + +load('Feb2015_ER_Vox.mat'); + +x=[1:0.1:50]; +for i =1:length(MC_ER_upper_power_fit_vox) + + ER_mean_power_fit=ER_mean_power_fit_vox{i}; + ER_upper_power_fit=ER_upper_power_fit_vox{i}; + ER_lower_power_fit=ER_lower_power_fit_vox{i}; + + MC_ER_mean_power_fit=MC_ER_mean_power_fit_vox{i}; + MC_ER_upper_power_fit=MC_ER_upper_power_fit_vox{i}; + MC_ER_lower_power_fit=MC_ER_lower_power_fit_vox{i}; + MC_y=MC_ydata{i}; + MC_x=MC_xdata{i}; + +%Real data band +band_mean_data=ER_mean_power_fit.a*x.^ER_mean_power_fit.b; +band_upper_data=ER_upper_power_fit.a.*x.^ER_upper_power_fit.b; +band_lower_data=ER_lower_power_fit.a.*x.^ER_lower_power_fit.b; +band_width_data=(band_mean_data-band_lower_data)./(1.28); + + + +%KrypCal Band - uses slightly different ER band than the one in the figures +band_mean_mc=MC_ER_mean_power_fit.a.*x.^MC_ER_mean_power_fit.b; +band_upper_mc=MC_ER_upper_power_fit.a*x.^MC_ER_upper_power_fit.b; +band_lower_mc=MC_ER_lower_power_fit.a*x.^MC_ER_lower_power_fit.b; +band_width_mc=(band_mean_mc-band_lower_mc)./(1.28); + + +%Plot the bands +figure +hold on; +plot(MC_x,MC_y,'.k'); +plot(x,band_mean_mc,'-b','LineWidth',2); +plot(x,band_mean_data,'-r','LineWidth',2); +legend('MC Data','MC Fit','Data Fit'); +xlabel('S1 (phe)'); ylabel('log10(S2/S1)'); myfigview(16); +plot(x,band_upper_mc,'--b','LineWidth',2); +plot(x,band_lower_mc,'--b','LineWidth',2); +plot(x,band_upper_data,'--r','LineWidth',2); +plot(x,band_lower_data,'--r','LineWidth',2); +ylim([1.5 3.5]) + + +%Improvement in bands: Negative is worse resolution +width_difference=mean((band_width_data-band_width_mc)./(band_width_data)) + +%Shift in bands: Positive is upward shift +mean_shift=-mean((band_mean_data-band_mean_mc)./(band_mean_data)) + +%Chi2 for band mean +temp=confint(ER_mean_power_fit); +ER_mean_power_fit_a_err=abs(ER_mean_power_fit.a-temp(1,1)); +ER_mean_power_fit_b_err=abs(ER_mean_power_fit.b-temp(1,2)); +band_mean_data_err=sqrt( ((x.^ER_mean_power_fit.b).*(ER_mean_power_fit_a_err)).^2 + (ER_mean_power_fit_b_err.*ER_mean_power_fit.a.*(x.^ER_mean_power_fit.b).*log(x)).^2); +mean_chi2=sum( ((band_mean_mc-band_mean_data)./band_mean_data_err).^2) +mean_p_value=1-chi2cdf(mean_chi2,length(band_mean_data)-1) + +%Chi2 for upper 90% +temp=confint(ER_upper_power_fit); +ER_upper_power_fit_a_err=abs(ER_upper_power_fit.a-temp(1,1)); +ER_upper_power_fit_b_err=abs(ER_upper_power_fit.b-temp(1,2)); +band_upper_data_err=sqrt( ((x.^ER_upper_power_fit.b).*(ER_upper_power_fit_a_err)).^2 + (ER_upper_power_fit_b_err.*ER_upper_power_fit.a.*(x.^ER_upper_power_fit.b).*log(x)).^2); +upper_chi2=sum( ((band_upper_mc-band_upper_data)./band_upper_data_err).^2) +upper_p_value=1-chi2cdf(upper_chi2,length(band_mean_data)-1) + +%Chi2 for lower 90% +temp=confint(ER_lower_power_fit); +ER_lower_power_fit_a_err=abs(ER_lower_power_fit.a-temp(1,1)); +ER_lower_power_fit_b_err=abs(ER_lower_power_fit.b-temp(1,2)); +band_lower_data_err=sqrt( ((x.^ER_lower_power_fit.b).*(ER_lower_power_fit_a_err)).^2 + (ER_lower_power_fit_b_err.*ER_lower_power_fit.a.*(x.^ER_lower_power_fit.b).*log(x)).^2); +lower_chi2=sum( ((band_lower_mc-band_lower_data)./band_lower_data_err).^2) +lower_p_value=1-chi2cdf(lower_chi2,length(band_mean_data)-1) + + +%Chi2 for total width +expected_width=(band_upper_data-band_lower_data); +expected_width_err=sqrt(band_upper_data_err.^2 + band_lower_data_err.^2); +observed_width=(band_upper_mc-band_lower_mc); +width_chi2=sum( ((observed_width-expected_width)./(expected_width_err)).^2) +width_p_value=1-chi2cdf(width_chi2,length(band_mean_data)-1) + + + +end + diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictVoxelizedBands/PredictERBand_Feb2016.m b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictVoxelizedBands/PredictERBand_Feb2016.m new file mode 100644 index 0000000..60e336e --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictVoxelizedBands/PredictERBand_Feb2016.m @@ -0,0 +1,203 @@ +% Load in the S1a/S1b -> ER Band map + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p22\KrypCal2p22_QualityChecks\ERBand_Prediction\S1aS1b_To_ERBand_RZVoxels.mat') + + +%% Load in Sep2015 ER S1a/S1b + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p22\KrypCal2p22_QualityChecks\ERBand_Prediction\PredictVoxelizedBands\Feb2016_S1aS1b_Vox.mat') + + +SE_size_Sep2015=25.64; +SE_size_Sep2014=27.21; +SE_size_Nov2014=26.13; +SE_size_Feb2015=26.23; +SE_size_Feb2016=25.05; + + +voxel_counter=1; +for i=1:size(s1ab_z_means,2) + MC_events=[]; + MC_events_x=[]; + + if ~isnan(s1ab_z_means(i)) + [powerlaw_a powerlaw_a_err]=polyval(S1aS1b_to_mean_a_fit,s1ab_z_means(i),S1aS1b_to_mean_a_fit_err); + [powerlaw_b powerlaw_b_err]=polyval(S1aS1b_to_mean_b_fit,s1ab_z_means(i),S1aS1b_to_mean_b_fit_err); + [powerlaw_a_upper powerlaw_a_upper_err]=polyval(S1aS1b_to_upper_a_fit,s1ab_z_means(i),S1aS1b_to_upper_a_fit_err); + [powerlaw_b_upper powerlaw_b_upper_err]=polyval(S1aS1b_to_upper_b_fit,s1ab_z_means(i),S1aS1b_to_upper_b_fit_err); + [powerlaw_a_lower powerlaw_a_lower_err]=polyval(S1aS1b_to_lower_a_fit,s1ab_z_means(i),S1aS1b_to_lower_a_fit_err); + [powerlaw_b_lower powerlaw_b_lower_err]=polyval(S1aS1b_to_lower_b_fit,s1ab_z_means(i),S1aS1b_to_lower_b_fit_err); + + %Make MC of predicted band for the voxel + for counter=1:10000; + xx=50*rand(1); %pick random S1 value + yy= log10((10.^(powerlaw_a.*xx.^powerlaw_b)).*(SE_size_Feb2016/SE_size_Sep2015)); %Get associate log10(S1/S2) mean from power law fit + yy_sigma=abs(yy-log10((10.^(powerlaw_a_upper.*xx.^powerlaw_b_upper)).*(SE_size_Feb2016/SE_size_Sep2015)) )/1.28; %Get associate log10(S1/S2) gaussian width from power law fit + MC_events=[MC_events; normrnd(yy,yy_sigma,1)]; + MC_events_x=[MC_events_x; xx]; + end + end + + %Fit to the Zslice MC Band + s1_min=0; + s1_max=50; + band_sigma=1.28; %90% confidence bounds + + s2_s1_bin= 1:.05:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + MC_counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut= inrange(MC_events_x,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(MC_events(ER_fit_cut),s2_s1_bin); + MC_counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(MC_events(ER_fit_cut),s2_s1_bin); + + %band=confint(Fit_ER,.1); + %ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*MC_counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + MC_ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + MC_ER_mean_fit=MC_ER_mean_power_fit.a.*ER_bins.^(MC_ER_mean_power_fit.b); + b=confint(MC_ER_mean_power_fit,.68); + MC_sigma_a_ER_mean=(b(2,1)-b(1,1))/2; + MC_sigma_b_ER_mean=(b(2,2)-b(1,2))/2; + + MC_ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + MC_ER_lower_fit=MC_ER_lower_power_fit.a.*ER_bins.^(MC_ER_lower_power_fit.b); + b=confint(MC_ER_lower_power_fit,.68); + MC_sigma_a_ER_lower=(b(2,1)-b(1,1))/2; + MC_sigma_b_ER_lower=(b(2,2)-b(1,2))/2; + + MC_ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + MC_ER_upper_fit=MC_ER_upper_power_fit.a.*ER_bins.^(MC_ER_upper_power_fit.b); + b=confint(MC_ER_upper_power_fit,.68); + MC_sigma_a_ER_upper=(b(2,1)-b(1,1))/2; + MC_sigma_b_ER_upper=(b(2,2)-b(1,2))/2; + + + MC_ER_lower_power_fit_vox{voxel_counter}=MC_ER_lower_power_fit; + MC_ER_upper_power_fit_vox{voxel_counter}=MC_ER_upper_power_fit; + MC_ER_mean_power_fit_vox{voxel_counter}=MC_ER_mean_power_fit; + MC_ydata{voxel_counter}=MC_events; + MC_xdata{voxel_counter}=MC_events_x; + + voxel_counter=voxel_counter+1; +end + +%% Plot Each Z Slice band and prediction + +load('Feb2016_ER_Vox.mat'); + +x=[1:0.1:50]; +for i =1:length(MC_ER_upper_power_fit_vox) + + ER_mean_power_fit=ER_mean_power_fit_vox{i}; + ER_upper_power_fit=ER_upper_power_fit_vox{i}; + ER_lower_power_fit=ER_lower_power_fit_vox{i}; + + MC_ER_mean_power_fit=MC_ER_mean_power_fit_vox{i}; + MC_ER_upper_power_fit=MC_ER_upper_power_fit_vox{i}; + MC_ER_lower_power_fit=MC_ER_lower_power_fit_vox{i}; + MC_y=MC_ydata{i}; + MC_x=MC_xdata{i}; + +%Real data band +band_mean_data=ER_mean_power_fit.a*x.^ER_mean_power_fit.b; +band_upper_data=ER_upper_power_fit.a.*x.^ER_upper_power_fit.b; +band_lower_data=ER_lower_power_fit.a.*x.^ER_lower_power_fit.b; +band_width_data=(band_mean_data-band_lower_data)./(1.28); + + + +%KrypCal Band - uses slightly different ER band than the one in the figures +band_mean_mc=MC_ER_mean_power_fit.a.*x.^MC_ER_mean_power_fit.b; +band_upper_mc=MC_ER_upper_power_fit.a*x.^MC_ER_upper_power_fit.b; +band_lower_mc=MC_ER_lower_power_fit.a*x.^MC_ER_lower_power_fit.b; +band_width_mc=(band_mean_mc-band_lower_mc)./(1.28); + + +%Plot the bands +figure +hold on; +plot(MC_x,MC_y,'.k'); +plot(x,band_mean_mc,'-b','LineWidth',2); +plot(x,band_mean_data,'-r','LineWidth',2); +legend('MC Data','MC Fit','Data Fit'); +xlabel('S1 (phe)'); ylabel('log10(S2/S1)'); myfigview(16); +plot(x,band_upper_mc,'--b','LineWidth',2); +plot(x,band_lower_mc,'--b','LineWidth',2); +plot(x,band_upper_data,'--r','LineWidth',2); +plot(x,band_lower_data,'--r','LineWidth',2); +ylim([1.5 3.5]) + + +%Improvement in bands: Negative is worse resolution +width_difference=mean((band_width_data-band_width_mc)./(band_width_data)) + +%Shift in bands: Positive is upward shift +mean_shift=-mean((band_mean_data-band_mean_mc)./(band_mean_data)) + +%Chi2 for band mean +temp=confint(ER_mean_power_fit); +ER_mean_power_fit_a_err=abs(ER_mean_power_fit.a-temp(1,1)); +ER_mean_power_fit_b_err=abs(ER_mean_power_fit.b-temp(1,2)); +band_mean_data_err=sqrt( ((x.^ER_mean_power_fit.b).*(ER_mean_power_fit_a_err)).^2 + (ER_mean_power_fit_b_err.*ER_mean_power_fit.a.*(x.^ER_mean_power_fit.b).*log(x)).^2); +mean_chi2=sum( ((band_mean_mc-band_mean_data)./band_mean_data_err).^2) +mean_p_value=1-chi2cdf(mean_chi2,length(band_mean_data)-1) + +%Chi2 for upper 90% +temp=confint(ER_upper_power_fit); +ER_upper_power_fit_a_err=abs(ER_upper_power_fit.a-temp(1,1)); +ER_upper_power_fit_b_err=abs(ER_upper_power_fit.b-temp(1,2)); +band_upper_data_err=sqrt( ((x.^ER_upper_power_fit.b).*(ER_upper_power_fit_a_err)).^2 + (ER_upper_power_fit_b_err.*ER_upper_power_fit.a.*(x.^ER_upper_power_fit.b).*log(x)).^2); +upper_chi2=sum( ((band_upper_mc-band_upper_data)./band_upper_data_err).^2) +upper_p_value=1-chi2cdf(upper_chi2,length(band_mean_data)-1) + +%Chi2 for lower 90% +temp=confint(ER_lower_power_fit); +ER_lower_power_fit_a_err=abs(ER_lower_power_fit.a-temp(1,1)); +ER_lower_power_fit_b_err=abs(ER_lower_power_fit.b-temp(1,2)); +band_lower_data_err=sqrt( ((x.^ER_lower_power_fit.b).*(ER_lower_power_fit_a_err)).^2 + (ER_lower_power_fit_b_err.*ER_lower_power_fit.a.*(x.^ER_lower_power_fit.b).*log(x)).^2); +lower_chi2=sum( ((band_lower_mc-band_lower_data)./band_lower_data_err).^2) +lower_p_value=1-chi2cdf(lower_chi2,length(band_mean_data)-1) + + +%Chi2 for total width +expected_width=(band_upper_data-band_lower_data); +expected_width_err=sqrt(band_upper_data_err.^2 + band_lower_data_err.^2); +observed_width=(band_upper_mc-band_lower_mc); +width_chi2=sum( ((observed_width-expected_width)./(expected_width_err)).^2) +width_p_value=1-chi2cdf(width_chi2,length(band_mean_data)-1) + + + +end + diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictVoxelizedBands/PredictERBand_Sep2015.m b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictVoxelizedBands/PredictERBand_Sep2015.m new file mode 100644 index 0000000..0cf8c44 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictVoxelizedBands/PredictERBand_Sep2015.m @@ -0,0 +1,205 @@ +% Load in the S1a/S1b -> ER Band map + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p22\KrypCal2p22_QualityChecks\ERBand_Prediction\S1aS1b_To_ERBand_RZVoxels.mat') + + +%% Load in Sep2015 ER S1a/S1b + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p22\KrypCal2p22_QualityChecks\ERBand_Prediction\PredictVoxelizedBands\Sep2015_S1aS1b_Vox.mat') + + +SE_size_Sep2015=25.64; +SE_size_Sep2014=27.21; +SE_size_Nov2014=26.13; +SE_size_Feb2015=26.23; + + +voxel_counter=1; +for i=1:size(s1ab_z_means,2) + MC_events=[]; + MC_events_x=[]; + + if ~isnan(s1ab_z_means(i)) + [powerlaw_a powerlaw_a_err]=polyval(S1aS1b_to_mean_a_fit,s1ab_z_means(i),S1aS1b_to_mean_a_fit_err); + [powerlaw_b powerlaw_b_err]=polyval(S1aS1b_to_mean_b_fit,s1ab_z_means(i),S1aS1b_to_mean_b_fit_err); + [powerlaw_a_upper powerlaw_a_upper_err]=polyval(S1aS1b_to_upper_a_fit,s1ab_z_means(i),S1aS1b_to_upper_a_fit_err); + [powerlaw_b_upper powerlaw_b_upper_err]=polyval(S1aS1b_to_upper_b_fit,s1ab_z_means(i),S1aS1b_to_upper_b_fit_err); + [powerlaw_a_lower powerlaw_a_lower_err]=polyval(S1aS1b_to_lower_a_fit,s1ab_z_means(i),S1aS1b_to_lower_a_fit_err); + [powerlaw_b_lower powerlaw_b_lower_err]=polyval(S1aS1b_to_lower_b_fit,s1ab_z_means(i),S1aS1b_to_lower_b_fit_err); + + %Make MC of predicted band for the voxel + for counter=1:10000; + xx=50*rand(1); %pick random S1 value + yy= powerlaw_a.*xx.^powerlaw_b; %Get associate log10(S1/S2) mean from power law fit + yy_sigma=abs(yy-(powerlaw_a_upper.*xx.^powerlaw_b_upper))/1.28; %Get associate log10(S1/S2) gaussian width from power law fit + MC_events=[MC_events; normrnd(yy,yy_sigma,1)]; + MC_events_x=[MC_events_x; xx]; + end + end + + %Fit to the Zslice MC Band + s1_min=0; + s1_max=50; + band_sigma=1.28; %90% confidence bounds + + s2_s1_bin= 1:.05:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + MC_counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut= inrange(MC_events_x,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(MC_events(ER_fit_cut),s2_s1_bin); + MC_counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(MC_events(ER_fit_cut),s2_s1_bin); + + %band=confint(Fit_ER,.1); + %ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*MC_counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + MC_ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + MC_ER_mean_fit=MC_ER_mean_power_fit.a.*ER_bins.^(MC_ER_mean_power_fit.b); + b=confint(MC_ER_mean_power_fit,.68); + MC_sigma_a_ER_mean=(b(2,1)-b(1,1))/2; + MC_sigma_b_ER_mean=(b(2,2)-b(1,2))/2; + + MC_ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + MC_ER_lower_fit=MC_ER_lower_power_fit.a.*ER_bins.^(MC_ER_lower_power_fit.b); + b=confint(MC_ER_lower_power_fit,.68); + MC_sigma_a_ER_lower=(b(2,1)-b(1,1))/2; + MC_sigma_b_ER_lower=(b(2,2)-b(1,2))/2; + + MC_ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + MC_ER_upper_fit=MC_ER_upper_power_fit.a.*ER_bins.^(MC_ER_upper_power_fit.b); + b=confint(MC_ER_upper_power_fit,.68); + MC_sigma_a_ER_upper=(b(2,1)-b(1,1))/2; + MC_sigma_b_ER_upper=(b(2,2)-b(1,2))/2; + + + MC_ER_lower_power_fit_vox{voxel_counter}=MC_ER_lower_power_fit; + MC_ER_upper_power_fit_vox{voxel_counter}=MC_ER_upper_power_fit; + MC_ER_mean_power_fit_vox{voxel_counter}=MC_ER_mean_power_fit; + MC_ydata{voxel_counter}=MC_events; + MC_xdata{voxel_counter}=MC_events_x; + + voxel_counter=voxel_counter+1; +end + +%% Plot Each Z Slice band and prediction + +load('Sep2015_ER_Vox.mat'); + +x=[1:0.1:50]; +for i =1:length(MC_ER_upper_power_fit_vox) + + ER_mean_power_fit=ER_mean_power_fit_vox{i}; + ER_upper_power_fit=ER_upper_power_fit_vox{i}; + ER_lower_power_fit=ER_lower_power_fit_vox{i}; + + MC_ER_mean_power_fit=MC_ER_mean_power_fit_vox{i}; + MC_ER_upper_power_fit=MC_ER_upper_power_fit_vox{i}; + MC_ER_lower_power_fit=MC_ER_lower_power_fit_vox{i}; + MC_y=MC_ydata{i}; + MC_x=MC_xdata{i}; + +%Real data band +band_mean_data=ER_mean_power_fit.a*x.^ER_mean_power_fit.b; +band_upper_data=ER_upper_power_fit.a.*x.^ER_upper_power_fit.b; +band_lower_data=ER_lower_power_fit.a.*x.^ER_lower_power_fit.b; +band_width_data=(band_mean_data-band_lower_data)./(1.28); + + + +%KrypCal Band - uses slightly different ER band than the one in the figures +band_mean_mc=MC_ER_mean_power_fit.a.*x.^MC_ER_mean_power_fit.b; +band_upper_mc=MC_ER_upper_power_fit.a*x.^MC_ER_upper_power_fit.b; +band_lower_mc=MC_ER_lower_power_fit.a*x.^MC_ER_lower_power_fit.b; +band_width_mc=(band_mean_mc-band_lower_mc)./(1.28); + + +%Plot the bands +figure +hold on; +plot(MC_x,MC_y,'.k'); +plot(x,band_mean_mc,'-b','LineWidth',2); +plot(x,band_mean_data,'-r','LineWidth',2); +legend('MC Data','MC Fit','Data Fit'); +xlabel('S1 (phe)'); ylabel('log10(S2/S1)'); myfigview(16); +plot(x,band_upper_mc,'--b','LineWidth',2); +plot(x,band_lower_mc,'--b','LineWidth',2); +plot(x,band_upper_data,'--r','LineWidth',2); +plot(x,band_lower_data,'--r','LineWidth',2); +ylim([1.5 3.5]) + + +%Improvement in bands: Negative is worse resolution +width_difference=mean((band_width_data-band_width_mc)./(band_width_data)) + +%Shift in bands: Positive is upward shift +mean_shift=-mean((band_mean_data-band_mean_mc)./(band_mean_data)) + +%Chi2 for band mean +temp=confint(ER_mean_power_fit); +ER_mean_power_fit_a_err=abs(ER_mean_power_fit.a-temp(1,1)); +ER_mean_power_fit_b_err=abs(ER_mean_power_fit.b-temp(1,2)); +band_mean_data_err=sqrt( ((x.^ER_mean_power_fit.b).*(ER_mean_power_fit_a_err)).^2 + (ER_mean_power_fit_b_err.*ER_mean_power_fit.a.*(x.^ER_mean_power_fit.b).*log(x)).^2); +mean_chi2=sum( ((band_mean_mc-band_mean_data)./band_mean_data_err).^2) +mean_p_value=1-chi2cdf(mean_chi2,length(band_mean_data)-1) + +%Chi2 for upper 90% +temp=confint(ER_upper_power_fit); +ER_upper_power_fit_a_err=abs(ER_upper_power_fit.a-temp(1,1)); +ER_upper_power_fit_b_err=abs(ER_upper_power_fit.b-temp(1,2)); +band_upper_data_err=sqrt( ((x.^ER_upper_power_fit.b).*(ER_upper_power_fit_a_err)).^2 + (ER_upper_power_fit_b_err.*ER_upper_power_fit.a.*(x.^ER_upper_power_fit.b).*log(x)).^2); +upper_chi2=sum( ((band_upper_mc-band_upper_data)./band_upper_data_err).^2) +upper_p_value=1-chi2cdf(upper_chi2,length(band_mean_data)-1) + +%Chi2 for lower 90% +temp=confint(ER_lower_power_fit); +ER_lower_power_fit_a_err=abs(ER_lower_power_fit.a-temp(1,1)); +ER_lower_power_fit_b_err=abs(ER_lower_power_fit.b-temp(1,2)); +band_lower_data_err=sqrt( ((x.^ER_lower_power_fit.b).*(ER_lower_power_fit_a_err)).^2 + (ER_lower_power_fit_b_err.*ER_lower_power_fit.a.*(x.^ER_lower_power_fit.b).*log(x)).^2); +lower_chi2=sum( ((band_lower_mc-band_lower_data)./band_lower_data_err).^2) +lower_p_value=1-chi2cdf(lower_chi2,length(band_mean_data)-1) + + +%Chi2 for total width +expected_width=(band_upper_data-band_lower_data); +expected_width_err=sqrt(band_upper_data_err.^2 + band_lower_data_err.^2); +observed_width=(band_upper_mc-band_lower_mc); +width_chi2=sum( ((observed_width-expected_width)./(expected_width_err)).^2) +width_p_value=1-chi2cdf(width_chi2,length(band_mean_data)-1) + + + +end + + + +%% Stats about the difference diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictVoxelizedBands/SetUp_VoxPrediction_Feb2015.m b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictVoxelizedBands/SetUp_VoxPrediction_Feb2015.m new file mode 100644 index 0000000..5213a97 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictVoxelizedBands/SetUp_VoxPrediction_Feb2015.m @@ -0,0 +1,1351 @@ +%% Make corrections with the chosen polynomial +path='C:\Users\Richard\Desktop\LUX Analysis\lux10_20150226T1943_cp18525'; + + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm','x_cm_tmplt','y_cm_tmplt'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +delay_min=0; +file_id_cp='test'; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 70000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + + + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + + zcut_min = 10; %field changes at 4 uSec + zcut_max = 0.95*det_edge; + + + if Kr_events < 30000 %then create a 10x10 grid. Otherwise 25x25. Want about 30 evts per bin + + S1xybinsize = sqrt((50*50)/(Kr_events/150)); + S1_xbin_min = -25; + S1_xbin_max = 25; + S1_ybin_min = -25; + S1_ybin_max = 25; + SE_ybin_min = -25; + SE_ybin_max = 25; + + S2xybinsize = sqrt((50*50)/(Kr_events/150));%cm +% SExybinsize = 5; DEFINED LATER, based on number of SE events + S2_xbin_min = -25; + S2_xbin_max = 25; + S2_ybin_min = -25; + S2_ybin_max = 25; + SE_xbin_min = -25; + SE_xbin_max = 25; + + + end + + s1_xbins = (S1_xbin_max-S1_xbin_min)./S1xybinsize; + s1_ybins = (S1_ybin_max-S1_ybin_min)./S1xybinsize; + + s2_xbins = (S2_xbin_max-S2_xbin_min)./S2xybinsize; + s2_ybins = (S2_ybin_max-S2_ybin_min)./S2xybinsize; + + %% Kr S1a/S2b map + +%Set up cuts and variables + s1ab_cut=logical(sum(s1_single_cut(:,:),1)); + s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); + s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); + s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); + s1ab_x=d.x_cm(s2_single_cut); + s1ab_y=d.y_cm(s2_single_cut); + s1ab_z=d.z_drift_samples(s2_single_cut)/100; + s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); + s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<25; + %plotting x=s1a v y=s1a/s1b cuts: y<0.035x-1, y>-0.035.*x+5; y>0.01.*x; %y<4.2; x<255 +% s1ab_areacut= (s1a_phe_both./s1b_phe_both-0.035.*s1a_phe_both<-1) & (s1a_phe_both./s1b_phe_both+0.035.*s1a_phe_both>5)... +% & (s1a_phe_both./s1b_phe_both > 0.01.* s1a_phe_both) & (s1a_phe_both./s1b_phe_both<4.2) & (s1a_phe_both<255); + + s1ab_x=s1ab_x(s1ab_timing_cut); + s1ab_y=s1ab_y(s1ab_timing_cut); + s1ab_z=s1ab_z(s1ab_timing_cut); + s1a_phe_both=s1a_phe_both(s1ab_timing_cut); + s1b_phe_both=s1b_phe_both(s1ab_timing_cut); + s1ab_radius=s1ab_radius(s1ab_timing_cut); + + %fidicual Z cut for s1ab_xy measurement + [s1ab_z_hist s1ab_z_hist_bins]=hist(s1ab_z(inrange(s1ab_z,[0,400])),[0:1:400]); + frac_hist=cumsum(s1ab_z_hist)./sum(s1ab_z_hist); + s1ab_z_cut_lower= min(s1ab_z_hist_bins(frac_hist>.10)); + s1ab_z_cut_upper= max(s1ab_z_hist_bins(frac_hist<.90)); + s1ab_z_cut=inrange(s1ab_z,[s1ab_z_cut_lower,s1ab_z_cut_upper]); + + %R cut for s1ab_Z measurement + [upperz_r_hist upperz_r_hist_bins]=hist(s1ab_radius(s1ab_z>s1ab_z_cut_upper & s1ab_radius<=26),[0:1:26]); + [lowerz_r_hist lowerz_r_hist_bins]=hist(s1ab_radius(s1ab_z0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:400]).','gauss1'); + s1b_fit=fit([0:2:300].',hist(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:300]).','gauss1'); + s1a_z_means(i)=s1a_fit.b1; + s1a_z_means_err(i)=s1a_fit.c1/sqrt(2)/sqrt(length(s1a_phe_both(s1ab_r_cut.' & s1a_phe_both>0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1b_z_means(i)=s1b_fit.b1; + s1b_z_means_err(i)=s1b_fit.c1/sqrt(2)/sqrt(length(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1ab_bincenters(i)=z_max-dT_step/2; + Kr_count_1D(i)=length(s1_phe_both(inrange(drift_time,[z_max-dT_step,z_max]) & kr_r_cut)); + i=i+1; + end + +s1ab_z_means=s1a_z_means./s1b_z_means; +s1ab_z_means_err=sqrt( (s1b_z_means_err.*s1a_z_means./(s1b_z_means.^2)).^2 + (s1a_z_means_err./s1b_z_means).^2); + +%fit polynomial to s1az and s1bz, to remove z dependence later in xy fit +[s1a_P, s1a_S]=polyfit(s1ab_bincenters,s1a_z_means,3); +[s1b_P, s1b_S]=polyfit(s1ab_bincenters,s1b_z_means,3); +[s1ab_P, s1ab_S]=polyfit(s1ab_bincenters,s1ab_z_means,2); + +%S1a z dependence plot +s1az_plot=figure; +errorbar(s1ab_bincenters,s1a_z_means,s1a_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a Mean (phe)'); title('S1a Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1a_P,[10:1:320]),'-r','LineWidth',2) + +%S1b z dependence plot +s1bz_plot=figure; +errorbar(s1ab_bincenters,s1b_z_means,s1b_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1b Mean (phe)'); title('S1b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1b_P,[10:1:320]),'-r','LineWidth',2) + +%S1a/b z dependence plot +s1a_over_bz_plot=figure; +errorbar(s1ab_bincenters,s1ab_z_means,s1ab_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a/b'); title('S1 a/b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1ab_P,[10:1:320]),'-r','LineWidth',2) + + +%Correcting z dependence to get XY dependence in same manner that Kr/CH3T +%map does + s1a_phe_both_z=s1a_phe_both.'.*polyval(s1a_P,z_center)./polyval(s1a_P,s1ab_z); + s1b_phe_both_z=s1b_phe_both.'.*polyval(s1b_P,z_center)./polyval(s1b_P,s1ab_z); + + %% S1a/b XY map (after z correction) +s1ab_xbin_min=-25; +s1ab_ybin_min=-25; +s1ab_xbin_max=25; +s1ab_ybin_max=25; +s1ab_xybinsize=sqrt((50*50)/(length(s1ab_z)/300)); +clear s1a_xy_mean s1a_xy_mean_err s1b_xy_mean s1b_xy_mean_err + +s1ab_xbins=s1ab_xbin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_xbin_max; +s1ab_ybins=s1ab_ybin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_ybin_max; + +s1a_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); +s1b_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); + + for x_bin=s1ab_xbin_min:s1ab_xybinsize:(s1ab_xbin_max-s1ab_xybinsize/2); + for y_bin=s1ab_ybin_min:s1ab_xybinsize:(s1ab_ybin_max-s1ab_xybinsize/2); + x_min = x_bin; x_max = x_bin+s1ab_xybinsize; + y_min = y_bin; y_max = y_bin+s1ab_xybinsize; + + x_count=int32(1+x_bin/s1ab_xybinsize+s1ab_xbin_max/s1ab_xybinsize); + y_count=int32(1+y_bin/s1ab_xybinsize+s1ab_ybin_max/s1ab_xybinsize); + + bin_cut = s1ab_z_cut.' & inrange(s1ab_z,[10 330]).' & s1a_phe_both>0 & s1b_phe_both>0 & inrange(s1ab_x,[x_min,x_max]).' & inrange(s1ab_y,[y_min,y_max]).'; + if length(s1a_phe_both_z(bin_cut))>100; + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400])),[0:2:400]).','gauss1'); + s1a_xy_mean(y_count,x_count)=s1a_z_fit.b1; + s1a_xy_mean_err(y_count,x_count)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300])),[0:2:300]).','gauss1'); + s1b_xy_mean(y_count,x_count)=s1b_z_fit.b1; + s1b_xy_mean_err(y_count,x_count)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300]))); + else + s1a_xy_mean(y_count,x_count)=0; + s1a_xy_mean_err(y_count,x_count)=0; + s1b_xy_mean(y_count,x_count)=0; + s1b_xy_mean_err(y_count,x_count)=0; + end + + end + end + s1ab_xy_mean=s1a_xy_mean./s1b_xy_mean; + s1ab_xy_mean_err=sqrt( (s1b_xy_mean_err.*s1a_xy_mean./(s1b_xy_mean.^2)).^2 + (s1a_xy_mean_err./s1b_xy_mean).^2); + + + %Plot s1a XY means + color_range_max=max(max(s1a_xy_mean)); + color_range_min=min(min(s1a_xy_mean(s1a_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1a_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1a_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %Plot s1a XY means + color_range_max=max(max(s1b_xy_mean)); + color_range_min=min(min(s1b_xy_mean(s1b_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1b_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1b_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1b Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1b Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %s1a/b XY Ratio + color_range_max=max(max(s1ab_xy_mean)); + color_range_min=min(min(s1ab_xy_mean(s1ab_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1ab_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a/b Ratio vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a/b Ratio','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + +% %% 3D Kr s1a/s1b map +% if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +% s1ab_xyz_numbins=floor((length(s1ab_z)/200)^(1/3)); %number of bins in one direction +% s1ab_xyz_zstep=det_edge/s1ab_xyz_numbins; +% s1ab_xyz_xstep=50/s1ab_xyz_numbins; +% s1ab_xyz_ystep=50/s1ab_xyz_numbins; +% s1ab_xyz_xmax=25; +% r_max=25; +% +% s1ab_xyz_zbins=10+s1ab_xyz_zstep/2:s1ab_xyz_zstep:10+s1ab_xyz_zstep/2+s1ab_xyz_zstep*s1ab_xyz_numbins; %20 us +% s1ab_xyz_xbins=(-r_max+s1ab_xyz_xstep/2):s1ab_xyz_xstep:r_max; +% s1ab_xyz_ybins=(-r_max+s1ab_xyz_ystep/2):s1ab_xyz_ystep:r_max; +% +% s1a_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +% s1a_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +% s1b_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +% s1b_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +% Kr_count_3D=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +% voxel_counter=1; +% +% for k = s1ab_xyz_zbins; %s1zbins are the center of the bin +% for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin +% for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin +% +% l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); +% m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); +% n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); +% +% %sort, and make the cut. using the variable q +% q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! +% %swap x,y due to matrix x-row, y-column definition +% kr_q=s2x(j-s1ab_xyz_xstep) & s2y(i-s1ab_xyz_ystep) & inrange(drift_time,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! +% +% %Count the number of events per bin +% Count_S1ab_3D(l,m,n)=length(s1a_phe_both(q)); +% Kr_count_3D(l,m,n)=length(s1_phe_both(kr_q)); +% +% if (Count_S1ab_3D(l,m,n) >= 100) % at least 100 counts before fitting. +% s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); +% s1a_xyz_mean(l,m,n)=s1a_z_fit.b1; +% s1a_xyz_mean_err(l,m,n)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); +% s1a_xyz_mean_vox{voxel_counter}=s1a_z_fit.b1; +% s1a_xyz_mean_err_vox{voxel_counter}=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); +% +% s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]) ),[0:2:300]).','gauss1'); +% s1b_xyz_mean(l,m,n)=s1b_z_fit.b1; +% s1b_xyz_mean_err(l,m,n)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); +% s1b_xyz_mean_vox{voxel_counter}=s1b_z_fit.b1; +% s1b_xyz_mean_err_vox{voxel_counter}=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); +% +% +% else %not enough stats to do the fit +% s1a_xyz_mean(l,m,n)=0; +% s1a_xyz_mean_err(l,m,n)=0; +% s1b_xyz_mean(l,m,n)=0; +% s1b_xyz_mean_err(l,m,n)=0; +% s1a_xyz_mean_vox{voxel_counter}=0; +% s1a_xyz_mean_err_vox{voxel_counter}=0; +% s1b_xyz_mean_vox{voxel_counter}=0; +% s1b_xyz_mean_err_vox{voxel_counter}=0; +% end +% +% voxel_counter=voxel_counter+1 +% end +% end +% k +% end +% +% s1ab_xyz_mean=s1a_xyz_mean./s1b_xyz_mean; +% s1ab_xyz_mean_err=sqrt( (s1b_xyz_mean_err.*s1a_xyz_mean./(s1b_xyz_mean.^2)).^2 + (s1a_xyz_mean_err./s1b_xyz_mean).^2); +% +% s1ab_xyz_mean_vox=s1a_xyz_mean_vox./s1b_xyz_mean_vox; +% s1ab_xyz_mean_err_vox=sqrt( (s1b_xyz_mean_err_vox.*s1a_xyz_mean_vox./(s1b_xyz_mean_vox.^2)).^2 + (s1a_xyz_mean_err_vox./s1b_xyz_mean_vox).^2); +% +% %Save ER Band fits +% save('Feb2015_S1aS1b_Vox','s1ab_xyz_mean_vox','s1ab_xyz_mean_err_vox','s1ab_xyz_mean','s1ab_xyz_xbins','s1ab_xyz_ybins','s1ab_xyz_zbins','s1ab_P','s1ab_z_means','s1ab_bincenters','Kr_count_3D','Kr_count_1D'); +% +% s1ab_xyz_xbins_old=s1ab_xyz_xbins; +% s1ab_xyz_ybins_old=s1ab_xyz_ybins; +% s1ab_xyz_zbins_old=s1ab_xyz_zbins; +% s1ab_bincenters_old=s1ab_bincenters; +% s1ab_xyz_zstep_old=s1ab_xyz_zstep; +% s1ab_xyz_xstep_old=s1ab_xyz_xstep; +% s1ab_xyz_ystep_old=s1ab_xyz_ystep; +% r_max_old=r_max; +% dT_step_old=dT_step; +% s1ab_z_cut_upper_old=s1ab_z_cut_upper; +% s1ab_z_old = s1ab_z; +% +% clearvars -except s1ab_z_old s1ab_xyz_xbins_old s1ab_xyz_ybins_old s1ab_xyz_zbins_old s1ab_bincenters_old s1ab_xyz_zstep_old s1ab_xyz_xstep_old s1ab_xyz_ystep_old r_max_old dT_step_old s1ab_z_cut_upper_old +% +% +% +% +% else + %Save ER Band fits + save('Feb2015_S1aS1b_Vox','s1ab_P','s1ab_z_means','s1ab_bincenters','Kr_count_1D'); + + dT_step_old=dT_step; + s1ab_z_cut_upper_old=s1ab_z_cut_upper; + s1ab_z_old = s1ab_z; + + clearvars -except s1ab_z_old s1ab_xyz_xbins_old s1ab_xyz_ybins_old s1ab_xyz_zbins_old s1ab_bincenters_old s1ab_xyz_zstep_old s1ab_xyz_xstep_old s1ab_xyz_ystep_old r_max_old dT_step_old s1ab_z_cut_upper_old + + +% end + + + +%% Make corrections with the chosen polynomial +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p22\KrypCal2p22_QualityChecks\ERBand_Prediction\MappingParametersStart_Feb2015') + +file_id_cp='Feb2015'; + +%% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % Removing field dependence from S1 and S2 + % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + %Hardcoded numbers from Energy Chi2 Fit + + + +s1ab_s2_xyz_fit_map.p1=-0.4988; +s1ab_s2_xyz_fit_map.p2=1.484; +c1=1-s1ab_s2_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s2_xyz_fit_map.p2; +s1ab_s2_xyz_fit_map.p3=c1; + +s1ab_s1_xyz_fit_map.p1=0.065; +s1ab_s1_xyz_fit_map.p2=0.02; +c2=1-s1ab_s1_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s1_xyz_fit_map.p2; +s1ab_s1_xyz_fit_map.p3=c2; + + + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else %Only do 1D in this case +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval); + + + + end + + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S1 Z-dependence (Both PMT arrays) +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + + light_correction_fig = figure; + errorbar(mean_index,means,means_error,'.k'); + hold on + [yplot_s1_both] = polyval(P_s1_both,dT_fit); + [center_s1_both, center_s1_both_err] = polyval(P_s1_both,z_center, S); %160[us]*1.51[\mus/us] + plot(dT_fit,yplot_s1_both,'-r','LineWidth',1); + xlabel('Depth (\mus)', 'FontSize',16); ylabel('Mean (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S1 Mean vs. Z'), 'FontSize', 16,'Interpreter','none'); + line([0 det_edge],[center_s1_both center_s1_both],'linestyle','--'); + line([z_center; z_center;],[min(means) max(means)],'linestyle','--'); + legend('S1\_both Mean', strcat('y=', num2str(P_s1_both(1),'%10.2e'), '*Z^2 + ', num2str(P_s1_both(2),'%10.2e')... + , '*Z + ', num2str(P_s1_both(3),4)),strcat('Det center = ',num2str(center_s1_both,4), ' [Phe]'),'location','northwest') + + box on; + myfigview(16); + xlim([0 det_edge]); + ylim([0.8*min(means) 1.15*max(means)]); + + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + + + + + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + + %%calculate S2/S1 also, just to double check the lifetime from S2 only + % hist_s2_both_s1(:,bin)= hist(s2_phe_both(time_cut)./s1_phe_both_z(time_cut),x3)'; + % temp_hist=hist_s2_both_s1(:,bin); + %Fit_s2_both_s1{bin}=fit(x3(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + % means_s2_s1(bin)=Fit_s2_both_s1{bin}.b1; + % means_error_s2_s1(bin) = Fit_s2_both_s1{bin}.c1/2/sqrt(sum(hist_s2_both_s1(:,bin))); % == sigma/sqrt(N); + % mean_index_s2_s1(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + + dT_range= inrange( mean_index,[5+bin_size,500] );%from 50 to 300us for the fit + + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + %%Tracker for pseudo-lifetime + s2_at_bottom_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_both=-320/log(s2_at_bottom_both/s2_at_top_both); + + dT_fit=0:1:det_edge; + + Fit_EL= fit(mean_index(dT_range),means(dT_range),'exp1'); + yfitEL = Fit_EL.a.*exp(Fit_EL.b.*dT_fit); + + e_lifetime_both=-1/Fit_EL.b; + s2_z0_both=Fit_EL.a; + + b=confint(Fit_EL, 0.683);%1 sigma matrix + sigma_e_lifetime_both=(1/b(1,2)-1/b(2,2))/2; + sigma_s2_z0_both=(b(2,1)-b(1,1))/2; + + lifetime_fig_both = figure; + errorbar(mean_index(2:end),means(2:end),means_error(2:end),'.k'); %first bin is anode, skip it + hold on + plot(dT_fit,yfitEL,'-r','LineWidth',1); + xlabel('Time (\mus)', 'FontSize',16); ylabel('Mean S2 (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S2_both Electron Lifetime'), 'FontSize', 16,'Interpreter','none'); + legend('S2\_both Mean', strcat( '\lambda= ', num2str(e_lifetime_both,4), ' \pm ', num2str(sigma_e_lifetime_both,2), ' \mus' )... + ,'location','northeast'); + myfigview(16); + xlim([0 det_edge]); + + + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_ybins),floor(s2_xbins)); +Sigma_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); +Count_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + +color_range_max=max(max(mean_S2_both_xy)); +color_range_min=min(min(mean_S2_both_xy(mean_S2_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + +s2_xy_both_fig = figure; +contourf(s2xbins,s2ybins,mean_S2_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. S2 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_ybins),floor(s1_xbins)); +Sigma_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); +Count_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +color_range_max=max(max(mean_S1_both_xy)); +color_range_min=min(min(mean_S1_both_xy(mean_S1_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + + +s1_xy_both_fig = figure; +contourf(s1xbins,s1ybins,mean_S1_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp,'. S1 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%% Apply corrections to CH3T and calculate the ER band + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\Run04_CH3T\KrypCal2p18_IQs\MakePlots\CH3T_Feb2015_Kr2p18.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +%% Make ER Band + +s1_min=0; +s1_max=50; + +%% First make plot of CH3T selection + +figure +plot(log10(s2_phe_both_xyz),log10(s1_phe_both_xyz),'.k') +hold on; +xlabel('log10(Corrected S2)'); ylabel ('log10(Corrected S1)'); myfigview(16) +x=[3.629:0.001:4.185]; +y=-0.7.*x+4.8; +plot(x,y,'-r','LineWidth',2); +x=[2.703:0.001:3.26]; +y=-0.7.*x+2; +plot(x,y,'-r','LineWidth',2); +x=[2.703:0.001:3.629]; +y=2.*x-5; +plot(x,y,'-r','LineWidth',2); +x=[3.26:0.001:4.185]; +y=2.*x-6.8; +plot(x,y,'-r','LineWidth',2); +title('Feb2015 CH3T'); + +%% First figure out where the outliers are in space + + +pulse_area_cut= (log10(s1_phe_both_xyz)+0.7*log10(s2_phe_both_xyz)<4.8) & (log10(s1_phe_both_xyz)+0.7*log10(s2_phe_both_xyz)>2.0) & ... + (log10(s1_phe_both_xyz)-2*log10(s2_phe_both_xyz)<-5) & (log10(s1_phe_both_xyz)-2*log10(s2_phe_both_xyz)>-6.8); + + +max_r=21; + + +%% Get ERBand In the Same Voxels - Zdep + +voxel_counter=1; +for z_max=10+dT_step_old:dT_step_old:s1ab_z_cut_upper_old + +fiducial_cut=inrange(s2radius_del,[0,21]) & inrange(drift_time,[z_max-dT_step_old z_max]); + +tritium_cut= clean_cut & pulse_area_cut & fiducial_cut; + + + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:.05:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=tritium_cut & inrange(s1_phe_both_xyz,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); + %ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + b=confint(ER_mean_power_fit,.68); + sigma_a_ER_mean=(b(2,1)-b(1,1))/2; + sigma_b_ER_mean=(b(2,2)-b(1,2))/2; + + ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + b=confint(ER_lower_power_fit,.68); + sigma_a_ER_lower=(b(2,1)-b(1,1))/2; + sigma_b_ER_lower=(b(2,2)-b(1,2))/2; + + ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + b=confint(ER_upper_power_fit,.68); + sigma_a_ER_upper=(b(2,1)-b(1,1))/2; + sigma_b_ER_upper=(b(2,2)-b(1,2))/2; + + + ER_lower_power_fit_vox{voxel_counter}=ER_lower_power_fit; + ER_upper_power_fit_vox{voxel_counter}=ER_upper_power_fit; + ER_mean_power_fit_vox{voxel_counter}=ER_mean_power_fit; + z_center_vox{voxel_counter}=z_max-dT_step_old/2; + + voxel_counter=voxel_counter+1; +end + + + save('Feb2015_ER_Vox','ER_lower_power_fit_vox','ER_upper_power_fit_vox','ER_mean_power_fit_vox','z_center_vox') + + +%% Get ERBand In the Same Voxels - 3D dep +% +% voxel_counter=1; +% if length(s1ab_z_old)>100000; %require 100,000 events to do 3D binning +% +% for k = s1ab_xyz_zbins; %s1zbins are the center of the bin +% for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep_old:r_max_old %map to rows going down (y_cm) -- s1x bins are the max edge of the bin +% for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep_old:r_max_old %map columns across (x_cm) -- s1y bins are the max edge of the bin +% +% fiducial_cut=inrange(drift_time,[40 300]) & ... +% s2x(j-s1ab_xyz_xstep_old) & s2y(i-s1ab_xyz_ystep_old) & inrange(drift_time,[(k-s1ab_xyz_zstep_old/2) , (k+s1ab_xyz_zstep_old/2)]) +% +% +% tritium_cut= clean_cut & pulse_area_cut & fiducial_cut; +% +% +% +% +% %% Make Band Plot +% band_sigma=1.28; %90% confidence bounds +% +% +% s2_s1_bin= 1:.05:5; +% ER_bin_size=2; %3 works +% index_i=1; +% ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; +% lower_bound=ones(size(ER_bins)); +% mean_ER_band=ones(size(ER_bins)); +% upper_bound=ones(size(ER_bins)); +% counts_ER_hist=ones(size(ER_bins)); +% ER_sigma=ones(size(ER_bins)); +% ER_sigma_sigma=ones(size(ER_bins)); +% +% % temporary, for calculating correct E-lifetime +% for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers +% +% +% ER_fit_cut=tritium_cut & inrange(s1_phe_both_xyz,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); +% +% ER_band_hist=hist(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); +% counts_ER_hist(index_i)=sum(ER_band_hist); +% +% Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); +% +% rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); +% +% %band=confint(Fit_ER,.1); +% %ER_sigma(index_i)= Fit_ER.c1/sqrt(2); +% ER_sigma(index_i)= sqrt(rms_fit.sig2); +% ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); +% +% lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; +% mean_ER_band(index_i)=Fit_ER.b1; +% upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; +% +% %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; +% +% index_i=index_i+1; +% end +% +% +% % Fit power law to the mean +% g=fittype('a*x^b'); +% ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); +% ER_mean_fit=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); +% b=confint(ER_mean_power_fit,.68); +% sigma_a_ER_mean=(b(2,1)-b(1,1))/2; +% sigma_b_ER_mean=(b(2,2)-b(1,2))/2; +% +% ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); +% ER_lower_fit=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); +% b=confint(ER_lower_power_fit,.68); +% sigma_a_ER_lower=(b(2,1)-b(1,1))/2; +% sigma_b_ER_lower=(b(2,2)-b(1,2))/2; +% +% ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); +% ER_upper_fit=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); +% b=confint(ER_upper_power_fit,.68); +% sigma_a_ER_upper=(b(2,1)-b(1,1))/2; +% sigma_b_ER_upper=(b(2,2)-b(1,2))/2; +% +% +% ER_lower_power_fit_3Dvox{voxel_counter}=ER_lower_power_fit; +% ER_upper_power_fit_3Dvox{voxel_counter}=ER_upper_power_fit; +% ER_mean_power_fit_3Dvox{voxel_counter}=ER_mean_power_fit; +% x_center_3Dvox{voxel_counter}=j-s1ab_xyz_xstep_old/2; +% y_center_3Dvox{voxel_counter}=i-s1ab_xyz_ystep_old/2; +% z_center_3Dvox{voxel_counter}=k; +% +% voxel_counter=voxel_counter+1; +% end +% end +% end +% +% save('Feb2015_ER_Vox','ER_lower_power_fit_vox','ER_upper_power_fit_vox','ER_mean_power_fit_vox','z_center_vox',... +% 'ER_lower_power_fit_3Dvox','ER_upper_power_fit_3Dvox','ER_mean_power_fit_3Dvox','x_center_3Dvox','y_center_3Dvox','z_center_3Dvox') +% +% +% end + diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictVoxelizedBands/SetUp_VoxPrediction_Feb2016.m b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictVoxelizedBands/SetUp_VoxPrediction_Feb2016.m new file mode 100644 index 0000000..3c95ac3 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictVoxelizedBands/SetUp_VoxPrediction_Feb2016.m @@ -0,0 +1,1349 @@ +%% Make corrections with the chosen polynomial +path='C:\Users\Richard\Desktop\LUX Analysis\lux10_20160208T0930_cp19837'; + + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm','x_cm_tmplt','y_cm_tmplt'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +delay_min=0; +file_id_cp='test'; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 70000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + + + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + + zcut_min = 10; %field changes at 4 uSec + zcut_max = 0.95*det_edge; + + + if Kr_events < 30000 %then create a 10x10 grid. Otherwise 25x25. Want about 30 evts per bin + + S1xybinsize = sqrt((50*50)/(Kr_events/150)); + S1_xbin_min = -25; + S1_xbin_max = 25; + S1_ybin_min = -25; + S1_ybin_max = 25; + SE_ybin_min = -25; + SE_ybin_max = 25; + + S2xybinsize = sqrt((50*50)/(Kr_events/150));%cm +% SExybinsize = 5; DEFINED LATER, based on number of SE events + S2_xbin_min = -25; + S2_xbin_max = 25; + S2_ybin_min = -25; + S2_ybin_max = 25; + SE_xbin_min = -25; + SE_xbin_max = 25; + + + end + + s1_xbins = (S1_xbin_max-S1_xbin_min)./S1xybinsize; + s1_ybins = (S1_ybin_max-S1_ybin_min)./S1xybinsize; + + s2_xbins = (S2_xbin_max-S2_xbin_min)./S2xybinsize; + s2_ybins = (S2_ybin_max-S2_ybin_min)./S2xybinsize; + + %% Kr S1a/S2b map + +%Set up cuts and variables + s1ab_cut=logical(sum(s1_single_cut(:,:),1)); + s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); + s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); + s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); + s1ab_x=d.x_cm(s2_single_cut); + s1ab_y=d.y_cm(s2_single_cut); + s1ab_z=d.z_drift_samples(s2_single_cut)/100; + s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); + s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<25; + %plotting x=s1a v y=s1a/s1b cuts: y<0.035x-1, y>-0.035.*x+5; y>0.01.*x; %y<4.2; x<255 +% s1ab_areacut= (s1a_phe_both./s1b_phe_both-0.035.*s1a_phe_both<-1) & (s1a_phe_both./s1b_phe_both+0.035.*s1a_phe_both>5)... +% & (s1a_phe_both./s1b_phe_both > 0.01.* s1a_phe_both) & (s1a_phe_both./s1b_phe_both<4.2) & (s1a_phe_both<255); + + s1ab_x=s1ab_x(s1ab_timing_cut); + s1ab_y=s1ab_y(s1ab_timing_cut); + s1ab_z=s1ab_z(s1ab_timing_cut); + s1a_phe_both=s1a_phe_both(s1ab_timing_cut); + s1b_phe_both=s1b_phe_both(s1ab_timing_cut); + s1ab_radius=s1ab_radius(s1ab_timing_cut); + + %fidicual Z cut for s1ab_xy measurement + [s1ab_z_hist s1ab_z_hist_bins]=hist(s1ab_z(inrange(s1ab_z,[0,400])),[0:1:400]); + frac_hist=cumsum(s1ab_z_hist)./sum(s1ab_z_hist); + s1ab_z_cut_lower= min(s1ab_z_hist_bins(frac_hist>.10)); + s1ab_z_cut_upper= max(s1ab_z_hist_bins(frac_hist<.90)); + s1ab_z_cut=inrange(s1ab_z,[s1ab_z_cut_lower,s1ab_z_cut_upper]); + + %R cut for s1ab_Z measurement + [upperz_r_hist upperz_r_hist_bins]=hist(s1ab_radius(s1ab_z>s1ab_z_cut_upper & s1ab_radius<=26),[0:1:26]); + [lowerz_r_hist lowerz_r_hist_bins]=hist(s1ab_radius(s1ab_z0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:400]).','gauss1'); + s1b_fit=fit([0:2:300].',hist(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:300]).','gauss1'); + s1a_z_means(i)=s1a_fit.b1; + s1a_z_means_err(i)=s1a_fit.c1/sqrt(2)/sqrt(length(s1a_phe_both(s1ab_r_cut.' & s1a_phe_both>0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1b_z_means(i)=s1b_fit.b1; + s1b_z_means_err(i)=s1b_fit.c1/sqrt(2)/sqrt(length(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1ab_bincenters(i)=z_max-dT_step/2; + Kr_count_1D(i)=length(s1_phe_both(inrange(drift_time,[z_max-dT_step,z_max]) & kr_r_cut)); + i=i+1; + end + +s1ab_z_means=s1a_z_means./s1b_z_means; +s1ab_z_means_err=sqrt( (s1b_z_means_err.*s1a_z_means./(s1b_z_means.^2)).^2 + (s1a_z_means_err./s1b_z_means).^2); + +%fit polynomial to s1az and s1bz, to remove z dependence later in xy fit +[s1a_P, s1a_S]=polyfit(s1ab_bincenters,s1a_z_means,3); +[s1b_P, s1b_S]=polyfit(s1ab_bincenters,s1b_z_means,3); +[s1ab_P, s1ab_S]=polyfit(s1ab_bincenters,s1ab_z_means,2); + +%S1a z dependence plot +s1az_plot=figure; +errorbar(s1ab_bincenters,s1a_z_means,s1a_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a Mean (phe)'); title('S1a Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1a_P,[10:1:320]),'-r','LineWidth',2) + +%S1b z dependence plot +s1bz_plot=figure; +errorbar(s1ab_bincenters,s1b_z_means,s1b_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1b Mean (phe)'); title('S1b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1b_P,[10:1:320]),'-r','LineWidth',2) + +%S1a/b z dependence plot +s1a_over_bz_plot=figure; +errorbar(s1ab_bincenters,s1ab_z_means,s1ab_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a/b'); title('S1 a/b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1ab_P,[10:1:320]),'-r','LineWidth',2) + + +%Correcting z dependence to get XY dependence in same manner that Kr/CH3T +%map does + s1a_phe_both_z=s1a_phe_both.'.*polyval(s1a_P,z_center)./polyval(s1a_P,s1ab_z); + s1b_phe_both_z=s1b_phe_both.'.*polyval(s1b_P,z_center)./polyval(s1b_P,s1ab_z); + + %% S1a/b XY map (after z correction) +s1ab_xbin_min=-25; +s1ab_ybin_min=-25; +s1ab_xbin_max=25; +s1ab_ybin_max=25; +s1ab_xybinsize=sqrt((50*50)/(length(s1ab_z)/300)); +clear s1a_xy_mean s1a_xy_mean_err s1b_xy_mean s1b_xy_mean_err + +s1ab_xbins=s1ab_xbin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_xbin_max; +s1ab_ybins=s1ab_ybin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_ybin_max; + +s1a_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); +s1b_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); + + for x_bin=s1ab_xbin_min:s1ab_xybinsize:(s1ab_xbin_max-s1ab_xybinsize/2); + for y_bin=s1ab_ybin_min:s1ab_xybinsize:(s1ab_ybin_max-s1ab_xybinsize/2); + x_min = x_bin; x_max = x_bin+s1ab_xybinsize; + y_min = y_bin; y_max = y_bin+s1ab_xybinsize; + + x_count=int32(1+x_bin/s1ab_xybinsize+s1ab_xbin_max/s1ab_xybinsize); + y_count=int32(1+y_bin/s1ab_xybinsize+s1ab_ybin_max/s1ab_xybinsize); + + bin_cut = s1ab_z_cut.' & inrange(s1ab_z,[10 330]).' & s1a_phe_both>0 & s1b_phe_both>0 & inrange(s1ab_x,[x_min,x_max]).' & inrange(s1ab_y,[y_min,y_max]).'; + if length(s1a_phe_both_z(bin_cut))>100; + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400])),[0:2:400]).','gauss1'); + s1a_xy_mean(y_count,x_count)=s1a_z_fit.b1; + s1a_xy_mean_err(y_count,x_count)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300])),[0:2:300]).','gauss1'); + s1b_xy_mean(y_count,x_count)=s1b_z_fit.b1; + s1b_xy_mean_err(y_count,x_count)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300]))); + else + s1a_xy_mean(y_count,x_count)=0; + s1a_xy_mean_err(y_count,x_count)=0; + s1b_xy_mean(y_count,x_count)=0; + s1b_xy_mean_err(y_count,x_count)=0; + end + + end + end + s1ab_xy_mean=s1a_xy_mean./s1b_xy_mean; + s1ab_xy_mean_err=sqrt( (s1b_xy_mean_err.*s1a_xy_mean./(s1b_xy_mean.^2)).^2 + (s1a_xy_mean_err./s1b_xy_mean).^2); + + + %Plot s1a XY means + color_range_max=max(max(s1a_xy_mean)); + color_range_min=min(min(s1a_xy_mean(s1a_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1a_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1a_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %Plot s1a XY means + color_range_max=max(max(s1b_xy_mean)); + color_range_min=min(min(s1b_xy_mean(s1b_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1b_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1b_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1b Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1b Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %s1a/b XY Ratio + color_range_max=max(max(s1ab_xy_mean)); + color_range_min=min(min(s1ab_xy_mean(s1ab_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1ab_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a/b Ratio vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a/b Ratio','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + +%% 3D Kr s1a/s1b map +if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +s1ab_xyz_numbins=floor((length(s1ab_z)/200)^(1/3)); %number of bins in one direction +s1ab_xyz_zstep=det_edge/s1ab_xyz_numbins; +s1ab_xyz_xstep=50/s1ab_xyz_numbins; +s1ab_xyz_ystep=50/s1ab_xyz_numbins; +s1ab_xyz_xmax=25; +r_max=25; + +s1ab_xyz_zbins=10+s1ab_xyz_zstep/2:s1ab_xyz_zstep:10+s1ab_xyz_zstep/2+s1ab_xyz_zstep*s1ab_xyz_numbins; %20 us +s1ab_xyz_xbins=(-r_max+s1ab_xyz_xstep/2):s1ab_xyz_xstep:r_max; +s1ab_xyz_ybins=(-r_max+s1ab_xyz_ystep/2):s1ab_xyz_ystep:r_max; + +s1a_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +Kr_count_3D=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + kr_q=s2x(j-s1ab_xyz_xstep) & s2y(i-s1ab_xyz_ystep) & inrange(drift_time,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + + %Count the number of events per bin + Count_S1ab_3D(l,m,n)=length(s1a_phe_both(q)); + Kr_count_3D(l,m,n)=length(s1_phe_both(kr_q)); + + if (Count_S1ab_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_xyz_mean(l,m,n)=s1a_z_fit.b1; + s1a_xyz_mean_err(l,m,n)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); + s1a_xyz_mean_vox{voxel_counter}=s1a_z_fit.b1; + s1a_xyz_mean_err_vox{voxel_counter}=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]) ),[0:2:300]).','gauss1'); + s1b_xyz_mean(l,m,n)=s1b_z_fit.b1; + s1b_xyz_mean_err(l,m,n)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); + s1b_xyz_mean_vox{voxel_counter}=s1b_z_fit.b1; + s1b_xyz_mean_err_vox{voxel_counter}=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); + + + else %not enough stats to do the fit + s1a_xyz_mean(l,m,n)=0; + s1a_xyz_mean_err(l,m,n)=0; + s1b_xyz_mean(l,m,n)=0; + s1b_xyz_mean_err(l,m,n)=0; + s1a_xyz_mean_vox{voxel_counter}=0; + s1a_xyz_mean_err_vox{voxel_counter}=0; + s1b_xyz_mean_vox{voxel_counter}=0; + s1b_xyz_mean_err_vox{voxel_counter}=0; + end + + end + end +k +end + + s1ab_xyz_mean=s1a_xyz_mean./s1b_xyz_mean; + s1ab_xyz_mean_err=sqrt( (s1b_xyz_mean_err.*s1a_xyz_mean./(s1b_xyz_mean.^2)).^2 + (s1a_xyz_mean_err./s1b_xyz_mean).^2); + + s1ab_xyz_mean_vox=s1a_xyz_mean_vox./s1b_xyz_mean_vox; + s1ab_xyz_mean_err_vox=sqrt( (s1b_xyz_mean_err_vox.*s1a_xyz_mean_vox./(s1b_xyz_mean_vox.^2)).^2 + (s1a_xyz_mean_err_vox./s1b_xyz_mean_vox).^2); + + %Save ER Band fits + save('Feb2016_S1aS1b_Vox','s1ab_xyz_mean_vox','s1ab_xyz_mean_err_vox','s1ab_xyz_mean','s1ab_xyz_xbins','s1ab_xyz_ybins','s1ab_xyz_zbins','s1ab_P','s1ab_z_means','s1ab_bincenters','Kr_count_3D','Kr_count_1D'); + + s1ab_xyz_xbins_old=s1ab_xyz_xbins; + s1ab_xyz_ybins_old=s1ab_xyz_ybins; + s1ab_xyz_zbins_old=s1ab_xyz_zbins; + s1ab_bincenters_old=s1ab_bincenters; + s1ab_xyz_zstep_old=s1ab_xyz_zstep; + s1ab_xyz_xstep_old=s1ab_xyz_xstep; + s1ab_xyz_ystep_old=s1ab_xyz_ystep; + r_max_old=r_max; + dT_step_old=dT_step; + s1ab_z_cut_upper_old=s1ab_z_cut_upper; + s1ab_z_old = s1ab_z; + + clearvars -except s1ab_z_old s1ab_xyz_xbins_old s1ab_xyz_ybins_old s1ab_xyz_zbins_old s1ab_bincenters_old s1ab_xyz_zstep_old s1ab_xyz_xstep_old s1ab_xyz_ystep_old r_max_old dT_step_old s1ab_z_cut_upper_old + + + + +else + %Save ER Band fits + save('Feb2016_S1aS1b_Vox','s1ab_P','s1ab_z_means','s1ab_bincenters','Kr_count_1D'); + + dT_step_old=dT_step; + s1ab_z_cut_upper_old=s1ab_z_cut_upper; + s1ab_z_old = s1ab_z; + + clearvars -except s1ab_z_old s1ab_xyz_xbins_old s1ab_xyz_ybins_old s1ab_xyz_zbins_old s1ab_bincenters_old s1ab_xyz_zstep_old s1ab_xyz_xstep_old s1ab_xyz_ystep_old r_max_old dT_step_old s1ab_z_cut_upper_old + + +end + + + +%% Make corrections with the chosen polynomial +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p22\KrypCal2p22_QualityChecks\ERBand_Prediction\MappingParametersStart_Feb2016') + +file_id_cp='Feb2016'; + +%% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % Removing field dependence from S1 and S2 + % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + %Hardcoded numbers from Energy Chi2 Fit + + + +s1ab_s2_xyz_fit_map.p1=-0.4988; +s1ab_s2_xyz_fit_map.p2=1.484; +c1=1-s1ab_s2_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s2_xyz_fit_map.p2; +s1ab_s2_xyz_fit_map.p3=c1; + +s1ab_s1_xyz_fit_map.p1=0.065; +s1ab_s1_xyz_fit_map.p2=0.02; +c2=1-s1ab_s1_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s1_xyz_fit_map.p2; +s1ab_s1_xyz_fit_map.p3=c2; + + + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else %Only do 1D in this case +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval); + + + + end + + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S1 Z-dependence (Both PMT arrays) +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + + light_correction_fig = figure; + errorbar(mean_index,means,means_error,'.k'); + hold on + [yplot_s1_both] = polyval(P_s1_both,dT_fit); + [center_s1_both, center_s1_both_err] = polyval(P_s1_both,z_center, S); %160[us]*1.51[\mus/us] + plot(dT_fit,yplot_s1_both,'-r','LineWidth',1); + xlabel('Depth (\mus)', 'FontSize',16); ylabel('Mean (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S1 Mean vs. Z'), 'FontSize', 16,'Interpreter','none'); + line([0 det_edge],[center_s1_both center_s1_both],'linestyle','--'); + line([z_center; z_center;],[min(means) max(means)],'linestyle','--'); + legend('S1\_both Mean', strcat('y=', num2str(P_s1_both(1),'%10.2e'), '*Z^2 + ', num2str(P_s1_both(2),'%10.2e')... + , '*Z + ', num2str(P_s1_both(3),4)),strcat('Det center = ',num2str(center_s1_both,4), ' [Phe]'),'location','northwest') + + box on; + myfigview(16); + xlim([0 det_edge]); + ylim([0.8*min(means) 1.15*max(means)]); + + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + + + + + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + + %%calculate S2/S1 also, just to double check the lifetime from S2 only + % hist_s2_both_s1(:,bin)= hist(s2_phe_both(time_cut)./s1_phe_both_z(time_cut),x3)'; + % temp_hist=hist_s2_both_s1(:,bin); + %Fit_s2_both_s1{bin}=fit(x3(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + % means_s2_s1(bin)=Fit_s2_both_s1{bin}.b1; + % means_error_s2_s1(bin) = Fit_s2_both_s1{bin}.c1/2/sqrt(sum(hist_s2_both_s1(:,bin))); % == sigma/sqrt(N); + % mean_index_s2_s1(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + + dT_range= inrange( mean_index,[5+bin_size,500] );%from 50 to 300us for the fit + + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + %%Tracker for pseudo-lifetime + s2_at_bottom_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_both=-320/log(s2_at_bottom_both/s2_at_top_both); + + dT_fit=0:1:det_edge; + + Fit_EL= fit(mean_index(dT_range),means(dT_range),'exp1'); + yfitEL = Fit_EL.a.*exp(Fit_EL.b.*dT_fit); + + e_lifetime_both=-1/Fit_EL.b; + s2_z0_both=Fit_EL.a; + + b=confint(Fit_EL, 0.683);%1 sigma matrix + sigma_e_lifetime_both=(1/b(1,2)-1/b(2,2))/2; + sigma_s2_z0_both=(b(2,1)-b(1,1))/2; + + lifetime_fig_both = figure; + errorbar(mean_index(2:end),means(2:end),means_error(2:end),'.k'); %first bin is anode, skip it + hold on + plot(dT_fit,yfitEL,'-r','LineWidth',1); + xlabel('Time (\mus)', 'FontSize',16); ylabel('Mean S2 (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S2_both Electron Lifetime'), 'FontSize', 16,'Interpreter','none'); + legend('S2\_both Mean', strcat( '\lambda= ', num2str(e_lifetime_both,4), ' \pm ', num2str(sigma_e_lifetime_both,2), ' \mus' )... + ,'location','northeast'); + myfigview(16); + xlim([0 det_edge]); + + + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_ybins),floor(s2_xbins)); +Sigma_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); +Count_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + +color_range_max=max(max(mean_S2_both_xy)); +color_range_min=min(min(mean_S2_both_xy(mean_S2_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + +s2_xy_both_fig = figure; +contourf(s2xbins,s2ybins,mean_S2_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. S2 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_ybins),floor(s1_xbins)); +Sigma_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); +Count_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +color_range_max=max(max(mean_S1_both_xy)); +color_range_min=min(min(mean_S1_both_xy(mean_S1_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + + +s1_xy_both_fig = figure; +contourf(s1xbins,s1ybins,mean_S1_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp,'. S1 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%% Apply corrections to CH3T and calculate the ER band + +load('C:\Program Files\MATLAB\R2012a\bin\CH3T_Feb2016_Kr2p18.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +%% Make ER Band + +s1_min=0; +s1_max=50; + +%% First make plot of CH3T selection + +figure +plot(log10(s2_phe_both_xyz),log10(s1_phe_both_xyz),'.k') +hold on; +xlabel('log10(Corrected S2)'); ylabel ('log10(Corrected S1)'); myfigview(16) +x=[3.629:0.001:4.185]; +y=-0.7.*x+4.8; +plot(x,y,'-r','LineWidth',2); +x=[2.703:0.001:3.26]; +y=-0.7.*x+2; +plot(x,y,'-r','LineWidth',2); +x=[2.703:0.001:3.629]; +y=2.*x-5; +plot(x,y,'-r','LineWidth',2); +x=[3.26:0.001:4.185]; +y=2.*x-6.8; +plot(x,y,'-r','LineWidth',2); +title('Feb2015 CH3T'); + +%% First figure out where the outliers are in space + + +pulse_area_cut= (log10(s1_phe_both_xyz)+0.7*log10(s2_phe_both_xyz)<4.8) & (log10(s1_phe_both_xyz)+0.7*log10(s2_phe_both_xyz)>2.0) & ... + (log10(s1_phe_both_xyz)-2*log10(s2_phe_both_xyz)<-5) & (log10(s1_phe_both_xyz)-2*log10(s2_phe_both_xyz)>-6.8); + + +max_r=21; + + +%% Get ERBand In the Same Voxels - Zdep + +voxel_counter=1; +for z_max=10+dT_step_old:dT_step_old:s1ab_z_cut_upper_old + +fiducial_cut=inrange(s2radius_del,[0,21]) & inrange(drift_time,[z_max-dT_step_old z_max]); + +tritium_cut= clean_cut & pulse_area_cut & fiducial_cut; + + + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:.05:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=tritium_cut & inrange(s1_phe_both_xyz,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); + %ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + b=confint(ER_mean_power_fit,.68); + sigma_a_ER_mean=(b(2,1)-b(1,1))/2; + sigma_b_ER_mean=(b(2,2)-b(1,2))/2; + + ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + b=confint(ER_lower_power_fit,.68); + sigma_a_ER_lower=(b(2,1)-b(1,1))/2; + sigma_b_ER_lower=(b(2,2)-b(1,2))/2; + + ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + b=confint(ER_upper_power_fit,.68); + sigma_a_ER_upper=(b(2,1)-b(1,1))/2; + sigma_b_ER_upper=(b(2,2)-b(1,2))/2; + + + ER_lower_power_fit_vox{voxel_counter}=ER_lower_power_fit; + ER_upper_power_fit_vox{voxel_counter}=ER_upper_power_fit; + ER_mean_power_fit_vox{voxel_counter}=ER_mean_power_fit; + z_center_vox{voxel_counter}=z_max-dT_step_old/2; + + voxel_counter=voxel_counter+1; +end + + + save('Feb2016_ER_Vox','ER_lower_power_fit_vox','ER_upper_power_fit_vox','ER_mean_power_fit_vox','z_center_vox') + + +%% Get ERBand In the Same Voxels - 3D dep + +voxel_counter=1; +if length(s1ab_z_old)>100000; %require 100,000 events to do 3D binning + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep_old:r_max_old %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep_old:r_max_old %map columns across (x_cm) -- s1y bins are the max edge of the bin + +fiducial_cut=inrange(drift_time,[40 300]) & ... + s2x(j-s1ab_xyz_xstep_old) & s2y(i-s1ab_xyz_ystep_old) & inrange(drift_time,[(k-s1ab_xyz_zstep_old/2) , (k+s1ab_xyz_zstep_old/2)]) + + +tritium_cut= clean_cut & pulse_area_cut & fiducial_cut; + + + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:.05:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=tritium_cut & inrange(s1_phe_both_xyz,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); + %ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + b=confint(ER_mean_power_fit,.68); + sigma_a_ER_mean=(b(2,1)-b(1,1))/2; + sigma_b_ER_mean=(b(2,2)-b(1,2))/2; + + ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + b=confint(ER_lower_power_fit,.68); + sigma_a_ER_lower=(b(2,1)-b(1,1))/2; + sigma_b_ER_lower=(b(2,2)-b(1,2))/2; + + ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + b=confint(ER_upper_power_fit,.68); + sigma_a_ER_upper=(b(2,1)-b(1,1))/2; + sigma_b_ER_upper=(b(2,2)-b(1,2))/2; + + + ER_lower_power_fit_3Dvox{voxel_counter}=ER_lower_power_fit; + ER_upper_power_fit_3Dvox{voxel_counter}=ER_upper_power_fit; + ER_mean_power_fit_3Dvox{voxel_counter}=ER_mean_power_fit; + x_center_3Dvox{voxel_counter}=j-s1ab_xyz_xstep_old/2; + y_center_3Dvox{voxel_counter}=i-s1ab_xyz_ystep_old/2; + z_center_3Dvox{voxel_counter}=k; + + voxel_counter=voxel_counter+1; + end + end +end + + save('Feb2016_ER_Vox','ER_lower_power_fit_vox','ER_upper_power_fit_vox','ER_mean_power_fit_vox','z_center_vox',... + 'ER_lower_power_fit_3Dvox','ER_upper_power_fit_3Dvox','ER_mean_power_fit_3Dvox','x_center_3Dvox','y_center_3Dvox','z_center_3Dvox') + + +end + diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictVoxelizedBands/SetUp_VoxPrediction_Sep2015.m b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictVoxelizedBands/SetUp_VoxPrediction_Sep2015.m new file mode 100644 index 0000000..727cb42 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/PredictVoxelizedBands/SetUp_VoxPrediction_Sep2015.m @@ -0,0 +1,1347 @@ +%% Make corrections with the chosen polynomial +path='C:\Users\Richard\Desktop\LUX Analysis\lux10_20150929T1905_cp18197'; + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm','x_cm_tmplt','y_cm_tmplt'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +delay_min=0; +file_id_cp='test'; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 70000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + + + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + + zcut_min = 10; %field changes at 4 uSec + zcut_max = 0.95*det_edge; + + + if Kr_events < 30000 %then create a 10x10 grid. Otherwise 25x25. Want about 30 evts per bin + + S1xybinsize = sqrt((50*50)/(Kr_events/150)); + S1_xbin_min = -25; + S1_xbin_max = 25; + S1_ybin_min = -25; + S1_ybin_max = 25; + SE_ybin_min = -25; + SE_ybin_max = 25; + + S2xybinsize = sqrt((50*50)/(Kr_events/150));%cm +% SExybinsize = 5; DEFINED LATER, based on number of SE events + S2_xbin_min = -25; + S2_xbin_max = 25; + S2_ybin_min = -25; + S2_ybin_max = 25; + SE_xbin_min = -25; + SE_xbin_max = 25; + + + end + + s1_xbins = (S1_xbin_max-S1_xbin_min)./S1xybinsize; + s1_ybins = (S1_ybin_max-S1_ybin_min)./S1xybinsize; + + s2_xbins = (S2_xbin_max-S2_xbin_min)./S2xybinsize; + s2_ybins = (S2_ybin_max-S2_ybin_min)./S2xybinsize; + + %% Kr S1a/S2b map + +%Set up cuts and variables + s1ab_cut=logical(sum(s1_single_cut(:,:),1)); + s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); + s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); + s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); + s1ab_x=d.x_cm(s2_single_cut); + s1ab_y=d.y_cm(s2_single_cut); + s1ab_z=d.z_drift_samples(s2_single_cut)/100; + s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); + s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<25; + %plotting x=s1a v y=s1a/s1b cuts: y<0.035x-1, y>-0.035.*x+5; y>0.01.*x; %y<4.2; x<255 +% s1ab_areacut= (s1a_phe_both./s1b_phe_both-0.035.*s1a_phe_both<-1) & (s1a_phe_both./s1b_phe_both+0.035.*s1a_phe_both>5)... +% & (s1a_phe_both./s1b_phe_both > 0.01.* s1a_phe_both) & (s1a_phe_both./s1b_phe_both<4.2) & (s1a_phe_both<255); + + s1ab_x=s1ab_x(s1ab_timing_cut); + s1ab_y=s1ab_y(s1ab_timing_cut); + s1ab_z=s1ab_z(s1ab_timing_cut); + s1a_phe_both=s1a_phe_both(s1ab_timing_cut); + s1b_phe_both=s1b_phe_both(s1ab_timing_cut); + s1ab_radius=s1ab_radius(s1ab_timing_cut); + + %fidicual Z cut for s1ab_xy measurement + [s1ab_z_hist s1ab_z_hist_bins]=hist(s1ab_z(inrange(s1ab_z,[0,400])),[0:1:400]); + frac_hist=cumsum(s1ab_z_hist)./sum(s1ab_z_hist); + s1ab_z_cut_lower= min(s1ab_z_hist_bins(frac_hist>.10)); + s1ab_z_cut_upper= max(s1ab_z_hist_bins(frac_hist<.90)); + s1ab_z_cut=inrange(s1ab_z,[s1ab_z_cut_lower,s1ab_z_cut_upper]); + + %R cut for s1ab_Z measurement + [upperz_r_hist upperz_r_hist_bins]=hist(s1ab_radius(s1ab_z>s1ab_z_cut_upper & s1ab_radius<=26),[0:1:26]); + [lowerz_r_hist lowerz_r_hist_bins]=hist(s1ab_radius(s1ab_z0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:400]).','gauss1'); + s1b_fit=fit([0:2:300].',hist(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:300]).','gauss1'); + s1a_z_means(i)=s1a_fit.b1; + s1a_z_means_err(i)=s1a_fit.c1/sqrt(2)/sqrt(length(s1a_phe_both(s1ab_r_cut.' & s1a_phe_both>0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1b_z_means(i)=s1b_fit.b1; + s1b_z_means_err(i)=s1b_fit.c1/sqrt(2)/sqrt(length(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1ab_bincenters(i)=z_max-dT_step/2; + Kr_count_1D(i)=length(s1_phe_both(inrange(drift_time,[z_max-dT_step,z_max]) & kr_r_cut)); + i=i+1; + end + +s1ab_z_means=s1a_z_means./s1b_z_means; +s1ab_z_means_err=sqrt( (s1b_z_means_err.*s1a_z_means./(s1b_z_means.^2)).^2 + (s1a_z_means_err./s1b_z_means).^2); + +%fit polynomial to s1az and s1bz, to remove z dependence later in xy fit +[s1a_P, s1a_S]=polyfit(s1ab_bincenters,s1a_z_means,3); +[s1b_P, s1b_S]=polyfit(s1ab_bincenters,s1b_z_means,3); +[s1ab_P, s1ab_S]=polyfit(s1ab_bincenters,s1ab_z_means,2); + +%S1a z dependence plot +s1az_plot=figure; +errorbar(s1ab_bincenters,s1a_z_means,s1a_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a Mean (phe)'); title('S1a Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1a_P,[10:1:320]),'-r','LineWidth',2) + +%S1b z dependence plot +s1bz_plot=figure; +errorbar(s1ab_bincenters,s1b_z_means,s1b_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1b Mean (phe)'); title('S1b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1b_P,[10:1:320]),'-r','LineWidth',2) + +%S1a/b z dependence plot +s1a_over_bz_plot=figure; +errorbar(s1ab_bincenters,s1ab_z_means,s1ab_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a/b'); title('S1 a/b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1ab_P,[10:1:320]),'-r','LineWidth',2) + + +%Correcting z dependence to get XY dependence in same manner that Kr/CH3T +%map does + s1a_phe_both_z=s1a_phe_both.'.*polyval(s1a_P,z_center)./polyval(s1a_P,s1ab_z); + s1b_phe_both_z=s1b_phe_both.'.*polyval(s1b_P,z_center)./polyval(s1b_P,s1ab_z); + + %% S1a/b XY map (after z correction) +s1ab_xbin_min=-25; +s1ab_ybin_min=-25; +s1ab_xbin_max=25; +s1ab_ybin_max=25; +s1ab_xybinsize=sqrt((50*50)/(length(s1ab_z)/300)); +clear s1a_xy_mean s1a_xy_mean_err s1b_xy_mean s1b_xy_mean_err + +s1ab_xbins=s1ab_xbin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_xbin_max; +s1ab_ybins=s1ab_ybin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_ybin_max; + +s1a_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); +s1b_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); + + for x_bin=s1ab_xbin_min:s1ab_xybinsize:(s1ab_xbin_max-s1ab_xybinsize/2); + for y_bin=s1ab_ybin_min:s1ab_xybinsize:(s1ab_ybin_max-s1ab_xybinsize/2); + x_min = x_bin; x_max = x_bin+s1ab_xybinsize; + y_min = y_bin; y_max = y_bin+s1ab_xybinsize; + + x_count=int32(1+x_bin/s1ab_xybinsize+s1ab_xbin_max/s1ab_xybinsize); + y_count=int32(1+y_bin/s1ab_xybinsize+s1ab_ybin_max/s1ab_xybinsize); + + bin_cut = s1ab_z_cut.' & inrange(s1ab_z,[10 330]).' & s1a_phe_both>0 & s1b_phe_both>0 & inrange(s1ab_x,[x_min,x_max]).' & inrange(s1ab_y,[y_min,y_max]).'; + if length(s1a_phe_both_z(bin_cut))>100; + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400])),[0:2:400]).','gauss1'); + s1a_xy_mean(y_count,x_count)=s1a_z_fit.b1; + s1a_xy_mean_err(y_count,x_count)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300])),[0:2:300]).','gauss1'); + s1b_xy_mean(y_count,x_count)=s1b_z_fit.b1; + s1b_xy_mean_err(y_count,x_count)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300]))); + else + s1a_xy_mean(y_count,x_count)=0; + s1a_xy_mean_err(y_count,x_count)=0; + s1b_xy_mean(y_count,x_count)=0; + s1b_xy_mean_err(y_count,x_count)=0; + end + + end + end + s1ab_xy_mean=s1a_xy_mean./s1b_xy_mean; + s1ab_xy_mean_err=sqrt( (s1b_xy_mean_err.*s1a_xy_mean./(s1b_xy_mean.^2)).^2 + (s1a_xy_mean_err./s1b_xy_mean).^2); + + + %Plot s1a XY means + color_range_max=max(max(s1a_xy_mean)); + color_range_min=min(min(s1a_xy_mean(s1a_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1a_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1a_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %Plot s1a XY means + color_range_max=max(max(s1b_xy_mean)); + color_range_min=min(min(s1b_xy_mean(s1b_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1b_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1b_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1b Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1b Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %s1a/b XY Ratio + color_range_max=max(max(s1ab_xy_mean)); + color_range_min=min(min(s1ab_xy_mean(s1ab_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1ab_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a/b Ratio vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a/b Ratio','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + +%% 3D Kr s1a/s1b map +if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +s1ab_xyz_numbins=floor((length(s1ab_z)/200)^(1/3)); %number of bins in one direction +s1ab_xyz_zstep=det_edge/s1ab_xyz_numbins; +s1ab_xyz_xstep=50/s1ab_xyz_numbins; +s1ab_xyz_ystep=50/s1ab_xyz_numbins; +s1ab_xyz_xmax=25; +r_max=25; + +s1ab_xyz_zbins=10+s1ab_xyz_zstep/2:s1ab_xyz_zstep:10+s1ab_xyz_zstep/2+s1ab_xyz_zstep*s1ab_xyz_numbins; %20 us +s1ab_xyz_xbins=(-r_max+s1ab_xyz_xstep/2):s1ab_xyz_xstep:r_max; +s1ab_xyz_ybins=(-r_max+s1ab_xyz_ystep/2):s1ab_xyz_ystep:r_max; + +s1a_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +Kr_count_3D=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + kr_q=s2x(j-s1ab_xyz_xstep) & s2y(i-s1ab_xyz_ystep) & inrange(drift_time,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + + %Count the number of events per bin + Count_S1ab_3D(l,m,n)=length(s1a_phe_both(q)); + Kr_count_3D(l,m,n)=length(s1_phe_both(kr_q)); + + if (Count_S1ab_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_xyz_mean(l,m,n)=s1a_z_fit.b1; + s1a_xyz_mean_err(l,m,n)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); + s1a_xyz_mean_vox{voxel_counter}=s1a_z_fit.b1; + s1a_xyz_mean_err_vox{voxel_counter}=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]) ),[0:2:300]).','gauss1'); + s1b_xyz_mean(l,m,n)=s1b_z_fit.b1; + s1b_xyz_mean_err(l,m,n)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); + s1b_xyz_mean_vox{voxel_counter}=s1b_z_fit.b1; + s1b_xyz_mean_err_vox{voxel_counter}=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); + + + else %not enough stats to do the fit + s1a_xyz_mean(l,m,n)=0; + s1a_xyz_mean_err(l,m,n)=0; + s1b_xyz_mean(l,m,n)=0; + s1b_xyz_mean_err(l,m,n)=0; + s1a_xyz_mean_vox{voxel_counter}=0; + s1a_xyz_mean_err_vox{voxel_counter}=0; + s1b_xyz_mean_vox{voxel_counter}=0; + s1b_xyz_mean_err_vox{voxel_counter}=0; + end + + end + end +k +end + + s1ab_xyz_mean=s1a_xyz_mean./s1b_xyz_mean; + s1ab_xyz_mean_err=sqrt( (s1b_xyz_mean_err.*s1a_xyz_mean./(s1b_xyz_mean.^2)).^2 + (s1a_xyz_mean_err./s1b_xyz_mean).^2); + + s1ab_xyz_mean_vox=s1a_xyz_mean_vox./s1b_xyz_mean_vox; + s1ab_xyz_mean_err_vox=sqrt( (s1b_xyz_mean_err_vox.*s1a_xyz_mean_vox./(s1b_xyz_mean_vox.^2)).^2 + (s1a_xyz_mean_err_vox./s1b_xyz_mean_vox).^2); + + %Save ER Band fits + save('Sep2015_S1aS1b_Vox','s1ab_xyz_mean_vox','s1ab_xyz_mean_err_vox','s1ab_xyz_mean','s1ab_xyz_xbins','s1ab_xyz_ybins','s1ab_xyz_zbins','s1ab_P','s1ab_z_means','s1ab_bincenters','Kr_count_3D','Kr_count_1D'); + + s1ab_xyz_xbins_old=s1ab_xyz_xbins; + s1ab_xyz_ybins_old=s1ab_xyz_ybins; + s1ab_xyz_zbins_old=s1ab_xyz_zbins; + s1ab_bincenters_old=s1ab_bincenters; + s1ab_xyz_zstep_old=s1ab_xyz_zstep; + s1ab_xyz_xstep_old=s1ab_xyz_xstep; + s1ab_xyz_ystep_old=s1ab_xyz_ystep; + r_max_old=r_max; + dT_step_old=dT_step; + s1ab_z_cut_upper_old=s1ab_z_cut_upper; + s1ab_z_old = s1ab_z; + + clearvars -except s1ab_z_old s1ab_xyz_xbins_old s1ab_xyz_ybins_old s1ab_xyz_zbins_old s1ab_bincenters_old s1ab_xyz_zstep_old s1ab_xyz_xstep_old s1ab_xyz_ystep_old r_max_old dT_step_old s1ab_z_cut_upper_old + + + + +else + %Save ER Band fits + save('Sep2015_S1aS1b_Vox','s1ab_P','s1ab_z_means','s1ab_bincenters','Kr_count_1D'); + + dT_step_old=dT_step; + s1ab_z_cut_upper_old=s1ab_z_cut_upper; + s1ab_z_old = s1ab_z; + + clearvars -except s1ab_z_old s1ab_xyz_xbins_old s1ab_xyz_ybins_old s1ab_xyz_zbins_old s1ab_bincenters_old s1ab_xyz_zstep_old s1ab_xyz_xstep_old s1ab_xyz_ystep_old r_max_old dT_step_old s1ab_z_cut_upper_old + + +end + + + +%% Make corrections with the chosen polynomial +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p22\KrypCal2p22_QualityChecks\ERBand_Prediction\MappingParametersStart_Sep2015') + +file_id_cp='Sep2015'; + +%% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % Removing field dependence from S1 and S2 + % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + %Hardcoded numbers from Energy Chi2 Fit + + + +s1ab_s2_xyz_fit_map.p1=-0.4988; +s1ab_s2_xyz_fit_map.p2=1.484; +c1=1-s1ab_s2_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s2_xyz_fit_map.p2; +s1ab_s2_xyz_fit_map.p3=c1; + +s1ab_s1_xyz_fit_map.p1=0.065; +s1ab_s1_xyz_fit_map.p2=0.02; +c2=1-s1ab_s1_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s1_xyz_fit_map.p2; +s1ab_s1_xyz_fit_map.p3=c2; + + + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else %Only do 1D in this case +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval); + + + + end + + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S1 Z-dependence (Both PMT arrays) +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + + light_correction_fig = figure; + errorbar(mean_index,means,means_error,'.k'); + hold on + [yplot_s1_both] = polyval(P_s1_both,dT_fit); + [center_s1_both, center_s1_both_err] = polyval(P_s1_both,z_center, S); %160[us]*1.51[\mus/us] + plot(dT_fit,yplot_s1_both,'-r','LineWidth',1); + xlabel('Depth (\mus)', 'FontSize',16); ylabel('Mean (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S1 Mean vs. Z'), 'FontSize', 16,'Interpreter','none'); + line([0 det_edge],[center_s1_both center_s1_both],'linestyle','--'); + line([z_center; z_center;],[min(means) max(means)],'linestyle','--'); + legend('S1\_both Mean', strcat('y=', num2str(P_s1_both(1),'%10.2e'), '*Z^2 + ', num2str(P_s1_both(2),'%10.2e')... + , '*Z + ', num2str(P_s1_both(3),4)),strcat('Det center = ',num2str(center_s1_both,4), ' [Phe]'),'location','northwest') + + box on; + myfigview(16); + xlim([0 det_edge]); + ylim([0.8*min(means) 1.15*max(means)]); + + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + + + + + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + + %%calculate S2/S1 also, just to double check the lifetime from S2 only + % hist_s2_both_s1(:,bin)= hist(s2_phe_both(time_cut)./s1_phe_both_z(time_cut),x3)'; + % temp_hist=hist_s2_both_s1(:,bin); + %Fit_s2_both_s1{bin}=fit(x3(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + % means_s2_s1(bin)=Fit_s2_both_s1{bin}.b1; + % means_error_s2_s1(bin) = Fit_s2_both_s1{bin}.c1/2/sqrt(sum(hist_s2_both_s1(:,bin))); % == sigma/sqrt(N); + % mean_index_s2_s1(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + + dT_range= inrange( mean_index,[5+bin_size,500] );%from 50 to 300us for the fit + + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + %%Tracker for pseudo-lifetime + s2_at_bottom_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_both=-320/log(s2_at_bottom_both/s2_at_top_both); + + dT_fit=0:1:det_edge; + + Fit_EL= fit(mean_index(dT_range),means(dT_range),'exp1'); + yfitEL = Fit_EL.a.*exp(Fit_EL.b.*dT_fit); + + e_lifetime_both=-1/Fit_EL.b; + s2_z0_both=Fit_EL.a; + + b=confint(Fit_EL, 0.683);%1 sigma matrix + sigma_e_lifetime_both=(1/b(1,2)-1/b(2,2))/2; + sigma_s2_z0_both=(b(2,1)-b(1,1))/2; + + lifetime_fig_both = figure; + errorbar(mean_index(2:end),means(2:end),means_error(2:end),'.k'); %first bin is anode, skip it + hold on + plot(dT_fit,yfitEL,'-r','LineWidth',1); + xlabel('Time (\mus)', 'FontSize',16); ylabel('Mean S2 (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S2_both Electron Lifetime'), 'FontSize', 16,'Interpreter','none'); + legend('S2\_both Mean', strcat( '\lambda= ', num2str(e_lifetime_both,4), ' \pm ', num2str(sigma_e_lifetime_both,2), ' \mus' )... + ,'location','northeast'); + myfigview(16); + xlim([0 det_edge]); + + + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_ybins),floor(s2_xbins)); +Sigma_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); +Count_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + +color_range_max=max(max(mean_S2_both_xy)); +color_range_min=min(min(mean_S2_both_xy(mean_S2_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + +s2_xy_both_fig = figure; +contourf(s2xbins,s2ybins,mean_S2_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. S2 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_ybins),floor(s1_xbins)); +Sigma_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); +Count_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +color_range_max=max(max(mean_S1_both_xy)); +color_range_min=min(min(mean_S1_both_xy(mean_S1_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + + +s1_xy_both_fig = figure; +contourf(s1xbins,s1ybins,mean_S1_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp,'. S1 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%% Apply corrections to CH3T and calculate the ER band + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\Run04_CH3T\KrypCal2p18_IQs\MakePlots\CH3T_Sep2015_Kr2p18.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +%% Make ER Band + +s1_min=0; +s1_max=50; + +%% First make plot of CH3T selection + +figure +plot(log10(s2_phe_both_xyz),log10(s1_phe_both_xyz),'.k') +hold on; +xlabel('log10(Corrected S2)'); ylabel ('log10(Corrected S1)'); myfigview(16) +x=[3.629:0.001:4.185]; +y=-0.7.*x+4.8; +plot(x,y,'-r','LineWidth',2); +x=[2.703:0.001:3.26]; +y=-0.7.*x+2; +plot(x,y,'-r','LineWidth',2); +x=[2.703:0.001:3.629]; +y=2.*x-5; +plot(x,y,'-r','LineWidth',2); +x=[3.26:0.001:4.185]; +y=2.*x-6.8; +plot(x,y,'-r','LineWidth',2); +title('Feb2015 CH3T'); + +%% First figure out where the outliers are in space + +pulse_area_cut= (log10(s1_phe_both_xyz)+0.7*log10(s2_phe_both_xyz)<4.8) & (log10(s1_phe_both_xyz)+0.7*log10(s2_phe_both_xyz)>2) & ... + (log10(s1_phe_both_xyz)-2*log10(s2_phe_both_xyz)<-5) & (log10(s1_phe_both_xyz)-2*log10(s2_phe_both_xyz)>-6.8); + + +max_r=21; + + +%% Get ERBand In the Same Voxels - Zdep + +voxel_counter=1; +for z_max=10+dT_step_old:dT_step_old:s1ab_z_cut_upper_old + +fiducial_cut=inrange(s2radius_del,[0,21]) & inrange(drift_time,[z_max-dT_step_old z_max]); + +tritium_cut= clean_cut & pulse_area_cut & fiducial_cut; + + + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:.05:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=tritium_cut & inrange(s1_phe_both_xyz,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); + %ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + b=confint(ER_mean_power_fit,.68); + sigma_a_ER_mean=(b(2,1)-b(1,1))/2; + sigma_b_ER_mean=(b(2,2)-b(1,2))/2; + + ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + b=confint(ER_lower_power_fit,.68); + sigma_a_ER_lower=(b(2,1)-b(1,1))/2; + sigma_b_ER_lower=(b(2,2)-b(1,2))/2; + + ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + b=confint(ER_upper_power_fit,.68); + sigma_a_ER_upper=(b(2,1)-b(1,1))/2; + sigma_b_ER_upper=(b(2,2)-b(1,2))/2; + + + ER_lower_power_fit_vox{voxel_counter}=ER_lower_power_fit; + ER_upper_power_fit_vox{voxel_counter}=ER_upper_power_fit; + ER_mean_power_fit_vox{voxel_counter}=ER_mean_power_fit; + z_center_vox{voxel_counter}=z_max-dT_step_old/2; + + voxel_counter=voxel_counter+1; +end + + + save('Sep2015_ER_Vox','ER_lower_power_fit_vox','ER_upper_power_fit_vox','ER_mean_power_fit_vox','z_center_vox') + + +%% Get ERBand In the Same Voxels - 3D dep + +voxel_counter=1; +if length(s1ab_z_old)>100000; %require 100,000 events to do 3D binning + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep_old:r_max_old %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep_old:r_max_old %map columns across (x_cm) -- s1y bins are the max edge of the bin + +fiducial_cut=inrange(drift_time,[40 300]) & ... + s2x(j-s1ab_xyz_xstep_old) & s2y(i-s1ab_xyz_ystep_old) & inrange(drift_time,[(k-s1ab_xyz_zstep_old/2) , (k+s1ab_xyz_zstep_old/2)]) + + +tritium_cut= clean_cut & pulse_area_cut & fiducial_cut; + + + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:.05:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=tritium_cut & inrange(s1_phe_both_xyz,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); + %ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + b=confint(ER_mean_power_fit,.68); + sigma_a_ER_mean=(b(2,1)-b(1,1))/2; + sigma_b_ER_mean=(b(2,2)-b(1,2))/2; + + ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + b=confint(ER_lower_power_fit,.68); + sigma_a_ER_lower=(b(2,1)-b(1,1))/2; + sigma_b_ER_lower=(b(2,2)-b(1,2))/2; + + ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + b=confint(ER_upper_power_fit,.68); + sigma_a_ER_upper=(b(2,1)-b(1,1))/2; + sigma_b_ER_upper=(b(2,2)-b(1,2))/2; + + + ER_lower_power_fit_3Dvox{voxel_counter}=ER_lower_power_fit; + ER_upper_power_fit_3Dvox{voxel_counter}=ER_upper_power_fit; + ER_mean_power_fit_3Dvox{voxel_counter}=ER_mean_power_fit; + x_center_3Dvox{voxel_counter}=j-s1ab_xyz_xstep_old/2; + y_center_3Dvox{voxel_counter}=i-s1ab_xyz_ystep_old/2; + z_center_3Dvox{voxel_counter}=k; + + voxel_counter=voxel_counter+1; + end + end +end + + save('Sep2015_ER_Vox','ER_lower_power_fit_vox','ER_upper_power_fit_vox','ER_mean_power_fit_vox','z_center_vox',... + 'ER_lower_power_fit_3Dvox','ER_upper_power_fit_3Dvox','ER_mean_power_fit_3Dvox','x_center_3Dvox','y_center_3Dvox','z_center_3Dvox') + + +end + diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/Sep2014_ERBand_RelatedToS1aS1b_RZ.m b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/Sep2014_ERBand_RelatedToS1aS1b_RZ.m new file mode 100644 index 0000000..e1abaca --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/Sep2014_ERBand_RelatedToS1aS1b_RZ.m @@ -0,0 +1,1418 @@ +%% Make corrections with the chosen polynomial +path='C:\Users\Richard\Desktop\LUX Analysis\lux10_20140903T1918_cp17059'; + + + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm','x_cm_tmplt','y_cm_tmplt'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +delay_min=0; +file_id_cp='test'; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 70000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + + + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + + zcut_min = 10; %field changes at 4 uSec + zcut_max = 0.95*det_edge; + + + if Kr_events < 30000 %then create a 10x10 grid. Otherwise 25x25. Want about 30 evts per bin + + S1xybinsize = sqrt((50*50)/(Kr_events/150)); + S1_xbin_min = -25; + S1_xbin_max = 25; + S1_ybin_min = -25; + S1_ybin_max = 25; + SE_ybin_min = -25; + SE_ybin_max = 25; + + S2xybinsize = sqrt((50*50)/(Kr_events/150));%cm +% SExybinsize = 5; DEFINED LATER, based on number of SE events + S2_xbin_min = -25; + S2_xbin_max = 25; + S2_ybin_min = -25; + S2_ybin_max = 25; + SE_xbin_min = -25; + SE_xbin_max = 25; + + + end + + s1_xbins = (S1_xbin_max-S1_xbin_min)./S1xybinsize; + s1_ybins = (S1_ybin_max-S1_ybin_min)./S1xybinsize; + + s2_xbins = (S2_xbin_max-S2_xbin_min)./S2xybinsize; + s2_ybins = (S2_ybin_max-S2_ybin_min)./S2xybinsize; + + %% Kr S1a/S2b map + +%Set up cuts and variables + s1ab_cut=logical(sum(s1_single_cut(:,:),1)); + s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); + s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); + s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); + s1ab_x=d.x_cm(s2_single_cut); + s1ab_y=d.y_cm(s2_single_cut); + s1ab_z=d.z_drift_samples(s2_single_cut)/100; + s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); + s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<25; + %plotting x=s1a v y=s1a/s1b cuts: y<0.035x-1, y>-0.035.*x+5; y>0.01.*x; %y<4.2; x<255 +% s1ab_areacut= (s1a_phe_both./s1b_phe_both-0.035.*s1a_phe_both<-1) & (s1a_phe_both./s1b_phe_both+0.035.*s1a_phe_both>5)... +% & (s1a_phe_both./s1b_phe_both > 0.01.* s1a_phe_both) & (s1a_phe_both./s1b_phe_both<4.2) & (s1a_phe_both<255); + + s1ab_x=s1ab_x(s1ab_timing_cut); + s1ab_y=s1ab_y(s1ab_timing_cut); + s1ab_z=s1ab_z(s1ab_timing_cut); + s1a_phe_both=s1a_phe_both(s1ab_timing_cut); + s1b_phe_both=s1b_phe_both(s1ab_timing_cut); + s1ab_radius=s1ab_radius(s1ab_timing_cut); + + %fidicual Z cut for s1ab_xy measurement + [s1ab_z_hist s1ab_z_hist_bins]=hist(s1ab_z(inrange(s1ab_z,[0,400])),[0:1:400]); + frac_hist=cumsum(s1ab_z_hist)./sum(s1ab_z_hist); + s1ab_z_cut_lower= min(s1ab_z_hist_bins(frac_hist>.10)); + s1ab_z_cut_upper= max(s1ab_z_hist_bins(frac_hist<.90)); + s1ab_z_cut=inrange(s1ab_z,[s1ab_z_cut_lower,s1ab_z_cut_upper]); + + %R cut for s1ab_Z measurement + [upperz_r_hist upperz_r_hist_bins]=hist(s1ab_radius(s1ab_z>s1ab_z_cut_upper & s1ab_radius<=26),[0:1:26]); + [lowerz_r_hist lowerz_r_hist_bins]=hist(s1ab_radius(s1ab_z0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:400]).','gauss1'); + s1b_fit=fit([0:2:300].',hist(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:300]).','gauss1'); + s1a_z_means(i)=s1a_fit.b1; + s1a_z_means_err(i)=s1a_fit.c1/sqrt(2)/sqrt(length(s1a_phe_both(s1ab_r_cut.' & s1a_phe_both>0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1b_z_means(i)=s1b_fit.b1; + s1b_z_means_err(i)=s1b_fit.c1/sqrt(2)/sqrt(length(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1ab_bincenters(i)=z_max-dT_step/2; + i=i+1; + end + +s1ab_z_means=s1a_z_means./s1b_z_means; +s1ab_z_means_err=sqrt( (s1b_z_means_err.*s1a_z_means./(s1b_z_means.^2)).^2 + (s1a_z_means_err./s1b_z_means).^2); + +%fit polynomial to s1az and s1bz, to remove z dependence later in xy fit +[s1a_P, s1a_S]=polyfit(s1ab_bincenters,s1a_z_means,3); +[s1b_P, s1b_S]=polyfit(s1ab_bincenters,s1b_z_means,3); +[s1ab_P, s1ab_S]=polyfit(s1ab_bincenters,s1ab_z_means,2); + +%S1a z dependence plot +s1az_plot=figure; +errorbar(s1ab_bincenters,s1a_z_means,s1a_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a Mean (phe)'); title('S1a Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1a_P,[10:1:320]),'-r','LineWidth',2) + +%S1b z dependence plot +s1bz_plot=figure; +errorbar(s1ab_bincenters,s1b_z_means,s1b_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1b Mean (phe)'); title('S1b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1b_P,[10:1:320]),'-r','LineWidth',2) + +%S1a/b z dependence plot +s1a_over_bz_plot=figure; +errorbar(s1ab_bincenters,s1ab_z_means,s1ab_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a/b'); title('S1 a/b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1ab_P,[10:1:320]),'-r','LineWidth',2) + + +%Correcting z dependence to get XY dependence in same manner that Kr/CH3T +%map does + s1a_phe_both_z=s1a_phe_both.'.*polyval(s1a_P,z_center)./polyval(s1a_P,s1ab_z); + s1b_phe_both_z=s1b_phe_both.'.*polyval(s1b_P,z_center)./polyval(s1b_P,s1ab_z); + + %% S1a/b XY map (after z correction) +s1ab_xbin_min=-25; +s1ab_ybin_min=-25; +s1ab_xbin_max=25; +s1ab_ybin_max=25; +s1ab_xybinsize=sqrt((50*50)/(length(s1ab_z)/300)); +clear s1a_xy_mean s1a_xy_mean_err s1b_xy_mean s1b_xy_mean_err + +s1ab_xbins=s1ab_xbin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_xbin_max; +s1ab_ybins=s1ab_ybin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_ybin_max; + +s1a_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); +s1b_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); + + for x_bin=s1ab_xbin_min:s1ab_xybinsize:(s1ab_xbin_max-s1ab_xybinsize/2); + for y_bin=s1ab_ybin_min:s1ab_xybinsize:(s1ab_ybin_max-s1ab_xybinsize/2); + x_min = x_bin; x_max = x_bin+s1ab_xybinsize; + y_min = y_bin; y_max = y_bin+s1ab_xybinsize; + + x_count=int32(1+x_bin/s1ab_xybinsize+s1ab_xbin_max/s1ab_xybinsize); + y_count=int32(1+y_bin/s1ab_xybinsize+s1ab_ybin_max/s1ab_xybinsize); + + bin_cut = s1ab_z_cut.' & inrange(s1ab_z,[10 330]).' & s1a_phe_both>0 & s1b_phe_both>0 & inrange(s1ab_x,[x_min,x_max]).' & inrange(s1ab_y,[y_min,y_max]).'; + if length(s1a_phe_both_z(bin_cut))>100; + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400])),[0:2:400]).','gauss1'); + s1a_xy_mean(y_count,x_count)=s1a_z_fit.b1; + s1a_xy_mean_err(y_count,x_count)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300])),[0:2:300]).','gauss1'); + s1b_xy_mean(y_count,x_count)=s1b_z_fit.b1; + s1b_xy_mean_err(y_count,x_count)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300]))); + else + s1a_xy_mean(y_count,x_count)=0; + s1a_xy_mean_err(y_count,x_count)=0; + s1b_xy_mean(y_count,x_count)=0; + s1b_xy_mean_err(y_count,x_count)=0; + end + + end + end + s1ab_xy_mean=s1a_xy_mean./s1b_xy_mean; + s1ab_xy_mean_err=sqrt( (s1b_xy_mean_err.*s1a_xy_mean./(s1b_xy_mean.^2)).^2 + (s1a_xy_mean_err./s1b_xy_mean).^2); + + + %Plot s1a XY means + color_range_max=max(max(s1a_xy_mean)); + color_range_min=min(min(s1a_xy_mean(s1a_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1a_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1a_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %Plot s1a XY means + color_range_max=max(max(s1b_xy_mean)); + color_range_min=min(min(s1b_xy_mean(s1b_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1b_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1b_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1b Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1b Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %s1a/b XY Ratio + color_range_max=max(max(s1ab_xy_mean)); + color_range_min=min(min(s1ab_xy_mean(s1ab_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1ab_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a/b Ratio vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a/b Ratio','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + +%% 3D Kr s1a/s1b map +if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +s1ab_xyz_numbins=floor((length(s1ab_z)/200)^(1/3)); %number of bins in one direction +s1ab_xyz_zstep=det_edge/s1ab_xyz_numbins; +s1ab_xyz_xstep=50/s1ab_xyz_numbins; +s1ab_xyz_ystep=50/s1ab_xyz_numbins; +s1ab_xyz_xmax=25; +r_max=25; + +s1ab_xyz_zbins=10+s1ab_xyz_zstep/2:s1ab_xyz_zstep:10+s1ab_xyz_zstep/2+s1ab_xyz_zstep*s1ab_xyz_numbins; %20 us +s1ab_xyz_xbins=(-r_max+s1ab_xyz_xstep/2):s1ab_xyz_xstep:r_max; +s1ab_xyz_ybins=(-r_max+s1ab_xyz_ystep/2):s1ab_xyz_ystep:r_max; + +s1a_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + + %Count the number of events per bin + Count_S1ab_3D(l,m,n)=length(s1a_phe_both(q)); + + if (Count_S1ab_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_xyz_mean(l,m,n)=s1a_z_fit.b1; + s1a_xyz_mean_err(l,m,n)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]) ),[0:2:300]).','gauss1'); + s1b_xyz_mean(l,m,n)=s1b_z_fit.b1; + s1b_xyz_mean_err(l,m,n)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); + else %not enough stats to do the fit + s1a_xyz_mean(l,m,n)=0; + s1a_xyz_mean_err(l,m,n)=0; + s1b_xyz_mean(l,m,n)=0; + s1b_xyz_mean_err(l,m,n)=0; + end + + end + end +k +end + + s1ab_xyz_mean=s1a_xyz_mean./s1b_xyz_mean; + s1ab_xyz_mean_err=sqrt( (s1b_xyz_mean_err.*s1a_xyz_mean./(s1b_xyz_mean.^2)).^2 + (s1a_xyz_mean_err./s1b_xyz_mean).^2); + +end + + +s1ab_s2_xyz_fit_map.p1=-0.4988; +s1ab_s2_xyz_fit_map.p2=1.484; +c1=1-s1ab_s2_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s2_xyz_fit_map.p2; +s1ab_s2_xyz_fit_map.p3=c1; + +s1ab_s1_xyz_fit_map.p1=0.065; +s1ab_s1_xyz_fit_map.p2=0.02; +c2=1-s1ab_s1_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s1_xyz_fit_map.p2; +s1ab_s1_xyz_fit_map.p3=c2; + + + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else %Only do 1D in this case +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval); + + + + end + + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S1 Z-dependence (Both PMT arrays) +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + + light_correction_fig = figure; + errorbar(mean_index,means,means_error,'.k'); + hold on + [yplot_s1_both] = polyval(P_s1_both,dT_fit); + [center_s1_both, center_s1_both_err] = polyval(P_s1_both,z_center, S); %160[us]*1.51[\mus/us] + plot(dT_fit,yplot_s1_both,'-r','LineWidth',1); + xlabel('Depth (\mus)', 'FontSize',16); ylabel('Mean (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S1 Mean vs. Z'), 'FontSize', 16,'Interpreter','none'); + line([0 det_edge],[center_s1_both center_s1_both],'linestyle','--'); + line([z_center; z_center;],[min(means) max(means)],'linestyle','--'); + legend('S1\_both Mean', strcat('y=', num2str(P_s1_both(1),'%10.2e'), '*Z^2 + ', num2str(P_s1_both(2),'%10.2e')... + , '*Z + ', num2str(P_s1_both(3),4)),strcat('Det center = ',num2str(center_s1_both,4), ' [Phe]'),'location','northwest') + + box on; + myfigview(16); + xlim([0 det_edge]); + ylim([0.8*min(means) 1.15*max(means)]); + + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + + + + + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + + %%calculate S2/S1 also, just to double check the lifetime from S2 only + % hist_s2_both_s1(:,bin)= hist(s2_phe_both(time_cut)./s1_phe_both_z(time_cut),x3)'; + % temp_hist=hist_s2_both_s1(:,bin); + %Fit_s2_both_s1{bin}=fit(x3(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + % means_s2_s1(bin)=Fit_s2_both_s1{bin}.b1; + % means_error_s2_s1(bin) = Fit_s2_both_s1{bin}.c1/2/sqrt(sum(hist_s2_both_s1(:,bin))); % == sigma/sqrt(N); + % mean_index_s2_s1(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + + dT_range= inrange( mean_index,[5+bin_size,500] );%from 50 to 300us for the fit + + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + %%Tracker for pseudo-lifetime + s2_at_bottom_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_both=-320/log(s2_at_bottom_both/s2_at_top_both); + + dT_fit=0:1:det_edge; + + Fit_EL= fit(mean_index(dT_range),means(dT_range),'exp1'); + yfitEL = Fit_EL.a.*exp(Fit_EL.b.*dT_fit); + + e_lifetime_both=-1/Fit_EL.b; + s2_z0_both=Fit_EL.a; + + b=confint(Fit_EL, 0.683);%1 sigma matrix + sigma_e_lifetime_both=(1/b(1,2)-1/b(2,2))/2; + sigma_s2_z0_both=(b(2,1)-b(1,1))/2; + + lifetime_fig_both = figure; + errorbar(mean_index(2:end),means(2:end),means_error(2:end),'.k'); %first bin is anode, skip it + hold on + plot(dT_fit,yfitEL,'-r','LineWidth',1); + xlabel('Time (\mus)', 'FontSize',16); ylabel('Mean S2 (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S2_both Electron Lifetime'), 'FontSize', 16,'Interpreter','none'); + legend('S2\_both Mean', strcat( '\lambda= ', num2str(e_lifetime_both,4), ' \pm ', num2str(sigma_e_lifetime_both,2), ' \mus' )... + ,'location','northeast'); + myfigview(16); + xlim([0 det_edge]); + + + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_ybins),floor(s2_xbins)); +Sigma_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); +Count_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + +color_range_max=max(max(mean_S2_both_xy)); +color_range_min=min(min(mean_S2_both_xy(mean_S2_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + +s2_xy_both_fig = figure; +contourf(s2xbins,s2ybins,mean_S2_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. S2 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_ybins),floor(s1_xbins)); +Sigma_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); +Count_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +color_range_max=max(max(mean_S1_both_xy)); +color_range_min=min(min(mean_S1_both_xy(mean_S1_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + + +s1_xy_both_fig = figure; +contourf(s1xbins,s1ybins,mean_S1_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp,'. S1 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%% S1a/b R^2 v Z map +s1ab_r2bin_min=0; +s1ab_r2bin_max=25*25; +s1ab_zbin_min=10; +s1ab_zbin_max=330; + +s1ab_r2z_binnum=(length(s1ab_z))/3000; %10k based on CH3T stats for ER band +s1ab_r2_binnum=floor(sqrt(s1ab_r2z_binnum)); +s1ab_z_binnum=floor(sqrt(s1ab_r2z_binnum)); + +s1ab_r2_binsize=(s1ab_r2bin_max-s1ab_r2bin_min)/s1ab_r2_binnum; +s1ab_z_binsize=(s1ab_zbin_max-s1ab_zbin_min)/s1ab_z_binnum; + +s1ab_r2bins=s1ab_r2bin_min+s1ab_r2_binsize/2:s1ab_r2_binsize:s1ab_r2bin_max; +s1ab_zbins=s1ab_zbin_min+s1ab_z_binsize/2:s1ab_z_binsize:s1ab_zbin_max; + +s1a_r2z_mean=zeros(length(s1ab_zbins),length(s1ab_r2bins)); +s1b_r2z_mean=zeros(length(s1ab_zbins),length(s1ab_r2bins)); +s1a_r2z_mean_err=zeros(length(s1ab_zbins),length(s1ab_r2bins)); +s1b_r2z_mean_err=zeros(length(s1ab_zbins),length(s1ab_r2bins)); +field_map_2014=zeros(length(s1ab_zbins),length(s1ab_r2bins)); +field_map_2015=zeros(length(s1ab_zbins),length(s1ab_r2bins)); +field_map_error=zeros(length(s1ab_zbins),length(s1ab_r2bins)); + +r2_counter=1; + for r2_bin_max=s1ab_r2bin_min+s1ab_r2_binsize:s1ab_r2_binsize:s1ab_r2bin_max; + z_counter=1; + for z_bin_max=s1ab_zbin_min+s1ab_z_binsize:s1ab_z_binsize:s1ab_zbin_max; + + bin_cut = s1a_phe_both>0 & s1b_phe_both>0 & inrange(s1ab_radius.^2,[r2_bin_max-s1ab_r2_binsize,r2_bin_max]).' & inrange(s1ab_z,[z_bin_max-s1ab_z_binsize,z_bin_max]).'; + if length(s1a_phe_both(bin_cut))>100; + clear s1a_confint s1b_confint + s1a_r2z_fit=fit([0:2:400].',hist(s1a_phe_both(bin_cut & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_r2z_mean(z_counter,r2_counter)=s1a_r2z_fit.b1; + s1a_confint=confint(s1a_r2z_fit,0.68); +% s1a_r2z_mean_err(z_counter,r2_counter)=s1a_r2z_fit.c1/sqrt(2)/length(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400]))); + s1a_r2z_mean_err(z_counter,r2_counter)=abs(s1a_confint(1,2)-s1a_r2z_fit.b1); + s1b_r2z_fit=fit([0:2:300].',hist(s1b_phe_both(bin_cut & inrange(s1b_phe_both,[0 300])),[0:2:300]).','gauss1'); + s1b_r2z_mean(z_counter,r2_counter)=s1b_r2z_fit.b1; + s1b_confint=confint(s1b_r2z_fit,0.68); +% s1b_xy_mean_err(y_count,x_count)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300]))); + s1b_r2z_mean_err(z_counter,r2_counter)=abs(s1b_confint(1,2)-s1b_r2z_fit.b1); + else + s1a_r2z_mean(z_counter,r2_counter)=0; + s1a_r2z_mean_err(z_counter,r2_counter)=0; + s1b_r2z_mean(z_counter,r2_counter)=0; + s1b_r2z_mean_err(z_counter,r2_counter)=0; + + end + z_counter=z_counter+1; + end + r2_counter=r2_counter+1; + end + s1ab_r2z_mean=s1a_r2z_mean./s1b_r2z_mean; + s1ab_r2z_mean_err=sqrt( (s1b_r2z_mean_err.*s1a_r2z_mean./(s1b_r2z_mean.^2)).^2 + (s1a_r2z_mean_err./s1b_r2z_mean).^2); + + %Plot s1a R2Z means + color_range_max=max(max(s1a_r2z_mean)); + color_range_min=min(min(s1a_r2z_mean(s1a_r2z_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + + s1a_r2z_fig = figure; + contourf(s1ab_r2bins,s1ab_zbins,s1a_r2z_mean,vc,'LineColor','none'); + xlabel('R^2 (cm^2)','fontsize', 18); + ylabel('Z (uSec)','fontsize', 18); + title(strcat(file_id_cp, '. S1a Mean vs. R^2 v Z.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + axis([0 625 0 330]) + myfigview(16); + set(gca,'Ydir','reverse') + + + %Plot s1a R2Z means + color_range_max=max(max(s1b_r2z_mean)); + color_range_min=min(min(s1b_r2z_mean(s1b_r2z_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1b_r2z_fig = figure; + contourf(s1ab_r2bins,s1ab_zbins,s1b_r2z_mean,vc,'LineColor','none'); + xlabel('R^2 (cm^2)','fontsize', 18); + ylabel('Z (uSec)','fontsize', 18); + title(strcat(file_id_cp, '. S1b Mean vs. R^2 v Z.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1b Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + axis([0 625 0 330]) + myfigview(16); + set(gca,'Ydir','reverse') + + + %s1a/b R2Z Ratio + color_range_max=max(max(s1ab_r2z_mean)); + color_range_min=min(min(s1ab_r2z_mean(s1ab_r2z_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1ab_r2z_fig = figure; + contourf(s1ab_r2bins,s1ab_zbins,s1ab_r2z_mean,vc,'LineColor','none'); + xlabel('R^2 (cm^2)','fontsize', 18); + ylabel('Z (uSec)','fontsize', 18); + title(strcat(file_id_cp, '. S1a/S1b Mean vs. R^2 v Z.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a/b Ratio','FontSize',16) + set(g,'FontSize',18) + hold on + axis([0 625 0 330]) + myfigview(16); + set(gca,'Ydir','reverse') + + +%% Apply corrections to CH3T and calculate the ER band + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\Run04_CH3T\KrypCal2p18_IQs\MakePlots\CH3T_Sep2014_Kr2p18.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + + + +s1_min=0; +s1_max=50; + +%% First figure out where the outliers are in space + +pulse_area_cut= (log10(s1_phe_both_xyz)+0.7*log10(s2_phe_both_xyz)<4.8) & (log10(s1_phe_both_xyz)+0.7*log10(s2_phe_both_xyz)>2) & ... + (log10(s1_phe_both_xyz)-2*log10(s2_phe_both_xyz)<-5) & (log10(s1_phe_both_xyz)-2*log10(s2_phe_both_xyz)>-6.8); + + +max_r=25; + +%% REDO THIS WITH SAME BINNING AS FIELD MAP + +voxel_counter=1; + + ER_lower_power_fit_vox={}; + ER_upper_power_fit_vox={}; + ER_mean_power_fit_vox={}; + + + + + for r2_max=s1ab_r2bin_min+s1ab_r2_binsize:s1ab_r2_binsize:s1ab_r2bin_max; + for z_max=s1ab_zbin_min+s1ab_z_binsize:s1ab_z_binsize:s1ab_zbin_max; + %note: voxels index in z, then y, then x + +fiducial_cut=inrange(s2radius.^2,[r2_max-s1ab_r2_binsize,r2_max]) & inrange(drift_time,[z_max-s1ab_z_binsize z_max]); +tritium_cut= clean_cut & pulse_area_cut & fiducial_cut; + +if length(s1_phe_both_xyz(tritium_cut))>5000 + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:.05:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=tritium_cut & inrange(s1_phe_both_xyz,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); + %ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + b=confint(ER_mean_power_fit,.68); + sigma_a_ER_mean=(b(2,1)-b(1,1))/2; + sigma_b_ER_mean=(b(2,2)-b(1,2))/2; + + ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + b=confint(ER_lower_power_fit,.68); + sigma_a_ER_lower=(b(2,1)-b(1,1))/2; + sigma_b_ER_lower=(b(2,2)-b(1,2))/2; + + ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + b=confint(ER_upper_power_fit,.68); + sigma_a_ER_upper=(b(2,1)-b(1,1))/2; + sigma_b_ER_upper=(b(2,2)-b(1,2))/2; + + + ER_lower_power_fit_vox{voxel_counter}=ER_lower_power_fit; + ER_upper_power_fit_vox{voxel_counter}=ER_upper_power_fit; + ER_mean_power_fit_vox{voxel_counter}=ER_mean_power_fit; + + ER_lower_power_fit_vox_aerr{voxel_counter}=sigma_a_ER_lower; + ER_upper_power_fit_vox_aerr{voxel_counter}=sigma_a_ER_upper; + ER_mean_power_fit_vox_aerr{voxel_counter}=sigma_a_ER_mean; + + ER_lower_power_fit_vox_berr{voxel_counter}=sigma_b_ER_lower; + ER_upper_power_fit_vox_berr{voxel_counter}=sigma_b_ER_upper; + ER_mean_power_fit_vox_berr{voxel_counter}=sigma_b_ER_mean; + + r2_centers(voxel_counter)=r2_max-s1ab_r2_binsize/2; + z_centers(voxel_counter)=z_max-s1ab_z_binsize/2; + skipflag(voxel_counter)=0; + +else + ER_lower_power_fit_vox{voxel_counter}=0; + ER_upper_power_fit_vox{voxel_counter}=0; + ER_mean_power_fit_vox{voxel_counter}=0; + + ER_lower_power_fit_vox_aerr{voxel_counter}=0; + ER_upper_power_fit_vox_aerr{voxel_counter}=0; + ER_mean_power_fit_vox_aerr{voxel_counter}=0; + + ER_lower_power_fit_vox_berr{voxel_counter}=0; + ER_upper_power_fit_vox_berr{voxel_counter}=0; + ER_mean_power_fit_vox_berr{voxel_counter}=0; + + r2_centers(voxel_counter)=0; + z_centers(voxel_counter)=0; + + skipflag(voxel_counter)=1; +end + voxel_counter=voxel_counter+1; + + + end + end + + + +%% Now relate the field to the ER band parameters + +%Relating parameter a to S1aS1b +temp_mean_s1as1b_map=s1ab_r2z_mean(:); +temp_mean_s1as1b_map_totalerr=s1ab_r2z_mean_err(:); + +for i=1:length(ER_mean_power_fit_vox) + + if skipflag(i)==0 +temp_ER_mean_a(i)=ER_mean_power_fit_vox{i}.a; +temp_ER_mean_a_err(i)=ER_mean_power_fit_vox_aerr{i}; + +temp_ER_mean_b(i)=ER_mean_power_fit_vox{i}.b; +temp_ER_mean_b_err(i)=ER_mean_power_fit_vox_berr{i}; + +temp_ER_lower_a(i)=ER_lower_power_fit_vox{i}.a; +temp_ER_lower_a_err(i)=ER_lower_power_fit_vox_aerr{i}; + +temp_ER_lower_b(i)=ER_lower_power_fit_vox{i}.b; +temp_ER_lower_b_err(i)=ER_lower_power_fit_vox_berr{i}; + +temp_ER_upper_a(i)=ER_upper_power_fit_vox{i}.a; +temp_ER_upper_a_err(i)=ER_upper_power_fit_vox_aerr{i}; + +temp_ER_upper_b(i)=ER_upper_power_fit_vox{i}.b; +temp_ER_upper_b_err(i)=ER_upper_power_fit_vox_berr{i}; + else +temp_ER_mean_a(i)=0; +temp_ER_mean_a_err(i)=0; + +temp_ER_mean_b(i)=0; +temp_ER_mean_b_err(i)=0; + +temp_ER_lower_a(i)=0; +temp_ER_lower_a_err(i)=0; + +temp_ER_lower_b(i)=0; +temp_ER_lower_b_err(i)=0; + +temp_ER_upper_a(i)=0; +temp_ER_upper_a_err(i)=0; + +temp_ER_upper_b(i)=0; +temp_ER_upper_b_err(i)=0; + end +end + +nancut=~isnan(temp_mean_s1as1b_map).' & ~isnan(temp_ER_mean_a) & temp_ER_mean_a~=0; + +[S1aS1b_to_mean_a_fit S1aS1b_to_mean_a_fit_err]=polyfit(temp_mean_s1as1b_map(nancut),temp_ER_mean_a(nancut).',2); +[S1aS1b_to_mean_b_fit S1aS1b_to_mean_b_fit_err]=polyfit(temp_mean_s1as1b_map(nancut),temp_ER_mean_b(nancut).',2); +[S1aS1b_to_lower_a_fit S1aS1b_to_lower_a_fit_err]=polyfit(temp_mean_s1as1b_map(nancut),temp_ER_lower_a(nancut).',2); +[S1aS1b_to_lower_b_fit S1aS1b_to_lower_b_fit_err]=polyfit(temp_mean_s1as1b_map(nancut),temp_ER_lower_b(nancut).',2); +[S1aS1b_to_upper_a_fit S1aS1b_to_upper_a_fit_err]=polyfit(temp_mean_s1as1b_map(nancut),temp_ER_upper_a(nancut).',2); +[S1aS1b_to_upper_b_fit S1aS1b_to_upper_b_fit_err]=polyfit(temp_mean_s1as1b_map(nancut),temp_ER_upper_b(nancut).',2); + +%% Plot coefficient relationship +figure +hold on; +xlabel('S1a/S1b'); ylabel('Power Law Coefficient'); +myfigview(16); + +[tempy tempyerr]=polyval(S1aS1b_to_mean_a_fit,[0:0.005:4],S1aS1b_to_mean_a_fit_err); +count=1; +clear tempfill +for i=length(tempy):-1:1; + tempfill(count)=tempy(i)-tempyerr(i); + count=count+1; +end +fill([0:.005:4,4:-0.005:0],[tempy+tempyerr,tempfill],[0.6 0.6 1],'EdgeColor',[0.6 0.6 1]) +plot([0:0.005:4],tempy,'-b','LineWidth',2); +xlim([2.3 3]) +rkploterr(temp_mean_s1as1b_map(nancut),temp_ER_mean_a(nancut),temp_mean_s1as1b_map_totalerr(nancut),temp_ER_mean_a_err(nancut),[0 0 0],[],[],2) + +%% Plot exponent relationship +figure +hold on; +xlabel('S1a/S1b'); ylabel('Power Law Exponent'); +myfigview(16); + +clear tempy tempyerr tempfill +[tempy tempyerr]=polyval(S1aS1b_to_mean_b_fit,[0:0.005:4],S1aS1b_to_mean_b_fit_err); +count=1; +for i=length(tempy):-1:1; + tempfill(count)=tempy(i)-tempyerr(i); + count=count+1; +end +fill([0:.005:4,4:-0.005:0],[tempy+tempyerr,tempfill],[0.6 0.6 1],'EdgeColor',[0.6 0.6 1]) +plot([0:0.005:4],tempy,'-b','LineWidth',2); +xlim([2.3 3]) +rkploterr(temp_mean_s1as1b_map(nancut),temp_ER_mean_b(nancut),temp_mean_s1as1b_map_totalerr(nancut),temp_ER_mean_b_err(nancut),[0 0 0],[],[],2) + + +save('Sep2014_S1aS1b_To_ERBand_RZVoxels','S1aS1b_to_mean_a_fit','S1aS1b_to_mean_b_fit','S1aS1b_to_lower_a_fit','S1aS1b_to_lower_b_fit','S1aS1b_to_upper_a_fit','S1aS1b_to_upper_b_fit',... + 'S1aS1b_to_mean_a_fit_err','S1aS1b_to_mean_b_fit_err','S1aS1b_to_lower_a_fit_err','S1aS1b_to_lower_b_fit_err','S1aS1b_to_upper_a_fit_err','S1aS1b_to_upper_b_fit_err'); \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/Sep2014_ER_Band.m b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/Sep2014_ER_Band.m new file mode 100644 index 0000000..fa60d8f --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/Sep2014_ER_Band.m @@ -0,0 +1,829 @@ +%% Make corrections with the chosen polynomial +load('MappingParametersStart_Sep2014') + +file_id_cp='Sep2014'; + +%% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % Removing field dependence from S1 and S2 + % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + %Hardcoded numbers from Energy Chi2 Fit + + + +s1ab_s2_xyz_fit_map.p1=-0.4988; +s1ab_s2_xyz_fit_map.p2=1.484; +c1=1-s1ab_s2_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s2_xyz_fit_map.p2; +s1ab_s2_xyz_fit_map.p3=c1; + +s1ab_s1_xyz_fit_map.p1=0.065; +s1ab_s1_xyz_fit_map.p2=0.02; +c2=1-s1ab_s1_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s1_xyz_fit_map.p2; +s1ab_s1_xyz_fit_map.p3=c2; + + + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else %Only do 1D in this case +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval); + + + + end + + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S1 Z-dependence (Both PMT arrays) +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + + light_correction_fig = figure; + errorbar(mean_index,means,means_error,'.k'); + hold on + [yplot_s1_both] = polyval(P_s1_both,dT_fit); + [center_s1_both, center_s1_both_err] = polyval(P_s1_both,z_center, S); %160[us]*1.51[\mus/us] + plot(dT_fit,yplot_s1_both,'-r','LineWidth',1); + xlabel('Depth (\mus)', 'FontSize',16); ylabel('Mean (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S1 Mean vs. Z'), 'FontSize', 16,'Interpreter','none'); + line([0 det_edge],[center_s1_both center_s1_both],'linestyle','--'); + line([z_center; z_center;],[min(means) max(means)],'linestyle','--'); + legend('S1\_both Mean', strcat('y=', num2str(P_s1_both(1),'%10.2e'), '*Z^2 + ', num2str(P_s1_both(2),'%10.2e')... + , '*Z + ', num2str(P_s1_both(3),4)),strcat('Det center = ',num2str(center_s1_both,4), ' [Phe]'),'location','northwest') + + box on; + myfigview(16); + xlim([0 det_edge]); + ylim([0.8*min(means) 1.15*max(means)]); + + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + + + + + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + + %%calculate S2/S1 also, just to double check the lifetime from S2 only + % hist_s2_both_s1(:,bin)= hist(s2_phe_both(time_cut)./s1_phe_both_z(time_cut),x3)'; + % temp_hist=hist_s2_both_s1(:,bin); + %Fit_s2_both_s1{bin}=fit(x3(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + % means_s2_s1(bin)=Fit_s2_both_s1{bin}.b1; + % means_error_s2_s1(bin) = Fit_s2_both_s1{bin}.c1/2/sqrt(sum(hist_s2_both_s1(:,bin))); % == sigma/sqrt(N); + % mean_index_s2_s1(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + + dT_range= inrange( mean_index,[5+bin_size,500] );%from 50 to 300us for the fit + + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + %%Tracker for pseudo-lifetime + s2_at_bottom_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_both=-320/log(s2_at_bottom_both/s2_at_top_both); + + dT_fit=0:1:det_edge; + + Fit_EL= fit(mean_index(dT_range),means(dT_range),'exp1'); + yfitEL = Fit_EL.a.*exp(Fit_EL.b.*dT_fit); + + e_lifetime_both=-1/Fit_EL.b; + s2_z0_both=Fit_EL.a; + + b=confint(Fit_EL, 0.683);%1 sigma matrix + sigma_e_lifetime_both=(1/b(1,2)-1/b(2,2))/2; + sigma_s2_z0_both=(b(2,1)-b(1,1))/2; + + lifetime_fig_both = figure; + errorbar(mean_index(2:end),means(2:end),means_error(2:end),'.k'); %first bin is anode, skip it + hold on + plot(dT_fit,yfitEL,'-r','LineWidth',1); + xlabel('Time (\mus)', 'FontSize',16); ylabel('Mean S2 (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S2_both Electron Lifetime'), 'FontSize', 16,'Interpreter','none'); + legend('S2\_both Mean', strcat( '\lambda= ', num2str(e_lifetime_both,4), ' \pm ', num2str(sigma_e_lifetime_both,2), ' \mus' )... + ,'location','northeast'); + myfigview(16); + xlim([0 det_edge]); + + + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_ybins),floor(s2_xbins)); +Sigma_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); +Count_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + +color_range_max=max(max(mean_S2_both_xy)); +color_range_min=min(min(mean_S2_both_xy(mean_S2_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + +s2_xy_both_fig = figure; +contourf(s2xbins,s2ybins,mean_S2_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. S2 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_ybins),floor(s1_xbins)); +Sigma_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); +Count_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +color_range_max=max(max(mean_S1_both_xy)); +color_range_min=min(min(mean_S1_both_xy(mean_S1_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + + +s1_xy_both_fig = figure; +contourf(s1xbins,s1ybins,mean_S1_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp,'. S1 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%% Apply corrections to CH3T and calculate the ER band + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\Run04_CH3T\KrypCal2p18_IQs\MakePlots\CH3T_Sep2014_Kr2p18.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +%% Make ER Band + +s1_min=0; +s1_max=50; + +%% First make plot of CH3T selection + +figure +plot(log10(s2_phe_both_xyz),log10(s1_phe_both_xyz),'.k') +hold on; +xlabel('log10(Corrected S2)'); ylabel ('log10(Corrected S1)'); myfigview(16) +x=[3.629:0.001:4.185]; +y=-0.7.*x+4.8; +plot(x,y,'-r','LineWidth',2); +x=[2.703:0.001:3.26]; +y=-0.7.*x+2; +plot(x,y,'-r','LineWidth',2); +x=[2.703:0.001:3.629]; +y=2.*x-5; +plot(x,y,'-r','LineWidth',2); +x=[3.26:0.001:4.185]; +y=2.*x-6.8; +plot(x,y,'-r','LineWidth',2); +title('Feb2015 CH3T'); + +%% First figure out where the outliers are in space + +pulse_area_cut= (log10(s1_phe_both_xyz)+0.7*log10(s2_phe_both_xyz)<4.8) & (log10(s1_phe_both_xyz)+0.7*log10(s2_phe_both_xyz)>2) & ... + (log10(s1_phe_both_xyz)-2*log10(s2_phe_both_xyz)<-5) & (log10(s1_phe_both_xyz)-2*log10(s2_phe_both_xyz)>-6.8); + + +max_r=21; +fiducial_cut=inrange(drift_time,[40 300]) & inrange(s2radius_del,[0,max_r]); + +tritium_cut= clean_cut & pulse_area_cut & fiducial_cut; + +%% Next, make plot of fiducial cut + +figure +density(s2radius_del.^2,drift_time,[0:10:1000],[0:2:450]) +cc=colorbar; +ylabel(cc,'Count','FontSize',16); +set(gca,'Ydir','reverse') +hold on; +line([441 441],[40 300],'Color','r','LineWidth',2) +line([0 441],[300 300],'Color','r','LineWidth',2) +line([0 441],[40 40],'Color','r','LineWidth',2) +xlabel('Delensed Radius^2 (cm^2)'); ylabel('Drift Time (uSec)'); myfigview(16); +title('Feb2015 CH3T') +% plot(s2radius_del(~fiducial_cut).^2,drift_time(~fiducial_cut),'.k','MarkerSize',2) + + + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:.05:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=tritium_cut & inrange(s1_phe_both_xyz,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); + %ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + b=confint(ER_mean_power_fit,.68); + sigma_a_ER_mean=(b(2,1)-b(1,1))/2; + sigma_b_ER_mean=(b(2,2)-b(1,2))/2; + + ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + b=confint(ER_lower_power_fit,.68); + sigma_a_ER_lower=(b(2,1)-b(1,1))/2; + sigma_b_ER_lower=(b(2,2)-b(1,2))/2; + + ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + b=confint(ER_upper_power_fit,.68); + sigma_a_ER_upper=(b(2,1)-b(1,1))/2; + sigma_b_ER_upper=(b(2,2)-b(1,2))/2; + + + %Make Plot + + no_fid_new=figure; + hold on + %plot(s1_phe_both_xyz(tritium_cut),log10(s2_phe_both_xyz(tritium_cut)./s1_phe_both_xyz(tritium_cut)),'ok','markersize',2) + density(s1_phe_both_xyz(tritium_cut),log10(s2_phe_both_xyz(tritium_cut)./s1_phe_both_xyz(tritium_cut)),[0:.5:100],[0:.05:4]); +% densityplot(s1_phe_both_xyz(tritium_cut),log10(s2_phe_both_xyz(tritium_cut)./s1_phe_both_xyz(tritium_cut)),'rectangle',[.5 .05],'lin'); + cc=colorbar; + ylabel(cc,'Count','FontSize',16); + colormap; + ylabel('Corrected log10(S2/S1)'); xlabel('S1 corrected (Pulse Area Phe)'); + title(sprintf('Run 04 CH3T, R<%d cm',max_r),'fontsize',16,'Interpreter','none'); + myfigview(16); + ylim([0 3.5]);xlim([0 s1_max]); +% plot(ER_bins,lower_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_lower_fit,'--k','markersize',14,'linewidth',2) +% plot(ER_bins,mean_ER_band,'ok','markersize',6,'linewidth',2)%plot mean of ER band + plot(ER_bins,ER_mean_fit,'-k','markersize',20,'linewidth',2) +% plot(ER_bins,upper_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_upper_fit,'--k','markersize',14,'linewidth',2) + + + bin_step=2; + + total_count=length(log10(s2_phe_both_xyz(tritium_cut))); + + + box; + text(10,2.8,strcat('Total Count= ',num2str(total_count)),'fontsize',16); + %text(5,.7,strcat('NEST\_SE_{bot} Fit=',num2str(ER_mean_NEST_fit.SE_ER_fit*73/64*27/max_r,3),'\pm ', num2str(sigma_SE_ER_fit*73/64*27/max_r,2),'[Phe]'),'fontsize',16,'color','m','interpreter','tex'); + %text(5,.8,'NEST Platinum V4-b', 'fontsize',16,'color','m','interpreter','tex' ); + text(5,.55,strcat('+',num2str(band_sigma),'\sigma = (',num2str(ER_upper_power_fit.a,3),'\pm', num2str(sigma_a_ER_upper,1) ,')\times S1_c ^{', num2str(ER_upper_power_fit.b,3),'\pm',num2str(sigma_b_ER_upper,1),'}'),'fontsize',16,'interpreter','tex'); + text(5,.3,strcat('Mean=(',num2str(ER_mean_power_fit.a,3),'\pm', num2str(sigma_a_ER_mean,1),')\times S1_c ^{', num2str(ER_mean_power_fit.b,3),'\pm', num2str(sigma_b_ER_mean,1),'}'),'fontsize',16,'interpreter','tex'); + text(5,.05,strcat('-',num2str(band_sigma),'\sigma = (',num2str(ER_lower_power_fit.a,3),'\pm', num2str(sigma_a_ER_lower,1),')\times S1_c ^{', num2str(ER_lower_power_fit.b,3),'\pm', num2str(sigma_b_ER_lower,1),'}'),'fontsize',16,'interpreter','tex'); + title('feb2015 CH3T') + + s1_phe_both_xyz_all=s1_phe_both_xyz(tritium_cut & inrange(drift_time,[0,110])); + log10_s2s1_xyz_all=log10(s2_phe_both_xyz(tritium_cut & inrange(drift_time,[0,110]))./s1_phe_both_xyz(tritium_cut & inrange(drift_time,[0,110]))); + ER_lower_fit_all=ER_lower_fit; + ER_upper_fit_all=ER_upper_fit; + ER_mean_fit_all=ER_mean_fit; + + + + %Save ER Band fits + save('Sep2014_ERFit','ER_bins','mean_ER_band','ER_sigma','ER_lower_power_fit','ER_upper_power_fit','ER_mean_power_fit','ER_lower_fit','ER_upper_fit','ER_mean_fit'); + \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/Sep2015_ERBand_RelatedToS1aS1b_RZ.m b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/Sep2015_ERBand_RelatedToS1aS1b_RZ.m new file mode 100644 index 0000000..827aac2 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/Sep2015_ERBand_RelatedToS1aS1b_RZ.m @@ -0,0 +1,1418 @@ +%% Make corrections with the chosen polynomial +path='C:\Users\Richard\Desktop\LUX Analysis\lux10_20150929T1905_cp18197'; + + + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm','x_cm_tmplt','y_cm_tmplt'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +delay_min=0; +file_id_cp='test'; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 70000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + + + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + + zcut_min = 10; %field changes at 4 uSec + zcut_max = 0.95*det_edge; + + + if Kr_events < 30000 %then create a 10x10 grid. Otherwise 25x25. Want about 30 evts per bin + + S1xybinsize = sqrt((50*50)/(Kr_events/150)); + S1_xbin_min = -25; + S1_xbin_max = 25; + S1_ybin_min = -25; + S1_ybin_max = 25; + SE_ybin_min = -25; + SE_ybin_max = 25; + + S2xybinsize = sqrt((50*50)/(Kr_events/150));%cm +% SExybinsize = 5; DEFINED LATER, based on number of SE events + S2_xbin_min = -25; + S2_xbin_max = 25; + S2_ybin_min = -25; + S2_ybin_max = 25; + SE_xbin_min = -25; + SE_xbin_max = 25; + + + end + + s1_xbins = (S1_xbin_max-S1_xbin_min)./S1xybinsize; + s1_ybins = (S1_ybin_max-S1_ybin_min)./S1xybinsize; + + s2_xbins = (S2_xbin_max-S2_xbin_min)./S2xybinsize; + s2_ybins = (S2_ybin_max-S2_ybin_min)./S2xybinsize; + + %% Kr S1a/S2b map + +%Set up cuts and variables + s1ab_cut=logical(sum(s1_single_cut(:,:),1)); + s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); + s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); + s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); + s1ab_x=d.x_cm(s2_single_cut); + s1ab_y=d.y_cm(s2_single_cut); + s1ab_z=d.z_drift_samples(s2_single_cut)/100; + s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); + s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<25; + %plotting x=s1a v y=s1a/s1b cuts: y<0.035x-1, y>-0.035.*x+5; y>0.01.*x; %y<4.2; x<255 +% s1ab_areacut= (s1a_phe_both./s1b_phe_both-0.035.*s1a_phe_both<-1) & (s1a_phe_both./s1b_phe_both+0.035.*s1a_phe_both>5)... +% & (s1a_phe_both./s1b_phe_both > 0.01.* s1a_phe_both) & (s1a_phe_both./s1b_phe_both<4.2) & (s1a_phe_both<255); + + s1ab_x=s1ab_x(s1ab_timing_cut); + s1ab_y=s1ab_y(s1ab_timing_cut); + s1ab_z=s1ab_z(s1ab_timing_cut); + s1a_phe_both=s1a_phe_both(s1ab_timing_cut); + s1b_phe_both=s1b_phe_both(s1ab_timing_cut); + s1ab_radius=s1ab_radius(s1ab_timing_cut); + + %fidicual Z cut for s1ab_xy measurement + [s1ab_z_hist s1ab_z_hist_bins]=hist(s1ab_z(inrange(s1ab_z,[0,400])),[0:1:400]); + frac_hist=cumsum(s1ab_z_hist)./sum(s1ab_z_hist); + s1ab_z_cut_lower= min(s1ab_z_hist_bins(frac_hist>.10)); + s1ab_z_cut_upper= max(s1ab_z_hist_bins(frac_hist<.90)); + s1ab_z_cut=inrange(s1ab_z,[s1ab_z_cut_lower,s1ab_z_cut_upper]); + + %R cut for s1ab_Z measurement + [upperz_r_hist upperz_r_hist_bins]=hist(s1ab_radius(s1ab_z>s1ab_z_cut_upper & s1ab_radius<=26),[0:1:26]); + [lowerz_r_hist lowerz_r_hist_bins]=hist(s1ab_radius(s1ab_z0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:400]).','gauss1'); + s1b_fit=fit([0:2:300].',hist(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:300]).','gauss1'); + s1a_z_means(i)=s1a_fit.b1; + s1a_z_means_err(i)=s1a_fit.c1/sqrt(2)/sqrt(length(s1a_phe_both(s1ab_r_cut.' & s1a_phe_both>0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1b_z_means(i)=s1b_fit.b1; + s1b_z_means_err(i)=s1b_fit.c1/sqrt(2)/sqrt(length(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1ab_bincenters(i)=z_max-dT_step/2; + i=i+1; + end + +s1ab_z_means=s1a_z_means./s1b_z_means; +s1ab_z_means_err=sqrt( (s1b_z_means_err.*s1a_z_means./(s1b_z_means.^2)).^2 + (s1a_z_means_err./s1b_z_means).^2); + +%fit polynomial to s1az and s1bz, to remove z dependence later in xy fit +[s1a_P, s1a_S]=polyfit(s1ab_bincenters,s1a_z_means,3); +[s1b_P, s1b_S]=polyfit(s1ab_bincenters,s1b_z_means,3); +[s1ab_P, s1ab_S]=polyfit(s1ab_bincenters,s1ab_z_means,2); + +%S1a z dependence plot +s1az_plot=figure; +errorbar(s1ab_bincenters,s1a_z_means,s1a_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a Mean (phe)'); title('S1a Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1a_P,[10:1:320]),'-r','LineWidth',2) + +%S1b z dependence plot +s1bz_plot=figure; +errorbar(s1ab_bincenters,s1b_z_means,s1b_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1b Mean (phe)'); title('S1b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1b_P,[10:1:320]),'-r','LineWidth',2) + +%S1a/b z dependence plot +s1a_over_bz_plot=figure; +errorbar(s1ab_bincenters,s1ab_z_means,s1ab_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a/b'); title('S1 a/b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1ab_P,[10:1:320]),'-r','LineWidth',2) + + +%Correcting z dependence to get XY dependence in same manner that Kr/CH3T +%map does + s1a_phe_both_z=s1a_phe_both.'.*polyval(s1a_P,z_center)./polyval(s1a_P,s1ab_z); + s1b_phe_both_z=s1b_phe_both.'.*polyval(s1b_P,z_center)./polyval(s1b_P,s1ab_z); + + %% S1a/b XY map (after z correction) +s1ab_xbin_min=-25; +s1ab_ybin_min=-25; +s1ab_xbin_max=25; +s1ab_ybin_max=25; +s1ab_xybinsize=sqrt((50*50)/(length(s1ab_z)/300)); +clear s1a_xy_mean s1a_xy_mean_err s1b_xy_mean s1b_xy_mean_err + +s1ab_xbins=s1ab_xbin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_xbin_max; +s1ab_ybins=s1ab_ybin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_ybin_max; + +s1a_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); +s1b_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); + + for x_bin=s1ab_xbin_min:s1ab_xybinsize:(s1ab_xbin_max-s1ab_xybinsize/2); + for y_bin=s1ab_ybin_min:s1ab_xybinsize:(s1ab_ybin_max-s1ab_xybinsize/2); + x_min = x_bin; x_max = x_bin+s1ab_xybinsize; + y_min = y_bin; y_max = y_bin+s1ab_xybinsize; + + x_count=int32(1+x_bin/s1ab_xybinsize+s1ab_xbin_max/s1ab_xybinsize); + y_count=int32(1+y_bin/s1ab_xybinsize+s1ab_ybin_max/s1ab_xybinsize); + + bin_cut = s1ab_z_cut.' & inrange(s1ab_z,[10 330]).' & s1a_phe_both>0 & s1b_phe_both>0 & inrange(s1ab_x,[x_min,x_max]).' & inrange(s1ab_y,[y_min,y_max]).'; + if length(s1a_phe_both_z(bin_cut))>100; + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400])),[0:2:400]).','gauss1'); + s1a_xy_mean(y_count,x_count)=s1a_z_fit.b1; + s1a_xy_mean_err(y_count,x_count)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300])),[0:2:300]).','gauss1'); + s1b_xy_mean(y_count,x_count)=s1b_z_fit.b1; + s1b_xy_mean_err(y_count,x_count)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300]))); + else + s1a_xy_mean(y_count,x_count)=0; + s1a_xy_mean_err(y_count,x_count)=0; + s1b_xy_mean(y_count,x_count)=0; + s1b_xy_mean_err(y_count,x_count)=0; + end + + end + end + s1ab_xy_mean=s1a_xy_mean./s1b_xy_mean; + s1ab_xy_mean_err=sqrt( (s1b_xy_mean_err.*s1a_xy_mean./(s1b_xy_mean.^2)).^2 + (s1a_xy_mean_err./s1b_xy_mean).^2); + + + %Plot s1a XY means + color_range_max=max(max(s1a_xy_mean)); + color_range_min=min(min(s1a_xy_mean(s1a_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1a_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1a_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %Plot s1a XY means + color_range_max=max(max(s1b_xy_mean)); + color_range_min=min(min(s1b_xy_mean(s1b_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1b_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1b_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1b Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1b Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %s1a/b XY Ratio + color_range_max=max(max(s1ab_xy_mean)); + color_range_min=min(min(s1ab_xy_mean(s1ab_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1ab_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a/b Ratio vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a/b Ratio','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + +%% 3D Kr s1a/s1b map +if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +s1ab_xyz_numbins=floor((length(s1ab_z)/200)^(1/3)); %number of bins in one direction +s1ab_xyz_zstep=det_edge/s1ab_xyz_numbins; +s1ab_xyz_xstep=50/s1ab_xyz_numbins; +s1ab_xyz_ystep=50/s1ab_xyz_numbins; +s1ab_xyz_xmax=25; +r_max=25; + +s1ab_xyz_zbins=10+s1ab_xyz_zstep/2:s1ab_xyz_zstep:10+s1ab_xyz_zstep/2+s1ab_xyz_zstep*s1ab_xyz_numbins; %20 us +s1ab_xyz_xbins=(-r_max+s1ab_xyz_xstep/2):s1ab_xyz_xstep:r_max; +s1ab_xyz_ybins=(-r_max+s1ab_xyz_ystep/2):s1ab_xyz_ystep:r_max; + +s1a_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + + %Count the number of events per bin + Count_S1ab_3D(l,m,n)=length(s1a_phe_both(q)); + + if (Count_S1ab_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_xyz_mean(l,m,n)=s1a_z_fit.b1; + s1a_xyz_mean_err(l,m,n)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]) ),[0:2:300]).','gauss1'); + s1b_xyz_mean(l,m,n)=s1b_z_fit.b1; + s1b_xyz_mean_err(l,m,n)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); + else %not enough stats to do the fit + s1a_xyz_mean(l,m,n)=0; + s1a_xyz_mean_err(l,m,n)=0; + s1b_xyz_mean(l,m,n)=0; + s1b_xyz_mean_err(l,m,n)=0; + end + + end + end +k +end + + s1ab_xyz_mean=s1a_xyz_mean./s1b_xyz_mean; + s1ab_xyz_mean_err=sqrt( (s1b_xyz_mean_err.*s1a_xyz_mean./(s1b_xyz_mean.^2)).^2 + (s1a_xyz_mean_err./s1b_xyz_mean).^2); + +end + + +s1ab_s2_xyz_fit_map.p1=-0.4988; +s1ab_s2_xyz_fit_map.p2=1.484; +c1=1-s1ab_s2_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s2_xyz_fit_map.p2; +s1ab_s2_xyz_fit_map.p3=c1; + +s1ab_s1_xyz_fit_map.p1=0.065; +s1ab_s1_xyz_fit_map.p2=0.02; +c2=1-s1ab_s1_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s1_xyz_fit_map.p2; +s1ab_s1_xyz_fit_map.p3=c2; + + + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else %Only do 1D in this case +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval); + + + + end + + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S1 Z-dependence (Both PMT arrays) +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + + light_correction_fig = figure; + errorbar(mean_index,means,means_error,'.k'); + hold on + [yplot_s1_both] = polyval(P_s1_both,dT_fit); + [center_s1_both, center_s1_both_err] = polyval(P_s1_both,z_center, S); %160[us]*1.51[\mus/us] + plot(dT_fit,yplot_s1_both,'-r','LineWidth',1); + xlabel('Depth (\mus)', 'FontSize',16); ylabel('Mean (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S1 Mean vs. Z'), 'FontSize', 16,'Interpreter','none'); + line([0 det_edge],[center_s1_both center_s1_both],'linestyle','--'); + line([z_center; z_center;],[min(means) max(means)],'linestyle','--'); + legend('S1\_both Mean', strcat('y=', num2str(P_s1_both(1),'%10.2e'), '*Z^2 + ', num2str(P_s1_both(2),'%10.2e')... + , '*Z + ', num2str(P_s1_both(3),4)),strcat('Det center = ',num2str(center_s1_both,4), ' [Phe]'),'location','northwest') + + box on; + myfigview(16); + xlim([0 det_edge]); + ylim([0.8*min(means) 1.15*max(means)]); + + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + + + + + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + + %%calculate S2/S1 also, just to double check the lifetime from S2 only + % hist_s2_both_s1(:,bin)= hist(s2_phe_both(time_cut)./s1_phe_both_z(time_cut),x3)'; + % temp_hist=hist_s2_both_s1(:,bin); + %Fit_s2_both_s1{bin}=fit(x3(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + % means_s2_s1(bin)=Fit_s2_both_s1{bin}.b1; + % means_error_s2_s1(bin) = Fit_s2_both_s1{bin}.c1/2/sqrt(sum(hist_s2_both_s1(:,bin))); % == sigma/sqrt(N); + % mean_index_s2_s1(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + + dT_range= inrange( mean_index,[5+bin_size,500] );%from 50 to 300us for the fit + + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + %%Tracker for pseudo-lifetime + s2_at_bottom_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_both=-320/log(s2_at_bottom_both/s2_at_top_both); + + dT_fit=0:1:det_edge; + + Fit_EL= fit(mean_index(dT_range),means(dT_range),'exp1'); + yfitEL = Fit_EL.a.*exp(Fit_EL.b.*dT_fit); + + e_lifetime_both=-1/Fit_EL.b; + s2_z0_both=Fit_EL.a; + + b=confint(Fit_EL, 0.683);%1 sigma matrix + sigma_e_lifetime_both=(1/b(1,2)-1/b(2,2))/2; + sigma_s2_z0_both=(b(2,1)-b(1,1))/2; + + lifetime_fig_both = figure; + errorbar(mean_index(2:end),means(2:end),means_error(2:end),'.k'); %first bin is anode, skip it + hold on + plot(dT_fit,yfitEL,'-r','LineWidth',1); + xlabel('Time (\mus)', 'FontSize',16); ylabel('Mean S2 (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S2_both Electron Lifetime'), 'FontSize', 16,'Interpreter','none'); + legend('S2\_both Mean', strcat( '\lambda= ', num2str(e_lifetime_both,4), ' \pm ', num2str(sigma_e_lifetime_both,2), ' \mus' )... + ,'location','northeast'); + myfigview(16); + xlim([0 det_edge]); + + + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_ybins),floor(s2_xbins)); +Sigma_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); +Count_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + +color_range_max=max(max(mean_S2_both_xy)); +color_range_min=min(min(mean_S2_both_xy(mean_S2_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + +s2_xy_both_fig = figure; +contourf(s2xbins,s2ybins,mean_S2_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. S2 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_ybins),floor(s1_xbins)); +Sigma_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); +Count_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +color_range_max=max(max(mean_S1_both_xy)); +color_range_min=min(min(mean_S1_both_xy(mean_S1_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + + +s1_xy_both_fig = figure; +contourf(s1xbins,s1ybins,mean_S1_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp,'. S1 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%% S1a/b R^2 v Z map +s1ab_r2bin_min=0; +s1ab_r2bin_max=25*25; +s1ab_zbin_min=10; +s1ab_zbin_max=330; + +s1ab_r2z_binnum=(length(s1ab_z))/3000; %10k based on CH3T stats for ER band +s1ab_r2_binnum=floor(sqrt(s1ab_r2z_binnum)); +s1ab_z_binnum=floor(sqrt(s1ab_r2z_binnum)); + +s1ab_r2_binsize=(s1ab_r2bin_max-s1ab_r2bin_min)/s1ab_r2_binnum; +s1ab_z_binsize=(s1ab_zbin_max-s1ab_zbin_min)/s1ab_z_binnum; + +s1ab_r2bins=s1ab_r2bin_min+s1ab_r2_binsize/2:s1ab_r2_binsize:s1ab_r2bin_max; +s1ab_zbins=s1ab_zbin_min+s1ab_z_binsize/2:s1ab_z_binsize:s1ab_zbin_max; + +s1a_r2z_mean=zeros(length(s1ab_zbins),length(s1ab_r2bins)); +s1b_r2z_mean=zeros(length(s1ab_zbins),length(s1ab_r2bins)); +s1a_r2z_mean_err=zeros(length(s1ab_zbins),length(s1ab_r2bins)); +s1b_r2z_mean_err=zeros(length(s1ab_zbins),length(s1ab_r2bins)); +field_map_2014=zeros(length(s1ab_zbins),length(s1ab_r2bins)); +field_map_2015=zeros(length(s1ab_zbins),length(s1ab_r2bins)); +field_map_error=zeros(length(s1ab_zbins),length(s1ab_r2bins)); + +r2_counter=1; + for r2_bin_max=s1ab_r2bin_min+s1ab_r2_binsize:s1ab_r2_binsize:s1ab_r2bin_max; + z_counter=1; + for z_bin_max=s1ab_zbin_min+s1ab_z_binsize:s1ab_z_binsize:s1ab_zbin_max; + + bin_cut = s1a_phe_both>0 & s1b_phe_both>0 & inrange(s1ab_radius.^2,[r2_bin_max-s1ab_r2_binsize,r2_bin_max]).' & inrange(s1ab_z,[z_bin_max-s1ab_z_binsize,z_bin_max]).'; + if length(s1a_phe_both(bin_cut))>100; + clear s1a_confint s1b_confint + s1a_r2z_fit=fit([0:2:400].',hist(s1a_phe_both(bin_cut & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_r2z_mean(z_counter,r2_counter)=s1a_r2z_fit.b1; + s1a_confint=confint(s1a_r2z_fit,0.68); +% s1a_r2z_mean_err(z_counter,r2_counter)=s1a_r2z_fit.c1/sqrt(2)/length(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400]))); + s1a_r2z_mean_err(z_counter,r2_counter)=abs(s1a_confint(1,2)-s1a_r2z_fit.b1); + s1b_r2z_fit=fit([0:2:300].',hist(s1b_phe_both(bin_cut & inrange(s1b_phe_both,[0 300])),[0:2:300]).','gauss1'); + s1b_r2z_mean(z_counter,r2_counter)=s1b_r2z_fit.b1; + s1b_confint=confint(s1b_r2z_fit,0.68); +% s1b_xy_mean_err(y_count,x_count)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300]))); + s1b_r2z_mean_err(z_counter,r2_counter)=abs(s1b_confint(1,2)-s1b_r2z_fit.b1); + else + s1a_r2z_mean(z_counter,r2_counter)=0; + s1a_r2z_mean_err(z_counter,r2_counter)=0; + s1b_r2z_mean(z_counter,r2_counter)=0; + s1b_r2z_mean_err(z_counter,r2_counter)=0; + + end + z_counter=z_counter+1; + end + r2_counter=r2_counter+1; + end + s1ab_r2z_mean=s1a_r2z_mean./s1b_r2z_mean; + s1ab_r2z_mean_err=sqrt( (s1b_r2z_mean_err.*s1a_r2z_mean./(s1b_r2z_mean.^2)).^2 + (s1a_r2z_mean_err./s1b_r2z_mean).^2); + + %Plot s1a R2Z means + color_range_max=max(max(s1a_r2z_mean)); + color_range_min=min(min(s1a_r2z_mean(s1a_r2z_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + + s1a_r2z_fig = figure; + contourf(s1ab_r2bins,s1ab_zbins,s1a_r2z_mean,vc,'LineColor','none'); + xlabel('R^2 (cm^2)','fontsize', 18); + ylabel('Z (uSec)','fontsize', 18); + title(strcat(file_id_cp, '. S1a Mean vs. R^2 v Z.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + axis([0 625 0 330]) + myfigview(16); + set(gca,'Ydir','reverse') + + + %Plot s1a R2Z means + color_range_max=max(max(s1b_r2z_mean)); + color_range_min=min(min(s1b_r2z_mean(s1b_r2z_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1b_r2z_fig = figure; + contourf(s1ab_r2bins,s1ab_zbins,s1b_r2z_mean,vc,'LineColor','none'); + xlabel('R^2 (cm^2)','fontsize', 18); + ylabel('Z (uSec)','fontsize', 18); + title(strcat(file_id_cp, '. S1b Mean vs. R^2 v Z.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1b Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + axis([0 625 0 330]) + myfigview(16); + set(gca,'Ydir','reverse') + + + %s1a/b R2Z Ratio + color_range_max=max(max(s1ab_r2z_mean)); + color_range_min=min(min(s1ab_r2z_mean(s1ab_r2z_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1ab_r2z_fig = figure; + contourf(s1ab_r2bins,s1ab_zbins,s1ab_r2z_mean,vc,'LineColor','none'); + xlabel('R^2 (cm^2)','fontsize', 18); + ylabel('Z (uSec)','fontsize', 18); + title(strcat(file_id_cp, '. S1a/S1b Mean vs. R^2 v Z.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a/b Ratio','FontSize',16) + set(g,'FontSize',18) + hold on + axis([0 625 0 330]) + myfigview(16); + set(gca,'Ydir','reverse') + + +%% Apply corrections to CH3T and calculate the ER band + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\Run04_CH3T\KrypCal2p18_IQs\MakePlots\CH3T_Sep2015_Kr2p18.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + + + +s1_min=0; +s1_max=50; + +%% First figure out where the outliers are in space + +pulse_area_cut= (log10(s1_phe_both_xyz)+0.7*log10(s2_phe_both_xyz)<4.8) & (log10(s1_phe_both_xyz)+0.7*log10(s2_phe_both_xyz)>2) & ... + (log10(s1_phe_both_xyz)-2*log10(s2_phe_both_xyz)<-5) & (log10(s1_phe_both_xyz)-2*log10(s2_phe_both_xyz)>-6.8); + + +max_r=25; + +%% REDO THIS WITH SAME BINNING AS FIELD MAP + +voxel_counter=1; + + ER_lower_power_fit_vox={}; + ER_upper_power_fit_vox={}; + ER_mean_power_fit_vox={}; + + + + + for r2_max=s1ab_r2bin_min+s1ab_r2_binsize:s1ab_r2_binsize:s1ab_r2bin_max; + for z_max=s1ab_zbin_min+s1ab_z_binsize:s1ab_z_binsize:s1ab_zbin_max; + %note: voxels index in z, then y, then x + +fiducial_cut=inrange(s2radius.^2,[r2_max-s1ab_r2_binsize,r2_max]) & inrange(drift_time,[z_max-s1ab_z_binsize z_max]); +tritium_cut= clean_cut & pulse_area_cut & fiducial_cut; + +if length(s1_phe_both_xyz(tritium_cut))>5000 + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:.05:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=tritium_cut & inrange(s1_phe_both_xyz,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); + %ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + b=confint(ER_mean_power_fit,.68); + sigma_a_ER_mean=(b(2,1)-b(1,1))/2; + sigma_b_ER_mean=(b(2,2)-b(1,2))/2; + + ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + b=confint(ER_lower_power_fit,.68); + sigma_a_ER_lower=(b(2,1)-b(1,1))/2; + sigma_b_ER_lower=(b(2,2)-b(1,2))/2; + + ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + b=confint(ER_upper_power_fit,.68); + sigma_a_ER_upper=(b(2,1)-b(1,1))/2; + sigma_b_ER_upper=(b(2,2)-b(1,2))/2; + + + ER_lower_power_fit_vox{voxel_counter}=ER_lower_power_fit; + ER_upper_power_fit_vox{voxel_counter}=ER_upper_power_fit; + ER_mean_power_fit_vox{voxel_counter}=ER_mean_power_fit; + + ER_lower_power_fit_vox_aerr{voxel_counter}=sigma_a_ER_lower; + ER_upper_power_fit_vox_aerr{voxel_counter}=sigma_a_ER_upper; + ER_mean_power_fit_vox_aerr{voxel_counter}=sigma_a_ER_mean; + + ER_lower_power_fit_vox_berr{voxel_counter}=sigma_b_ER_lower; + ER_upper_power_fit_vox_berr{voxel_counter}=sigma_b_ER_upper; + ER_mean_power_fit_vox_berr{voxel_counter}=sigma_b_ER_mean; + + r2_centers(voxel_counter)=r2_max-s1ab_r2_binsize/2; + z_centers(voxel_counter)=z_max-s1ab_z_binsize/2; + skipflag(voxel_counter)=0; + +else + ER_lower_power_fit_vox{voxel_counter}=0; + ER_upper_power_fit_vox{voxel_counter}=0; + ER_mean_power_fit_vox{voxel_counter}=0; + + ER_lower_power_fit_vox_aerr{voxel_counter}=0; + ER_upper_power_fit_vox_aerr{voxel_counter}=0; + ER_mean_power_fit_vox_aerr{voxel_counter}=0; + + ER_lower_power_fit_vox_berr{voxel_counter}=0; + ER_upper_power_fit_vox_berr{voxel_counter}=0; + ER_mean_power_fit_vox_berr{voxel_counter}=0; + + r2_centers(voxel_counter)=0; + z_centers(voxel_counter)=0; + + skipflag(voxel_counter)=1; +end + voxel_counter=voxel_counter+1; + + + end + end + + + +%% Now relate the field to the ER band parameters + +%Relating parameter a to S1aS1b +temp_mean_s1as1b_map=s1ab_r2z_mean(:); +temp_mean_s1as1b_map_totalerr=s1ab_r2z_mean_err(:); + +for i=1:length(ER_mean_power_fit_vox) + + if skipflag(i)==0 +temp_ER_mean_a(i)=ER_mean_power_fit_vox{i}.a; +temp_ER_mean_a_err(i)=ER_mean_power_fit_vox_aerr{i}; + +temp_ER_mean_b(i)=ER_mean_power_fit_vox{i}.b; +temp_ER_mean_b_err(i)=ER_mean_power_fit_vox_berr{i}; + +temp_ER_lower_a(i)=ER_lower_power_fit_vox{i}.a; +temp_ER_lower_a_err(i)=ER_lower_power_fit_vox_aerr{i}; + +temp_ER_lower_b(i)=ER_lower_power_fit_vox{i}.b; +temp_ER_lower_b_err(i)=ER_lower_power_fit_vox_berr{i}; + +temp_ER_upper_a(i)=ER_upper_power_fit_vox{i}.a; +temp_ER_upper_a_err(i)=ER_upper_power_fit_vox_aerr{i}; + +temp_ER_upper_b(i)=ER_upper_power_fit_vox{i}.b; +temp_ER_upper_b_err(i)=ER_upper_power_fit_vox_berr{i}; + else +temp_ER_mean_a(i)=0; +temp_ER_mean_a_err(i)=0; + +temp_ER_mean_b(i)=0; +temp_ER_mean_b_err(i)=0; + +temp_ER_lower_a(i)=0; +temp_ER_lower_a_err(i)=0; + +temp_ER_lower_b(i)=0; +temp_ER_lower_b_err(i)=0; + +temp_ER_upper_a(i)=0; +temp_ER_upper_a_err(i)=0; + +temp_ER_upper_b(i)=0; +temp_ER_upper_b_err(i)=0; + end +end + +nancut=~isnan(temp_mean_s1as1b_map).' & ~isnan(temp_ER_mean_a) & temp_ER_mean_a~=0; + +[S1aS1b_to_mean_a_fit S1aS1b_to_mean_a_fit_err]=polyfit(temp_mean_s1as1b_map(nancut),temp_ER_mean_a(nancut).',2); +[S1aS1b_to_mean_b_fit S1aS1b_to_mean_b_fit_err]=polyfit(temp_mean_s1as1b_map(nancut),temp_ER_mean_b(nancut).',2); +[S1aS1b_to_lower_a_fit S1aS1b_to_lower_a_fit_err]=polyfit(temp_mean_s1as1b_map(nancut),temp_ER_lower_a(nancut).',2); +[S1aS1b_to_lower_b_fit S1aS1b_to_lower_b_fit_err]=polyfit(temp_mean_s1as1b_map(nancut),temp_ER_lower_b(nancut).',2); +[S1aS1b_to_upper_a_fit S1aS1b_to_upper_a_fit_err]=polyfit(temp_mean_s1as1b_map(nancut),temp_ER_upper_a(nancut).',2); +[S1aS1b_to_upper_b_fit S1aS1b_to_upper_b_fit_err]=polyfit(temp_mean_s1as1b_map(nancut),temp_ER_upper_b(nancut).',2); + +%% Plot coefficient relationship +figure +hold on; +xlabel('S1a/S1b'); ylabel('Power Law Coefficient'); +myfigview(16); + +[tempy tempyerr]=polyval(S1aS1b_to_mean_a_fit,[0:0.005:4],S1aS1b_to_mean_a_fit_err); +count=1; +clear tempfill +for i=length(tempy):-1:1; + tempfill(count)=tempy(i)-tempyerr(i); + count=count+1; +end +fill([0:.005:4,4:-0.005:0],[tempy+tempyerr,tempfill],[0.6 0.6 1],'EdgeColor',[0.6 0.6 1]) +plot([0:0.005:4],tempy,'-b','LineWidth',2); +xlim([2.3 3]) +rkploterr(temp_mean_s1as1b_map(nancut),temp_ER_mean_a(nancut),temp_mean_s1as1b_map_totalerr(nancut),temp_ER_mean_a_err(nancut),[0 0 0],[],[],2) + +%% Plot exponent relationship +figure +hold on; +xlabel('S1a/S1b'); ylabel('Power Law Exponent'); +myfigview(16); + +clear tempy tempyerr tempfill +[tempy tempyerr]=polyval(S1aS1b_to_mean_b_fit,[0:0.005:4],S1aS1b_to_mean_b_fit_err); +count=1; +for i=length(tempy):-1:1; + tempfill(count)=tempy(i)-tempyerr(i); + count=count+1; +end +fill([0:.005:4,4:-0.005:0],[tempy+tempyerr,tempfill],[0.6 0.6 1],'EdgeColor',[0.6 0.6 1]) +plot([0:0.005:4],tempy,'-b','LineWidth',2); +xlim([2.3 3]) +rkploterr(temp_mean_s1as1b_map(nancut),temp_ER_mean_b(nancut),temp_mean_s1as1b_map_totalerr(nancut),temp_ER_mean_b_err(nancut),[0 0 0],[],[],2) + + +save('S1aS1b_To_ERBand_RZVoxels','S1aS1b_to_mean_a_fit','S1aS1b_to_mean_b_fit','S1aS1b_to_lower_a_fit','S1aS1b_to_lower_b_fit','S1aS1b_to_upper_a_fit','S1aS1b_to_upper_b_fit',... + 'S1aS1b_to_mean_a_fit_err','S1aS1b_to_mean_b_fit_err','S1aS1b_to_lower_a_fit_err','S1aS1b_to_lower_b_fit_err','S1aS1b_to_upper_a_fit_err','S1aS1b_to_upper_b_fit_err'); \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/Sep2015_ER_Band.m b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/Sep2015_ER_Band.m new file mode 100644 index 0000000..08f9911 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Prediction/Sep2015_ER_Band.m @@ -0,0 +1,829 @@ +%% Make corrections with the chosen polynomial +load('MappingParametersStart_Sep2015') + +file_id_cp='Sep2015'; + +%% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % Removing field dependence from S1 and S2 + % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + %Hardcoded numbers from Energy Chi2 Fit + + + +s1ab_s2_xyz_fit_map.p1=-0.4988; +s1ab_s2_xyz_fit_map.p2=1.484; +c1=1-s1ab_s2_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s2_xyz_fit_map.p2; +s1ab_s2_xyz_fit_map.p3=c1; + +s1ab_s1_xyz_fit_map.p1=0.065; +s1ab_s1_xyz_fit_map.p2=0.02; +c2=1-s1ab_s1_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s1_xyz_fit_map.p2; +s1ab_s1_xyz_fit_map.p3=c2; + + + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else %Only do 1D in this case +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval); + + + + end + + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S1 Z-dependence (Both PMT arrays) +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + + light_correction_fig = figure; + errorbar(mean_index,means,means_error,'.k'); + hold on + [yplot_s1_both] = polyval(P_s1_both,dT_fit); + [center_s1_both, center_s1_both_err] = polyval(P_s1_both,z_center, S); %160[us]*1.51[\mus/us] + plot(dT_fit,yplot_s1_both,'-r','LineWidth',1); + xlabel('Depth (\mus)', 'FontSize',16); ylabel('Mean (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S1 Mean vs. Z'), 'FontSize', 16,'Interpreter','none'); + line([0 det_edge],[center_s1_both center_s1_both],'linestyle','--'); + line([z_center; z_center;],[min(means) max(means)],'linestyle','--'); + legend('S1\_both Mean', strcat('y=', num2str(P_s1_both(1),'%10.2e'), '*Z^2 + ', num2str(P_s1_both(2),'%10.2e')... + , '*Z + ', num2str(P_s1_both(3),4)),strcat('Det center = ',num2str(center_s1_both,4), ' [Phe]'),'location','northwest') + + box on; + myfigview(16); + xlim([0 det_edge]); + ylim([0.8*min(means) 1.15*max(means)]); + + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + + + + + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + + %%calculate S2/S1 also, just to double check the lifetime from S2 only + % hist_s2_both_s1(:,bin)= hist(s2_phe_both(time_cut)./s1_phe_both_z(time_cut),x3)'; + % temp_hist=hist_s2_both_s1(:,bin); + %Fit_s2_both_s1{bin}=fit(x3(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + % means_s2_s1(bin)=Fit_s2_both_s1{bin}.b1; + % means_error_s2_s1(bin) = Fit_s2_both_s1{bin}.c1/2/sqrt(sum(hist_s2_both_s1(:,bin))); % == sigma/sqrt(N); + % mean_index_s2_s1(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + + dT_range= inrange( mean_index,[5+bin_size,500] );%from 50 to 300us for the fit + + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + %%Tracker for pseudo-lifetime + s2_at_bottom_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_both=-320/log(s2_at_bottom_both/s2_at_top_both); + + dT_fit=0:1:det_edge; + + Fit_EL= fit(mean_index(dT_range),means(dT_range),'exp1'); + yfitEL = Fit_EL.a.*exp(Fit_EL.b.*dT_fit); + + e_lifetime_both=-1/Fit_EL.b; + s2_z0_both=Fit_EL.a; + + b=confint(Fit_EL, 0.683);%1 sigma matrix + sigma_e_lifetime_both=(1/b(1,2)-1/b(2,2))/2; + sigma_s2_z0_both=(b(2,1)-b(1,1))/2; + + lifetime_fig_both = figure; + errorbar(mean_index(2:end),means(2:end),means_error(2:end),'.k'); %first bin is anode, skip it + hold on + plot(dT_fit,yfitEL,'-r','LineWidth',1); + xlabel('Time (\mus)', 'FontSize',16); ylabel('Mean S2 (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S2_both Electron Lifetime'), 'FontSize', 16,'Interpreter','none'); + legend('S2\_both Mean', strcat( '\lambda= ', num2str(e_lifetime_both,4), ' \pm ', num2str(sigma_e_lifetime_both,2), ' \mus' )... + ,'location','northeast'); + myfigview(16); + xlim([0 det_edge]); + + + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_ybins),floor(s2_xbins)); +Sigma_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); +Count_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + +color_range_max=max(max(mean_S2_both_xy)); +color_range_min=min(min(mean_S2_both_xy(mean_S2_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + +s2_xy_both_fig = figure; +contourf(s2xbins,s2ybins,mean_S2_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. S2 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_ybins),floor(s1_xbins)); +Sigma_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); +Count_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +color_range_max=max(max(mean_S1_both_xy)); +color_range_min=min(min(mean_S1_both_xy(mean_S1_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + + +s1_xy_both_fig = figure; +contourf(s1xbins,s1ybins,mean_S1_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp,'. S1 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%% Apply corrections to CH3T and calculate the ER band + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\Run04_CH3T\KrypCal2p18_IQs\MakePlots\CH3T_Sep2015_Kr2p18.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +%% Make ER Band + +s1_min=0; +s1_max=50; + +%% First make plot of CH3T selection + +figure +plot(log10(s2_phe_both_xyz),log10(s1_phe_both_xyz),'.k') +hold on; +xlabel('log10(Corrected S2)'); ylabel ('log10(Corrected S1)'); myfigview(16) +x=[3.629:0.001:4.185]; +y=-0.7.*x+4.8; +plot(x,y,'-r','LineWidth',2); +x=[2.703:0.001:3.26]; +y=-0.7.*x+2; +plot(x,y,'-r','LineWidth',2); +x=[2.703:0.001:3.629]; +y=2.*x-5; +plot(x,y,'-r','LineWidth',2); +x=[3.26:0.001:4.185]; +y=2.*x-6.8; +plot(x,y,'-r','LineWidth',2); +title('Feb2015 CH3T'); + +%% First figure out where the outliers are in space + +pulse_area_cut= (log10(s1_phe_both_xyz)+0.7*log10(s2_phe_both_xyz)<4.8) & (log10(s1_phe_both_xyz)+0.7*log10(s2_phe_both_xyz)>2) & ... + (log10(s1_phe_both_xyz)-2*log10(s2_phe_both_xyz)<-5) & (log10(s1_phe_both_xyz)-2*log10(s2_phe_both_xyz)>-6.8); + + +max_r=21; +fiducial_cut=inrange(drift_time,[40 300]) & inrange(s2radius_del,[0,max_r]); + +tritium_cut= clean_cut & pulse_area_cut & fiducial_cut; + +%% Next, make plot of fiducial cut + +figure +density(s2radius_del.^2,drift_time,[0:10:1000],[0:2:450]) +cc=colorbar; +ylabel(cc,'Count','FontSize',16); +set(gca,'Ydir','reverse') +hold on; +line([441 441],[40 300],'Color','r','LineWidth',2) +line([0 441],[300 300],'Color','r','LineWidth',2) +line([0 441],[40 40],'Color','r','LineWidth',2) +xlabel('Delensed Radius^2 (cm^2)'); ylabel('Drift Time (uSec)'); myfigview(16); +title('Feb2015 CH3T') +% plot(s2radius_del(~fiducial_cut).^2,drift_time(~fiducial_cut),'.k','MarkerSize',2) + + + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:.05:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=tritium_cut & inrange(s1_phe_both_xyz,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); + %ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + b=confint(ER_mean_power_fit,.68); + sigma_a_ER_mean=(b(2,1)-b(1,1))/2; + sigma_b_ER_mean=(b(2,2)-b(1,2))/2; + + ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + b=confint(ER_lower_power_fit,.68); + sigma_a_ER_lower=(b(2,1)-b(1,1))/2; + sigma_b_ER_lower=(b(2,2)-b(1,2))/2; + + ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + b=confint(ER_upper_power_fit,.68); + sigma_a_ER_upper=(b(2,1)-b(1,1))/2; + sigma_b_ER_upper=(b(2,2)-b(1,2))/2; + + + %Make Plot + + no_fid_new=figure; + hold on + %plot(s1_phe_both_xyz(tritium_cut),log10(s2_phe_both_xyz(tritium_cut)./s1_phe_both_xyz(tritium_cut)),'ok','markersize',2) + density(s1_phe_both_xyz(tritium_cut),log10(s2_phe_both_xyz(tritium_cut)./s1_phe_both_xyz(tritium_cut)),[0:.5:100],[0:.05:4]); +% densityplot(s1_phe_both_xyz(tritium_cut),log10(s2_phe_both_xyz(tritium_cut)./s1_phe_both_xyz(tritium_cut)),'rectangle',[.5 .05],'lin'); + cc=colorbar; + ylabel(cc,'Count','FontSize',16); + colormap; + ylabel('Corrected log10(S2/S1)'); xlabel('S1 corrected (Pulse Area Phe)'); + title(sprintf('Run 04 CH3T, R<%d cm',max_r),'fontsize',16,'Interpreter','none'); + myfigview(16); + ylim([0 3.5]);xlim([0 s1_max]); +% plot(ER_bins,lower_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_lower_fit,'--k','markersize',14,'linewidth',2) +% plot(ER_bins,mean_ER_band,'ok','markersize',6,'linewidth',2)%plot mean of ER band + plot(ER_bins,ER_mean_fit,'-k','markersize',20,'linewidth',2) +% plot(ER_bins,upper_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_upper_fit,'--k','markersize',14,'linewidth',2) + + + bin_step=2; + + total_count=length(log10(s2_phe_both_xyz(tritium_cut))); + + + box; + text(10,2.8,strcat('Total Count= ',num2str(total_count)),'fontsize',16); + %text(5,.7,strcat('NEST\_SE_{bot} Fit=',num2str(ER_mean_NEST_fit.SE_ER_fit*73/64*27/max_r,3),'\pm ', num2str(sigma_SE_ER_fit*73/64*27/max_r,2),'[Phe]'),'fontsize',16,'color','m','interpreter','tex'); + %text(5,.8,'NEST Platinum V4-b', 'fontsize',16,'color','m','interpreter','tex' ); + text(5,.55,strcat('+',num2str(band_sigma),'\sigma = (',num2str(ER_upper_power_fit.a,3),'\pm', num2str(sigma_a_ER_upper,1) ,')\times S1_c ^{', num2str(ER_upper_power_fit.b,3),'\pm',num2str(sigma_b_ER_upper,1),'}'),'fontsize',16,'interpreter','tex'); + text(5,.3,strcat('Mean=(',num2str(ER_mean_power_fit.a,3),'\pm', num2str(sigma_a_ER_mean,1),')\times S1_c ^{', num2str(ER_mean_power_fit.b,3),'\pm', num2str(sigma_b_ER_mean,1),'}'),'fontsize',16,'interpreter','tex'); + text(5,.05,strcat('-',num2str(band_sigma),'\sigma = (',num2str(ER_lower_power_fit.a,3),'\pm', num2str(sigma_a_ER_lower,1),')\times S1_c ^{', num2str(ER_lower_power_fit.b,3),'\pm', num2str(sigma_b_ER_lower,1),'}'),'fontsize',16,'interpreter','tex'); + title('feb2015 CH3T') + + s1_phe_both_xyz_all=s1_phe_both_xyz(tritium_cut & inrange(drift_time,[0,110])); + log10_s2s1_xyz_all=log10(s2_phe_both_xyz(tritium_cut & inrange(drift_time,[0,110]))./s1_phe_both_xyz(tritium_cut & inrange(drift_time,[0,110]))); + ER_lower_fit_all=ER_lower_fit; + ER_upper_fit_all=ER_upper_fit; + ER_mean_fit_all=ER_mean_fit; + + + + %Save ER Band fits + save('Sep2015_ERFit','ER_bins','mean_ER_band','ER_sigma','ER_lower_power_fit','ER_upper_power_fit','ER_mean_power_fit','ER_lower_fit','ER_upper_fit','ER_mean_fit'); + \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Z_Dependence/ERBandVoxelized.m b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Z_Dependence/ERBandVoxelized.m new file mode 100644 index 0000000..5c2b8f2 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Z_Dependence/ERBandVoxelized.m @@ -0,0 +1,830 @@ +%% Make corrections with the chosen polynomial +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p22\KrypCal2p22_QualityChecks\ERBand_Prediction\MappingParametersStart_Sep2015') + +file_id_cp='Sep2015'; + +%% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % Removing field dependence from S1 and S2 + % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + %Hardcoded numbers from Energy Chi2 Fit + + + +s1ab_s2_xyz_fit_map.p1=-0.4988; +s1ab_s2_xyz_fit_map.p2=1.484; +c1=1-s1ab_s2_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s2_xyz_fit_map.p2; +s1ab_s2_xyz_fit_map.p3=c1; + +s1ab_s1_xyz_fit_map.p1=0.065; +s1ab_s1_xyz_fit_map.p2=0.02; +c2=1-s1ab_s1_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s1_xyz_fit_map.p2; +s1ab_s1_xyz_fit_map.p3=c2; + + + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else %Only do 1D in this case +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval); + + + + end + + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S1 Z-dependence (Both PMT arrays) +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + + light_correction_fig = figure; + errorbar(mean_index,means,means_error,'.k'); + hold on + [yplot_s1_both] = polyval(P_s1_both,dT_fit); + [center_s1_both, center_s1_both_err] = polyval(P_s1_both,z_center, S); %160[us]*1.51[\mus/us] + plot(dT_fit,yplot_s1_both,'-r','LineWidth',1); + xlabel('Depth (\mus)', 'FontSize',16); ylabel('Mean (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S1 Mean vs. Z'), 'FontSize', 16,'Interpreter','none'); + line([0 det_edge],[center_s1_both center_s1_both],'linestyle','--'); + line([z_center; z_center;],[min(means) max(means)],'linestyle','--'); + legend('S1\_both Mean', strcat('y=', num2str(P_s1_both(1),'%10.2e'), '*Z^2 + ', num2str(P_s1_both(2),'%10.2e')... + , '*Z + ', num2str(P_s1_both(3),4)),strcat('Det center = ',num2str(center_s1_both,4), ' [Phe]'),'location','northwest') + + box on; + myfigview(16); + xlim([0 det_edge]); + ylim([0.8*min(means) 1.15*max(means)]); + + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + + + + + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + + %%calculate S2/S1 also, just to double check the lifetime from S2 only + % hist_s2_both_s1(:,bin)= hist(s2_phe_both(time_cut)./s1_phe_both_z(time_cut),x3)'; + % temp_hist=hist_s2_both_s1(:,bin); + %Fit_s2_both_s1{bin}=fit(x3(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + % means_s2_s1(bin)=Fit_s2_both_s1{bin}.b1; + % means_error_s2_s1(bin) = Fit_s2_both_s1{bin}.c1/2/sqrt(sum(hist_s2_both_s1(:,bin))); % == sigma/sqrt(N); + % mean_index_s2_s1(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + + dT_range= inrange( mean_index,[5+bin_size,500] );%from 50 to 300us for the fit + + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + %%Tracker for pseudo-lifetime + s2_at_bottom_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_both=-320/log(s2_at_bottom_both/s2_at_top_both); + + dT_fit=0:1:det_edge; + + Fit_EL= fit(mean_index(dT_range),means(dT_range),'exp1'); + yfitEL = Fit_EL.a.*exp(Fit_EL.b.*dT_fit); + + e_lifetime_both=-1/Fit_EL.b; + s2_z0_both=Fit_EL.a; + + b=confint(Fit_EL, 0.683);%1 sigma matrix + sigma_e_lifetime_both=(1/b(1,2)-1/b(2,2))/2; + sigma_s2_z0_both=(b(2,1)-b(1,1))/2; + + lifetime_fig_both = figure; + errorbar(mean_index(2:end),means(2:end),means_error(2:end),'.k'); %first bin is anode, skip it + hold on + plot(dT_fit,yfitEL,'-r','LineWidth',1); + xlabel('Time (\mus)', 'FontSize',16); ylabel('Mean S2 (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S2_both Electron Lifetime'), 'FontSize', 16,'Interpreter','none'); + legend('S2\_both Mean', strcat( '\lambda= ', num2str(e_lifetime_both,4), ' \pm ', num2str(sigma_e_lifetime_both,2), ' \mus' )... + ,'location','northeast'); + myfigview(16); + xlim([0 det_edge]); + + + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_ybins),floor(s2_xbins)); +Sigma_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); +Count_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + +color_range_max=max(max(mean_S2_both_xy)); +color_range_min=min(min(mean_S2_both_xy(mean_S2_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + +s2_xy_both_fig = figure; +contourf(s2xbins,s2ybins,mean_S2_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. S2 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_ybins),floor(s1_xbins)); +Sigma_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); +Count_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +color_range_max=max(max(mean_S1_both_xy)); +color_range_min=min(min(mean_S1_both_xy(mean_S1_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + + +s1_xy_both_fig = figure; +contourf(s1xbins,s1ybins,mean_S1_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp,'. S1 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%% Apply corrections to CH3T and calculate the ER band + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\Run04_CH3T\KrypCal2p18_IQs\MakePlots\CH3T_Sep2015_Kr2p18.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +%% Make ER Band + +s1_min=0; +s1_max=50; + +%% First make plot of CH3T selection + +figure +plot(log10(s2_phe_both_xyz),log10(s1_phe_both_xyz),'.k') +hold on; +xlabel('log10(Corrected S2)'); ylabel ('log10(Corrected S1)'); myfigview(16) +x=[3.629:0.001:4.185]; +y=-0.7.*x+4.8; +plot(x,y,'-r','LineWidth',2); +x=[2.703:0.001:3.26]; +y=-0.7.*x+2; +plot(x,y,'-r','LineWidth',2); +x=[2.703:0.001:3.629]; +y=2.*x-5; +plot(x,y,'-r','LineWidth',2); +x=[3.26:0.001:4.185]; +y=2.*x-6.8; +plot(x,y,'-r','LineWidth',2); +title('Feb2015 CH3T'); + +%% First figure out where the outliers are in space + +pulse_area_cut= (log10(s1_phe_both_xyz)+0.7*log10(s2_phe_both_xyz)<4.8) & (log10(s1_phe_both_xyz)+0.7*log10(s2_phe_both_xyz)>2) & ... + (log10(s1_phe_both_xyz)-2*log10(s2_phe_both_xyz)<-5) & (log10(s1_phe_both_xyz)-2*log10(s2_phe_both_xyz)>-6.8); + + +max_r=25; + +%% Loop over the 3x3x3 sections of the detetctor + +z_step=floor((300-40)/3); +x_step=floor(50/3); +y_step=floor(50/3); + +voxel_counter=1; + + ER_lower_power_fit_vox={}; + ER_upper_power_fit_vox={}; + ER_mean_power_fit_vox={}; + +for x_max=-25+x_step:x_step:25; + for y_max=-25+y_step:y_step:25; + for z_max=40+z_step:z_step:300; + %note: voxels index in z, then y, then x + +fiducial_cut=inrange(drift_time,[40 300]) & inrange(s2radius_del,[0,max_r]) & ... + inrange(s2x_del,[x_max-x_step x_max]) & inrange(s2y_del,[y_max-y_step y_max]) & inrange(drift_time,[z_max-z_step z_max]); + +tritium_cut= clean_cut & pulse_area_cut & fiducial_cut; + + + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:.05:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=tritium_cut & inrange(s1_phe_both_xyz,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); + %ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + b=confint(ER_mean_power_fit,.68); + sigma_a_ER_mean=(b(2,1)-b(1,1))/2; + sigma_b_ER_mean=(b(2,2)-b(1,2))/2; + + ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + b=confint(ER_lower_power_fit,.68); + sigma_a_ER_lower=(b(2,1)-b(1,1))/2; + sigma_b_ER_lower=(b(2,2)-b(1,2))/2; + + ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + b=confint(ER_upper_power_fit,.68); + sigma_a_ER_upper=(b(2,1)-b(1,1))/2; + sigma_b_ER_upper=(b(2,2)-b(1,2))/2; + + + ER_lower_power_fit_vox{voxel_counter}=ER_lower_power_fit; + ER_upper_power_fit_vox{voxel_counter}=ER_upper_power_fit; + ER_mean_power_fit_vox{voxel_counter}=ER_mean_power_fit; + x_center_vox{voxel_counter}=x_max-x_step/2; + y_center_vox{voxel_counter}=y_max-y_step/2; + z_center_vox{voxel_counter}=z_max-z_step/2; + + voxel_counter=voxel_counter+1; + end + end +end + +%% Plot the ER bands +save('Sep2015_2p22_ERFit_Voxels','ER_lower_power_fit_vox','ER_upper_power_fit_vox','ER_mean_power_fit_vox','x_center_vox','y_center_vox','z_center_vox'); + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p22\KrypCal2p22_QualityChecks\ERBand_Prediction\Sep2015_ERFit.mat'); + +figure +hold on; +x=[0:0.1:50]; +y_total=ER_mean_power_fit.a.*x.^ER_mean_power_fit.b; +y_total_upper=ER_upper_power_fit.a.*x.^ER_upper_power_fit.b; +y_total_lower=ER_lower_power_fit.a.*x.^ER_lower_power_fit.b; +plot(x,y_total,'-k','LineWidth',2,'Color',[0 0 0]) + +for i=1:(length(ER_mean_power_fit_vox)); + clear y + y=ER_mean_power_fit_vox{i}.a.*x.^ER_mean_power_fit_vox{i}.b; + plot(x,y,'-','LineWidth',1,'Color',[0.8 0.8 0.8]) + + y=ER_lower_power_fit_vox{i}.a.*x.^ER_lower_power_fit_vox{i}.b; + plot(x,y,'--','LineWidth',1,'Color',[0.8 0.8 0.8]) + + y=ER_upper_power_fit_vox{i}.a.*x.^ER_upper_power_fit_vox{i}.b; + plot(x,y,'--','LineWidth',1,'Color',[0.8 0.8 0.8]) +end +xlabel('Corrected S1 (phe)'); ylabel('Corrected log10(S2/S1)'); myfigview(16); +ylim([1.8 3]) +plot(x,y_total,'-k','LineWidth',2,'Color',[0 0 0]) +plot(x,y_total_upper,'--k','LineWidth',2,'Color',[0 0 0]) +plot(x,y_total_lower,'--k','LineWidth',2,'Color',[0 0 0]) +legend('Total Band','Voxelized Band Means'); + + diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Z_Dependence/ERBandVoxelized_libNEST.m b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Z_Dependence/ERBandVoxelized_libNEST.m new file mode 100644 index 0000000..0154747 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Z_Dependence/ERBandVoxelized_libNEST.m @@ -0,0 +1,140 @@ +load('LibNEST_ERData.mat') + +s2radius_del=s2x_del+s2y_del; +s1_min=0; +s1_max=50; + +max_r=25; + +%% Loop over the 3x3x3 sections of the detetctor + +z_step=floor((300-40)/3); +x_step=floor(50/3); +y_step=floor(50/3); + +voxel_counter=1; + + ER_lower_power_fit_vox={}; + ER_upper_power_fit_vox={}; + ER_mean_power_fit_vox={}; + +for x_max=-25+x_step:x_step:25; + for y_max=-25+y_step:y_step:25; + for z_max=40+z_step:z_step:300; + %note: voxels index in z, then y, then x + +fiducial_cut=inrange(s2x_del,[x_max-x_step x_max]) & inrange(s2y_del,[y_max-y_step y_max]) & inrange(drift_time,[z_max-z_step z_max]); + +tritium_cut= fiducial_cut; + + + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:.05:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=tritium_cut & inrange(s1_phe_both_xyz,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); + %ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + b=confint(ER_mean_power_fit,.68); + sigma_a_ER_mean=(b(2,1)-b(1,1))/2; + sigma_b_ER_mean=(b(2,2)-b(1,2))/2; + + ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + b=confint(ER_lower_power_fit,.68); + sigma_a_ER_lower=(b(2,1)-b(1,1))/2; + sigma_b_ER_lower=(b(2,2)-b(1,2))/2; + + ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + b=confint(ER_upper_power_fit,.68); + sigma_a_ER_upper=(b(2,1)-b(1,1))/2; + sigma_b_ER_upper=(b(2,2)-b(1,2))/2; + + + ER_lower_power_fit_vox{voxel_counter}=ER_lower_power_fit; + ER_upper_power_fit_vox{voxel_counter}=ER_upper_power_fit; + ER_mean_power_fit_vox{voxel_counter}=ER_mean_power_fit; + x_center_vox{voxel_counter}=x_max-x_step/2; + y_center_vox{voxel_counter}=y_max-y_step/2; + z_center_vox{voxel_counter}=z_max-z_step/2; + + voxel_counter=voxel_counter+1; + end + end +end + +%% Plot the ER bands +save('Sep2015_2p22_LibNEST_ERFit_Voxels','ER_lower_power_fit_vox','ER_upper_power_fit_vox','ER_mean_power_fit_vox','x_center_vox','y_center_vox','z_center_vox'); + +% load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p22\KrypCal2p22_QualityChecks\ERBand_Prediction\Sep2015_ERFit.mat'); + +figure +hold on; +x=[0:0.1:50]; +% y_total=ER_mean_power_fit.a.*x.^ER_mean_power_fit.b; +% y_total_upper=ER_upper_power_fit.a.*x.^ER_upper_power_fit.b; +% y_total_lower=ER_lower_power_fit.a.*x.^ER_lower_power_fit.b; +plot(x,y_total,'-k','LineWidth',2,'Color',[0 0 0]) + +for i=1:(length(ER_mean_power_fit_vox)); + clear y + y=ER_mean_power_fit_vox{i}.a.*x.^ER_mean_power_fit_vox{i}.b; + plot(x,y,'-','LineWidth',1,'Color',[0.8 0.8 0.8]) + + y=ER_lower_power_fit_vox{i}.a.*x.^ER_lower_power_fit_vox{i}.b; + plot(x,y,'--','LineWidth',1,'Color',[0.8 0.8 0.8]) + + y=ER_upper_power_fit_vox{i}.a.*x.^ER_upper_power_fit_vox{i}.b; + plot(x,y,'--','LineWidth',1,'Color',[0.8 0.8 0.8]) +end +xlabel('Corrected S1 (phe)'); ylabel('Corrected log10(S2/S1)'); myfigview(16); +ylim([1.8 3]) +plot(x,y_total,'-k','LineWidth',2,'Color',[0 0 0]) +plot(x,y_total_upper,'--k','LineWidth',2,'Color',[0 0 0]) +plot(x,y_total_lower,'--k','LineWidth',2,'Color',[0 0 0]) +legend('Total Band','Voxelized Band Means'); + + diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Z_Dependence/ERBand_Z_Dependence.m b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Z_Dependence/ERBand_Z_Dependence.m new file mode 100644 index 0000000..83e5758 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Z_Dependence/ERBand_Z_Dependence.m @@ -0,0 +1,1199 @@ +%% Make corrections with the chosen polynomial +path='C:\Users\Richard\Desktop\LUX Analysis\lux10_20150929T1905_cp18197'; + + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +delay_min=0; +file_id_cp='test'; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 70000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + + + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + + zcut_min = 10; %field changes at 4 uSec + zcut_max = 0.95*det_edge; + + + if Kr_events < 30000 %then create a 10x10 grid. Otherwise 25x25. Want about 30 evts per bin + + S1xybinsize = sqrt((50*50)/(Kr_events/150)); + S1_xbin_min = -25; + S1_xbin_max = 25; + S1_ybin_min = -25; + S1_ybin_max = 25; + SE_ybin_min = -25; + SE_ybin_max = 25; + + S2xybinsize = sqrt((50*50)/(Kr_events/150));%cm +% SExybinsize = 5; DEFINED LATER, based on number of SE events + S2_xbin_min = -25; + S2_xbin_max = 25; + S2_ybin_min = -25; + S2_ybin_max = 25; + SE_xbin_min = -25; + SE_xbin_max = 25; + + + end + + s1_xbins = (S1_xbin_max-S1_xbin_min)./S1xybinsize; + s1_ybins = (S1_ybin_max-S1_ybin_min)./S1xybinsize; + + s2_xbins = (S2_xbin_max-S2_xbin_min)./S2xybinsize; + s2_ybins = (S2_ybin_max-S2_ybin_min)./S2xybinsize; + + %% Kr S1a/S2b map + +%Set up cuts and variables + s1ab_cut=logical(sum(s1_single_cut(:,:),1)); + s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); + s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); + s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); + s1ab_x=d.x_cm(s2_single_cut); + s1ab_y=d.y_cm(s2_single_cut); + s1ab_z=d.z_drift_samples(s2_single_cut)/100; + s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); + s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<25; + %plotting x=s1a v y=s1a/s1b cuts: y<0.035x-1, y>-0.035.*x+5; y>0.01.*x; %y<4.2; x<255 +% s1ab_areacut= (s1a_phe_both./s1b_phe_both-0.035.*s1a_phe_both<-1) & (s1a_phe_both./s1b_phe_both+0.035.*s1a_phe_both>5)... +% & (s1a_phe_both./s1b_phe_both > 0.01.* s1a_phe_both) & (s1a_phe_both./s1b_phe_both<4.2) & (s1a_phe_both<255); + + s1ab_x=s1ab_x(s1ab_timing_cut); + s1ab_y=s1ab_y(s1ab_timing_cut); + s1ab_z=s1ab_z(s1ab_timing_cut); + s1a_phe_both=s1a_phe_both(s1ab_timing_cut); + s1b_phe_both=s1b_phe_both(s1ab_timing_cut); + s1ab_radius=s1ab_radius(s1ab_timing_cut); + + %fidicual Z cut for s1ab_xy measurement + [s1ab_z_hist s1ab_z_hist_bins]=hist(s1ab_z(inrange(s1ab_z,[0,400])),[0:1:400]); + frac_hist=cumsum(s1ab_z_hist)./sum(s1ab_z_hist); + s1ab_z_cut_lower= min(s1ab_z_hist_bins(frac_hist>.10)); + s1ab_z_cut_upper= max(s1ab_z_hist_bins(frac_hist<.90)); + s1ab_z_cut=inrange(s1ab_z,[s1ab_z_cut_lower,s1ab_z_cut_upper]); + + %R cut for s1ab_Z measurement + [upperz_r_hist upperz_r_hist_bins]=hist(s1ab_radius(s1ab_z>s1ab_z_cut_upper & s1ab_radius<=26),[0:1:26]); + [lowerz_r_hist lowerz_r_hist_bins]=hist(s1ab_radius(s1ab_z0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:400]).','gauss1'); + s1b_fit=fit([0:2:300].',hist(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:300]).','gauss1'); + s1a_z_means(i)=s1a_fit.b1; + s1a_z_means_err(i)=s1a_fit.c1/sqrt(2)/sqrt(length(s1a_phe_both(s1ab_r_cut.' & s1a_phe_both>0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1b_z_means(i)=s1b_fit.b1; + s1b_z_means_err(i)=s1b_fit.c1/sqrt(2)/sqrt(length(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1ab_bincenters(i)=z_max-dT_step/2; + i=i+1; + end + +s1ab_z_means=s1a_z_means./s1b_z_means; +s1ab_z_means_err=sqrt( (s1b_z_means_err.*s1a_z_means./(s1b_z_means.^2)).^2 + (s1a_z_means_err./s1b_z_means).^2); + +%fit polynomial to s1az and s1bz, to remove z dependence later in xy fit +[s1a_P, s1a_S]=polyfit(s1ab_bincenters,s1a_z_means,3); +[s1b_P, s1b_S]=polyfit(s1ab_bincenters,s1b_z_means,3); +[s1ab_P, s1ab_S]=polyfit(s1ab_bincenters,s1ab_z_means,2); + +%S1a z dependence plot +s1az_plot=figure; +errorbar(s1ab_bincenters,s1a_z_means,s1a_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a Mean (phe)'); title('S1a Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1a_P,[10:1:320]),'-r','LineWidth',2) + +%S1b z dependence plot +s1bz_plot=figure; +errorbar(s1ab_bincenters,s1b_z_means,s1b_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1b Mean (phe)'); title('S1b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1b_P,[10:1:320]),'-r','LineWidth',2) + +%S1a/b z dependence plot +s1a_over_bz_plot=figure; +errorbar(s1ab_bincenters,s1ab_z_means,s1ab_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a/b'); title('S1 a/b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1ab_P,[10:1:320]),'-r','LineWidth',2) + + +%Correcting z dependence to get XY dependence in same manner that Kr/CH3T +%map does + s1a_phe_both_z=s1a_phe_both.'.*polyval(s1a_P,z_center)./polyval(s1a_P,s1ab_z); + s1b_phe_both_z=s1b_phe_both.'.*polyval(s1b_P,z_center)./polyval(s1b_P,s1ab_z); + + %% S1a/b XY map (after z correction) +s1ab_xbin_min=-25; +s1ab_ybin_min=-25; +s1ab_xbin_max=25; +s1ab_ybin_max=25; +s1ab_xybinsize=sqrt((50*50)/(length(s1ab_z)/300)); +clear s1a_xy_mean s1a_xy_mean_err s1b_xy_mean s1b_xy_mean_err + +s1ab_xbins=s1ab_xbin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_xbin_max; +s1ab_ybins=s1ab_ybin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_ybin_max; + +s1a_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); +s1b_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); + + for x_bin=s1ab_xbin_min:s1ab_xybinsize:(s1ab_xbin_max-s1ab_xybinsize/2); + for y_bin=s1ab_ybin_min:s1ab_xybinsize:(s1ab_ybin_max-s1ab_xybinsize/2); + x_min = x_bin; x_max = x_bin+s1ab_xybinsize; + y_min = y_bin; y_max = y_bin+s1ab_xybinsize; + + x_count=int32(1+x_bin/s1ab_xybinsize+s1ab_xbin_max/s1ab_xybinsize); + y_count=int32(1+y_bin/s1ab_xybinsize+s1ab_ybin_max/s1ab_xybinsize); + + bin_cut = s1ab_z_cut.' & inrange(s1ab_z,[10 330]).' & s1a_phe_both>0 & s1b_phe_both>0 & inrange(s1ab_x,[x_min,x_max]).' & inrange(s1ab_y,[y_min,y_max]).'; + if length(s1a_phe_both_z(bin_cut))>100; + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400])),[0:2:400]).','gauss1'); + s1a_xy_mean(y_count,x_count)=s1a_z_fit.b1; + s1a_xy_mean_err(y_count,x_count)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300])),[0:2:300]).','gauss1'); + s1b_xy_mean(y_count,x_count)=s1b_z_fit.b1; + s1b_xy_mean_err(y_count,x_count)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300]))); + else + s1a_xy_mean(y_count,x_count)=0; + s1a_xy_mean_err(y_count,x_count)=0; + s1b_xy_mean(y_count,x_count)=0; + s1b_xy_mean_err(y_count,x_count)=0; + end + + end + end + s1ab_xy_mean=s1a_xy_mean./s1b_xy_mean; + s1ab_xy_mean_err=sqrt( (s1b_xy_mean_err.*s1a_xy_mean./(s1b_xy_mean.^2)).^2 + (s1a_xy_mean_err./s1b_xy_mean).^2); + + + %Plot s1a XY means + color_range_max=max(max(s1a_xy_mean)); + color_range_min=min(min(s1a_xy_mean(s1a_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1a_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1a_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %Plot s1a XY means + color_range_max=max(max(s1b_xy_mean)); + color_range_min=min(min(s1b_xy_mean(s1b_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1b_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1b_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1b Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1b Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %s1a/b XY Ratio + color_range_max=max(max(s1ab_xy_mean)); + color_range_min=min(min(s1ab_xy_mean(s1ab_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1ab_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a/b Ratio vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a/b Ratio','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + +%% 3D Kr s1a/s1b map +if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +s1ab_xyz_numbins=floor((length(s1ab_z)/200)^(1/3)); %number of bins in one direction +s1ab_xyz_zstep=det_edge/s1ab_xyz_numbins; +s1ab_xyz_xstep=50/s1ab_xyz_numbins; +s1ab_xyz_ystep=50/s1ab_xyz_numbins; +s1ab_xyz_xmax=25; +r_max=25; + +s1ab_xyz_zbins=10+s1ab_xyz_zstep/2:s1ab_xyz_zstep:10+s1ab_xyz_zstep/2+s1ab_xyz_zstep*s1ab_xyz_numbins; %20 us +s1ab_xyz_xbins=(-r_max+s1ab_xyz_xstep/2):s1ab_xyz_xstep:r_max; +s1ab_xyz_ybins=(-r_max+s1ab_xyz_ystep/2):s1ab_xyz_ystep:r_max; + +s1a_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + + %Count the number of events per bin + Count_S1ab_3D(l,m,n)=length(s1a_phe_both(q)); + + if (Count_S1ab_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_xyz_mean(l,m,n)=s1a_z_fit.b1; + s1a_xyz_mean_err(l,m,n)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]) ),[0:2:300]).','gauss1'); + s1b_xyz_mean(l,m,n)=s1b_z_fit.b1; + s1b_xyz_mean_err(l,m,n)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); + else %not enough stats to do the fit + s1a_xyz_mean(l,m,n)=0; + s1a_xyz_mean_err(l,m,n)=0; + s1b_xyz_mean(l,m,n)=0; + s1b_xyz_mean_err(l,m,n)=0; + end + + end + end +k +end + + s1ab_xyz_mean=s1a_xyz_mean./s1b_xyz_mean; + s1ab_xyz_mean_err=sqrt( (s1b_xyz_mean_err.*s1a_xyz_mean./(s1b_xyz_mean.^2)).^2 + (s1a_xyz_mean_err./s1b_xyz_mean).^2); + +end + %% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % Removing field dependence from S1 and S2 + % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + %Hardcoded numbers from Energy Chi2 Fit + + + +s1ab_s2_xyz_fit_map.p1=-0.4988; +s1ab_s2_xyz_fit_map.p2=1.484; +c1=1-s1ab_s2_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s2_xyz_fit_map.p2; +s1ab_s2_xyz_fit_map.p3=c1; + +s1ab_s1_xyz_fit_map.p1=0.065; +s1ab_s1_xyz_fit_map.p2=0.02; +c2=1-s1ab_s1_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s1_xyz_fit_map.p2; +s1ab_s1_xyz_fit_map.p3=c2; + + + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else %Only do 1D in this case +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval); + + + + end + + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S1 Z-dependence (Both PMT arrays) +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + + light_correction_fig = figure; + errorbar(mean_index,means,means_error,'.k'); + hold on + [yplot_s1_both] = polyval(P_s1_both,dT_fit); + [center_s1_both, center_s1_both_err] = polyval(P_s1_both,z_center, S); %160[us]*1.51[\mus/us] + plot(dT_fit,yplot_s1_both,'-r','LineWidth',1); + xlabel('Depth (\mus)', 'FontSize',16); ylabel('Mean (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S1 Mean vs. Z'), 'FontSize', 16,'Interpreter','none'); + line([0 det_edge],[center_s1_both center_s1_both],'linestyle','--'); + line([z_center; z_center;],[min(means) max(means)],'linestyle','--'); + legend('S1\_both Mean', strcat('y=', num2str(P_s1_both(1),'%10.2e'), '*Z^2 + ', num2str(P_s1_both(2),'%10.2e')... + , '*Z + ', num2str(P_s1_both(3),4)),strcat('Det center = ',num2str(center_s1_both,4), ' [Phe]'),'location','northwest') + + box on; + myfigview(16); + xlim([0 det_edge]); + ylim([0.8*min(means) 1.15*max(means)]); + + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + + + + + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + + %%calculate S2/S1 also, just to double check the lifetime from S2 only + % hist_s2_both_s1(:,bin)= hist(s2_phe_both(time_cut)./s1_phe_both_z(time_cut),x3)'; + % temp_hist=hist_s2_both_s1(:,bin); + %Fit_s2_both_s1{bin}=fit(x3(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + % means_s2_s1(bin)=Fit_s2_both_s1{bin}.b1; + % means_error_s2_s1(bin) = Fit_s2_both_s1{bin}.c1/2/sqrt(sum(hist_s2_both_s1(:,bin))); % == sigma/sqrt(N); + % mean_index_s2_s1(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + + dT_range= inrange( mean_index,[5+bin_size,500] );%from 50 to 300us for the fit + + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + %%Tracker for pseudo-lifetime + s2_at_bottom_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_both=-320/log(s2_at_bottom_both/s2_at_top_both); + + dT_fit=0:1:det_edge; + + Fit_EL= fit(mean_index(dT_range),means(dT_range),'exp1'); + yfitEL = Fit_EL.a.*exp(Fit_EL.b.*dT_fit); + + e_lifetime_both=-1/Fit_EL.b; + s2_z0_both=Fit_EL.a; + + b=confint(Fit_EL, 0.683);%1 sigma matrix + sigma_e_lifetime_both=(1/b(1,2)-1/b(2,2))/2; + sigma_s2_z0_both=(b(2,1)-b(1,1))/2; + + lifetime_fig_both = figure; + errorbar(mean_index(2:end),means(2:end),means_error(2:end),'.k'); %first bin is anode, skip it + hold on + plot(dT_fit,yfitEL,'-r','LineWidth',1); + xlabel('Time (\mus)', 'FontSize',16); ylabel('Mean S2 (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S2_both Electron Lifetime'), 'FontSize', 16,'Interpreter','none'); + legend('S2\_both Mean', strcat( '\lambda= ', num2str(e_lifetime_both,4), ' \pm ', num2str(sigma_e_lifetime_both,2), ' \mus' )... + ,'location','northeast'); + myfigview(16); + xlim([0 det_edge]); + + + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_ybins),floor(s2_xbins)); +Sigma_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); +Count_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + +color_range_max=max(max(mean_S2_both_xy)); +color_range_min=min(min(mean_S2_both_xy(mean_S2_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + +s2_xy_both_fig = figure; +contourf(s2xbins,s2ybins,mean_S2_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. S2 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_ybins),floor(s1_xbins)); +Sigma_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); +Count_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +color_range_max=max(max(mean_S1_both_xy)); +color_range_min=min(min(mean_S1_both_xy(mean_S1_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + + +s1_xy_both_fig = figure; +contourf(s1xbins,s1ybins,mean_S1_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp,'. S1 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%% Apply corrections to CH3T and calculate the ER band + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\Run04_CH3T\KrypCal2p18_IQs\MakePlots\CH3T_Sep2015_Kr2p18.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +%% Make ER Band + +s1_min=0; +s1_max=50; + +%% First make plot of CH3T selection + +figure +plot(log10(s2_phe_both_xyz),log10(s1_phe_both_xyz),'.k') +cc=colorbar; +ylabel(cc,'Count','FontSize',16); +caxis +hold on; +xlabel('log10(Corrected S2)'); ylabel ('log10(Corrected S1)'); myfigview(16) +x=[2:0.001:4.585]; +y=-0.7.*x+4.85; +plot(x,y,'-b','LineWidth',2); +y=-0.7.*x+2; +plot(x,y,'-b','LineWidth',2); +y=2.*x-5; +plot(x,y,'-b','LineWidth',2); +y=2.*x-7; +plot(x,y,'-b','LineWidth',2); +title('Sep2015 CH3T'); + + + + +%% First figure out where the outliers are in space + +pulse_area_cut= (log10(s1_phe_both_xyz)+0.7*log10(s2_phe_both_xyz)<4.85) & (log10(s1_phe_both_xyz)+0.7*log10(s2_phe_both_xyz)>2) & ... + (log10(s1_phe_both_xyz)-2*log10(s2_phe_both_xyz)<-5) & (log10(s1_phe_both_xyz)-2*log10(s2_phe_both_xyz)>-7); + + +max_r=21; + +dT_step=30; + +bin_counter=1; +for dT_max=10+dT_step:dT_step:300; + +fiducial_cut=inrange(drift_time,[dT_max-dT_step, dT_max]) & inrange(s2radius_del,[0,max_r]); + +tritium_cut= clean_cut & pulse_area_cut & fiducial_cut; + + + + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:.05:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=tritium_cut & inrange(s1_phe_both_xyz,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); + %ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit{bin_counter}=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + + + ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit{bin_counter}=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + + ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit{bin_counter}=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + + bin_counter=bin_counter+1; +end + + + %Make Plot + + figure; + hold on + ylabel('Corrected log10(S2/S1)'); xlabel('S1 corrected (Pulse Area Phe)'); + title(sprintf('Run 04 CH3T, R<%d cm',max_r),'fontsize',16,'Interpreter','none'); + myfigview(16); + ylim([0 3.5]);xlim([0 s1_max]); + + colors={[1 0 0],[0 1 0],[0 0 1],[0 0 0],[1 1 0]}; + color_counter=1; + for i=[1,5,9]; + plot(ER_bins,ER_lower_fit{i},'--','Color',colors{color_counter},'markersize',14,'linewidth',2) + plot(ER_bins,ER_mean_fit{i},'-','Color',colors{color_counter},'markersize',20,'linewidth',2) + plot(ER_bins,ER_upper_fit{i},'--','Color',colors{color_counter},'markersize',14,'linewidth',2) + color_counter=color_counter+1; + end + + save('ERBand_Z_Dep_WithFieldCorr','ER_bins','ER_lower_fit','ER_mean_fit','ER_upper_fit'); diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Z_Dependence/ERBand_Z_Dependence_NoFieldCorr.m b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Z_Dependence/ERBand_Z_Dependence_NoFieldCorr.m new file mode 100644 index 0000000..3fc95af --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Z_Dependence/ERBand_Z_Dependence_NoFieldCorr.m @@ -0,0 +1,1199 @@ +%% Make corrections with the chosen polynomial +path='C:\Users\Richard\Desktop\LUX Analysis\lux10_20150929T1905_cp18197'; + + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +delay_min=0; +file_id_cp='test'; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 70000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + + + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + + zcut_min = 10; %field changes at 4 uSec + zcut_max = 0.95*det_edge; + + + if Kr_events < 30000 %then create a 10x10 grid. Otherwise 25x25. Want about 30 evts per bin + + S1xybinsize = sqrt((50*50)/(Kr_events/150)); + S1_xbin_min = -25; + S1_xbin_max = 25; + S1_ybin_min = -25; + S1_ybin_max = 25; + SE_ybin_min = -25; + SE_ybin_max = 25; + + S2xybinsize = sqrt((50*50)/(Kr_events/150));%cm +% SExybinsize = 5; DEFINED LATER, based on number of SE events + S2_xbin_min = -25; + S2_xbin_max = 25; + S2_ybin_min = -25; + S2_ybin_max = 25; + SE_xbin_min = -25; + SE_xbin_max = 25; + + + end + + s1_xbins = (S1_xbin_max-S1_xbin_min)./S1xybinsize; + s1_ybins = (S1_ybin_max-S1_ybin_min)./S1xybinsize; + + s2_xbins = (S2_xbin_max-S2_xbin_min)./S2xybinsize; + s2_ybins = (S2_ybin_max-S2_ybin_min)./S2xybinsize; + + %% Kr S1a/S2b map + +%Set up cuts and variables + s1ab_cut=logical(sum(s1_single_cut(:,:),1)); + s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); + s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); + s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); + s1ab_x=d.x_cm(s2_single_cut); + s1ab_y=d.y_cm(s2_single_cut); + s1ab_z=d.z_drift_samples(s2_single_cut)/100; + s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); + s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<25; + %plotting x=s1a v y=s1a/s1b cuts: y<0.035x-1, y>-0.035.*x+5; y>0.01.*x; %y<4.2; x<255 +% s1ab_areacut= (s1a_phe_both./s1b_phe_both-0.035.*s1a_phe_both<-1) & (s1a_phe_both./s1b_phe_both+0.035.*s1a_phe_both>5)... +% & (s1a_phe_both./s1b_phe_both > 0.01.* s1a_phe_both) & (s1a_phe_both./s1b_phe_both<4.2) & (s1a_phe_both<255); + + s1ab_x=s1ab_x(s1ab_timing_cut); + s1ab_y=s1ab_y(s1ab_timing_cut); + s1ab_z=s1ab_z(s1ab_timing_cut); + s1a_phe_both=s1a_phe_both(s1ab_timing_cut); + s1b_phe_both=s1b_phe_both(s1ab_timing_cut); + s1ab_radius=s1ab_radius(s1ab_timing_cut); + + %fidicual Z cut for s1ab_xy measurement + [s1ab_z_hist s1ab_z_hist_bins]=hist(s1ab_z(inrange(s1ab_z,[0,400])),[0:1:400]); + frac_hist=cumsum(s1ab_z_hist)./sum(s1ab_z_hist); + s1ab_z_cut_lower= min(s1ab_z_hist_bins(frac_hist>.10)); + s1ab_z_cut_upper= max(s1ab_z_hist_bins(frac_hist<.90)); + s1ab_z_cut=inrange(s1ab_z,[s1ab_z_cut_lower,s1ab_z_cut_upper]); + + %R cut for s1ab_Z measurement + [upperz_r_hist upperz_r_hist_bins]=hist(s1ab_radius(s1ab_z>s1ab_z_cut_upper & s1ab_radius<=26),[0:1:26]); + [lowerz_r_hist lowerz_r_hist_bins]=hist(s1ab_radius(s1ab_z0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:400]).','gauss1'); + s1b_fit=fit([0:2:300].',hist(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:300]).','gauss1'); + s1a_z_means(i)=s1a_fit.b1; + s1a_z_means_err(i)=s1a_fit.c1/sqrt(2)/sqrt(length(s1a_phe_both(s1ab_r_cut.' & s1a_phe_both>0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1b_z_means(i)=s1b_fit.b1; + s1b_z_means_err(i)=s1b_fit.c1/sqrt(2)/sqrt(length(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1ab_bincenters(i)=z_max-dT_step/2; + i=i+1; + end + +s1ab_z_means=s1a_z_means./s1b_z_means; +s1ab_z_means_err=sqrt( (s1b_z_means_err.*s1a_z_means./(s1b_z_means.^2)).^2 + (s1a_z_means_err./s1b_z_means).^2); + +%fit polynomial to s1az and s1bz, to remove z dependence later in xy fit +[s1a_P, s1a_S]=polyfit(s1ab_bincenters,s1a_z_means,3); +[s1b_P, s1b_S]=polyfit(s1ab_bincenters,s1b_z_means,3); +[s1ab_P, s1ab_S]=polyfit(s1ab_bincenters,s1ab_z_means,2); + +%S1a z dependence plot +s1az_plot=figure; +errorbar(s1ab_bincenters,s1a_z_means,s1a_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a Mean (phe)'); title('S1a Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1a_P,[10:1:320]),'-r','LineWidth',2) + +%S1b z dependence plot +s1bz_plot=figure; +errorbar(s1ab_bincenters,s1b_z_means,s1b_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1b Mean (phe)'); title('S1b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1b_P,[10:1:320]),'-r','LineWidth',2) + +%S1a/b z dependence plot +s1a_over_bz_plot=figure; +errorbar(s1ab_bincenters,s1ab_z_means,s1ab_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a/b'); title('S1 a/b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1ab_P,[10:1:320]),'-r','LineWidth',2) + + +%Correcting z dependence to get XY dependence in same manner that Kr/CH3T +%map does + s1a_phe_both_z=s1a_phe_both.'.*polyval(s1a_P,z_center)./polyval(s1a_P,s1ab_z); + s1b_phe_both_z=s1b_phe_both.'.*polyval(s1b_P,z_center)./polyval(s1b_P,s1ab_z); + + %% S1a/b XY map (after z correction) +s1ab_xbin_min=-25; +s1ab_ybin_min=-25; +s1ab_xbin_max=25; +s1ab_ybin_max=25; +s1ab_xybinsize=sqrt((50*50)/(length(s1ab_z)/300)); +clear s1a_xy_mean s1a_xy_mean_err s1b_xy_mean s1b_xy_mean_err + +s1ab_xbins=s1ab_xbin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_xbin_max; +s1ab_ybins=s1ab_ybin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_ybin_max; + +s1a_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); +s1b_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); + + for x_bin=s1ab_xbin_min:s1ab_xybinsize:(s1ab_xbin_max-s1ab_xybinsize/2); + for y_bin=s1ab_ybin_min:s1ab_xybinsize:(s1ab_ybin_max-s1ab_xybinsize/2); + x_min = x_bin; x_max = x_bin+s1ab_xybinsize; + y_min = y_bin; y_max = y_bin+s1ab_xybinsize; + + x_count=int32(1+x_bin/s1ab_xybinsize+s1ab_xbin_max/s1ab_xybinsize); + y_count=int32(1+y_bin/s1ab_xybinsize+s1ab_ybin_max/s1ab_xybinsize); + + bin_cut = s1ab_z_cut.' & inrange(s1ab_z,[10 330]).' & s1a_phe_both>0 & s1b_phe_both>0 & inrange(s1ab_x,[x_min,x_max]).' & inrange(s1ab_y,[y_min,y_max]).'; + if length(s1a_phe_both_z(bin_cut))>100; + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400])),[0:2:400]).','gauss1'); + s1a_xy_mean(y_count,x_count)=s1a_z_fit.b1; + s1a_xy_mean_err(y_count,x_count)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300])),[0:2:300]).','gauss1'); + s1b_xy_mean(y_count,x_count)=s1b_z_fit.b1; + s1b_xy_mean_err(y_count,x_count)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300]))); + else + s1a_xy_mean(y_count,x_count)=0; + s1a_xy_mean_err(y_count,x_count)=0; + s1b_xy_mean(y_count,x_count)=0; + s1b_xy_mean_err(y_count,x_count)=0; + end + + end + end + s1ab_xy_mean=s1a_xy_mean./s1b_xy_mean; + s1ab_xy_mean_err=sqrt( (s1b_xy_mean_err.*s1a_xy_mean./(s1b_xy_mean.^2)).^2 + (s1a_xy_mean_err./s1b_xy_mean).^2); + + + %Plot s1a XY means + color_range_max=max(max(s1a_xy_mean)); + color_range_min=min(min(s1a_xy_mean(s1a_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1a_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1a_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %Plot s1a XY means + color_range_max=max(max(s1b_xy_mean)); + color_range_min=min(min(s1b_xy_mean(s1b_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1b_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1b_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1b Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1b Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %s1a/b XY Ratio + color_range_max=max(max(s1ab_xy_mean)); + color_range_min=min(min(s1ab_xy_mean(s1ab_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1ab_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a/b Ratio vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a/b Ratio','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + +%% 3D Kr s1a/s1b map +if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +s1ab_xyz_numbins=floor((length(s1ab_z)/200)^(1/3)); %number of bins in one direction +s1ab_xyz_zstep=det_edge/s1ab_xyz_numbins; +s1ab_xyz_xstep=50/s1ab_xyz_numbins; +s1ab_xyz_ystep=50/s1ab_xyz_numbins; +s1ab_xyz_xmax=25; +r_max=25; + +s1ab_xyz_zbins=10+s1ab_xyz_zstep/2:s1ab_xyz_zstep:10+s1ab_xyz_zstep/2+s1ab_xyz_zstep*s1ab_xyz_numbins; %20 us +s1ab_xyz_xbins=(-r_max+s1ab_xyz_xstep/2):s1ab_xyz_xstep:r_max; +s1ab_xyz_ybins=(-r_max+s1ab_xyz_ystep/2):s1ab_xyz_ystep:r_max; + +s1a_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + + %Count the number of events per bin + Count_S1ab_3D(l,m,n)=length(s1a_phe_both(q)); + + if (Count_S1ab_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_xyz_mean(l,m,n)=s1a_z_fit.b1; + s1a_xyz_mean_err(l,m,n)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]) ),[0:2:300]).','gauss1'); + s1b_xyz_mean(l,m,n)=s1b_z_fit.b1; + s1b_xyz_mean_err(l,m,n)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); + else %not enough stats to do the fit + s1a_xyz_mean(l,m,n)=0; + s1a_xyz_mean_err(l,m,n)=0; + s1b_xyz_mean(l,m,n)=0; + s1b_xyz_mean_err(l,m,n)=0; + end + + end + end +k +end + + s1ab_xyz_mean=s1a_xyz_mean./s1b_xyz_mean; + s1ab_xyz_mean_err=sqrt( (s1b_xyz_mean_err.*s1a_xyz_mean./(s1b_xyz_mean.^2)).^2 + (s1a_xyz_mean_err./s1b_xyz_mean).^2); + +end + %% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % Removing field dependence from S1 and S2 + % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + %Hardcoded numbers from Energy Chi2 Fit + + +% +% s1ab_s2_xyz_fit_map.p1=-0.4988; +% s1ab_s2_xyz_fit_map.p2=1.484; +% c1=1-s1ab_s2_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s2_xyz_fit_map.p2; +% s1ab_s2_xyz_fit_map.p3=c1; +% +% s1ab_s1_xyz_fit_map.p1=0.065; +% s1ab_s1_xyz_fit_map.p2=0.02; +% c2=1-s1ab_s1_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s1_xyz_fit_map.p2; +% s1ab_s1_xyz_fit_map.p3=c2; +% +% +% %If we can use 3D map, do so. If there aren't enough events do 1D then 2D +% if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +% %Removing zeros from map with nearest neighbor method +% s1ab_xyz_mean_old=s1ab_xyz_mean; +% temp_map=s1ab_xyz_mean; +% q= ~isnan(temp_map); +% r=nearestpoint(find(~q),find(q)); +% s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); +% +% %interpolating with cubic so that we get NaN when extrapolating +% s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); +% s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); +% s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); +% s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); +% +% %Filling in NaN values with the s1a/s1b Z map polynomial +% s1as1b_zvalues= polyval(s1ab_P,drift_time); +% s1as1b_z_at_center=s1as1b_at_center; +% s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); +% s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); +% s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); +% s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); +% +% s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +% s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +% s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +% s1_phe_both=s1_phe_both./s1_3Dfieldremoval; +% +% +% else %Only do 1D in this case +% %Removing zeros from map with nearest neighbor method +% s1ab_xy_mean_old=s1ab_xy_mean; +% temp_map=s1ab_xy_mean; +% q= ~isnan(temp_map); +% r=nearestpoint(find(~q),find(q)); +% s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); +% +% %interpolating with cubic so that we get NaN when extrapolating +% s1as1b_zvalues= polyval(s1ab_P,drift_time); +% s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); +% s1as1b_z_at_center=polyval(s1ab_P,z_center); +% s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); +% +% s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); +% s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); +% s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); +% s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); +% +% %Filling in NaN values with no XY correction. (Z dependence should never be NaN) +% s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; +% s2_zfieldremoval(isnan(s2_zfieldremoval))=1; +% s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; +% s1_zfieldremoval(isnan(s1_zfieldremoval))=1; +% +% +% s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +% s2_phe_both=s2_phe_both./(s2_zfieldremoval); +% s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +% s1_phe_both=s1_phe_both./(s1_zfieldremoval); +% +% +% +% end + + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S1 Z-dependence (Both PMT arrays) +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + + light_correction_fig = figure; + errorbar(mean_index,means,means_error,'.k'); + hold on + [yplot_s1_both] = polyval(P_s1_both,dT_fit); + [center_s1_both, center_s1_both_err] = polyval(P_s1_both,z_center, S); %160[us]*1.51[\mus/us] + plot(dT_fit,yplot_s1_both,'-r','LineWidth',1); + xlabel('Depth (\mus)', 'FontSize',16); ylabel('Mean (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S1 Mean vs. Z'), 'FontSize', 16,'Interpreter','none'); + line([0 det_edge],[center_s1_both center_s1_both],'linestyle','--'); + line([z_center; z_center;],[min(means) max(means)],'linestyle','--'); + legend('S1\_both Mean', strcat('y=', num2str(P_s1_both(1),'%10.2e'), '*Z^2 + ', num2str(P_s1_both(2),'%10.2e')... + , '*Z + ', num2str(P_s1_both(3),4)),strcat('Det center = ',num2str(center_s1_both,4), ' [Phe]'),'location','northwest') + + box on; + myfigview(16); + xlim([0 det_edge]); + ylim([0.8*min(means) 1.15*max(means)]); + + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + + + + + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + + %%calculate S2/S1 also, just to double check the lifetime from S2 only + % hist_s2_both_s1(:,bin)= hist(s2_phe_both(time_cut)./s1_phe_both_z(time_cut),x3)'; + % temp_hist=hist_s2_both_s1(:,bin); + %Fit_s2_both_s1{bin}=fit(x3(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + % means_s2_s1(bin)=Fit_s2_both_s1{bin}.b1; + % means_error_s2_s1(bin) = Fit_s2_both_s1{bin}.c1/2/sqrt(sum(hist_s2_both_s1(:,bin))); % == sigma/sqrt(N); + % mean_index_s2_s1(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + + dT_range= inrange( mean_index,[5+bin_size,500] );%from 50 to 300us for the fit + + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + %%Tracker for pseudo-lifetime + s2_at_bottom_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_both=-320/log(s2_at_bottom_both/s2_at_top_both); + + dT_fit=0:1:det_edge; + + Fit_EL= fit(mean_index(dT_range),means(dT_range),'exp1'); + yfitEL = Fit_EL.a.*exp(Fit_EL.b.*dT_fit); + + e_lifetime_both=-1/Fit_EL.b; + s2_z0_both=Fit_EL.a; + + b=confint(Fit_EL, 0.683);%1 sigma matrix + sigma_e_lifetime_both=(1/b(1,2)-1/b(2,2))/2; + sigma_s2_z0_both=(b(2,1)-b(1,1))/2; + + lifetime_fig_both = figure; + errorbar(mean_index(2:end),means(2:end),means_error(2:end),'.k'); %first bin is anode, skip it + hold on + plot(dT_fit,yfitEL,'-r','LineWidth',1); + xlabel('Time (\mus)', 'FontSize',16); ylabel('Mean S2 (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S2_both Electron Lifetime'), 'FontSize', 16,'Interpreter','none'); + legend('S2\_both Mean', strcat( '\lambda= ', num2str(e_lifetime_both,4), ' \pm ', num2str(sigma_e_lifetime_both,2), ' \mus' )... + ,'location','northeast'); + myfigview(16); + xlim([0 det_edge]); + + + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_ybins),floor(s2_xbins)); +Sigma_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); +Count_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + +color_range_max=max(max(mean_S2_both_xy)); +color_range_min=min(min(mean_S2_both_xy(mean_S2_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + +s2_xy_both_fig = figure; +contourf(s2xbins,s2ybins,mean_S2_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. S2 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_ybins),floor(s1_xbins)); +Sigma_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); +Count_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +color_range_max=max(max(mean_S1_both_xy)); +color_range_min=min(min(mean_S1_both_xy(mean_S1_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + + +s1_xy_both_fig = figure; +contourf(s1xbins,s1ybins,mean_S1_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp,'. S1 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%% Apply corrections to CH3T and calculate the ER band + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\Run04_CH3T\KrypCal2p18_IQs\MakePlots\CH3T_Sep2015_Kr2p18.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +%% Make ER Band + +s1_min=0; +s1_max=50; + +%% First make plot of CH3T selection + +figure +plot(log10(s2_phe_both_xyz),log10(s1_phe_both_xyz),'.k') +cc=colorbar; +ylabel(cc,'Count','FontSize',16); +caxis +hold on; +xlabel('log10(Corrected S2)'); ylabel ('log10(Corrected S1)'); myfigview(16) +x=[2:0.001:4.585]; +y=-0.7.*x+5; +plot(x,y,'-b','LineWidth',2); +y=-0.7.*x+2; +plot(x,y,'-b','LineWidth',2); +y=2.*x-5; +plot(x,y,'-b','LineWidth',2); +y=2.*x-7.3; +plot(x,y,'-b','LineWidth',2); +title('Sep2015 CH3T'); + + + + +%% First figure out where the outliers are in space + +pulse_area_cut= (log10(s1_phe_both_xyz)+0.7*log10(s2_phe_both_xyz)<5) & (log10(s1_phe_both_xyz)+0.7*log10(s2_phe_both_xyz)>2) & ... + (log10(s1_phe_both_xyz)-2*log10(s2_phe_both_xyz)<-5) & (log10(s1_phe_both_xyz)-2*log10(s2_phe_both_xyz)>-7.3); + + +max_r=21; + +dT_step=30; + +bin_counter=1; +for dT_max=10+dT_step:dT_step:300; + +fiducial_cut=inrange(drift_time,[dT_max-dT_step, dT_max]) & inrange(s2radius_del,[0,max_r]); + +tritium_cut= clean_cut & pulse_area_cut & fiducial_cut; + + + + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:.05:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=tritium_cut & inrange(s1_phe_both_xyz,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(ER_fit_cut)./s1_phe_both_xyz(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); + %ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit{bin_counter}=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + + + ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit{bin_counter}=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + + ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit{bin_counter}=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + + bin_counter=bin_counter+1; +end + + + %Make Plot + + figure; + hold on + ylabel('Corrected log10(S2/S1)'); xlabel('S1 corrected (Pulse Area Phe)'); + title(sprintf('Run 04 CH3T, R<%d cm',max_r),'fontsize',16,'Interpreter','none'); + myfigview(16); + ylim([0 3.5]);xlim([0 s1_max]); + + colors={[1 0 0],[0 1 0],[0 0 1],[0 0 0],[1 1 0]}; + color_counter=1; + for i=[1,5,9]; + plot(ER_bins,ER_lower_fit{i},'--','Color',colors{color_counter},'markersize',14,'linewidth',2) + plot(ER_bins,ER_mean_fit{i},'-','Color',colors{color_counter},'markersize',20,'linewidth',2) + plot(ER_bins,ER_upper_fit{i},'--','Color',colors{color_counter},'markersize',14,'linewidth',2) + color_counter=color_counter+1; + end + + save('ERBand_Z_Dep_NoFieldCorr','ER_bins','ER_lower_fit','ER_mean_fit','ER_upper_fit'); diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Z_Dependence/OverlayAllBands.m b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Z_Dependence/OverlayAllBands.m new file mode 100644 index 0000000..a6c56c5 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/ERBand_Z_Dependence/OverlayAllBands.m @@ -0,0 +1,74 @@ +x=[0:0.1:50]; + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p22\KrypCal2p22_QualityChecks\ERBand_Prediction\Sep2015_ERFit.mat') +y_Sep2015_lower=ER_lower_power_fit.a.*x.^ER_lower_power_fit.b; +y_Sep2015_middle=ER_mean_power_fit.a.*x.^ER_mean_power_fit.b; +y_Sep2015_upper=ER_upper_power_fit.a.*x.^ER_upper_power_fit.b; + + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p22\KrypCal2p22_QualityChecks\ERBand_Prediction\Sep2014_ERFit.mat') +y_Sep2014_lower=ER_lower_power_fit.a.*x.^ER_lower_power_fit.b; +y_Sep2014_middle=ER_mean_power_fit.a.*x.^ER_mean_power_fit.b; +y_Sep2014_upper=ER_upper_power_fit.a.*x.^ER_upper_power_fit.b; + + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p22\KrypCal2p22_QualityChecks\ERBand_Prediction\Nov2014_ERFit.mat') +y_Nov2014_lower=ER_lower_power_fit.a.*x.^ER_lower_power_fit.b; +y_Nov2014_middle=ER_mean_power_fit.a.*x.^ER_mean_power_fit.b; +y_Nov2014_upper=ER_upper_power_fit.a.*x.^ER_upper_power_fit.b; + + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p22\KrypCal2p22_QualityChecks\ERBand_Prediction\Feb2015_ERFit.mat') +y_Feb2015_lower=ER_lower_power_fit.a.*x.^ER_lower_power_fit.b; +y_Feb2015_middle=ER_mean_power_fit.a.*x.^ER_mean_power_fit.b; +y_Feb2015_upper=ER_upper_power_fit.a.*x.^ER_upper_power_fit.b; + + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p22\KrypCal2p22_QualityChecks\ERBand_Prediction\Feb2016_ERFit.mat') +y_Feb2016_lower=ER_lower_power_fit.a.*x.^ER_lower_power_fit.b; +y_Feb2016_middle=ER_mean_power_fit.a.*x.^ER_mean_power_fit.b; +y_Feb2016_upper=ER_upper_power_fit.a.*x.^ER_upper_power_fit.b; + +figure +hold on; +plot(x,y_Sep2014_middle,'-k','LineWidth',2,'Color',[0 0 1]); +plot(x,y_Nov2014_middle,'-k','LineWidth',2,'Color',[0 1 0]); +plot(x,y_Feb2015_middle,'-k','LineWidth',2,'Color',[1 0 0]); +plot(x,y_Sep2015_middle,'-k','LineWidth',2,'Color',[0 0 0]); +plot(x,y_Feb2016_middle,'-k','LineWidth',2,'Color',[1 0 1]); +xlabel('Corrected S1 (phe)'); +ylabel('Corrected log10(S2/S1)'); +legend('Sep2014','Nov2014','Feb2015','Sep2015','Feb2016'); +myfigview(16); +plot(x,y_Sep2015_lower,'--k','LineWidth',2,'Color',[0.6 0.6 0.6]); +plot(x,y_Feb2015_lower,'--k','LineWidth',2,'Color',[1 0.6 0.6]); +plot(x,y_Nov2014_lower,'--k','LineWidth',2,'Color',[0.6 1 0.6]); +plot(x,y_Sep2014_lower,'--k','LineWidth',2,'Color',[0.6 0.6 1]); +plot(x,y_Sep2015_upper,'--k','LineWidth',2,'Color',[0.6 0.6 0.6]); +plot(x,y_Feb2015_upper,'--k','LineWidth',2,'Color',[1 0.6 0.6]); +plot(x,y_Nov2014_upper,'--k','LineWidth',2,'Color',[0.6 1 0.6]); +plot(x,y_Sep2014_upper,'--k','LineWidth',2,'Color',[0.6 0.6 1]); +plot(x,y_Feb2016_lower,'--k','LineWidth',2,'Color',[1 0.6 1]); +plot(x,y_Feb2016_upper,'--k','LineWidth',2,'Color',[1 0.6 1]); + +ylim([1.8 3]) + +%% Plot without 2014 data + +figure +hold on; +plot(x,y_Feb2015_middle,'-k','LineWidth',2,'Color',[0 0 1]); +plot(x,y_Sep2015_middle,'-k','LineWidth',2,'Color',[0 1 0]); +plot(x,y_Feb2016_middle,'-k','LineWidth',2,'Color',[1 0 0]); +xlabel('Corrected S1 (phe)'); +ylabel('Corrected log10(S2/S1)'); +h_leg=legend('Feb2015','Sep2015','Feb2016'); +myfigview(22); +plot(x,y_Sep2015_lower,'--k','LineWidth',2,'Color',[0.6 1 0.6]); +plot(x,y_Feb2015_lower,'--k','LineWidth',2,'Color',[0.6 0.6 1]); +plot(x,y_Sep2015_upper,'--k','LineWidth',2,'Color',[0.6 1 0.6]); +plot(x,y_Feb2015_upper,'--k','LineWidth',2,'Color',[0.6 0.6 1]); +plot(x,y_Feb2016_lower,'--k','LineWidth',2,'Color',[1 0.6 0.6]); +plot(x,y_Feb2016_upper,'--k','LineWidth',2,'Color',[1 0.6 0.6]); +set(h_leg,'FontSize',25) +ylim([1.8 3]) \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/EnergyReconstructionAndG1EE/Chi2Info_NoFieldCorr.docx b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/EnergyReconstructionAndG1EE/Chi2Info_NoFieldCorr.docx new file mode 100644 index 0000000000000000000000000000000000000000..f5eda34ac235b738a2917ed290fd8dd20a12e238 GIT binary patch literal 20109 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 %require 100,000 events to do 3D binning +% %Removing zeros from map with nearest neighbor method +% s1ab_xyz_mean_old=s1ab_xyz_mean; +% temp_map=s1ab_xyz_mean; +% q= ~isnan(temp_map); +% r=nearestpoint(find(~q),find(q)); +% s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); +% +% %interpolating with cubic so that we get NaN when extrapolating +% s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); +% s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); +% s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); +% s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); +% +% %Filling in NaN values with the s1a/s1b Z map polynomial +% s1as1b_zvalues= polyval(s1ab_P,drift_time); +% s1as1b_z_at_center=s1as1b_at_center; +% s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); +% s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); +% s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); +% s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); +% +% s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +% s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +% s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +% s1_phe_both=s1_phe_both./s1_3Dfieldremoval; +% +% +% else +% %Removing zeros from map with nearest neighbor method +% s1ab_xy_mean_old=s1ab_xy_mean; +% temp_map=s1ab_xy_mean; +% q= ~isnan(temp_map); +% r=nearestpoint(find(~q),find(q)); +% s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); +% +% %interpolating with cubic so that we get NaN when extrapolating +% s1as1b_zvalues= polyval(s1ab_P,drift_time); +% s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); +% s1as1b_z_at_center=polyval(s1ab_P,z_center); +% s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); +% +% s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); +% s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); +% s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); +% s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); +% +% %Filling in NaN values with no XY correction. (Z dependence should never be NaN) +% s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; +% s2_zfieldremoval(isnan(s2_zfieldremoval))=1; +% s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; +% s1_zfieldremoval(isnan(s1_zfieldremoval))=1; +% +% +% s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +% s2_phe_both=s2_phe_both./(s2_zfieldremoval); +% s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +% s1_phe_both=s1_phe_both./(s1_zfieldremoval); +% +% +% +% end + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=1000; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1500]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[5+bin_size, 500] );%from 50 to 300us for the fit, based on when s1as1b values get strange + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + %%Tracker for pseudo-lifetime + s2_at_bottom=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_2015=-320/log(s2_at_bottom/s2_at_top); + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_xbins),floor(s2_ybins)); +Sigma_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); +Count_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_xbins),floor(s1_ybins)); +Sigma_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); +Count_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XYZ. 3D Map, caluculate and Submit IQ +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% if Kr_events>150000 +% +% % LUXkrypCal_S1_3D(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_distance_\mus,user_name,file_id_cp,dp_version,submit); +% LUXkrypCal_S1_3D_Run04_local_2p14FixedZHisto(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_time,x_center,y_center,z_center,det_edge,inpaint_on,user_name,file_id_cp,dp_version, algorithm_name, submit); +% +% +% end + + +%% Apply corrections to CH3T and calculate the ER band shift + +%First load the data + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\CH3T_Sep2015_NoCorrections.mat'); + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = S2_x; +s1_y_cm = S2_y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,S2_x,S2_y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + h3_cut= inrange(drift_time,[40 300]) & inrange(s1_phe_both,[0 120]) ... + & (log10(s1_phe_both)+0.8*log10(s2_phe_both)<5.2) .... + & (log10(s1_phe_both)-2*log10(s2_phe_both)>-6.8) & (log10(s1_phe_both)-2*log10(s2_phe_both)<-4.8)... + & s2_phe_both>100 & s2_phe_both<16000 & s2radius<25; %used to be drift time 100 to 250 + +h3_s1_c_2015=s1_phe_both_xyz(h3_cut); +h3_s2_c_2015=s2_phe_both_xyz(h3_cut); + + + kr_cut= inrange(drift_time,[40 300]) & inrange(s1_phe_both,[30 1000]) ... + & (log10(s1_phe_both)+0.6*log10(s2_phe_both)>4.5) & (log10(s1_phe_both)+0.6*log10(s2_phe_both)<5.05) ... + & (log10(s1_phe_both)-2*log10(s2_phe_both)>-7.6) & (log10(s1_phe_both)-2*log10(s2_phe_both)<-4.7) ... + & s2_phe_both>3000 & s2_phe_both<60000 & s2radius<25; %used to be drift time 100 to 250 + +kr_s1_c_2015=s1_phe_both_xyz(kr_cut); +kr_s2_c_2015=s2_phe_both_xyz(kr_cut); +kr_2015_drift_time=drift_time(kr_cut); +kr_2015_s2x=S2_x(kr_cut); +kr_2015_s2y=S2_y(kr_cut); + + clearvars -except param_counter a1_list b1_list a2_list b2_list total_chi2_list h3_chi2_list kr_chi2_list g1_list g2_list total_chi2_map h3_chi2_map kr_chi2_map chi2_midtobot_list... + best_chi2_midtotop besta1_midtotop besta2_midtotop bestb1_midtotop bestb2_midtotop best_chi2_midtobot... + besta1_midtobot besta1_midtotop bestb1_midtobot bestb1_midtotop a1 b1 a2 b2 c2 chi2_midtotop_map chi2_midtobot_map b_counter a_counter... + besta1_combined bestb1_combined besta2_combined bestb2_combined best_chi2_combined chi2_combined_map chi2_combined_list b1_counter a1_counter a2_counter b2_counter... + a1_counter b1_counter a2_counter b2_counter c1_list c2_list bestc1_midtobot bestc2_midtobot bestc1_midtotop bestc2_midtotop bestc1_combined bestc2_combined... + besta1_combined besta2_combined bestb1_combined bestb2_combined besta1 bestb1 bestc1 besta2 bestb2 bestc2 bestg1 bestg2 best_total_chi2 NEST_CH3T_Spectrum inpaint_on... + best_kr_chi2 best_h3_chi2 electron_lifetime_list electron_lifetime_map a2_start a1_start b1_start b2_start ... + total_h3_chi2_list total_kr_chi2_list total_chi2_list h3_chi2_2016_list h3_chi2_2015_list kr_chi2_2016_list kr_chi2_2015_list ... + electron_lifetime_2016_list electron_lifetime_2015_list total_h3_chi2_map total_kr_chi2_map total_chi2_map h3_chi2_2016_map h3_chi2_2015_map ... + kr_chi2_2016_map kr_chi2_2015_map electron_lifetime_2016_map electron_lifetime_2015_map NEST_CH3T_Spectrum_Sep2015 NEST_CH3T_Spectrum_Feb2016 g1 g2 bestg1 bestg2 g1_counter g2_counter ... + firsta1 firstb1 firsta2 firstb2 firstg1 firstg2 kr_means_2015_map kr_means_2016_map kr_sigma_2015_map kr_sigma_2016_map kr_staterr_2015_map kr_staterr_2016_map ... + kr_means_2015_list kr_means_2016_list kr_2015_num_events kr_2016_num_events kr_sigma_2015_list kr_sigma_2016_list kr_staterr_2015_list kr_staterr_2016_list ... + pseudo_lifetime_2016 pseudo_lifetime_2015 kr_s1_c_2015 kr_s2_c_2015 h3_s1_c_2015 h3_s2_c_2015 s1ab_s2_xyz_fit_map s1ab_s1_xyz_fit_map ... + kr_2015_drift_time kr_2015_s2x kr_2015_s2y kr_chi2_2016_zslice_list kr_chi2_2015_zslice_list kr_chi2_zslice_zcenter_list ... + full_kr_chi2_2016_list full_kr_chi2_2015_list best_total_kr_chi2 best_total_h3_chi2 alternate_total_chi2_map alternate_total_chi2_list ... + best_total_alternate_chi2 best_total_alternate_kr_chi2 best_total_alternate_h3_chi2 besta2_alternate bestb2_alternate bestg1_alternate bestg2_alternate bestc2_alternate ... + total_h3_chi2_nothresh_list total_chi2_nothresh_list alternate_total_chi2_nothresh_list h3_chi2_2015_nothresh_list h3_chi2_2016_nothresh_list ... + total_h3_chi2_nothresh_map total_chi2_nothresh_map alternate_total_chi2_nothresh_map h3_chi2_2016_nothresh_map h3_chi2_2015_nothresh_map ... + best_total_chi2_nothresh best_total_kr_chi2_nothresh best_total_h3_chi2_nothresh besta2_nothresh bestb2_nothresh bestc2_nothresh bestg1_nothresh bestEE_nothresh ... + best_total_alternate_chi2_nothresh best_total_alternate_kr_chi2_nothresh best_total_alternate_h3_chi2_nothresh besta2_alternate_nothresh bestb2_alternate_nothresh ... + bestc2_alternate_nothresh bestg1_alternate_nothresh bestEE_alternate_nothresh best_total_chi2_nothresh best_total_alternate_chi2_nothresh ee_list ... + total_h3_chi2_nothresh_separatescaling_list total_chi2_nothresh_separatescaling_list best_total_chi2_nothresh_separatescaling ... + best_total_kr_chi2_nothresh_separatescaling best_total_h3_chi2_nothresh_separatescaling besta2_nothresh_separatescaling ... + bestc2_nothresh_separatescaling bestg1_nothresh_separatescaling bestEE_nothresh_separatescaling ... + total_h3_chi2_nothresh_separatescaling_map total_chi2_nothresh_separatescaling_map bestEE_nothresh ... + h3_chi2_2015_nothresh_separatescaling_list h3_chi2_2016_nothresh_separatescaling_list ee_list ... + h3_chi2_2016_oldsim_list h3_chi2_2015_oldsim_list total_h3_chi2_oldsim_list total_chi2_oldsim_list ... + best_total_chi2_oldsim best_total_kr_chi2_oldsim best_total_h3_chi2_oldsim besta2_oldsim bestb2_oldsim ... + bestc2_oldsim bestg1_oldsim bestEE_oldsim NEST_CH3T_Spectrum_old + + + +%%%%%%%%%%%%%%%%%%%%% +%% REPEAT FOR 2014 DATA +%%%%%%%%%%%%%%%%%%%%% + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\MappingParametersFit_Start_2016_CutDown.mat') + +% %If we can use 3D map, do so. If there aren't enough events do 1D then 2D +% if length(s1ab_z)>90000; %require 100,000 events to do 3D binning +% %Removing zeros from map with nearest neighbor method +% s1ab_xyz_mean_old=s1ab_xyz_mean; +% temp_map=s1ab_xyz_mean; +% q= ~isnan(temp_map); +% r=nearestpoint(find(~q),find(q)); +% s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); +% +% %interpolating with cubic so that we get NaN when extrapolating +% s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); +% s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); +% s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); +% s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); +% +% %Filling in NaN values with the s1a/s1b Z map polynomial +% s1as1b_zvalues= polyval(s1ab_P,drift_time); +% s1as1b_z_at_center=s1as1b_at_center; +% s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); +% s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); +% s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); +% s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); +% +% s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +% s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +% s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +% s1_phe_both=s1_phe_both./s1_3Dfieldremoval; +% +% +% else +% %Removing zeros from map with nearest neighbor method +% s1ab_xy_mean_old=s1ab_xy_mean; +% temp_map=s1ab_xy_mean; +% q= ~isnan(temp_map); +% r=nearestpoint(find(~q),find(q)); +% s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); +% +% %interpolating with cubic so that we get NaN when extrapolating +% s1as1b_zvalues= polyval(s1ab_P,drift_time); +% s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); +% s1as1b_z_at_center=polyval(s1ab_P,z_center); +% s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); +% +% s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); +% s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); +% s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); +% s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); +% +% %Filling in NaN values with no XY correction. (Z dependence should never be NaN) +% s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; +% s2_zfieldremoval(isnan(s2_zfieldremoval))=1; +% s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; +% s1_zfieldremoval(isnan(s1_zfieldremoval))=1; +% +% +% s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +% s2_phe_both=s2_phe_both./(s2_zfieldremoval); +% s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +% s1_phe_both=s1_phe_both./(s1_zfieldremoval); +% +% +% +% end + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[5+bin_size, 500] );%from 50 to 300us for the fit, based on when s1as1b values get strange + +s2_both_norm_z_index=mean_index(dT_range); +s2_both_norm_z_means=means(dT_range); + s2_at_top=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + %%Tracker for pseudo-lifetime + s2_at_bottom=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_2016=-320/log(s2_at_bottom/s2_at_top); +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_xbins),floor(s2_ybins)); +Sigma_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); +Count_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_xbins),floor(s1_ybins)); +Sigma_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); +Count_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Apply corrections to 2016 Kr data +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\MappingParametersFit_Start_2016_CutDown.mat') + + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; +% +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate ER Band shift +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + liquid_cut= inrange(drift_time,[40 300]) ... + & (log10(s1_phe_both)+0.7*log10(s2_phe_both)>4.9) & (log10(s1_phe_both)+0.7*log10(s2_phe_both)<5.5) ... + & s2_phe_both>3000 & s2_phe_both<80000 & s2radius<25; %used to be drift time 100 to 250 + + +kr_s1_c_2016=s1_phe_both_xyz(liquid_cut); +kr_s2_c_2016=s2_phe_both_xyz(liquid_cut); +kr_2016_drift_time=drift_time(liquid_cut); +kr_2016_s2x=s2x(liquid_cut); +kr_2016_s2y=s2y(liquid_cut); + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%Apply Corrections to 2016 CH3T Data +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\CH3T_Feb2016_NoCorrections.mat'); + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +% electron_lifetime_2016=e_lifetime_both; +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate ER Band shift +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +s1_min=0; +s1_max=120; + + %% Redo with r<10 cm + + + liquid_cut= clean_cut & inrange(drift_time,[40 300]) ... + & (log10(s1_phe_both)+log10(s2_phe_both)<5.9) & (log10(s1_phe_both)-2.*log10(s2_phe_both)<-4.8) ... + & (log10(s1_phe_both)-2.*log10(s2_phe_both)>-6.8) ... + & s2_phe_both>600 & s2_phe_both<16000 & s2radius<25; %used to be drift time 100 to 250 + + + +h3_s1_c_2016=s1_phe_both_xyz(liquid_cut); +h3_s2_c_2016=s2_phe_both_xyz(liquid_cut); + + clearvars -except param_counter a1_list b1_list a2_list b2_list total_chi2_list h3_chi2_list kr_chi2_list g1_list g2_list total_chi2_map h3_chi2_map kr_chi2_map chi2_midtobot_list... + best_chi2_midtotop besta1_midtotop besta2_midtotop bestb1_midtotop bestb2_midtotop best_chi2_midtobot... + besta1_midtobot besta1_midtotop bestb1_midtobot bestb1_midtotop a1 b1 a2 b2 chi2_midtotop_map chi2_midtobot_map b_counter a_counter... + besta1_combined bestb1_combined besta2_combined bestb2_combined best_chi2_combined chi2_combined_map chi2_combined_list b1_counter a1_counter a2_counter b2_counter... + a1_counter b1_counter a2_counter b2_counter c1_list c2_list bestc1_midtobot bestc2_midtobot bestc1_midtotop bestc2_midtotop bestc1_combined bestc2_combined... + besta1_combined besta2_combined bestb1_combined bestb2_combined besta1 bestb1 bestc1 besta2 bestb2 bestc2 bestg1 bestg2 best_total_chi2 NEST_CH3T_Spectrum inpaint_on... + best_kr_chi2 best_h3_chi2 electron_lifetime_list electron_lifetime_map a2_start a1_start b1_start b2_start ... + total_h3_chi2_list total_kr_chi2_list total_chi2_list h3_chi2_2016_list h3_chi2_2015_list kr_chi2_2016_list kr_chi2_2015_list ... + electron_lifetime_2016_list electron_lifetime_2015_list total_h3_chi2_map total_kr_chi2_map total_chi2_map h3_chi2_2016_map h3_chi2_2015_map ... + kr_chi2_2016_map kr_chi2_2015_map electron_lifetime_2016_map electron_lifetime_2015_map NEST_CH3T_Spectrum_Sep2015 NEST_CH3T_Spectrum_Feb2016 g1 g2 bestg1 bestg2 g1_counter g2_counter ... + firsta1 firstb1 firsta2 firstb2 firstg1 firstg2 kr_means_2015_map kr_means_2016_map kr_sigma_2015_map kr_sigma_2016_map kr_staterr_2015_map kr_staterr_2016_map ... + kr_means_2015_list kr_means_2016_list kr_2015_num_events kr_2016_num_events kr_sigma_2015_list kr_sigma_2016_list kr_staterr_2015_list kr_staterr_2016_list ... + pseudo_lifetime_2016 pseudo_lifetime_2015 kr_s1_c_2015 kr_s2_c_2015 h3_s1_c_2015 h3_s2_c_2015 kr_s1_c_2016 kr_s2_c_2016 h3_s1_c_2016 h3_s2_c_2016 ... + kr_2015_drift_time kr_2015_s2x kr_2015_s2y kr_2016_drift_time kr_2016_s2x kr_2016_s2y ... + kr_chi2_2016_zslice_list kr_chi2_2015_zslice_list kr_chi2_zslice_zcenter_list ... + full_kr_chi2_2016_list full_kr_chi2_2015_list best_total_kr_chi2 best_total_h3_chi2 alternate_total_chi2_map alternate_total_chi2_list ... + best_total_alternate_chi2 best_total_alternate_kr_chi2 best_total_alternate_h3_chi2 besta2_alternate bestb2_alternate bestg1_alternate bestg2_alternate bestc2_alternate c2 ... + total_h3_chi2_nothresh_list total_chi2_nothresh_list alternate_total_chi2_nothresh_list h3_chi2_2015_nothresh_list h3_chi2_2016_nothresh_list ... + total_h3_chi2_nothresh_map total_chi2_nothresh_map alternate_total_chi2_nothresh_map h3_chi2_2016_nothresh_map h3_chi2_2015_nothresh_map ... + best_total_chi2_nothresh best_total_kr_chi2_nothresh best_total_h3_chi2_nothresh besta2_nothresh bestb2_nothresh bestc2_nothresh bestg1_nothresh bestEE_nothresh ... + best_total_alternate_chi2_nothresh best_total_alternate_kr_chi2_nothresh best_total_alternate_h3_chi2_nothresh besta2_alternate_nothresh bestb2_alternate_nothresh ... + bestc2_alternate_nothresh bestg1_alternate_nothresh bestEE_alternate_nothresh best_total_chi2_nothresh best_total_alternate_chi2_nothresh ee_list ... + total_h3_chi2_nothresh_separatescaling_list total_chi2_nothresh_separatescaling_list best_total_chi2_nothresh_separatescaling ... + best_total_kr_chi2_nothresh_separatescaling best_total_h3_chi2_nothresh_separatescaling besta2_nothresh_separatescaling ... + bestc2_nothresh_separatescaling bestg1_nothresh_separatescaling bestEE_nothresh_separatescaling ... + total_h3_chi2_nothresh_separatescaling_map total_chi2_nothresh_separatescaling_map bestEE_nothresh ... + h3_chi2_2015_nothresh_separatescaling_list h3_chi2_2016_nothresh_separatescaling_list ee_list ... + h3_chi2_2016_oldsim_list h3_chi2_2015_oldsim_list total_h3_chi2_oldsim_list total_chi2_oldsim_list ... + best_total_chi2_oldsim best_total_kr_chi2_oldsim best_total_h3_chi2_oldsim besta2_oldsim bestb2_oldsim ... + bestc2_oldsim bestg1_oldsim bestEE_oldsim NEST_CH3T_Spectrum_old +%% Make plots + + + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\NEST_CH3T_Spectrum_old.mat') + + + + +best_total_chi2=100000000; + +counter=1; +for g1=0.09:0.005:0.125; + for ee=0.75:0.01:1.2; + + g2_feb2016=25.05*ee; %converting to g2 with SE size + g2_sep2015=25.8536*ee; +%Kr 2014 data + +Kr_E_2016=(1/73).*(kr_s1_c_2016./g1+kr_s2_c_2016./g2_feb2016); +H3_E_2016=(1/73).*(h3_s1_c_2016./g1+h3_s2_c_2016./g2_feb2016); + +Kr_E_2015=(1/73).*(kr_s1_c_2015./g1+kr_s2_c_2015./g2_sep2015); +H3_E_2015=(1/73).*(h3_s1_c_2015./g1+h3_s2_c_2015./g2_sep2015); + +i=1; +for dT_max=40+20/2:20:300-20/2; + temp_fit_2016=fit([0:1:100].',hist(Kr_E_2016(inrange(kr_2016_drift_time,[dT_max-20 dT_max])),[0:1:100]).','gauss1'); + kr_2016_means(i)=temp_fit_2016.b1; + kr_2016_means_err(i)=temp_fit_2016.c1/sqrt(2)/length(Kr_E_2016(inrange(kr_2016_drift_time,[dT_max-20 dT_max]))); + + temp_fit_2015=fit([0:1:100].',hist(Kr_E_2015(inrange(kr_2015_drift_time,[dT_max-20 dT_max])),[0:1:100]).','gauss1'); + kr_2015_means(i)=temp_fit_2015.b1; + kr_2015_means_err(i)=temp_fit_2015.c1/sqrt(2)/length(Kr_E_2015(inrange(kr_2015_drift_time,[dT_max-20 dT_max]))); + + dT_centers(i)=dT_max-10; + i=i+1; +end + +kr_2016_chi2_slices=((41.55-kr_2016_means)./0.2395).^2; +kr_2015_chi2_slices=((41.55-kr_2015_means)./0.2395).^2; + + %make CH3T data spectrum + [h3_hist_2016,h3_hist_bin_2016]=hist(H3_E_2016,NEST_CH3T_Spectrum_old(1,:)); + [h3_hist_2015,h3_hist_bin_2015]=hist(H3_E_2015,NEST_CH3T_Spectrum_old(1,:)); + + scale_factor_2015_oldsim=sum(h3_hist_2015(17:80))/sum(NEST_CH3T_Spectrum_old(2,17:80)); + h3_scaled_oldsim_2015=scale_factor_2015_oldsim.*NEST_CH3T_Spectrum_old(2,:); + + scale_factor_2016_oldsim=sum(h3_hist_2016(17:80))/sum(NEST_CH3T_Spectrum_old(2,17:80)); + h3_scaled_oldsim_2016=scale_factor_2016_oldsim.*NEST_CH3T_Spectrum_old(2,:); + + h3_chi2_2016=(1/62).*sum( (h3_scaled_oldsim_2016(17:80) - h3_hist_2016(17:80)).^2 ./(h3_hist_2016(17:80))); %(4:80) is to avoid low stat areas in the simulation + h3_chi2_2015=(1/62).*sum( (h3_scaled_oldsim_2015(17:80) - h3_hist_2015(17:80)).^2 ./(h3_hist_2015(17:80))); + + total_h3_chi2=(h3_chi2_2016+h3_chi2_2015)/2; + total_kr_chi2=(mean(kr_2016_chi2_slices)+mean(kr_2015_chi2_slices))/2; + total_chi2=(total_h3_chi2+total_kr_chi2)/2; + + total_h3_chi2_list(counter)=(h3_chi2_2016+h3_chi2_2015)/2; + total_kr_chi2_list(counter)=(mean(kr_2016_chi2_slices)+mean(kr_2015_chi2_slices))/2; + total_chi2_list(counter)=(total_h3_chi2+total_kr_chi2)/2; + ee_list(counter)=ee; + g1_list(counter)=g1; + + if total_chi20 & g1_list==bestg1; + + +% Find 1.4 chi2 diff = 0.68 interval = 1 sigma interval +EErange=ee_list(ee_cut); +Chi2range=total_chi2_list(ee_cut); + +EEupperbound=max(EErange(Chi2range-min(Chi2range) < 1.4)); +EE_one_sig=EEupperbound-bestEE + +%% Repeat for g1 +g1_cut=total_chi2_list>0 & ee_list==bestEE; + +% Find 1.4 chi2 diff = 0.68 interval = 1 sigma interval +g1range=g1_list(g1_cut); +Chi2range=total_chi2_list(g1_cut); + +g1upperbound=max(g1range(Chi2range-min(Chi2range) < 1.4)); +g1_one_sig=g1upperbound-bestg1 diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/EnergyReconstructionAndG1EE/ForWriteUp/MakeEnergySpectra_Chi2Result.m b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/EnergyReconstructionAndG1EE/ForWriteUp/MakeEnergySpectra_Chi2Result.m new file mode 100644 index 0000000..b1354cc --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/EnergyReconstructionAndG1EE/ForWriteUp/MakeEnergySpectra_Chi2Result.m @@ -0,0 +1,1582 @@ +% NEED TO UPDATE THESE POLYNOMIALS AND G1/G2 + + +inpaint_on=0; + +%HAVE TO MAKE THIS .MAT FILE STILL - USE class 1 and class 9 for S1 +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\MappingParametersFit_Start_2015_CutDown.mat') + + +s1ab_s2_xyz_fit_map.p1=-0.4988; +s1ab_s2_xyz_fit_map.p2=1.484; +c1=1-s1ab_s2_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s2_xyz_fit_map.p2; +s1ab_s2_xyz_fit_map.p3=c1; + +s1ab_s1_xyz_fit_map.p1=0.065; +s1ab_s1_xyz_fit_map.p2=0.02; +c2=1-s1ab_s1_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s1_xyz_fit_map.p2; +s1ab_s1_xyz_fit_map.p3=c2; + + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>90000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval); + + + + end + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=1000; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1500]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[5+bin_size, 500] );%from 50 to 300us for the fit, based on when s1as1b values get strange + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + %%Tracker for pseudo-lifetime + s2_at_bottom=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_2015=-320/log(s2_at_bottom/s2_at_top); + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_xbins),floor(s2_ybins)); +Sigma_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); +Count_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_xbins),floor(s1_ybins)); +Sigma_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); +Count_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XYZ. 3D Map, caluculate and Submit IQ +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% if Kr_events>150000 +% +% % LUXkrypCal_S1_3D(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_distance_\mus,user_name,file_id_cp,dp_version,submit); +% LUXkrypCal_S1_3D_Run04_local_2p14FixedZHisto(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_time,x_center,y_center,z_center,det_edge,inpaint_on,user_name,file_id_cp,dp_version, algorithm_name, submit); +% +% +% end + + +%% Apply corrections to CH3T and calculate the ER band shift + +%First load the data + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\CH3T_Sep2015_NoCorrections.mat'); + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = S2_x; +s1_y_cm = S2_y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,S2_x,S2_y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + h3_cut= inrange(drift_time,[40 300]) & inrange(s1_phe_both,[0 120]) ... + & (log10(s1_phe_both)+0.8*log10(s2_phe_both)<5.2) .... + & (log10(s1_phe_both)-2*log10(s2_phe_both)>-6.8) & (log10(s1_phe_both)-2*log10(s2_phe_both)<-4.8)... + & s2_phe_both>100 & s2_phe_both<16000 & s2radius<25; %used to be drift time 100 to 250 + +h3_s1_c_2015=s1_phe_both_xyz(h3_cut); +h3_s2_c_2015=s2_phe_both_xyz(h3_cut); + + + kr_cut= inrange(drift_time,[40 300]) & inrange(s1_phe_both,[30 1000]) ... + & (log10(s1_phe_both)+0.6*log10(s2_phe_both)>4.5) & (log10(s1_phe_both)+0.6*log10(s2_phe_both)<5.05) ... + & (log10(s1_phe_both)-2*log10(s2_phe_both)>-7.6) & (log10(s1_phe_both)-2*log10(s2_phe_both)<-4.7) ... + & s2_phe_both>3000 & s2_phe_both<60000 & s2radius<25; %used to be drift time 100 to 250 + +kr_s1_c_2015=s1_phe_both_xyz(kr_cut); +kr_s2_c_2015=s2_phe_both_xyz(kr_cut); +kr_2015_drift_time=drift_time(kr_cut); +kr_2015_s2x=S2_x(kr_cut); +kr_2015_s2y=S2_y(kr_cut); + + clearvars -except param_counter a1_list b1_list a2_list b2_list total_chi2_list h3_chi2_list kr_chi2_list g1_list g2_list total_chi2_map h3_chi2_map kr_chi2_map chi2_midtobot_list... + best_chi2_midtotop besta1_midtotop besta2_midtotop bestb1_midtotop bestb2_midtotop best_chi2_midtobot... + besta1_midtobot besta1_midtotop bestb1_midtobot bestb1_midtotop a1 b1 a2 b2 c2 chi2_midtotop_map chi2_midtobot_map b_counter a_counter... + besta1_combined bestb1_combined besta2_combined bestb2_combined best_chi2_combined chi2_combined_map chi2_combined_list b1_counter a1_counter a2_counter b2_counter... + a1_counter b1_counter a2_counter b2_counter c1_list c2_list bestc1_midtobot bestc2_midtobot bestc1_midtotop bestc2_midtotop bestc1_combined bestc2_combined... + besta1_combined besta2_combined bestb1_combined bestb2_combined besta1 bestb1 bestc1 besta2 bestb2 bestc2 bestg1 bestg2 best_total_chi2 NEST_CH3T_Spectrum inpaint_on... + best_kr_chi2 best_h3_chi2 electron_lifetime_list electron_lifetime_map a2_start a1_start b1_start b2_start ... + total_h3_chi2_list total_kr_chi2_list total_chi2_list h3_chi2_2016_list h3_chi2_2015_list kr_chi2_2016_list kr_chi2_2015_list ... + electron_lifetime_2016_list electron_lifetime_2015_list total_h3_chi2_map total_kr_chi2_map total_chi2_map h3_chi2_2016_map h3_chi2_2015_map ... + kr_chi2_2016_map kr_chi2_2015_map electron_lifetime_2016_map electron_lifetime_2015_map NEST_CH3T_Spectrum_Sep2015 NEST_CH3T_Spectrum_Feb2016 g1 g2 bestg1 bestg2 g1_counter g2_counter ... + firsta1 firstb1 firsta2 firstb2 firstg1 firstg2 kr_means_2015_map kr_means_2016_map kr_sigma_2015_map kr_sigma_2016_map kr_staterr_2015_map kr_staterr_2016_map ... + kr_means_2015_list kr_means_2016_list kr_2015_num_events kr_2016_num_events kr_sigma_2015_list kr_sigma_2016_list kr_staterr_2015_list kr_staterr_2016_list ... + pseudo_lifetime_2016 pseudo_lifetime_2015 kr_s1_c_2015 kr_s2_c_2015 h3_s1_c_2015 h3_s2_c_2015 s1ab_s2_xyz_fit_map s1ab_s1_xyz_fit_map ... + kr_2015_drift_time kr_2015_s2x kr_2015_s2y kr_chi2_2016_zslice_list kr_chi2_2015_zslice_list kr_chi2_zslice_zcenter_list ... + full_kr_chi2_2016_list full_kr_chi2_2015_list best_total_kr_chi2 best_total_h3_chi2 alternate_total_chi2_map alternate_total_chi2_list ... + best_total_alternate_chi2 best_total_alternate_kr_chi2 best_total_alternate_h3_chi2 besta2_alternate bestb2_alternate bestg1_alternate bestg2_alternate bestc2_alternate ... + total_h3_chi2_nothresh_list total_chi2_nothresh_list alternate_total_chi2_nothresh_list h3_chi2_2015_nothresh_list h3_chi2_2016_nothresh_list ... + total_h3_chi2_nothresh_map total_chi2_nothresh_map alternate_total_chi2_nothresh_map h3_chi2_2016_nothresh_map h3_chi2_2015_nothresh_map ... + best_total_chi2_nothresh best_total_kr_chi2_nothresh best_total_h3_chi2_nothresh besta2_nothresh bestb2_nothresh bestc2_nothresh bestg1_nothresh bestEE_nothresh ... + best_total_alternate_chi2_nothresh best_total_alternate_kr_chi2_nothresh best_total_alternate_h3_chi2_nothresh besta2_alternate_nothresh bestb2_alternate_nothresh ... + bestc2_alternate_nothresh bestg1_alternate_nothresh bestEE_alternate_nothresh best_total_chi2_nothresh best_total_alternate_chi2_nothresh ee_list ... + total_h3_chi2_nothresh_separatescaling_list total_chi2_nothresh_separatescaling_list best_total_chi2_nothresh_separatescaling ... + best_total_kr_chi2_nothresh_separatescaling best_total_h3_chi2_nothresh_separatescaling besta2_nothresh_separatescaling ... + bestc2_nothresh_separatescaling bestg1_nothresh_separatescaling bestEE_nothresh_separatescaling ... + total_h3_chi2_nothresh_separatescaling_map total_chi2_nothresh_separatescaling_map bestEE_nothresh ... + h3_chi2_2015_nothresh_separatescaling_list h3_chi2_2016_nothresh_separatescaling_list ee_list ... + h3_chi2_2016_oldsim_list h3_chi2_2015_oldsim_list total_h3_chi2_oldsim_list total_chi2_oldsim_list ... + best_total_chi2_oldsim best_total_kr_chi2_oldsim best_total_h3_chi2_oldsim besta2_oldsim bestb2_oldsim ... + bestc2_oldsim bestg1_oldsim bestEE_oldsim NEST_CH3T_Spectrum_old + + + +%%%%%%%%%%%%%%%%%%%%% +%% REPEAT FOR 2014 DATA +%%%%%%%%%%%%%%%%%%%%% + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\MappingParametersFit_Start_2016_CutDown.mat') + + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>90000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval); + + + + end + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[5+bin_size, 500] );%from 50 to 300us for the fit, based on when s1as1b values get strange + +s2_both_norm_z_index=mean_index(dT_range); +s2_both_norm_z_means=means(dT_range); + s2_at_top=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + %%Tracker for pseudo-lifetime + s2_at_bottom=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_2016=-320/log(s2_at_bottom/s2_at_top); +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_xbins),floor(s2_ybins)); +Sigma_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); +Count_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_xbins),floor(s1_ybins)); +Sigma_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); +Count_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Apply corrections to 2016 Kr data +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\MappingParametersFit_Start_2016_CutDown.mat') + + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; +% +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate ER Band shift +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + liquid_cut= inrange(drift_time,[40 300]) ... + & (log10(s1_phe_both)+0.7*log10(s2_phe_both)>4.9) & (log10(s1_phe_both)+0.7*log10(s2_phe_both)<5.5) ... + & s2_phe_both>3000 & s2_phe_both<80000 & s2radius<25; %used to be drift time 100 to 250 + + +kr_s1_c_2016=s1_phe_both_xyz(liquid_cut); +kr_s2_c_2016=s2_phe_both_xyz(liquid_cut); +kr_2016_drift_time=drift_time(liquid_cut); +kr_2016_s2x=s2x(liquid_cut); +kr_2016_s2y=s2y(liquid_cut); + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%Apply Corrections to 2016 CH3T Data +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\CH3T_Feb2016_NoCorrections.mat'); + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +% electron_lifetime_2016=e_lifetime_both; +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate ER Band shift +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +s1_min=0; +s1_max=120; + + %% Redo with r<10 cm + + + liquid_cut= clean_cut & inrange(drift_time,[40 300]) ... + & (log10(s1_phe_both)+log10(s2_phe_both)<5.9) & (log10(s1_phe_both)-2.*log10(s2_phe_both)<-4.8) ... + & (log10(s1_phe_both)-2.*log10(s2_phe_both)>-6.8) ... + & s2_phe_both>600 & s2_phe_both<16000 & s2radius<25; %used to be drift time 100 to 250 + + + +h3_s1_c_2016=s1_phe_both_xyz(liquid_cut); +h3_s2_c_2016=s2_phe_both_xyz(liquid_cut); + + clearvars -except param_counter a1_list b1_list a2_list b2_list total_chi2_list h3_chi2_list kr_chi2_list g1_list g2_list total_chi2_map h3_chi2_map kr_chi2_map chi2_midtobot_list... + best_chi2_midtotop besta1_midtotop besta2_midtotop bestb1_midtotop bestb2_midtotop best_chi2_midtobot... + besta1_midtobot besta1_midtotop bestb1_midtobot bestb1_midtotop a1 b1 a2 b2 chi2_midtotop_map chi2_midtobot_map b_counter a_counter... + besta1_combined bestb1_combined besta2_combined bestb2_combined best_chi2_combined chi2_combined_map chi2_combined_list b1_counter a1_counter a2_counter b2_counter... + a1_counter b1_counter a2_counter b2_counter c1_list c2_list bestc1_midtobot bestc2_midtobot bestc1_midtotop bestc2_midtotop bestc1_combined bestc2_combined... + besta1_combined besta2_combined bestb1_combined bestb2_combined besta1 bestb1 bestc1 besta2 bestb2 bestc2 bestg1 bestg2 best_total_chi2 NEST_CH3T_Spectrum inpaint_on... + best_kr_chi2 best_h3_chi2 electron_lifetime_list electron_lifetime_map a2_start a1_start b1_start b2_start ... + total_h3_chi2_list total_kr_chi2_list total_chi2_list h3_chi2_2016_list h3_chi2_2015_list kr_chi2_2016_list kr_chi2_2015_list ... + electron_lifetime_2016_list electron_lifetime_2015_list total_h3_chi2_map total_kr_chi2_map total_chi2_map h3_chi2_2016_map h3_chi2_2015_map ... + kr_chi2_2016_map kr_chi2_2015_map electron_lifetime_2016_map electron_lifetime_2015_map NEST_CH3T_Spectrum_Sep2015 NEST_CH3T_Spectrum_Feb2016 g1 g2 bestg1 bestg2 g1_counter g2_counter ... + firsta1 firstb1 firsta2 firstb2 firstg1 firstg2 kr_means_2015_map kr_means_2016_map kr_sigma_2015_map kr_sigma_2016_map kr_staterr_2015_map kr_staterr_2016_map ... + kr_means_2015_list kr_means_2016_list kr_2015_num_events kr_2016_num_events kr_sigma_2015_list kr_sigma_2016_list kr_staterr_2015_list kr_staterr_2016_list ... + pseudo_lifetime_2016 pseudo_lifetime_2015 kr_s1_c_2015 kr_s2_c_2015 h3_s1_c_2015 h3_s2_c_2015 kr_s1_c_2016 kr_s2_c_2016 h3_s1_c_2016 h3_s2_c_2016 ... + kr_2015_drift_time kr_2015_s2x kr_2015_s2y kr_2016_drift_time kr_2016_s2x kr_2016_s2y ... + kr_chi2_2016_zslice_list kr_chi2_2015_zslice_list kr_chi2_zslice_zcenter_list ... + full_kr_chi2_2016_list full_kr_chi2_2015_list best_total_kr_chi2 best_total_h3_chi2 alternate_total_chi2_map alternate_total_chi2_list ... + best_total_alternate_chi2 best_total_alternate_kr_chi2 best_total_alternate_h3_chi2 besta2_alternate bestb2_alternate bestg1_alternate bestg2_alternate bestc2_alternate c2 ... + total_h3_chi2_nothresh_list total_chi2_nothresh_list alternate_total_chi2_nothresh_list h3_chi2_2015_nothresh_list h3_chi2_2016_nothresh_list ... + total_h3_chi2_nothresh_map total_chi2_nothresh_map alternate_total_chi2_nothresh_map h3_chi2_2016_nothresh_map h3_chi2_2015_nothresh_map ... + best_total_chi2_nothresh best_total_kr_chi2_nothresh best_total_h3_chi2_nothresh besta2_nothresh bestb2_nothresh bestc2_nothresh bestg1_nothresh bestEE_nothresh ... + best_total_alternate_chi2_nothresh best_total_alternate_kr_chi2_nothresh best_total_alternate_h3_chi2_nothresh besta2_alternate_nothresh bestb2_alternate_nothresh ... + bestc2_alternate_nothresh bestg1_alternate_nothresh bestEE_alternate_nothresh best_total_chi2_nothresh best_total_alternate_chi2_nothresh ee_list ... + total_h3_chi2_nothresh_separatescaling_list total_chi2_nothresh_separatescaling_list best_total_chi2_nothresh_separatescaling ... + best_total_kr_chi2_nothresh_separatescaling best_total_h3_chi2_nothresh_separatescaling besta2_nothresh_separatescaling ... + bestc2_nothresh_separatescaling bestg1_nothresh_separatescaling bestEE_nothresh_separatescaling ... + total_h3_chi2_nothresh_separatescaling_map total_chi2_nothresh_separatescaling_map bestEE_nothresh ... + h3_chi2_2015_nothresh_separatescaling_list h3_chi2_2016_nothresh_separatescaling_list ee_list ... + h3_chi2_2016_oldsim_list h3_chi2_2015_oldsim_list total_h3_chi2_oldsim_list total_chi2_oldsim_list ... + best_total_chi2_oldsim best_total_kr_chi2_oldsim best_total_h3_chi2_oldsim besta2_oldsim bestb2_oldsim ... + bestc2_oldsim bestg1_oldsim bestEE_oldsim NEST_CH3T_Spectrum_old +%% Make plots + + + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\NEST_CH3T_Spectrum_old.mat') + + + +best_total_chi2=100000000; +for g1=0.09:0.005:0.125; + for ee=0.75:0.01:1.2; + + g2_feb2016=25.05*ee; %converting to g2 with SE size + g2_sep2015=25.8536*ee; +%Kr 2014 data + +Kr_E_2016=(1/73).*(kr_s1_c_2016./g1+kr_s2_c_2016./g2_feb2016); +H3_E_2016=(1/73).*(h3_s1_c_2016./g1+h3_s2_c_2016./g2_feb2016); + +Kr_E_2015=(1/73).*(kr_s1_c_2015./g1+kr_s2_c_2015./g2_sep2015); +H3_E_2015=(1/73).*(h3_s1_c_2015./g1+h3_s2_c_2015./g2_sep2015); + +i=1; +for dT_max=40+20/2:20:300-20/2; + temp_fit_2016=fit([0:1:100].',hist(Kr_E_2016(inrange(kr_2016_drift_time,[dT_max-20 dT_max])),[0:1:100]).','gauss1'); + kr_2016_means(i)=temp_fit_2016.b1; + kr_2016_means_err(i)=temp_fit_2016.c1/sqrt(2)/length(Kr_E_2016(inrange(kr_2016_drift_time,[dT_max-20 dT_max]))); + + temp_fit_2015=fit([0:1:100].',hist(Kr_E_2015(inrange(kr_2015_drift_time,[dT_max-20 dT_max])),[0:1:100]).','gauss1'); + kr_2015_means(i)=temp_fit_2015.b1; + kr_2015_means_err(i)=temp_fit_2015.c1/sqrt(2)/length(Kr_E_2015(inrange(kr_2015_drift_time,[dT_max-20 dT_max]))); + + dT_centers(i)=dT_max-10; + i=i+1; +end + +kr_2016_chi2_slices=((41.55-kr_2016_means)./0.2395).^2; +kr_2015_chi2_slices=((41.55-kr_2015_means)./0.2395).^2; + + %make CH3T data spectrum + [h3_hist_2016,h3_hist_bin_2016]=hist(H3_E_2016,NEST_CH3T_Spectrum_old(1,:)); + [h3_hist_2015,h3_hist_bin_2015]=hist(H3_E_2015,NEST_CH3T_Spectrum_old(1,:)); + + scale_factor_2015_oldsim=sum(h3_hist_2015(17:80))/sum(NEST_CH3T_Spectrum_old(2,17:80)); + h3_scaled_oldsim_2015=scale_factor_2015_oldsim.*NEST_CH3T_Spectrum_old(2,:); + + scale_factor_2016_oldsim=sum(h3_hist_2016(17:80))/sum(NEST_CH3T_Spectrum_old(2,17:80)); + h3_scaled_oldsim_2016=scale_factor_2016_oldsim.*NEST_CH3T_Spectrum_old(2,:); + + h3_chi2_2016=(1/62).*sum( (h3_scaled_oldsim_2016(17:80) - h3_hist_2016(17:80)).^2 ./(h3_hist_2016(17:80))); %(4:80) is to avoid low stat areas in the simulation + h3_chi2_2015=(1/62).*sum( (h3_scaled_oldsim_2015(17:80) - h3_hist_2015(17:80)).^2 ./(h3_hist_2015(17:80))); + + total_h3_chi2=(h3_chi2_2016+h3_chi2_2015)/2; + total_kr_chi2=(mean(kr_2016_chi2_slices)+mean(kr_2015_chi2_slices))/2; + total_chi2=(total_h3_chi2+total_kr_chi2)/2; + + if total_chi290000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval); + + + + end + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=1000; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1500]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[5+bin_size, 500] );%from 50 to 300us for the fit, based on when s1as1b values get strange + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + %%Tracker for pseudo-lifetime + s2_at_bottom=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_2015=-320/log(s2_at_bottom/s2_at_top); + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_xbins),floor(s2_ybins)); +Sigma_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); +Count_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_xbins),floor(s1_ybins)); +Sigma_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); +Count_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XYZ. 3D Map, caluculate and Submit IQ +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% if Kr_events>150000 +% +% % LUXkrypCal_S1_3D(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_distance_\mus,user_name,file_id_cp,dp_version,submit); +% LUXkrypCal_S1_3D_Run04_local_2p14FixedZHisto(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_time,x_center,y_center,z_center,det_edge,inpaint_on,user_name,file_id_cp,dp_version, algorithm_name, submit); +% +% +% end + + +%% Apply corrections to CH3T and calculate the ER band shift + +%First load the data + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\CH3T_Sep2015_NoCorrections.mat'); + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = S2_x; +s1_y_cm = S2_y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,S2_x,S2_y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + h3_cut= inrange(drift_time,[40 300]) & inrange(s1_phe_both,[0 120]) ... + & (log10(s1_phe_both)+0.8*log10(s2_phe_both)<5.2) .... + & (log10(s1_phe_both)-2*log10(s2_phe_both)>-6.8) & (log10(s1_phe_both)-2*log10(s2_phe_both)<-4.8)... + & s2_phe_both>100 & s2_phe_both<16000 & s2radius<25; %used to be drift time 100 to 250 + +h3_s1_c_2015=s1_phe_both_xyz(h3_cut); +h3_s2_c_2015=s2_phe_both_xyz(h3_cut); + + + kr_cut= inrange(drift_time,[40 300]) & inrange(s1_phe_both,[30 1000]) ... + & (log10(s1_phe_both)+0.6*log10(s2_phe_both)>4.5) & (log10(s1_phe_both)+0.6*log10(s2_phe_both)<5.05) ... + & (log10(s1_phe_both)-2*log10(s2_phe_both)>-7.6) & (log10(s1_phe_both)-2*log10(s2_phe_both)<-4.7) ... + & s2_phe_both>3000 & s2_phe_both<60000 & s2radius<25; %used to be drift time 100 to 250 + +kr_s1_c_2015=s1_phe_both_xyz(kr_cut); +kr_s2_c_2015=s2_phe_both_xyz(kr_cut); +kr_2015_drift_time=drift_time(kr_cut); +kr_2015_s2x=S2_x(kr_cut); +kr_2015_s2y=S2_y(kr_cut); + + clearvars -except param_counter a1_list b1_list a2_list b2_list total_chi2_list h3_chi2_list kr_chi2_list g1_list g2_list total_chi2_map h3_chi2_map kr_chi2_map chi2_midtobot_list... + best_chi2_midtotop besta1_midtotop besta2_midtotop bestb1_midtotop bestb2_midtotop best_chi2_midtobot... + besta1_midtobot besta1_midtotop bestb1_midtobot bestb1_midtotop a1 b1 a2 b2 c2 chi2_midtotop_map chi2_midtobot_map b_counter a_counter... + besta1_combined bestb1_combined besta2_combined bestb2_combined best_chi2_combined chi2_combined_map chi2_combined_list b1_counter a1_counter a2_counter b2_counter... + a1_counter b1_counter a2_counter b2_counter c1_list c2_list bestc1_midtobot bestc2_midtobot bestc1_midtotop bestc2_midtotop bestc1_combined bestc2_combined... + besta1_combined besta2_combined bestb1_combined bestb2_combined besta1 bestb1 bestc1 besta2 bestb2 bestc2 bestg1 bestg2 best_total_chi2 NEST_CH3T_Spectrum inpaint_on... + best_kr_chi2 best_h3_chi2 electron_lifetime_list electron_lifetime_map a2_start a1_start b1_start b2_start ... + total_h3_chi2_list total_kr_chi2_list total_chi2_list h3_chi2_2016_list h3_chi2_2015_list kr_chi2_2016_list kr_chi2_2015_list ... + electron_lifetime_2016_list electron_lifetime_2015_list total_h3_chi2_map total_kr_chi2_map total_chi2_map h3_chi2_2016_map h3_chi2_2015_map ... + kr_chi2_2016_map kr_chi2_2015_map electron_lifetime_2016_map electron_lifetime_2015_map NEST_CH3T_Spectrum_Sep2015 NEST_CH3T_Spectrum_Feb2016 g1 g2 bestg1 bestg2 g1_counter g2_counter ... + firsta1 firstb1 firsta2 firstb2 firstg1 firstg2 kr_means_2015_map kr_means_2016_map kr_sigma_2015_map kr_sigma_2016_map kr_staterr_2015_map kr_staterr_2016_map ... + kr_means_2015_list kr_means_2016_list kr_2015_num_events kr_2016_num_events kr_sigma_2015_list kr_sigma_2016_list kr_staterr_2015_list kr_staterr_2016_list ... + pseudo_lifetime_2016 pseudo_lifetime_2015 kr_s1_c_2015 kr_s2_c_2015 h3_s1_c_2015 h3_s2_c_2015 s1ab_s2_xyz_fit_map s1ab_s1_xyz_fit_map ... + kr_2015_drift_time kr_2015_s2x kr_2015_s2y kr_chi2_2016_zslice_list kr_chi2_2015_zslice_list kr_chi2_zslice_zcenter_list ... + full_kr_chi2_2016_list full_kr_chi2_2015_list best_total_kr_chi2 best_total_h3_chi2 alternate_total_chi2_map alternate_total_chi2_list ... + best_total_alternate_chi2 best_total_alternate_kr_chi2 best_total_alternate_h3_chi2 besta2_alternate bestb2_alternate bestg1_alternate bestg2_alternate bestc2_alternate ... + total_h3_chi2_nothresh_list total_chi2_nothresh_list alternate_total_chi2_nothresh_list h3_chi2_2015_nothresh_list h3_chi2_2016_nothresh_list ... + total_h3_chi2_nothresh_map total_chi2_nothresh_map alternate_total_chi2_nothresh_map h3_chi2_2016_nothresh_map h3_chi2_2015_nothresh_map ... + best_total_chi2_nothresh best_total_kr_chi2_nothresh best_total_h3_chi2_nothresh besta2_nothresh bestb2_nothresh bestc2_nothresh bestg1_nothresh bestEE_nothresh ... + best_total_alternate_chi2_nothresh best_total_alternate_kr_chi2_nothresh best_total_alternate_h3_chi2_nothresh besta2_alternate_nothresh bestb2_alternate_nothresh ... + bestc2_alternate_nothresh bestg1_alternate_nothresh bestEE_alternate_nothresh best_total_chi2_nothresh best_total_alternate_chi2_nothresh ee_list ... + total_h3_chi2_nothresh_separatescaling_list total_chi2_nothresh_separatescaling_list best_total_chi2_nothresh_separatescaling ... + best_total_kr_chi2_nothresh_separatescaling best_total_h3_chi2_nothresh_separatescaling besta2_nothresh_separatescaling ... + bestc2_nothresh_separatescaling bestg1_nothresh_separatescaling bestEE_nothresh_separatescaling ... + total_h3_chi2_nothresh_separatescaling_map total_chi2_nothresh_separatescaling_map bestEE_nothresh ... + h3_chi2_2015_nothresh_separatescaling_list h3_chi2_2016_nothresh_separatescaling_list ee_list ... + h3_chi2_2016_oldsim_list h3_chi2_2015_oldsim_list total_h3_chi2_oldsim_list total_chi2_oldsim_list ... + best_total_chi2_oldsim best_total_kr_chi2_oldsim best_total_h3_chi2_oldsim besta2_oldsim bestb2_oldsim ... + bestc2_oldsim bestg1_oldsim bestEE_oldsim NEST_CH3T_Spectrum_old + + + +%%%%%%%%%%%%%%%%%%%%% +%% REPEAT FOR 2014 DATA +%%%%%%%%%%%%%%%%%%%%% + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\MappingParametersFit_Start_2016_CutDown.mat') + + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>90000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval); + + + + end + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[5+bin_size, 500] );%from 50 to 300us for the fit, based on when s1as1b values get strange + +s2_both_norm_z_index=mean_index(dT_range); +s2_both_norm_z_means=means(dT_range); + s2_at_top=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + %%Tracker for pseudo-lifetime + s2_at_bottom=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_2016=-320/log(s2_at_bottom/s2_at_top); +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_xbins),floor(s2_ybins)); +Sigma_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); +Count_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_xbins),floor(s1_ybins)); +Sigma_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); +Count_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Apply corrections to 2016 Kr data +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\MappingParametersFit_Start_2016_CutDown.mat') + + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; +% +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate ER Band shift +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + liquid_cut= inrange(drift_time,[40 300]) ... + & (log10(s1_phe_both)+0.7*log10(s2_phe_both)>4.9) & (log10(s1_phe_both)+0.7*log10(s2_phe_both)<5.5) ... + & s2_phe_both>3000 & s2_phe_both<80000 & s2radius<25; %used to be drift time 100 to 250 + + +kr_s1_c_2016=s1_phe_both_xyz(liquid_cut); +kr_s2_c_2016=s2_phe_both_xyz(liquid_cut); +kr_2016_drift_time=drift_time(liquid_cut); +kr_2016_s2x=s2x(liquid_cut); +kr_2016_s2y=s2y(liquid_cut); + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%Apply Corrections to 2016 CH3T Data +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\CH3T_Feb2016_NoCorrections.mat'); + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +% electron_lifetime_2016=e_lifetime_both; +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate ER Band shift +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +s1_min=0; +s1_max=120; + + %% Redo with r<10 cm + + + liquid_cut= clean_cut & inrange(drift_time,[40 300]) ... + & (log10(s1_phe_both)+log10(s2_phe_both)<5.9) & (log10(s1_phe_both)-2.*log10(s2_phe_both)<-4.8) ... + & (log10(s1_phe_both)-2.*log10(s2_phe_both)>-6.8) ... + & s2_phe_both>600 & s2_phe_both<16000 & s2radius<25; %used to be drift time 100 to 250 + + + +h3_s1_c_2016=s1_phe_both_xyz(liquid_cut); +h3_s2_c_2016=s2_phe_both_xyz(liquid_cut); + + clearvars -except param_counter a1_list b1_list a2_list b2_list total_chi2_list h3_chi2_list kr_chi2_list g1_list g2_list total_chi2_map h3_chi2_map kr_chi2_map chi2_midtobot_list... + best_chi2_midtotop besta1_midtotop besta2_midtotop bestb1_midtotop bestb2_midtotop best_chi2_midtobot... + besta1_midtobot besta1_midtotop bestb1_midtobot bestb1_midtotop a1 b1 a2 b2 chi2_midtotop_map chi2_midtobot_map b_counter a_counter... + besta1_combined bestb1_combined besta2_combined bestb2_combined best_chi2_combined chi2_combined_map chi2_combined_list b1_counter a1_counter a2_counter b2_counter... + a1_counter b1_counter a2_counter b2_counter c1_list c2_list bestc1_midtobot bestc2_midtobot bestc1_midtotop bestc2_midtotop bestc1_combined bestc2_combined... + besta1_combined besta2_combined bestb1_combined bestb2_combined besta1 bestb1 bestc1 besta2 bestb2 bestc2 bestg1 bestg2 best_total_chi2 NEST_CH3T_Spectrum inpaint_on... + best_kr_chi2 best_h3_chi2 electron_lifetime_list electron_lifetime_map a2_start a1_start b1_start b2_start ... + total_h3_chi2_list total_kr_chi2_list total_chi2_list h3_chi2_2016_list h3_chi2_2015_list kr_chi2_2016_list kr_chi2_2015_list ... + electron_lifetime_2016_list electron_lifetime_2015_list total_h3_chi2_map total_kr_chi2_map total_chi2_map h3_chi2_2016_map h3_chi2_2015_map ... + kr_chi2_2016_map kr_chi2_2015_map electron_lifetime_2016_map electron_lifetime_2015_map NEST_CH3T_Spectrum_Sep2015 NEST_CH3T_Spectrum_Feb2016 g1 g2 bestg1 bestg2 g1_counter g2_counter ... + firsta1 firstb1 firsta2 firstb2 firstg1 firstg2 kr_means_2015_map kr_means_2016_map kr_sigma_2015_map kr_sigma_2016_map kr_staterr_2015_map kr_staterr_2016_map ... + kr_means_2015_list kr_means_2016_list kr_2015_num_events kr_2016_num_events kr_sigma_2015_list kr_sigma_2016_list kr_staterr_2015_list kr_staterr_2016_list ... + pseudo_lifetime_2016 pseudo_lifetime_2015 kr_s1_c_2015 kr_s2_c_2015 h3_s1_c_2015 h3_s2_c_2015 kr_s1_c_2016 kr_s2_c_2016 h3_s1_c_2016 h3_s2_c_2016 ... + kr_2015_drift_time kr_2015_s2x kr_2015_s2y kr_2016_drift_time kr_2016_s2x kr_2016_s2y ... + kr_chi2_2016_zslice_list kr_chi2_2015_zslice_list kr_chi2_zslice_zcenter_list ... + full_kr_chi2_2016_list full_kr_chi2_2015_list best_total_kr_chi2 best_total_h3_chi2 alternate_total_chi2_map alternate_total_chi2_list ... + best_total_alternate_chi2 best_total_alternate_kr_chi2 best_total_alternate_h3_chi2 besta2_alternate bestb2_alternate bestg1_alternate bestg2_alternate bestc2_alternate c2 ... + total_h3_chi2_nothresh_list total_chi2_nothresh_list alternate_total_chi2_nothresh_list h3_chi2_2015_nothresh_list h3_chi2_2016_nothresh_list ... + total_h3_chi2_nothresh_map total_chi2_nothresh_map alternate_total_chi2_nothresh_map h3_chi2_2016_nothresh_map h3_chi2_2015_nothresh_map ... + best_total_chi2_nothresh best_total_kr_chi2_nothresh best_total_h3_chi2_nothresh besta2_nothresh bestb2_nothresh bestc2_nothresh bestg1_nothresh bestEE_nothresh ... + best_total_alternate_chi2_nothresh best_total_alternate_kr_chi2_nothresh best_total_alternate_h3_chi2_nothresh besta2_alternate_nothresh bestb2_alternate_nothresh ... + bestc2_alternate_nothresh bestg1_alternate_nothresh bestEE_alternate_nothresh best_total_chi2_nothresh best_total_alternate_chi2_nothresh ee_list ... + total_h3_chi2_nothresh_separatescaling_list total_chi2_nothresh_separatescaling_list best_total_chi2_nothresh_separatescaling ... + best_total_kr_chi2_nothresh_separatescaling best_total_h3_chi2_nothresh_separatescaling besta2_nothresh_separatescaling ... + bestc2_nothresh_separatescaling bestg1_nothresh_separatescaling bestEE_nothresh_separatescaling ... + total_h3_chi2_nothresh_separatescaling_map total_chi2_nothresh_separatescaling_map bestEE_nothresh ... + h3_chi2_2015_nothresh_separatescaling_list h3_chi2_2016_nothresh_separatescaling_list ee_list ... + h3_chi2_2016_oldsim_list h3_chi2_2015_oldsim_list total_h3_chi2_oldsim_list total_chi2_oldsim_list ... + best_total_chi2_oldsim best_total_kr_chi2_oldsim best_total_h3_chi2_oldsim besta2_oldsim bestb2_oldsim ... + bestc2_oldsim bestg1_oldsim bestEE_oldsim NEST_CH3T_Spectrum_old +%% Make plots + + + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\NEST_CH3T_Spectrum_old.mat') + + + +best_total_chi2=100000000; +for g1=0.09:0.005:0.125; + for ee=0.75:0.01:1.2; + + g2_feb2016=25.05*ee; %converting to g2 with SE size + g2_sep2015=25.8536*ee; +%Kr 2014 data + +Kr_E_2016=(1/73).*(kr_s1_c_2016./g1+kr_s2_c_2016./g2_feb2016); +H3_E_2016=(1/73).*(h3_s1_c_2016./g1+h3_s2_c_2016./g2_feb2016); + +Kr_E_2015=(1/73).*(kr_s1_c_2015./g1+kr_s2_c_2015./g2_sep2015); +H3_E_2015=(1/73).*(h3_s1_c_2015./g1+h3_s2_c_2015./g2_sep2015); + +i=1; +for dT_max=40+20/2:20:300-20/2; + temp_fit_2016=fit([0:1:100].',hist(Kr_E_2016(inrange(kr_2016_drift_time,[dT_max-20 dT_max])),[0:1:100]).','gauss1'); + kr_2016_means(i)=temp_fit_2016.b1; + kr_2016_means_err(i)=temp_fit_2016.c1/sqrt(2)/length(Kr_E_2016(inrange(kr_2016_drift_time,[dT_max-20 dT_max]))); + + temp_fit_2015=fit([0:1:100].',hist(Kr_E_2015(inrange(kr_2015_drift_time,[dT_max-20 dT_max])),[0:1:100]).','gauss1'); + kr_2015_means(i)=temp_fit_2015.b1; + kr_2015_means_err(i)=temp_fit_2015.c1/sqrt(2)/length(Kr_E_2015(inrange(kr_2015_drift_time,[dT_max-20 dT_max]))); + + dT_centers(i)=dT_max-10; + i=i+1; +end + +kr_2016_chi2_slices=((41.55-kr_2016_means)./0.2395).^2; +kr_2015_chi2_slices=((41.55-kr_2015_means)./0.2395).^2; + + %make CH3T data spectrum + [h3_hist_2016,h3_hist_bin_2016]=hist(H3_E_2016,NEST_CH3T_Spectrum_old(1,:)); + [h3_hist_2015,h3_hist_bin_2015]=hist(H3_E_2015,NEST_CH3T_Spectrum_old(1,:)); + + scale_factor_2015_oldsim=sum(h3_hist_2015(17:80))/sum(NEST_CH3T_Spectrum_old(2,17:80)); + h3_scaled_oldsim_2015=scale_factor_2015_oldsim.*NEST_CH3T_Spectrum_old(2,:); + + scale_factor_2016_oldsim=sum(h3_hist_2016(17:80))/sum(NEST_CH3T_Spectrum_old(2,17:80)); + h3_scaled_oldsim_2016=scale_factor_2016_oldsim.*NEST_CH3T_Spectrum_old(2,:); + + h3_chi2_2016=(1/62).*sum( (h3_scaled_oldsim_2016(17:80) - h3_hist_2016(17:80)).^2 ./(h3_hist_2016(17:80))); %(4:80) is to avoid low stat areas in the simulation + h3_chi2_2015=(1/62).*sum( (h3_scaled_oldsim_2015(17:80) - h3_hist_2015(17:80)).^2 ./(h3_hist_2015(17:80))); + + total_h3_chi2=(h3_chi2_2016+h3_chi2_2015)/2; + total_kr_chi2=(mean(kr_2016_chi2_slices)+mean(kr_2015_chi2_slices))/2; + total_chi2=(total_h3_chi2+total_kr_chi2)/2; + + if total_chi290000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval); + + + + end + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=1000; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1500]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[5+bin_size, 500] );%from 50 to 300us for the fit, based on when s1as1b values get strange + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + %%Tracker for pseudo-lifetime + s2_at_bottom=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_2015=-320/log(s2_at_bottom/s2_at_top); + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_xbins),floor(s2_ybins)); +Sigma_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); +Count_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_xbins),floor(s1_ybins)); +Sigma_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); +Count_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XYZ. 3D Map, caluculate and Submit IQ +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% if Kr_events>150000 +% +% % LUXkrypCal_S1_3D(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_distance_\mus,user_name,file_id_cp,dp_version,submit); +% LUXkrypCal_S1_3D_Run04_local_2p14FixedZHisto(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_time,x_center,y_center,z_center,det_edge,inpaint_on,user_name,file_id_cp,dp_version, algorithm_name, submit); +% +% +% end + + +%% Apply corrections to CH3T and calculate the ER band shift + +%First load the data + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\CH3T_Sep2015_NoCorrections.mat'); + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = S2_x; +s1_y_cm = S2_y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,S2_x,S2_y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + h3_cut= inrange(drift_time,[40 300]) & inrange(s1_phe_both,[0 120]) ... + & (log10(s1_phe_both)+0.8*log10(s2_phe_both)<5.2) .... + & (log10(s1_phe_both)-2*log10(s2_phe_both)>-6.8) & (log10(s1_phe_both)-2*log10(s2_phe_both)<-4.8)... + & s2_phe_both>100 & s2_phe_both<16000 & s2radius<25; %used to be drift time 100 to 250 + +h3_s1_c_2015=s1_phe_both_xyz(h3_cut); +h3_s2_c_2015=s2_phe_both_xyz(h3_cut); + + + kr_cut= inrange(drift_time,[40 300]) & inrange(s1_phe_both,[30 1000]) ... + & (log10(s1_phe_both)+0.6*log10(s2_phe_both)>4.5) & (log10(s1_phe_both)+0.6*log10(s2_phe_both)<5.05) ... + & (log10(s1_phe_both)-2*log10(s2_phe_both)>-7.6) & (log10(s1_phe_both)-2*log10(s2_phe_both)<-4.7) ... + & s2_phe_both>3000 & s2_phe_both<60000 & s2radius<25; %used to be drift time 100 to 250 + +kr_s1_c_2015=s1_phe_both_xyz(kr_cut); +kr_s2_c_2015=s2_phe_both_xyz(kr_cut); +kr_2015_drift_time=drift_time(kr_cut); +kr_2015_s2x=S2_x(kr_cut); +kr_2015_s2y=S2_y(kr_cut); + + clearvars -except param_counter a1_list b1_list a2_list b2_list total_chi2_list h3_chi2_list kr_chi2_list g1_list g2_list total_chi2_map h3_chi2_map kr_chi2_map chi2_midtobot_list... + best_chi2_midtotop besta1_midtotop besta2_midtotop bestb1_midtotop bestb2_midtotop best_chi2_midtobot... + besta1_midtobot besta1_midtotop bestb1_midtobot bestb1_midtotop a1 b1 a2 b2 c2 chi2_midtotop_map chi2_midtobot_map b_counter a_counter... + besta1_combined bestb1_combined besta2_combined bestb2_combined best_chi2_combined chi2_combined_map chi2_combined_list b1_counter a1_counter a2_counter b2_counter... + a1_counter b1_counter a2_counter b2_counter c1_list c2_list bestc1_midtobot bestc2_midtobot bestc1_midtotop bestc2_midtotop bestc1_combined bestc2_combined... + besta1_combined besta2_combined bestb1_combined bestb2_combined besta1 bestb1 bestc1 besta2 bestb2 bestc2 bestg1 bestg2 best_total_chi2 NEST_CH3T_Spectrum inpaint_on... + best_kr_chi2 best_h3_chi2 electron_lifetime_list electron_lifetime_map a2_start a1_start b1_start b2_start ... + total_h3_chi2_list total_kr_chi2_list total_chi2_list h3_chi2_2016_list h3_chi2_2015_list kr_chi2_2016_list kr_chi2_2015_list ... + electron_lifetime_2016_list electron_lifetime_2015_list total_h3_chi2_map total_kr_chi2_map total_chi2_map h3_chi2_2016_map h3_chi2_2015_map ... + kr_chi2_2016_map kr_chi2_2015_map electron_lifetime_2016_map electron_lifetime_2015_map NEST_CH3T_Spectrum_Sep2015 NEST_CH3T_Spectrum_Feb2016 g1 g2 bestg1 bestg2 g1_counter g2_counter ... + firsta1 firstb1 firsta2 firstb2 firstg1 firstg2 kr_means_2015_map kr_means_2016_map kr_sigma_2015_map kr_sigma_2016_map kr_staterr_2015_map kr_staterr_2016_map ... + kr_means_2015_list kr_means_2016_list kr_2015_num_events kr_2016_num_events kr_sigma_2015_list kr_sigma_2016_list kr_staterr_2015_list kr_staterr_2016_list ... + pseudo_lifetime_2016 pseudo_lifetime_2015 kr_s1_c_2015 kr_s2_c_2015 h3_s1_c_2015 h3_s2_c_2015 s1ab_s2_xyz_fit_map s1ab_s1_xyz_fit_map ... + kr_2015_drift_time kr_2015_s2x kr_2015_s2y kr_chi2_2016_zslice_list kr_chi2_2015_zslice_list kr_chi2_zslice_zcenter_list ... + full_kr_chi2_2016_list full_kr_chi2_2015_list best_total_kr_chi2 best_total_h3_chi2 alternate_total_chi2_map alternate_total_chi2_list ... + best_total_alternate_chi2 best_total_alternate_kr_chi2 best_total_alternate_h3_chi2 besta2_alternate bestb2_alternate bestg1_alternate bestg2_alternate bestc2_alternate ... + total_h3_chi2_nothresh_list total_chi2_nothresh_list alternate_total_chi2_nothresh_list h3_chi2_2015_nothresh_list h3_chi2_2016_nothresh_list ... + total_h3_chi2_nothresh_map total_chi2_nothresh_map alternate_total_chi2_nothresh_map h3_chi2_2016_nothresh_map h3_chi2_2015_nothresh_map ... + best_total_chi2_nothresh best_total_kr_chi2_nothresh best_total_h3_chi2_nothresh besta2_nothresh bestb2_nothresh bestc2_nothresh bestg1_nothresh bestEE_nothresh ... + best_total_alternate_chi2_nothresh best_total_alternate_kr_chi2_nothresh best_total_alternate_h3_chi2_nothresh besta2_alternate_nothresh bestb2_alternate_nothresh ... + bestc2_alternate_nothresh bestg1_alternate_nothresh bestEE_alternate_nothresh best_total_chi2_nothresh best_total_alternate_chi2_nothresh ee_list ... + total_h3_chi2_nothresh_separatescaling_list total_chi2_nothresh_separatescaling_list best_total_chi2_nothresh_separatescaling ... + best_total_kr_chi2_nothresh_separatescaling best_total_h3_chi2_nothresh_separatescaling besta2_nothresh_separatescaling ... + bestc2_nothresh_separatescaling bestg1_nothresh_separatescaling bestEE_nothresh_separatescaling ... + total_h3_chi2_nothresh_separatescaling_map total_chi2_nothresh_separatescaling_map bestEE_nothresh ... + h3_chi2_2015_nothresh_separatescaling_list h3_chi2_2016_nothresh_separatescaling_list ee_list ... + h3_chi2_2016_oldsim_list h3_chi2_2015_oldsim_list total_h3_chi2_oldsim_list total_chi2_oldsim_list ... + best_total_chi2_oldsim best_total_kr_chi2_oldsim best_total_h3_chi2_oldsim besta2_oldsim bestb2_oldsim ... + bestc2_oldsim bestg1_oldsim bestEE_oldsim NEST_CH3T_Spectrum_old + + + +%%%%%%%%%%%%%%%%%%%%% +%% REPEAT FOR 2014 DATA +%%%%%%%%%%%%%%%%%%%%% + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\MappingParametersFit_Start_2016_CutDown.mat') + + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>90000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval); + + + + end + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[5+bin_size, 500] );%from 50 to 300us for the fit, based on when s1as1b values get strange + +s2_both_norm_z_index=mean_index(dT_range); +s2_both_norm_z_means=means(dT_range); + s2_at_top=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + %%Tracker for pseudo-lifetime + s2_at_bottom=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_2016=-320/log(s2_at_bottom/s2_at_top); +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_xbins),floor(s2_ybins)); +Sigma_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); +Count_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_xbins),floor(s1_ybins)); +Sigma_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); +Count_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Apply corrections to 2016 Kr data +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\MappingParametersFit_Start_2016_CutDown.mat') + + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; +% +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate ER Band shift +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + liquid_cut= inrange(drift_time,[40 300]) ... + & (log10(s1_phe_both)+0.7*log10(s2_phe_both)>4.9) & (log10(s1_phe_both)+0.7*log10(s2_phe_both)<5.5) ... + & s2_phe_both>3000 & s2_phe_both<80000 & s2radius<25; %used to be drift time 100 to 250 + + +kr_s1_c_2016=s1_phe_both_xyz(liquid_cut); +kr_s2_c_2016=s2_phe_both_xyz(liquid_cut); +kr_2016_drift_time=drift_time(liquid_cut); +kr_2016_s2x=s2x(liquid_cut); +kr_2016_s2y=s2y(liquid_cut); + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%Apply Corrections to 2016 CH3T Data +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\CH3T_Feb2016_NoCorrections.mat'); + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +% electron_lifetime_2016=e_lifetime_both; +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate ER Band shift +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +s1_min=0; +s1_max=120; + + %% Redo with r<10 cm + + + liquid_cut= clean_cut & inrange(drift_time,[40 300]) ... + & (log10(s1_phe_both)+log10(s2_phe_both)<5.9) & (log10(s1_phe_both)-2.*log10(s2_phe_both)<-4.8) ... + & (log10(s1_phe_both)-2.*log10(s2_phe_both)>-6.8) ... + & s2_phe_both>600 & s2_phe_both<16000 & s2radius<25; %used to be drift time 100 to 250 + + + +h3_s1_c_2016=s1_phe_both_xyz(liquid_cut); +h3_s2_c_2016=s2_phe_both_xyz(liquid_cut); + + clearvars -except param_counter a1_list b1_list a2_list b2_list total_chi2_list h3_chi2_list kr_chi2_list g1_list g2_list total_chi2_map h3_chi2_map kr_chi2_map chi2_midtobot_list... + best_chi2_midtotop besta1_midtotop besta2_midtotop bestb1_midtotop bestb2_midtotop best_chi2_midtobot... + besta1_midtobot besta1_midtotop bestb1_midtobot bestb1_midtotop a1 b1 a2 b2 chi2_midtotop_map chi2_midtobot_map b_counter a_counter... + besta1_combined bestb1_combined besta2_combined bestb2_combined best_chi2_combined chi2_combined_map chi2_combined_list b1_counter a1_counter a2_counter b2_counter... + a1_counter b1_counter a2_counter b2_counter c1_list c2_list bestc1_midtobot bestc2_midtobot bestc1_midtotop bestc2_midtotop bestc1_combined bestc2_combined... + besta1_combined besta2_combined bestb1_combined bestb2_combined besta1 bestb1 bestc1 besta2 bestb2 bestc2 bestg1 bestg2 best_total_chi2 NEST_CH3T_Spectrum inpaint_on... + best_kr_chi2 best_h3_chi2 electron_lifetime_list electron_lifetime_map a2_start a1_start b1_start b2_start ... + total_h3_chi2_list total_kr_chi2_list total_chi2_list h3_chi2_2016_list h3_chi2_2015_list kr_chi2_2016_list kr_chi2_2015_list ... + electron_lifetime_2016_list electron_lifetime_2015_list total_h3_chi2_map total_kr_chi2_map total_chi2_map h3_chi2_2016_map h3_chi2_2015_map ... + kr_chi2_2016_map kr_chi2_2015_map electron_lifetime_2016_map electron_lifetime_2015_map NEST_CH3T_Spectrum_Sep2015 NEST_CH3T_Spectrum_Feb2016 g1 g2 bestg1 bestg2 g1_counter g2_counter ... + firsta1 firstb1 firsta2 firstb2 firstg1 firstg2 kr_means_2015_map kr_means_2016_map kr_sigma_2015_map kr_sigma_2016_map kr_staterr_2015_map kr_staterr_2016_map ... + kr_means_2015_list kr_means_2016_list kr_2015_num_events kr_2016_num_events kr_sigma_2015_list kr_sigma_2016_list kr_staterr_2015_list kr_staterr_2016_list ... + pseudo_lifetime_2016 pseudo_lifetime_2015 kr_s1_c_2015 kr_s2_c_2015 h3_s1_c_2015 h3_s2_c_2015 kr_s1_c_2016 kr_s2_c_2016 h3_s1_c_2016 h3_s2_c_2016 ... + kr_2015_drift_time kr_2015_s2x kr_2015_s2y kr_2016_drift_time kr_2016_s2x kr_2016_s2y ... + kr_chi2_2016_zslice_list kr_chi2_2015_zslice_list kr_chi2_zslice_zcenter_list ... + full_kr_chi2_2016_list full_kr_chi2_2015_list best_total_kr_chi2 best_total_h3_chi2 alternate_total_chi2_map alternate_total_chi2_list ... + best_total_alternate_chi2 best_total_alternate_kr_chi2 best_total_alternate_h3_chi2 besta2_alternate bestb2_alternate bestg1_alternate bestg2_alternate bestc2_alternate c2 ... + total_h3_chi2_nothresh_list total_chi2_nothresh_list alternate_total_chi2_nothresh_list h3_chi2_2015_nothresh_list h3_chi2_2016_nothresh_list ... + total_h3_chi2_nothresh_map total_chi2_nothresh_map alternate_total_chi2_nothresh_map h3_chi2_2016_nothresh_map h3_chi2_2015_nothresh_map ... + best_total_chi2_nothresh best_total_kr_chi2_nothresh best_total_h3_chi2_nothresh besta2_nothresh bestb2_nothresh bestc2_nothresh bestg1_nothresh bestEE_nothresh ... + best_total_alternate_chi2_nothresh best_total_alternate_kr_chi2_nothresh best_total_alternate_h3_chi2_nothresh besta2_alternate_nothresh bestb2_alternate_nothresh ... + bestc2_alternate_nothresh bestg1_alternate_nothresh bestEE_alternate_nothresh best_total_chi2_nothresh best_total_alternate_chi2_nothresh ee_list ... + total_h3_chi2_nothresh_separatescaling_list total_chi2_nothresh_separatescaling_list best_total_chi2_nothresh_separatescaling ... + best_total_kr_chi2_nothresh_separatescaling best_total_h3_chi2_nothresh_separatescaling besta2_nothresh_separatescaling ... + bestc2_nothresh_separatescaling bestg1_nothresh_separatescaling bestEE_nothresh_separatescaling ... + total_h3_chi2_nothresh_separatescaling_map total_chi2_nothresh_separatescaling_map bestEE_nothresh ... + h3_chi2_2015_nothresh_separatescaling_list h3_chi2_2016_nothresh_separatescaling_list ee_list ... + h3_chi2_2016_oldsim_list h3_chi2_2015_oldsim_list total_h3_chi2_oldsim_list total_chi2_oldsim_list ... + best_total_chi2_oldsim best_total_kr_chi2_oldsim best_total_h3_chi2_oldsim besta2_oldsim bestb2_oldsim ... + bestc2_oldsim bestg1_oldsim bestEE_oldsim NEST_CH3T_Spectrum_old +%% Make plots + + + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\NEST_CH3T_Spectrum_old.mat') + + + +best_total_chi2=100000000; +for g1=0.09:0.005:0.125; + for ee=0.75:0.01:1.2; + + g2_feb2016=25.05*ee; %converting to g2 with SE size + g2_sep2015=25.8536*ee; +%Kr 2014 data + +Kr_E_2016=(1/73).*(kr_s1_c_2016./g1+kr_s2_c_2016./g2_feb2016); +H3_E_2016=(1/73).*(h3_s1_c_2016./g1+h3_s2_c_2016./g2_feb2016); + +Kr_E_2015=(1/73).*(kr_s1_c_2015./g1+kr_s2_c_2015./g2_sep2015); +H3_E_2015=(1/73).*(h3_s1_c_2015./g1+h3_s2_c_2015./g2_sep2015); + +i=1; +for dT_max=40+20/2:20:300-20/2; + temp_fit_2016=fit([0:1:100].',hist(Kr_E_2016(inrange(kr_2016_drift_time,[dT_max-20 dT_max])),[0:1:100]).','gauss1'); + kr_2016_means(i)=temp_fit_2016.b1; + kr_2016_means_err(i)=temp_fit_2016.c1/sqrt(2)/length(Kr_E_2016(inrange(kr_2016_drift_time,[dT_max-20 dT_max]))); + + temp_fit_2015=fit([0:1:100].',hist(Kr_E_2015(inrange(kr_2015_drift_time,[dT_max-20 dT_max])),[0:1:100]).','gauss1'); + kr_2015_means(i)=temp_fit_2015.b1; + kr_2015_means_err(i)=temp_fit_2015.c1/sqrt(2)/length(Kr_E_2015(inrange(kr_2015_drift_time,[dT_max-20 dT_max]))); + + dT_centers(i)=dT_max-10; + i=i+1; +end + +kr_2016_chi2_slices=((41.55-kr_2016_means)./0.2395).^2; +kr_2015_chi2_slices=((41.55-kr_2015_means)./0.2395).^2; + + %make CH3T data spectrum + [h3_hist_2016,h3_hist_bin_2016]=hist(H3_E_2016,NEST_CH3T_Spectrum_old(1,:)); + [h3_hist_2015,h3_hist_bin_2015]=hist(H3_E_2015,NEST_CH3T_Spectrum_old(1,:)); + + scale_factor_2015_oldsim=sum(h3_hist_2015(17:80))/sum(NEST_CH3T_Spectrum_old(2,17:80)); + h3_scaled_oldsim_2015=scale_factor_2015_oldsim.*NEST_CH3T_Spectrum_old(2,:); + + scale_factor_2016_oldsim=sum(h3_hist_2016(17:80))/sum(NEST_CH3T_Spectrum_old(2,17:80)); + h3_scaled_oldsim_2016=scale_factor_2016_oldsim.*NEST_CH3T_Spectrum_old(2,:); + + h3_chi2_2016=(1/62).*sum( (h3_scaled_oldsim_2016(17:80) - h3_hist_2016(17:80)).^2 ./(h3_hist_2016(17:80))); %(4:80) is to avoid low stat areas in the simulation + h3_chi2_2015=(1/62).*sum( (h3_scaled_oldsim_2015(17:80) - h3_hist_2015(17:80)).^2 ./(h3_hist_2015(17:80))); + + total_h3_chi2=(h3_chi2_2016+h3_chi2_2015)/2; + total_kr_chi2=(mean(kr_2016_chi2_slices)+mean(kr_2015_chi2_slices))/2; + total_chi2=(total_h3_chi2+total_kr_chi2)/2; + + if total_chi290000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval); + + + + end + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=1000; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1500]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[5+bin_size, 500] );%from 50 to 300us for the fit, based on when s1as1b values get strange + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + %%Tracker for pseudo-lifetime + s2_at_bottom=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_2015=-320/log(s2_at_bottom/s2_at_top); + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_xbins),floor(s2_ybins)); +Sigma_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); +Count_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_xbins),floor(s1_ybins)); +Sigma_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); +Count_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XYZ. 3D Map, caluculate and Submit IQ +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% if Kr_events>150000 +% +% % LUXkrypCal_S1_3D(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_distance_\mus,user_name,file_id_cp,dp_version,submit); +% LUXkrypCal_S1_3D_Run04_local_2p14FixedZHisto(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_time,x_center,y_center,z_center,det_edge,inpaint_on,user_name,file_id_cp,dp_version, algorithm_name, submit); +% +% +% end + + +%% Apply corrections to CH3T and calculate the ER band shift + +%First load the data + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\CH3T_Sep2015_NoCorrections.mat'); + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = S2_x; +s1_y_cm = S2_y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,S2_x,S2_y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + h3_cut= inrange(drift_time,[40 300]) & inrange(s1_phe_both,[0 120]) ... + & (log10(s1_phe_both)+0.8*log10(s2_phe_both)<5.2) .... + & (log10(s1_phe_both)-2*log10(s2_phe_both)>-6.8) & (log10(s1_phe_both)-2*log10(s2_phe_both)<-4.8)... + & s2_phe_both>100 & s2_phe_both<16000 & s2radius<25; %used to be drift time 100 to 250 + +h3_s1_c_2015=s1_phe_both_xyz(h3_cut); +h3_s2_c_2015=s2_phe_both_xyz(h3_cut); + + + kr_cut= inrange(drift_time,[40 300]) & inrange(s1_phe_both,[30 1000]) ... + & (log10(s1_phe_both)+0.6*log10(s2_phe_both)>4.5) & (log10(s1_phe_both)+0.6*log10(s2_phe_both)<5.05) ... + & (log10(s1_phe_both)-2*log10(s2_phe_both)>-7.6) & (log10(s1_phe_both)-2*log10(s2_phe_both)<-4.7) ... + & s2_phe_both>3000 & s2_phe_both<60000 & s2radius<25; %used to be drift time 100 to 250 + +kr_s1_c_2015=s1_phe_both_xyz(kr_cut); +kr_s2_c_2015=s2_phe_both_xyz(kr_cut); +kr_2015_drift_time=drift_time(kr_cut); +kr_2015_s2x=S2_x(kr_cut); +kr_2015_s2y=S2_y(kr_cut); + + clearvars -except param_counter a1_list b1_list a2_list b2_list total_chi2_list h3_chi2_list kr_chi2_list g1_list g2_list total_chi2_map h3_chi2_map kr_chi2_map chi2_midtobot_list... + best_chi2_midtotop besta1_midtotop besta2_midtotop bestb1_midtotop bestb2_midtotop best_chi2_midtobot... + besta1_midtobot besta1_midtotop bestb1_midtobot bestb1_midtotop a1 b1 a2 b2 c2 chi2_midtotop_map chi2_midtobot_map b_counter a_counter... + besta1_combined bestb1_combined besta2_combined bestb2_combined best_chi2_combined chi2_combined_map chi2_combined_list b1_counter a1_counter a2_counter b2_counter... + a1_counter b1_counter a2_counter b2_counter c1_list c2_list bestc1_midtobot bestc2_midtobot bestc1_midtotop bestc2_midtotop bestc1_combined bestc2_combined... + besta1_combined besta2_combined bestb1_combined bestb2_combined besta1 bestb1 bestc1 besta2 bestb2 bestc2 bestg1 bestg2 best_total_chi2 NEST_CH3T_Spectrum inpaint_on... + best_kr_chi2 best_h3_chi2 electron_lifetime_list electron_lifetime_map a2_start a1_start b1_start b2_start ... + total_h3_chi2_list total_kr_chi2_list total_chi2_list h3_chi2_2016_list h3_chi2_2015_list kr_chi2_2016_list kr_chi2_2015_list ... + electron_lifetime_2016_list electron_lifetime_2015_list total_h3_chi2_map total_kr_chi2_map total_chi2_map h3_chi2_2016_map h3_chi2_2015_map ... + kr_chi2_2016_map kr_chi2_2015_map electron_lifetime_2016_map electron_lifetime_2015_map NEST_CH3T_Spectrum_Sep2015 NEST_CH3T_Spectrum_Feb2016 g1 g2 bestg1 bestg2 g1_counter g2_counter ... + firsta1 firstb1 firsta2 firstb2 firstg1 firstg2 kr_means_2015_map kr_means_2016_map kr_sigma_2015_map kr_sigma_2016_map kr_staterr_2015_map kr_staterr_2016_map ... + kr_means_2015_list kr_means_2016_list kr_2015_num_events kr_2016_num_events kr_sigma_2015_list kr_sigma_2016_list kr_staterr_2015_list kr_staterr_2016_list ... + pseudo_lifetime_2016 pseudo_lifetime_2015 kr_s1_c_2015 kr_s2_c_2015 h3_s1_c_2015 h3_s2_c_2015 s1ab_s2_xyz_fit_map s1ab_s1_xyz_fit_map ... + kr_2015_drift_time kr_2015_s2x kr_2015_s2y kr_chi2_2016_zslice_list kr_chi2_2015_zslice_list kr_chi2_zslice_zcenter_list ... + full_kr_chi2_2016_list full_kr_chi2_2015_list best_total_kr_chi2 best_total_h3_chi2 alternate_total_chi2_map alternate_total_chi2_list ... + best_total_alternate_chi2 best_total_alternate_kr_chi2 best_total_alternate_h3_chi2 besta2_alternate bestb2_alternate bestg1_alternate bestg2_alternate bestc2_alternate ... + total_h3_chi2_nothresh_list total_chi2_nothresh_list alternate_total_chi2_nothresh_list h3_chi2_2015_nothresh_list h3_chi2_2016_nothresh_list ... + total_h3_chi2_nothresh_map total_chi2_nothresh_map alternate_total_chi2_nothresh_map h3_chi2_2016_nothresh_map h3_chi2_2015_nothresh_map ... + best_total_chi2_nothresh best_total_kr_chi2_nothresh best_total_h3_chi2_nothresh besta2_nothresh bestb2_nothresh bestc2_nothresh bestg1_nothresh bestEE_nothresh ... + best_total_alternate_chi2_nothresh best_total_alternate_kr_chi2_nothresh best_total_alternate_h3_chi2_nothresh besta2_alternate_nothresh bestb2_alternate_nothresh ... + bestc2_alternate_nothresh bestg1_alternate_nothresh bestEE_alternate_nothresh best_total_chi2_nothresh best_total_alternate_chi2_nothresh ee_list ... + total_h3_chi2_nothresh_separatescaling_list total_chi2_nothresh_separatescaling_list best_total_chi2_nothresh_separatescaling ... + best_total_kr_chi2_nothresh_separatescaling best_total_h3_chi2_nothresh_separatescaling besta2_nothresh_separatescaling ... + bestc2_nothresh_separatescaling bestg1_nothresh_separatescaling bestEE_nothresh_separatescaling ... + total_h3_chi2_nothresh_separatescaling_map total_chi2_nothresh_separatescaling_map bestEE_nothresh ... + h3_chi2_2015_nothresh_separatescaling_list h3_chi2_2016_nothresh_separatescaling_list ee_list ... + h3_chi2_2016_oldsim_list h3_chi2_2015_oldsim_list total_h3_chi2_oldsim_list total_chi2_oldsim_list ... + best_total_chi2_oldsim best_total_kr_chi2_oldsim best_total_h3_chi2_oldsim besta2_oldsim bestb2_oldsim ... + bestc2_oldsim bestg1_oldsim bestEE_oldsim NEST_CH3T_Spectrum_old + + + +%%%%%%%%%%%%%%%%%%%%% +%% REPEAT FOR 2014 DATA +%%%%%%%%%%%%%%%%%%%%% + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\MappingParametersFit_Start_2016_CutDown.mat') + + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>90000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval); + + + + end + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[5+bin_size, 500] );%from 50 to 300us for the fit, based on when s1as1b values get strange + +s2_both_norm_z_index=mean_index(dT_range); +s2_both_norm_z_means=means(dT_range); + s2_at_top=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + %%Tracker for pseudo-lifetime + s2_at_bottom=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_2016=-320/log(s2_at_bottom/s2_at_top); +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_xbins),floor(s2_ybins)); +Sigma_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); +Count_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_xbins),floor(s1_ybins)); +Sigma_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); +Count_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Apply corrections to 2016 Kr data +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\MappingParametersFit_Start_2016_CutDown.mat') + + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; +% +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate ER Band shift +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + liquid_cut= inrange(drift_time,[40 300]) ... + & (log10(s1_phe_both)+0.7*log10(s2_phe_both)>4.9) & (log10(s1_phe_both)+0.7*log10(s2_phe_both)<5.5) ... + & s2_phe_both>3000 & s2_phe_both<80000 & s2radius<25; %used to be drift time 100 to 250 + + +kr_s1_c_2016=s1_phe_both_xyz(liquid_cut); +kr_s2_c_2016=s2_phe_both_xyz(liquid_cut); +kr_2016_drift_time=drift_time(liquid_cut); +kr_2016_s2x=s2x(liquid_cut); +kr_2016_s2y=s2y(liquid_cut); + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%Apply Corrections to 2016 CH3T Data +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\CH3T_Feb2016_NoCorrections.mat'); + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +% electron_lifetime_2016=e_lifetime_both; +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate ER Band shift +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +s1_min=0; +s1_max=120; + + %% Redo with r<10 cm + + + liquid_cut= clean_cut & inrange(drift_time,[40 300]) ... + & (log10(s1_phe_both)+log10(s2_phe_both)<5.9) & (log10(s1_phe_both)-2.*log10(s2_phe_both)<-4.8) ... + & (log10(s1_phe_both)-2.*log10(s2_phe_both)>-6.8) ... + & s2_phe_both>600 & s2_phe_both<16000 & s2radius<25; %used to be drift time 100 to 250 + + + +h3_s1_c_2016=s1_phe_both_xyz(liquid_cut); +h3_s2_c_2016=s2_phe_both_xyz(liquid_cut); + + clearvars -except param_counter a1_list b1_list a2_list b2_list total_chi2_list h3_chi2_list kr_chi2_list g1_list g2_list total_chi2_map h3_chi2_map kr_chi2_map chi2_midtobot_list... + best_chi2_midtotop besta1_midtotop besta2_midtotop bestb1_midtotop bestb2_midtotop best_chi2_midtobot... + besta1_midtobot besta1_midtotop bestb1_midtobot bestb1_midtotop a1 b1 a2 b2 chi2_midtotop_map chi2_midtobot_map b_counter a_counter... + besta1_combined bestb1_combined besta2_combined bestb2_combined best_chi2_combined chi2_combined_map chi2_combined_list b1_counter a1_counter a2_counter b2_counter... + a1_counter b1_counter a2_counter b2_counter c1_list c2_list bestc1_midtobot bestc2_midtobot bestc1_midtotop bestc2_midtotop bestc1_combined bestc2_combined... + besta1_combined besta2_combined bestb1_combined bestb2_combined besta1 bestb1 bestc1 besta2 bestb2 bestc2 bestg1 bestg2 best_total_chi2 NEST_CH3T_Spectrum inpaint_on... + best_kr_chi2 best_h3_chi2 electron_lifetime_list electron_lifetime_map a2_start a1_start b1_start b2_start ... + total_h3_chi2_list total_kr_chi2_list total_chi2_list h3_chi2_2016_list h3_chi2_2015_list kr_chi2_2016_list kr_chi2_2015_list ... + electron_lifetime_2016_list electron_lifetime_2015_list total_h3_chi2_map total_kr_chi2_map total_chi2_map h3_chi2_2016_map h3_chi2_2015_map ... + kr_chi2_2016_map kr_chi2_2015_map electron_lifetime_2016_map electron_lifetime_2015_map NEST_CH3T_Spectrum_Sep2015 NEST_CH3T_Spectrum_Feb2016 g1 g2 bestg1 bestg2 g1_counter g2_counter ... + firsta1 firstb1 firsta2 firstb2 firstg1 firstg2 kr_means_2015_map kr_means_2016_map kr_sigma_2015_map kr_sigma_2016_map kr_staterr_2015_map kr_staterr_2016_map ... + kr_means_2015_list kr_means_2016_list kr_2015_num_events kr_2016_num_events kr_sigma_2015_list kr_sigma_2016_list kr_staterr_2015_list kr_staterr_2016_list ... + pseudo_lifetime_2016 pseudo_lifetime_2015 kr_s1_c_2015 kr_s2_c_2015 h3_s1_c_2015 h3_s2_c_2015 kr_s1_c_2016 kr_s2_c_2016 h3_s1_c_2016 h3_s2_c_2016 ... + kr_2015_drift_time kr_2015_s2x kr_2015_s2y kr_2016_drift_time kr_2016_s2x kr_2016_s2y ... + kr_chi2_2016_zslice_list kr_chi2_2015_zslice_list kr_chi2_zslice_zcenter_list ... + full_kr_chi2_2016_list full_kr_chi2_2015_list best_total_kr_chi2 best_total_h3_chi2 alternate_total_chi2_map alternate_total_chi2_list ... + best_total_alternate_chi2 best_total_alternate_kr_chi2 best_total_alternate_h3_chi2 besta2_alternate bestb2_alternate bestg1_alternate bestg2_alternate bestc2_alternate c2 ... + total_h3_chi2_nothresh_list total_chi2_nothresh_list alternate_total_chi2_nothresh_list h3_chi2_2015_nothresh_list h3_chi2_2016_nothresh_list ... + total_h3_chi2_nothresh_map total_chi2_nothresh_map alternate_total_chi2_nothresh_map h3_chi2_2016_nothresh_map h3_chi2_2015_nothresh_map ... + best_total_chi2_nothresh best_total_kr_chi2_nothresh best_total_h3_chi2_nothresh besta2_nothresh bestb2_nothresh bestc2_nothresh bestg1_nothresh bestEE_nothresh ... + best_total_alternate_chi2_nothresh best_total_alternate_kr_chi2_nothresh best_total_alternate_h3_chi2_nothresh besta2_alternate_nothresh bestb2_alternate_nothresh ... + bestc2_alternate_nothresh bestg1_alternate_nothresh bestEE_alternate_nothresh best_total_chi2_nothresh best_total_alternate_chi2_nothresh ee_list ... + total_h3_chi2_nothresh_separatescaling_list total_chi2_nothresh_separatescaling_list best_total_chi2_nothresh_separatescaling ... + best_total_kr_chi2_nothresh_separatescaling best_total_h3_chi2_nothresh_separatescaling besta2_nothresh_separatescaling ... + bestc2_nothresh_separatescaling bestg1_nothresh_separatescaling bestEE_nothresh_separatescaling ... + total_h3_chi2_nothresh_separatescaling_map total_chi2_nothresh_separatescaling_map bestEE_nothresh ... + h3_chi2_2015_nothresh_separatescaling_list h3_chi2_2016_nothresh_separatescaling_list ee_list ... + h3_chi2_2016_oldsim_list h3_chi2_2015_oldsim_list total_h3_chi2_oldsim_list total_chi2_oldsim_list ... + best_total_chi2_oldsim best_total_kr_chi2_oldsim best_total_h3_chi2_oldsim besta2_oldsim bestb2_oldsim ... + bestc2_oldsim bestg1_oldsim bestEE_oldsim NEST_CH3T_Spectrum_old +%% Make plots + + + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\NEST_CH3T_Spectrum_old.mat') + + + +% +% best_total_chi2=100000000; +% for g1=0.09:0.005:0.125; +% for ee=0.55:0.01:1.0; +% +% % g1=0.1025; ee=0.76; +% g2_sep2014=27.21*ee; %converting to g2 with SE size +% g2_sep2015=25.8536*ee; +% %Kr 2014 data +% +% Kr_E_2014=(1/73).*(kr_s1_c_2014./g1+kr_s2_c_2014./g2_sep2014); +% H3_E_2014=(1/73).*(h3_s1_c_2014./g1+h3_s2_c_2014./g2_sep2014); +% +% Kr_E_2015=(1/73).*(kr_s1_c_2015./g1+kr_s2_c_2015./g2_sep2015); +% H3_E_2015=(1/73).*(h3_s1_c_2015./g1+h3_s2_c_2015./g2_sep2015); +% +% i=1; +% for dT_max=40+20/2:20:300-20/2; +% temp_fit_2014=fit([0:1:100].',hist(Kr_E_2014(inrange(kr_2014_drift_time,[dT_max-20 dT_max])),[0:1:100]).','gauss1'); +% kr_2014_means(i)=temp_fit_2014.b1; +% kr_2014_means_err(i)=temp_fit_2014.c1/sqrt(2)/length(Kr_E_2014(inrange(kr_2014_drift_time,[dT_max-20 dT_max]))); +% +% temp_fit_2015=fit([0:1:100].',hist(Kr_E_2015(inrange(kr_2015_drift_time,[dT_max-20 dT_max])),[0:1:100]).','gauss1'); +% kr_2015_means(i)=temp_fit_2015.b1; +% kr_2015_means_err(i)=temp_fit_2015.c1/sqrt(2)/length(Kr_E_2015(inrange(kr_2015_drift_time,[dT_max-20 dT_max]))); +% +% dT_centers(i)=dT_max-10; +% i=i+1; +% end +% +% kr_2014_chi2_slices=((41.55-kr_2014_means)./0.2395).^2; +% kr_2015_chi2_slices=((41.55-kr_2015_means)./0.2395).^2; +% +% % figure +% % errorbar(dT_centers,kr_2014_means,kr_2014_means_err,'.k'); +% % xlabel('Drift Time (uSec)'); ylabel('Kr Energy Mean (phd)'); +% % title('2014 Data'); +% % myfigview(16); +% % +% % figure +% % errorbar(dT_centers,kr_2015_means,kr_2015_means_err,'.k'); +% % xlabel('Drift Time (uSec)'); ylabel('Kr Energy Mean (phd)'); +% % title('2015 Data'); +% % myfigview(16); +% % +% % figure +% % errorbar(dT_centers,kr_2014_means,kr_2014_means_err,'.k'); +% % hold on; +% % errorbar(dT_centers,kr_2015_means,kr_2015_means_err,'.r'); +% % xlabel('Drift Time (uSec)'); ylabel('Kr Energy Mean (phd)'); +% % legend('2014','2015'); +% % myfigview(16); +% +% +% %make CH3T data spectrum +% [h3_hist_sep2014,h3_hist_bin_sep2014]=hist(H3_E_2014,NEST_CH3T_Spectrum_Sep2014(1,:)); +% [h3_hist_sep2015,h3_hist_bin_sep2015]=hist(H3_E_2015,NEST_CH3T_Spectrum_Sep2015(1,:)); +% +% %scale the simulation to the data +% scale_factor_sep2014=sum(h3_hist_sep2014)./sum(NEST_CH3T_Spectrum_Sep2014(2,:)); +% scale_factor_sep2015=sum(h3_hist_sep2015)./sum(NEST_CH3T_Spectrum_Sep2015(2,:)); +% h3_scaled_sim_sep2014=NEST_CH3T_Spectrum_Sep2014(2,:).*scale_factor_sep2014; +% h3_scaled_sim_sep2015=NEST_CH3T_Spectrum_Sep2015(2,:).*scale_factor_sep2015; +% +% h3_chi2_Sep2014=(1/63).*sum( (h3_scaled_sim_sep2014(15:80) - h3_hist_sep2014(15:80)).^2 ./(h3_hist_sep2014(15:80))); +% h3_chi2_Sep2015=(1/63).*sum( (h3_scaled_sim_sep2015(15:80) - h3_hist_sep2015(15:80)).^2 ./(h3_hist_sep2015(15:80))); +% +% +% total_h3_chi2=(h3_chi2_Sep2014+h3_chi2_Sep2015)/2; +% total_kr_chi2=(mean(kr_2014_chi2_slices)+mean(kr_2015_chi2_slices))/2; +% total_chi2=(total_h3_chi2+total_kr_chi2)/2; +% +% if total_chi290000; %require 100,000 events to do 3D binning +% %Removing zeros from map with nearest neighbor method +% s1ab_xyz_mean_old=s1ab_xyz_mean; +% temp_map=s1ab_xyz_mean; +% q= ~isnan(temp_map); +% r=nearestpoint(find(~q),find(q)); +% s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); +% +% %interpolating with cubic so that we get NaN when extrapolating +% s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); +% s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); +% s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); +% s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); +% +% %Filling in NaN values with the s1a/s1b Z map polynomial +% s1as1b_zvalues= polyval(s1ab_P,drift_time); +% s1as1b_z_at_center=s1as1b_at_center; +% s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); +% s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); +% s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); +% s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); +% +% s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +% s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +% s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +% s1_phe_both=s1_phe_both./s1_3Dfieldremoval; +% +% +% else +% %Removing zeros from map with nearest neighbor method +% s1ab_xy_mean_old=s1ab_xy_mean; +% temp_map=s1ab_xy_mean; +% q= ~isnan(temp_map); +% r=nearestpoint(find(~q),find(q)); +% s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); +% +% %interpolating with cubic so that we get NaN when extrapolating +% s1as1b_zvalues= polyval(s1ab_P,drift_time); +% s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); +% s1as1b_z_at_center=polyval(s1ab_P,z_center); +% s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); +% +% s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); +% s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); +% s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); +% s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); +% +% %Filling in NaN values with no XY correction. (Z dependence should never be NaN) +% s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; +% s2_zfieldremoval(isnan(s2_zfieldremoval))=1; +% s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; +% s1_zfieldremoval(isnan(s1_zfieldremoval))=1; +% +% +% s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +% s2_phe_both=s2_phe_both./(s2_zfieldremoval); +% s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +% s1_phe_both=s1_phe_both./(s1_zfieldremoval); +% +% +% +% end + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=1000; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1500]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[5+bin_size, 500] );%from 50 to 300us for the fit, based on when s1as1b values get strange + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + %%Tracker for pseudo-lifetime + s2_at_bottom=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_2015=-320/log(s2_at_bottom/s2_at_top); + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_xbins),floor(s2_ybins)); +Sigma_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); +Count_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_xbins),floor(s1_ybins)); +Sigma_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); +Count_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XYZ. 3D Map, caluculate and Submit IQ +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% if Kr_events>150000 +% +% % LUXkrypCal_S1_3D(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_distance_\mus,user_name,file_id_cp,dp_version,submit); +% LUXkrypCal_S1_3D_Run04_local_2p14FixedZHisto(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_time,x_center,y_center,z_center,det_edge,inpaint_on,user_name,file_id_cp,dp_version, algorithm_name, submit); +% +% +% end + + +%% Apply corrections to CH3T and calculate the ER band shift + +%First load the data + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\CH3T_Sep2015_NoCorrections.mat'); + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = S2_x; +s1_y_cm = S2_y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,S2_x,S2_y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + h3_cut= inrange(drift_time,[40 300]) & inrange(s1_phe_both,[0 120]) ... + & (log10(s1_phe_both)+0.8*log10(s2_phe_both)<5.2) .... + & (log10(s1_phe_both)-2*log10(s2_phe_both)>-6.8) & (log10(s1_phe_both)-2*log10(s2_phe_both)<-4.8)... + & s2_phe_both>100 & s2_phe_both<16000 & s2radius<25; %used to be drift time 100 to 250 + +h3_s1_c_2015=s1_phe_both_xyz(h3_cut); +h3_s2_c_2015=s2_phe_both_xyz(h3_cut); + + + kr_cut= inrange(drift_time,[40 300]) & inrange(s1_phe_both,[30 1000]) ... + & (log10(s1_phe_both)+0.6*log10(s2_phe_both)>4.5) & (log10(s1_phe_both)+0.6*log10(s2_phe_both)<5.05) ... + & (log10(s1_phe_both)-2*log10(s2_phe_both)>-7.6) & (log10(s1_phe_both)-2*log10(s2_phe_both)<-4.7) ... + & s2_phe_both>3000 & s2_phe_both<60000 & s2radius<25; %used to be drift time 100 to 250 + +kr_s1_c_2015=s1_phe_both_xyz(kr_cut); +kr_s2_c_2015=s2_phe_both_xyz(kr_cut); +kr_2015_drift_time=drift_time(kr_cut); +kr_2015_s2x=S2_x(kr_cut); +kr_2015_s2y=S2_y(kr_cut); + + clearvars -except param_counter a1_list b1_list a2_list b2_list total_chi2_list h3_chi2_list kr_chi2_list g1_list g2_list total_chi2_map h3_chi2_map kr_chi2_map chi2_midtobot_list... + best_chi2_midtotop besta1_midtotop besta2_midtotop bestb1_midtotop bestb2_midtotop best_chi2_midtobot... + besta1_midtobot besta1_midtotop bestb1_midtobot bestb1_midtotop a1 b1 a2 b2 c2 chi2_midtotop_map chi2_midtobot_map b_counter a_counter... + besta1_combined bestb1_combined besta2_combined bestb2_combined best_chi2_combined chi2_combined_map chi2_combined_list b1_counter a1_counter a2_counter b2_counter... + a1_counter b1_counter a2_counter b2_counter c1_list c2_list bestc1_midtobot bestc2_midtobot bestc1_midtotop bestc2_midtotop bestc1_combined bestc2_combined... + besta1_combined besta2_combined bestb1_combined bestb2_combined besta1 bestb1 bestc1 besta2 bestb2 bestc2 bestg1 bestg2 best_total_chi2 NEST_CH3T_Spectrum inpaint_on... + best_kr_chi2 best_h3_chi2 electron_lifetime_list electron_lifetime_map a2_start a1_start b1_start b2_start ... + total_h3_chi2_list total_kr_chi2_list total_chi2_list h3_chi2_2016_list h3_chi2_2015_list kr_chi2_2016_list kr_chi2_2015_list ... + electron_lifetime_2016_list electron_lifetime_2015_list total_h3_chi2_map total_kr_chi2_map total_chi2_map h3_chi2_2016_map h3_chi2_2015_map ... + kr_chi2_2016_map kr_chi2_2015_map electron_lifetime_2016_map electron_lifetime_2015_map NEST_CH3T_Spectrum_Sep2015 NEST_CH3T_Spectrum_Feb2016 g1 g2 bestg1 bestg2 g1_counter g2_counter ... + firsta1 firstb1 firsta2 firstb2 firstg1 firstg2 kr_means_2015_map kr_means_2016_map kr_sigma_2015_map kr_sigma_2016_map kr_staterr_2015_map kr_staterr_2016_map ... + kr_means_2015_list kr_means_2016_list kr_2015_num_events kr_2016_num_events kr_sigma_2015_list kr_sigma_2016_list kr_staterr_2015_list kr_staterr_2016_list ... + pseudo_lifetime_2016 pseudo_lifetime_2015 kr_s1_c_2015 kr_s2_c_2015 h3_s1_c_2015 h3_s2_c_2015 s1ab_s2_xyz_fit_map s1ab_s1_xyz_fit_map ... + kr_2015_drift_time kr_2015_s2x kr_2015_s2y kr_chi2_2016_zslice_list kr_chi2_2015_zslice_list kr_chi2_zslice_zcenter_list ... + full_kr_chi2_2016_list full_kr_chi2_2015_list best_total_kr_chi2 best_total_h3_chi2 alternate_total_chi2_map alternate_total_chi2_list ... + best_total_alternate_chi2 best_total_alternate_kr_chi2 best_total_alternate_h3_chi2 besta2_alternate bestb2_alternate bestg1_alternate bestg2_alternate bestc2_alternate ... + total_h3_chi2_nothresh_list total_chi2_nothresh_list alternate_total_chi2_nothresh_list h3_chi2_2015_nothresh_list h3_chi2_2016_nothresh_list ... + total_h3_chi2_nothresh_map total_chi2_nothresh_map alternate_total_chi2_nothresh_map h3_chi2_2016_nothresh_map h3_chi2_2015_nothresh_map ... + best_total_chi2_nothresh best_total_kr_chi2_nothresh best_total_h3_chi2_nothresh besta2_nothresh bestb2_nothresh bestc2_nothresh bestg1_nothresh bestEE_nothresh ... + best_total_alternate_chi2_nothresh best_total_alternate_kr_chi2_nothresh best_total_alternate_h3_chi2_nothresh besta2_alternate_nothresh bestb2_alternate_nothresh ... + bestc2_alternate_nothresh bestg1_alternate_nothresh bestEE_alternate_nothresh best_total_chi2_nothresh best_total_alternate_chi2_nothresh ee_list ... + total_h3_chi2_nothresh_separatescaling_list total_chi2_nothresh_separatescaling_list best_total_chi2_nothresh_separatescaling ... + best_total_kr_chi2_nothresh_separatescaling best_total_h3_chi2_nothresh_separatescaling besta2_nothresh_separatescaling ... + bestc2_nothresh_separatescaling bestg1_nothresh_separatescaling bestEE_nothresh_separatescaling ... + total_h3_chi2_nothresh_separatescaling_map total_chi2_nothresh_separatescaling_map bestEE_nothresh ... + h3_chi2_2015_nothresh_separatescaling_list h3_chi2_2016_nothresh_separatescaling_list ee_list ... + h3_chi2_2016_oldsim_list h3_chi2_2015_oldsim_list total_h3_chi2_oldsim_list total_chi2_oldsim_list ... + best_total_chi2_oldsim best_total_kr_chi2_oldsim best_total_h3_chi2_oldsim besta2_oldsim bestb2_oldsim ... + bestc2_oldsim bestg1_oldsim bestEE_oldsim NEST_CH3T_Spectrum_old + + + +%%%%%%%%%%%%%%%%%%%%% +%% REPEAT FOR 2014 DATA +%%%%%%%%%%%%%%%%%%%%% + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\MappingParametersFit_Start_2016_CutDown.mat') + +% %If we can use 3D map, do so. If there aren't enough events do 1D then 2D +% if length(s1ab_z)>90000; %require 100,000 events to do 3D binning +% %Removing zeros from map with nearest neighbor method +% s1ab_xyz_mean_old=s1ab_xyz_mean; +% temp_map=s1ab_xyz_mean; +% q= ~isnan(temp_map); +% r=nearestpoint(find(~q),find(q)); +% s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); +% +% %interpolating with cubic so that we get NaN when extrapolating +% s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); +% s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); +% s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); +% s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); +% +% %Filling in NaN values with the s1a/s1b Z map polynomial +% s1as1b_zvalues= polyval(s1ab_P,drift_time); +% s1as1b_z_at_center=s1as1b_at_center; +% s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); +% s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); +% s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); +% s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); +% +% s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +% s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +% s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +% s1_phe_both=s1_phe_both./s1_3Dfieldremoval; +% +% +% else +% %Removing zeros from map with nearest neighbor method +% s1ab_xy_mean_old=s1ab_xy_mean; +% temp_map=s1ab_xy_mean; +% q= ~isnan(temp_map); +% r=nearestpoint(find(~q),find(q)); +% s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); +% +% %interpolating with cubic so that we get NaN when extrapolating +% s1as1b_zvalues= polyval(s1ab_P,drift_time); +% s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); +% s1as1b_z_at_center=polyval(s1ab_P,z_center); +% s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); +% +% s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); +% s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); +% s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); +% s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); +% +% %Filling in NaN values with no XY correction. (Z dependence should never be NaN) +% s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; +% s2_zfieldremoval(isnan(s2_zfieldremoval))=1; +% s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; +% s1_zfieldremoval(isnan(s1_zfieldremoval))=1; +% +% +% s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +% s2_phe_both=s2_phe_both./(s2_zfieldremoval); +% s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +% s1_phe_both=s1_phe_both./(s1_zfieldremoval); +% +% +% +% end + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[5+bin_size, 500] );%from 50 to 300us for the fit, based on when s1as1b values get strange + +s2_both_norm_z_index=mean_index(dT_range); +s2_both_norm_z_means=means(dT_range); + s2_at_top=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + %%Tracker for pseudo-lifetime + s2_at_bottom=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_2016=-320/log(s2_at_bottom/s2_at_top); +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_xbins),floor(s2_ybins)); +Sigma_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); +Count_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_xbins),floor(s1_ybins)); +Sigma_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); +Count_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Apply corrections to 2016 Kr data +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\MappingParametersFit_Start_2016_CutDown.mat') + + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; +% +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate ER Band shift +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + liquid_cut= inrange(drift_time,[40 300]) ... + & (log10(s1_phe_both)+0.7*log10(s2_phe_both)>4.9) & (log10(s1_phe_both)+0.7*log10(s2_phe_both)<5.5) ... + & s2_phe_both>3000 & s2_phe_both<80000 & s2radius<25; %used to be drift time 100 to 250 + + +kr_s1_c_2016=s1_phe_both_xyz(liquid_cut); +kr_s2_c_2016=s2_phe_both_xyz(liquid_cut); +kr_2016_drift_time=drift_time(liquid_cut); +kr_2016_s2x=s2x(liquid_cut); +kr_2016_s2y=s2y(liquid_cut); + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%Apply Corrections to 2016 CH3T Data +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\CH3T_Feb2016_NoCorrections.mat'); + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +% electron_lifetime_2016=e_lifetime_both; +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate ER Band shift +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +s1_min=0; +s1_max=120; + + %% Redo with r<10 cm + + + liquid_cut= clean_cut & inrange(drift_time,[40 300]) ... + & (log10(s1_phe_both)+log10(s2_phe_both)<5.9) & (log10(s1_phe_both)-2.*log10(s2_phe_both)<-4.8) ... + & (log10(s1_phe_both)-2.*log10(s2_phe_both)>-6.8) ... + & s2_phe_both>600 & s2_phe_both<16000 & s2radius<25; %used to be drift time 100 to 250 + + + +h3_s1_c_2016=s1_phe_both_xyz(liquid_cut); +h3_s2_c_2016=s2_phe_both_xyz(liquid_cut); + + clearvars -except param_counter a1_list b1_list a2_list b2_list total_chi2_list h3_chi2_list kr_chi2_list g1_list g2_list total_chi2_map h3_chi2_map kr_chi2_map chi2_midtobot_list... + best_chi2_midtotop besta1_midtotop besta2_midtotop bestb1_midtotop bestb2_midtotop best_chi2_midtobot... + besta1_midtobot besta1_midtotop bestb1_midtobot bestb1_midtotop a1 b1 a2 b2 chi2_midtotop_map chi2_midtobot_map b_counter a_counter... + besta1_combined bestb1_combined besta2_combined bestb2_combined best_chi2_combined chi2_combined_map chi2_combined_list b1_counter a1_counter a2_counter b2_counter... + a1_counter b1_counter a2_counter b2_counter c1_list c2_list bestc1_midtobot bestc2_midtobot bestc1_midtotop bestc2_midtotop bestc1_combined bestc2_combined... + besta1_combined besta2_combined bestb1_combined bestb2_combined besta1 bestb1 bestc1 besta2 bestb2 bestc2 bestg1 bestg2 best_total_chi2 NEST_CH3T_Spectrum inpaint_on... + best_kr_chi2 best_h3_chi2 electron_lifetime_list electron_lifetime_map a2_start a1_start b1_start b2_start ... + total_h3_chi2_list total_kr_chi2_list total_chi2_list h3_chi2_2016_list h3_chi2_2015_list kr_chi2_2016_list kr_chi2_2015_list ... + electron_lifetime_2016_list electron_lifetime_2015_list total_h3_chi2_map total_kr_chi2_map total_chi2_map h3_chi2_2016_map h3_chi2_2015_map ... + kr_chi2_2016_map kr_chi2_2015_map electron_lifetime_2016_map electron_lifetime_2015_map NEST_CH3T_Spectrum_Sep2015 NEST_CH3T_Spectrum_Feb2016 g1 g2 bestg1 bestg2 g1_counter g2_counter ... + firsta1 firstb1 firsta2 firstb2 firstg1 firstg2 kr_means_2015_map kr_means_2016_map kr_sigma_2015_map kr_sigma_2016_map kr_staterr_2015_map kr_staterr_2016_map ... + kr_means_2015_list kr_means_2016_list kr_2015_num_events kr_2016_num_events kr_sigma_2015_list kr_sigma_2016_list kr_staterr_2015_list kr_staterr_2016_list ... + pseudo_lifetime_2016 pseudo_lifetime_2015 kr_s1_c_2015 kr_s2_c_2015 h3_s1_c_2015 h3_s2_c_2015 kr_s1_c_2016 kr_s2_c_2016 h3_s1_c_2016 h3_s2_c_2016 ... + kr_2015_drift_time kr_2015_s2x kr_2015_s2y kr_2016_drift_time kr_2016_s2x kr_2016_s2y ... + kr_chi2_2016_zslice_list kr_chi2_2015_zslice_list kr_chi2_zslice_zcenter_list ... + full_kr_chi2_2016_list full_kr_chi2_2015_list best_total_kr_chi2 best_total_h3_chi2 alternate_total_chi2_map alternate_total_chi2_list ... + best_total_alternate_chi2 best_total_alternate_kr_chi2 best_total_alternate_h3_chi2 besta2_alternate bestb2_alternate bestg1_alternate bestg2_alternate bestc2_alternate c2 ... + total_h3_chi2_nothresh_list total_chi2_nothresh_list alternate_total_chi2_nothresh_list h3_chi2_2015_nothresh_list h3_chi2_2016_nothresh_list ... + total_h3_chi2_nothresh_map total_chi2_nothresh_map alternate_total_chi2_nothresh_map h3_chi2_2016_nothresh_map h3_chi2_2015_nothresh_map ... + best_total_chi2_nothresh best_total_kr_chi2_nothresh best_total_h3_chi2_nothresh besta2_nothresh bestb2_nothresh bestc2_nothresh bestg1_nothresh bestEE_nothresh ... + best_total_alternate_chi2_nothresh best_total_alternate_kr_chi2_nothresh best_total_alternate_h3_chi2_nothresh besta2_alternate_nothresh bestb2_alternate_nothresh ... + bestc2_alternate_nothresh bestg1_alternate_nothresh bestEE_alternate_nothresh best_total_chi2_nothresh best_total_alternate_chi2_nothresh ee_list ... + total_h3_chi2_nothresh_separatescaling_list total_chi2_nothresh_separatescaling_list best_total_chi2_nothresh_separatescaling ... + best_total_kr_chi2_nothresh_separatescaling best_total_h3_chi2_nothresh_separatescaling besta2_nothresh_separatescaling ... + bestc2_nothresh_separatescaling bestg1_nothresh_separatescaling bestEE_nothresh_separatescaling ... + total_h3_chi2_nothresh_separatescaling_map total_chi2_nothresh_separatescaling_map bestEE_nothresh ... + h3_chi2_2015_nothresh_separatescaling_list h3_chi2_2016_nothresh_separatescaling_list ee_list ... + h3_chi2_2016_oldsim_list h3_chi2_2015_oldsim_list total_h3_chi2_oldsim_list total_chi2_oldsim_list ... + best_total_chi2_oldsim best_total_kr_chi2_oldsim best_total_h3_chi2_oldsim besta2_oldsim bestb2_oldsim ... + bestc2_oldsim bestg1_oldsim bestEE_oldsim NEST_CH3T_Spectrum_old +%% Make plots + + + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\NEST_CH3T_Spectrum_old.mat') + + + + +best_total_chi2=100000000; +for g1=0.09:0.005:0.125; + for ee=0.75:0.01:1.2; + + g2_feb2016=25.05*ee; %converting to g2 with SE size + g2_sep2015=25.8536*ee; +%Kr 2014 data + +Kr_E_2016=(1/73).*(kr_s1_c_2016./g1+kr_s2_c_2016./g2_feb2016); +H3_E_2016=(1/73).*(h3_s1_c_2016./g1+h3_s2_c_2016./g2_feb2016); + +Kr_E_2015=(1/73).*(kr_s1_c_2015./g1+kr_s2_c_2015./g2_sep2015); +H3_E_2015=(1/73).*(h3_s1_c_2015./g1+h3_s2_c_2015./g2_sep2015); + +i=1; +for dT_max=40+20/2:20:300-20/2; + temp_fit_2016=fit([0:1:100].',hist(Kr_E_2016(inrange(kr_2016_drift_time,[dT_max-20 dT_max])),[0:1:100]).','gauss1'); + kr_2016_means(i)=temp_fit_2016.b1; + kr_2016_means_err(i)=temp_fit_2016.c1/sqrt(2)/length(Kr_E_2016(inrange(kr_2016_drift_time,[dT_max-20 dT_max]))); + + temp_fit_2015=fit([0:1:100].',hist(Kr_E_2015(inrange(kr_2015_drift_time,[dT_max-20 dT_max])),[0:1:100]).','gauss1'); + kr_2015_means(i)=temp_fit_2015.b1; + kr_2015_means_err(i)=temp_fit_2015.c1/sqrt(2)/length(Kr_E_2015(inrange(kr_2015_drift_time,[dT_max-20 dT_max]))); + + dT_centers(i)=dT_max-10; + i=i+1; +end + +kr_2016_chi2_slices=((41.55-kr_2016_means)./0.2395).^2; +kr_2015_chi2_slices=((41.55-kr_2015_means)./0.2395).^2; + + %make CH3T data spectrum + [h3_hist_2016,h3_hist_bin_2016]=hist(H3_E_2016,NEST_CH3T_Spectrum_old(1,:)); + [h3_hist_2015,h3_hist_bin_2015]=hist(H3_E_2015,NEST_CH3T_Spectrum_old(1,:)); + + scale_factor_2015_oldsim=sum(h3_hist_2015(17:80))/sum(NEST_CH3T_Spectrum_old(2,17:80)); + h3_scaled_oldsim_2015=scale_factor_2015_oldsim.*NEST_CH3T_Spectrum_old(2,:); + + scale_factor_2016_oldsim=sum(h3_hist_2016(17:80))/sum(NEST_CH3T_Spectrum_old(2,17:80)); + h3_scaled_oldsim_2016=scale_factor_2016_oldsim.*NEST_CH3T_Spectrum_old(2,:); + + h3_chi2_2016=(1/62).*sum( (h3_scaled_oldsim_2016(17:80) - h3_hist_2016(17:80)).^2 ./(h3_hist_2016(17:80))); %(4:80) is to avoid low stat areas in the simulation + h3_chi2_2015=(1/62).*sum( (h3_scaled_oldsim_2015(17:80) - h3_hist_2015(17:80)).^2 ./(h3_hist_2015(17:80))); + + total_h3_chi2=(h3_chi2_2016+h3_chi2_2015)/2; + total_kr_chi2=(mean(kr_2016_chi2_slices)+mean(kr_2015_chi2_slices))/2; + total_chi2=(total_h3_chi2+total_kr_chi2)/2; + + if total_chi290000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval); + + + + end + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=1000; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1500]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[5+bin_size, 500] );%from 50 to 300us for the fit, based on when s1as1b values get strange + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + %%Tracker for pseudo-lifetime + s2_at_bottom=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_2015=-320/log(s2_at_bottom/s2_at_top); + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_xbins),floor(s2_ybins)); +Sigma_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); +Count_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_xbins),floor(s1_ybins)); +Sigma_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); +Count_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XYZ. 3D Map, caluculate and Submit IQ +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% if Kr_events>150000 +% +% % LUXkrypCal_S1_3D(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_distance_\mus,user_name,file_id_cp,dp_version,submit); +% LUXkrypCal_S1_3D_Run04_local_2p14FixedZHisto(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_time,x_center,y_center,z_center,det_edge,inpaint_on,user_name,file_id_cp,dp_version, algorithm_name, submit); +% +% +% end + + +%% Apply corrections to CH3T and calculate the ER band shift + +%First load the data + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\CH3T_Sep2015_NoCorrections.mat'); + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = S2_x; +s1_y_cm = S2_y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,S2_x,S2_y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + h3_cut= inrange(drift_time,[40 300]) & inrange(s1_phe_both,[0 120]) ... + & (log10(s1_phe_both)+0.8*log10(s2_phe_both)<5.2) .... + & (log10(s1_phe_both)-2*log10(s2_phe_both)>-6.8) & (log10(s1_phe_both)-2*log10(s2_phe_both)<-4.8)... + & s2_phe_both>100 & s2_phe_both<16000 & s2radius<25; %used to be drift time 100 to 250 + +h3_s1_c_2015=s1_phe_both_z(h3_cut); +h3_s2_c_2015=s2_phe_both_z(h3_cut); + + + kr_cut= inrange(drift_time,[40 300]) & inrange(s1_phe_both,[30 1000]) ... + & (log10(s1_phe_both)+0.6*log10(s2_phe_both)>4.5) & (log10(s1_phe_both)+0.6*log10(s2_phe_both)<5.05) ... + & (log10(s1_phe_both)-2*log10(s2_phe_both)>-7.6) & (log10(s1_phe_both)-2*log10(s2_phe_both)<-4.7) ... + & s2_phe_both>3000 & s2_phe_both<60000 & s2radius<25; %used to be drift time 100 to 250 + +kr_s1_c_2015=s1_phe_both_z(kr_cut); +kr_s2_c_2015=s2_phe_both_z(kr_cut); +kr_2015_drift_time=drift_time(kr_cut); +kr_2015_s2x=S2_x(kr_cut); +kr_2015_s2y=S2_y(kr_cut); + + clearvars -except param_counter a1_list b1_list a2_list b2_list total_chi2_list h3_chi2_list kr_chi2_list g1_list g2_list total_chi2_map h3_chi2_map kr_chi2_map chi2_midtobot_list... + best_chi2_midtotop besta1_midtotop besta2_midtotop bestb1_midtotop bestb2_midtotop best_chi2_midtobot... + besta1_midtobot besta1_midtotop bestb1_midtobot bestb1_midtotop a1 b1 a2 b2 c2 chi2_midtotop_map chi2_midtobot_map b_counter a_counter... + besta1_combined bestb1_combined besta2_combined bestb2_combined best_chi2_combined chi2_combined_map chi2_combined_list b1_counter a1_counter a2_counter b2_counter... + a1_counter b1_counter a2_counter b2_counter c1_list c2_list bestc1_midtobot bestc2_midtobot bestc1_midtotop bestc2_midtotop bestc1_combined bestc2_combined... + besta1_combined besta2_combined bestb1_combined bestb2_combined besta1 bestb1 bestc1 besta2 bestb2 bestc2 bestg1 bestg2 best_total_chi2 NEST_CH3T_Spectrum inpaint_on... + best_kr_chi2 best_h3_chi2 electron_lifetime_list electron_lifetime_map a2_start a1_start b1_start b2_start ... + total_h3_chi2_list total_kr_chi2_list total_chi2_list h3_chi2_2016_list h3_chi2_2015_list kr_chi2_2016_list kr_chi2_2015_list ... + electron_lifetime_2016_list electron_lifetime_2015_list total_h3_chi2_map total_kr_chi2_map total_chi2_map h3_chi2_2016_map h3_chi2_2015_map ... + kr_chi2_2016_map kr_chi2_2015_map electron_lifetime_2016_map electron_lifetime_2015_map NEST_CH3T_Spectrum_Sep2015 NEST_CH3T_Spectrum_Feb2016 g1 g2 bestg1 bestg2 g1_counter g2_counter ... + firsta1 firstb1 firsta2 firstb2 firstg1 firstg2 kr_means_2015_map kr_means_2016_map kr_sigma_2015_map kr_sigma_2016_map kr_staterr_2015_map kr_staterr_2016_map ... + kr_means_2015_list kr_means_2016_list kr_2015_num_events kr_2016_num_events kr_sigma_2015_list kr_sigma_2016_list kr_staterr_2015_list kr_staterr_2016_list ... + pseudo_lifetime_2016 pseudo_lifetime_2015 kr_s1_c_2015 kr_s2_c_2015 h3_s1_c_2015 h3_s2_c_2015 s1ab_s2_xyz_fit_map s1ab_s1_xyz_fit_map ... + kr_2015_drift_time kr_2015_s2x kr_2015_s2y kr_chi2_2016_zslice_list kr_chi2_2015_zslice_list kr_chi2_zslice_zcenter_list ... + full_kr_chi2_2016_list full_kr_chi2_2015_list best_total_kr_chi2 best_total_h3_chi2 alternate_total_chi2_map alternate_total_chi2_list ... + best_total_alternate_chi2 best_total_alternate_kr_chi2 best_total_alternate_h3_chi2 besta2_alternate bestb2_alternate bestg1_alternate bestg2_alternate bestc2_alternate ... + total_h3_chi2_nothresh_list total_chi2_nothresh_list alternate_total_chi2_nothresh_list h3_chi2_2015_nothresh_list h3_chi2_2016_nothresh_list ... + total_h3_chi2_nothresh_map total_chi2_nothresh_map alternate_total_chi2_nothresh_map h3_chi2_2016_nothresh_map h3_chi2_2015_nothresh_map ... + best_total_chi2_nothresh best_total_kr_chi2_nothresh best_total_h3_chi2_nothresh besta2_nothresh bestb2_nothresh bestc2_nothresh bestg1_nothresh bestEE_nothresh ... + best_total_alternate_chi2_nothresh best_total_alternate_kr_chi2_nothresh best_total_alternate_h3_chi2_nothresh besta2_alternate_nothresh bestb2_alternate_nothresh ... + bestc2_alternate_nothresh bestg1_alternate_nothresh bestEE_alternate_nothresh best_total_chi2_nothresh best_total_alternate_chi2_nothresh ee_list ... + total_h3_chi2_nothresh_separatescaling_list total_chi2_nothresh_separatescaling_list best_total_chi2_nothresh_separatescaling ... + best_total_kr_chi2_nothresh_separatescaling best_total_h3_chi2_nothresh_separatescaling besta2_nothresh_separatescaling ... + bestc2_nothresh_separatescaling bestg1_nothresh_separatescaling bestEE_nothresh_separatescaling ... + total_h3_chi2_nothresh_separatescaling_map total_chi2_nothresh_separatescaling_map bestEE_nothresh ... + h3_chi2_2015_nothresh_separatescaling_list h3_chi2_2016_nothresh_separatescaling_list ee_list ... + h3_chi2_2016_oldsim_list h3_chi2_2015_oldsim_list total_h3_chi2_oldsim_list total_chi2_oldsim_list ... + best_total_chi2_oldsim best_total_kr_chi2_oldsim best_total_h3_chi2_oldsim besta2_oldsim bestb2_oldsim ... + bestc2_oldsim bestg1_oldsim bestEE_oldsim NEST_CH3T_Spectrum_old + + + +%%%%%%%%%%%%%%%%%%%%% +%% REPEAT FOR 2014 DATA +%%%%%%%%%%%%%%%%%%%%% + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\MappingParametersFit_Start_2016_CutDown.mat') + + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>90000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval); + + + + end + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[5+bin_size, 500] );%from 50 to 300us for the fit, based on when s1as1b values get strange + +s2_both_norm_z_index=mean_index(dT_range); +s2_both_norm_z_means=means(dT_range); + s2_at_top=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + %%Tracker for pseudo-lifetime + s2_at_bottom=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_2016=-320/log(s2_at_bottom/s2_at_top); +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_xbins),floor(s2_ybins)); +Sigma_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); +Count_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_xbins),floor(s1_ybins)); +Sigma_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); +Count_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Apply corrections to 2016 Kr data +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\MappingParametersFit_Start_2016_CutDown.mat') + + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; +% +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate ER Band shift +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + liquid_cut= inrange(drift_time,[40 300]) ... + & (log10(s1_phe_both)+0.7*log10(s2_phe_both)>4.9) & (log10(s1_phe_both)+0.7*log10(s2_phe_both)<5.5) ... + & s2_phe_both>3000 & s2_phe_both<80000 & s2radius<25; %used to be drift time 100 to 250 + + +kr_s1_c_2016=s1_phe_both_z(liquid_cut); +kr_s2_c_2016=s2_phe_both_z(liquid_cut); +kr_2016_drift_time=drift_time(liquid_cut); +kr_2016_s2x=s2x(liquid_cut); +kr_2016_s2y=s2y(liquid_cut); + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%Apply Corrections to 2016 CH3T Data +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\CH3T_Feb2016_NoCorrections.mat'); + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +% electron_lifetime_2016=e_lifetime_both; +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate ER Band shift +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +s1_min=0; +s1_max=120; + + %% Redo with r<10 cm + + + liquid_cut= clean_cut & inrange(drift_time,[40 300]) ... + & (log10(s1_phe_both)+log10(s2_phe_both)<5.9) & (log10(s1_phe_both)-2.*log10(s2_phe_both)<-4.8) ... + & (log10(s1_phe_both)-2.*log10(s2_phe_both)>-6.8) ... + & s2_phe_both>600 & s2_phe_both<16000 & s2radius<25; %used to be drift time 100 to 250 + + + +h3_s1_c_2016=s1_phe_both_z(liquid_cut); +h3_s2_c_2016=s2_phe_both_z(liquid_cut); + + clearvars -except param_counter a1_list b1_list a2_list b2_list total_chi2_list h3_chi2_list kr_chi2_list g1_list g2_list total_chi2_map h3_chi2_map kr_chi2_map chi2_midtobot_list... + best_chi2_midtotop besta1_midtotop besta2_midtotop bestb1_midtotop bestb2_midtotop best_chi2_midtobot... + besta1_midtobot besta1_midtotop bestb1_midtobot bestb1_midtotop a1 b1 a2 b2 chi2_midtotop_map chi2_midtobot_map b_counter a_counter... + besta1_combined bestb1_combined besta2_combined bestb2_combined best_chi2_combined chi2_combined_map chi2_combined_list b1_counter a1_counter a2_counter b2_counter... + a1_counter b1_counter a2_counter b2_counter c1_list c2_list bestc1_midtobot bestc2_midtobot bestc1_midtotop bestc2_midtotop bestc1_combined bestc2_combined... + besta1_combined besta2_combined bestb1_combined bestb2_combined besta1 bestb1 bestc1 besta2 bestb2 bestc2 bestg1 bestg2 best_total_chi2 NEST_CH3T_Spectrum inpaint_on... + best_kr_chi2 best_h3_chi2 electron_lifetime_list electron_lifetime_map a2_start a1_start b1_start b2_start ... + total_h3_chi2_list total_kr_chi2_list total_chi2_list h3_chi2_2016_list h3_chi2_2015_list kr_chi2_2016_list kr_chi2_2015_list ... + electron_lifetime_2016_list electron_lifetime_2015_list total_h3_chi2_map total_kr_chi2_map total_chi2_map h3_chi2_2016_map h3_chi2_2015_map ... + kr_chi2_2016_map kr_chi2_2015_map electron_lifetime_2016_map electron_lifetime_2015_map NEST_CH3T_Spectrum_Sep2015 NEST_CH3T_Spectrum_Feb2016 g1 g2 bestg1 bestg2 g1_counter g2_counter ... + firsta1 firstb1 firsta2 firstb2 firstg1 firstg2 kr_means_2015_map kr_means_2016_map kr_sigma_2015_map kr_sigma_2016_map kr_staterr_2015_map kr_staterr_2016_map ... + kr_means_2015_list kr_means_2016_list kr_2015_num_events kr_2016_num_events kr_sigma_2015_list kr_sigma_2016_list kr_staterr_2015_list kr_staterr_2016_list ... + pseudo_lifetime_2016 pseudo_lifetime_2015 kr_s1_c_2015 kr_s2_c_2015 h3_s1_c_2015 h3_s2_c_2015 kr_s1_c_2016 kr_s2_c_2016 h3_s1_c_2016 h3_s2_c_2016 ... + kr_2015_drift_time kr_2015_s2x kr_2015_s2y kr_2016_drift_time kr_2016_s2x kr_2016_s2y ... + kr_chi2_2016_zslice_list kr_chi2_2015_zslice_list kr_chi2_zslice_zcenter_list ... + full_kr_chi2_2016_list full_kr_chi2_2015_list best_total_kr_chi2 best_total_h3_chi2 alternate_total_chi2_map alternate_total_chi2_list ... + best_total_alternate_chi2 best_total_alternate_kr_chi2 best_total_alternate_h3_chi2 besta2_alternate bestb2_alternate bestg1_alternate bestg2_alternate bestc2_alternate c2 ... + total_h3_chi2_nothresh_list total_chi2_nothresh_list alternate_total_chi2_nothresh_list h3_chi2_2015_nothresh_list h3_chi2_2016_nothresh_list ... + total_h3_chi2_nothresh_map total_chi2_nothresh_map alternate_total_chi2_nothresh_map h3_chi2_2016_nothresh_map h3_chi2_2015_nothresh_map ... + best_total_chi2_nothresh best_total_kr_chi2_nothresh best_total_h3_chi2_nothresh besta2_nothresh bestb2_nothresh bestc2_nothresh bestg1_nothresh bestEE_nothresh ... + best_total_alternate_chi2_nothresh best_total_alternate_kr_chi2_nothresh best_total_alternate_h3_chi2_nothresh besta2_alternate_nothresh bestb2_alternate_nothresh ... + bestc2_alternate_nothresh bestg1_alternate_nothresh bestEE_alternate_nothresh best_total_chi2_nothresh best_total_alternate_chi2_nothresh ee_list ... + total_h3_chi2_nothresh_separatescaling_list total_chi2_nothresh_separatescaling_list best_total_chi2_nothresh_separatescaling ... + best_total_kr_chi2_nothresh_separatescaling best_total_h3_chi2_nothresh_separatescaling besta2_nothresh_separatescaling ... + bestc2_nothresh_separatescaling bestg1_nothresh_separatescaling bestEE_nothresh_separatescaling ... + total_h3_chi2_nothresh_separatescaling_map total_chi2_nothresh_separatescaling_map bestEE_nothresh ... + h3_chi2_2015_nothresh_separatescaling_list h3_chi2_2016_nothresh_separatescaling_list ee_list ... + h3_chi2_2016_oldsim_list h3_chi2_2015_oldsim_list total_h3_chi2_oldsim_list total_chi2_oldsim_list ... + best_total_chi2_oldsim best_total_kr_chi2_oldsim best_total_h3_chi2_oldsim besta2_oldsim bestb2_oldsim ... + bestc2_oldsim bestg1_oldsim bestEE_oldsim NEST_CH3T_Spectrum_old +%% Make plots + + + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\NEST_CH3T_Spectrum_old.mat') + + + + +best_total_chi2=100000000; +for g1=0.09:0.002:0.11; + for ee=0.7:0.001:1; + + g2_feb2016=25.05*ee; %converting to g2 with SE size + g2_sep2015=25.8536*ee; +%Kr 2014 data + +Kr_E_2016=(1/73).*(kr_s1_c_2016./g1+kr_s2_c_2016./g2_feb2016); +H3_E_2016=(1/73).*(h3_s1_c_2016./g1+h3_s2_c_2016./g2_feb2016); + +Kr_E_2015=(1/73).*(kr_s1_c_2015./g1+kr_s2_c_2015./g2_sep2015); +H3_E_2015=(1/73).*(h3_s1_c_2015./g1+h3_s2_c_2015./g2_sep2015); + +i=1; +for dT_max=40+20/2:20:300-20/2; + temp_fit_2016=fit([0:1:100].',hist(Kr_E_2016(inrange(kr_2016_drift_time,[dT_max-20 dT_max])),[0:1:100]).','gauss1'); + kr_2016_means(i)=temp_fit_2016.b1; + kr_2016_means_err(i)=temp_fit_2016.c1/sqrt(2)/length(Kr_E_2016(inrange(kr_2016_drift_time,[dT_max-20 dT_max]))); + + temp_fit_2015=fit([0:1:100].',hist(Kr_E_2015(inrange(kr_2015_drift_time,[dT_max-20 dT_max])),[0:1:100]).','gauss1'); + kr_2015_means(i)=temp_fit_2015.b1; + kr_2015_means_err(i)=temp_fit_2015.c1/sqrt(2)/length(Kr_E_2015(inrange(kr_2015_drift_time,[dT_max-20 dT_max]))); + + dT_centers(i)=dT_max-10; + i=i+1; +end + +kr_2016_chi2_slices=((41.55-kr_2016_means)./0.2395).^2; +kr_2015_chi2_slices=((41.55-kr_2015_means)./0.2395).^2; + + %make CH3T data spectrum + [h3_hist_2016,h3_hist_bin_2016]=hist(H3_E_2016,NEST_CH3T_Spectrum_old(1,:)); + [h3_hist_2015,h3_hist_bin_2015]=hist(H3_E_2015,NEST_CH3T_Spectrum_old(1,:)); + + scale_factor_2015_oldsim=sum(h3_hist_2015(17:80))/sum(NEST_CH3T_Spectrum_old(2,17:80)); + h3_scaled_oldsim_2015=scale_factor_2015_oldsim.*NEST_CH3T_Spectrum_old(2,:); + + scale_factor_2016_oldsim=sum(h3_hist_2016(17:80))/sum(NEST_CH3T_Spectrum_old(2,17:80)); + h3_scaled_oldsim_2016=scale_factor_2016_oldsim.*NEST_CH3T_Spectrum_old(2,:); + + h3_chi2_2016=(1/62).*sum( (h3_scaled_oldsim_2016(17:80) - h3_hist_2016(17:80)).^2 ./(h3_hist_2016(17:80))); %(4:80) is to avoid low stat areas in the simulation + h3_chi2_2015=(1/62).*sum( (h3_scaled_oldsim_2015(17:80) - h3_hist_2015(17:80)).^2 ./(h3_hist_2015(17:80))); + + total_h3_chi2=(h3_chi2_2016+h3_chi2_2015)/2; + total_kr_chi2=(mean(kr_2016_chi2_slices)+mean(kr_2015_chi2_slices))/2; + total_chi2=(total_h3_chi2+total_kr_chi2)/2; + + if total_chi290000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval); + + + + end + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=1000; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1500]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[5+bin_size, 500] );%from 50 to 300us for the fit, based on when s1as1b values get strange + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + %%Tracker for pseudo-lifetime + s2_at_bottom=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_2015=-320/log(s2_at_bottom/s2_at_top); + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_xbins),floor(s2_ybins)); +Sigma_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); +Count_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_xbins),floor(s1_ybins)); +Sigma_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); +Count_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XYZ. 3D Map, caluculate and Submit IQ +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% if Kr_events>150000 +% +% % LUXkrypCal_S1_3D(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_distance_\mus,user_name,file_id_cp,dp_version,submit); +% LUXkrypCal_S1_3D_Run04_local_2p14FixedZHisto(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_time,x_center,y_center,z_center,det_edge,inpaint_on,user_name,file_id_cp,dp_version, algorithm_name, submit); +% +% +% end +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%Apply Corrections to 2015 DD Data +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\Run04_ERBand\Kr2p14_FixedZHisto\Oct2015_DD.mat'); +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + %% Redo with r<10 cm + +fid_cut=(drift_time< -s2radius.^2+280) & drift_time>50 & drift_time<250; + +DD_s1_2015=s1_phe_both_xyz(fid_cut); +DD_s2_2015=s2_phe_both_xyz(fid_cut); + + +%% Make the plots + + +g1=0.098; ee=0.8080; +% g2_sep2014=27.21*ee; %converting to g2 with SE size + g2=25.28*ee; +%Kr 2014 data + +DD_E_2015=(1/73).*(DD_s1_2015./g1+DD_s2_2015./g2); + + +figure +step(DD_E_2015,[0:3:500],'k') +hold on; +line([163.9 163.9],[0 length(DD_E_2015)],'Color','r','LineWidth',2) %Xe131 +% line([236.1 236.1],[0 length(DD_E_2015)],'Color','r','LineWidth',2) %Xe129 +% % line([280 280],[0 length(DD_E_2015)],'Color','r','LineWidth',2) %Xe125? +% line([40 40],[0 length(DD_E_2015)],'Color','r','LineWidth',2) +% line([80 80],[0 length(DD_E_2015)],'Color','r','LineWidth',2) +% % line([33.2 33.2],[0 length(DD_E_2015)],'Color','r','LineWidth',2) %Xray (127?) +% % line([5.3 5.3],[0 length(DD_E_2015)],'Color','r','LineWidth',2) %xray (127?) +% line([275 275],[0 length(DD_E_2015)],'Color','r','LineWidth',2) +ylim([0 100]); +xlim([20 400]); +xlabel('Energy (keV)'); ylabel('Counts'); myfigview(16); +legend('Data','Expected'); + +ht=text(0,0,'Xe125 (275 keV)'); +set(ht,'FontSize',18) +set(ht,'Rotation',90) +set(ht,'Color',[1 0 0]) + +ht=text(0,0,'Xe129 (236 keV)'); +set(ht,'FontSize',18) +set(ht,'Rotation',90) +set(ht,'Color',[1 0 0]) + +ht=text(0,0,'Xe 131 (163.9 keV)'); +set(ht,'FontSize',18) +set(ht,'Rotation',90) +set(ht,'Color',[1 0 0]) + +ht=text(0,0,'Xe 129 (40 keV)'); +set(ht,'FontSize',18) +set(ht,'Rotation',90) +set(ht,'Color',[1 0 0]) + +ht=text(0,0,'Xe 131 (80 keV)'); +set(ht,'FontSize',18) +set(ht,'Rotation',90) +set(ht,'Color',[1 0 0]) + +%% Fit to the mose distinguishable DD peaks + +cut_40kev=inrange(DD_E_2015,[30 60]); +cut_80kev=inrange(DD_E_2015,[70 95]); +cut_164kev=inrange(DD_E_2015,[140 180]); +cut_236kev=inrange(DD_E_2015,[210,250]); +cut_275kev=inrange(DD_E_2015,[265,285]); + +fit_40kev=fit([30:3:60].',hist(DD_E_2015(cut_40kev),[30:3:60]).','gauss1'); +fit_80kev=fit([70:3:95].',hist(DD_E_2015(cut_80kev),[70:3:95]).','gauss1'); +fit_164kev=fit([140:3:180].',hist(DD_E_2015(cut_164kev),[140:3:180]).','gauss1'); +fit_236kev=fit([210:3:250].',hist(DD_E_2015(cut_236kev),[210:3:250]).','gauss1'); +fit_275kev=fit([265:3:285].',hist(DD_E_2015(cut_275kev),[265:3:285]).','gauss1'); + +resolution_40keV=(fit_40kev.c1/sqrt(2))/fit_40kev.b1 +resolution_80keV=(fit_80kev.c1/sqrt(2))/fit_80kev.b1 +resolution_164keV=(fit_164kev.c1/sqrt(2))/fit_164kev.b1 +resolution_236keV=(fit_236kev.c1/sqrt(2))/fit_236kev.b1 +resolution_275keV=(fit_275kev.c1/sqrt(2))/fit_275kev.b1 + +%show the fits +% figure +% step(DD_E_2015,[0:3:500],'-k'); +hold on; +x=[25:1:60]; y=fit_40kev.a1.*exp(-((x-fit_40kev.b1)./fit_40kev.c1).^2); +plot(x,y,'-b','LineWidth',2); +x=[60:3:120]; y=fit_80kev.a1.*exp(-((x-fit_80kev.b1)./fit_80kev.c1).^2); +plot(x,y,'-b','LineWidth',2); +x=[130:3:190]; y=fit_164kev.a1.*exp(-((x-fit_164kev.b1)./fit_164kev.c1).^2); +plot(x,y,'-b','LineWidth',2); +x=[200:3:260]; y=fit_236kev.a1.*exp(-((x-fit_236kev.b1)./fit_236kev.c1).^2); +plot(x,y,'-b','LineWidth',2); +x=[260:3:295]; y=fit_275kev.a1.*exp(-((x-fit_275kev.b1)./fit_275kev.c1).^2); +plot(x,y,'-b','LineWidth',2); +line([236.1 236.1],[0 length(DD_E_2015)],'Color','r','LineWidth',2) %Xe129 +line([40 40],[0 length(DD_E_2015)],'Color','r','LineWidth',2) +line([80 80],[0 length(DD_E_2015)],'Color','r','LineWidth',2) +line([275 275],[0 length(DD_E_2015)],'Color','r','LineWidth',2) +ylim([0 100]); +xlim([20 400]); +legend('Data','Expected','Fits'); + + +Xe129_40keV_mean=fit_40kev.b1 +Xe129_40keV_sig=fit_40kev.c1/sqrt(2) +temp=confint(fit_40kev,0.68); +Xe129_40keV_mean_err=abs(fit_40kev.b1-temp(1,2)) +Xe129_40keV_sig_err=abs(fit_40kev.c1-temp(1,3))/sqrt(2) +Xe129_40keV_resolution=(fit_40kev.c1/sqrt(2))/fit_40kev.b1 +Xe129_40keV_resolution_err=sqrt ( (Xe129_40keV_sig_err./Xe129_40keV_mean).^2 + ( (Xe129_40keV_sig.*Xe129_40keV_mean_err)./(Xe129_40keV_mean.^2)).^2 ) + +Xe131_80keV_mean=fit_80kev.b1 +Xe131_80keV_sig=fit_80kev.c1/sqrt(2) +temp=confint(fit_80kev,0.68); +Xe131_80keV_mean_err=abs(fit_80kev.b1-temp(1,2)) +Xe131_80keV_sig_err=abs(fit_80kev.c1-temp(1,3))/sqrt(2) +Xe131_80keV_resolution=(fit_80kev.c1/sqrt(2))/fit_80kev.b1 +Xe131_80keV_resolution_err=sqrt ( (Xe131_80keV_sig_err./Xe131_80keV_mean).^2 + ( (Xe131_80keV_sig.*Xe131_80keV_mean_err)./(Xe131_80keV_mean.^2)).^2 ) + +Xe131_164keV_mean=fit_164kev.b1 +Xe131_164keV_sig=fit_164kev.c1/sqrt(2) +temp=confint(fit_164kev,0.68); +Xe131_164keV_mean_err=abs(fit_164kev.b1-temp(1,2)) +Xe131_164keV_sig_err=abs(fit_164kev.c1-temp(1,3))/sqrt(2) +Xe131_164keV_resolution=(fit_164kev.c1/sqrt(2))/fit_164kev.b1 +Xe131_164keV_resolution_err=sqrt ( (Xe131_164keV_sig_err./Xe131_164keV_mean).^2 + ( (Xe131_164keV_sig.*Xe131_164keV_mean_err)./(Xe131_164keV_mean.^2)).^2 ) + +Xe129_236keV_mean=fit_236kev.b1 +Xe129_236keV_sig=fit_236kev.c1/sqrt(2) +temp=confint(fit_236kev,0.68); +Xe129_236keV_mean_err=abs(fit_236kev.b1-temp(1,2)) +Xe129_236keV_sig_err=abs(fit_236kev.c1-temp(1,3))/sqrt(2) +Xe129_236keV_resolution=(fit_236kev.c1/sqrt(2))/fit_236kev.b1 +Xe129_236keV_resolution_err=sqrt ( (Xe129_236keV_sig_err./Xe129_236keV_mean).^2 + ( (Xe129_236keV_sig.*Xe129_236keV_mean_err)./(Xe129_236keV_mean.^2)).^2 ) + +Xe125_275keV_mean=fit_275kev.b1 +Xe125_275keV_sig=fit_275kev.c1/sqrt(2) +temp=confint(fit_275kev,0.68); +Xe125_275keV_mean_err=abs(fit_275kev.b1-temp(1,2)) +Xe125_275keV_sig_err=abs(fit_275kev.c1-temp(1,3))/sqrt(2) +Xe125_275keV_resolution=(fit_275kev.c1/sqrt(2))/fit_275kev.b1 +Xe125_275keV_resolution_err=sqrt ( (Xe125_275keV_sig_err./Xe125_275keV_mean).^2 + ( (Xe125_275keV_sig.*Xe125_275keV_mean_err)./(Xe125_275keV_mean.^2)).^2 ) + + diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/EnergyResolution/DDEnergyResolution_NoFieldCorrection.m b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/EnergyResolution/DDEnergyResolution_NoFieldCorrection.m new file mode 100644 index 0000000..937211e --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/EnergyResolution/DDEnergyResolution_NoFieldCorrection.m @@ -0,0 +1,736 @@ +% NEED TO UPDATE THESE POLYNOMIALS AND G1 AND G2 +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\KrypCal2p21_QualityChecks\EnergyResolution\MappingParametersFit_Start_Oct2015DD_CutDown'); +% +% +% s1ab_s2_xyz_fit_map.p1=-0.4988; +% s1ab_s2_xyz_fit_map.p2=1.484; +% c1=1-s1ab_s2_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s2_xyz_fit_map.p2; +% s1ab_s2_xyz_fit_map.p3=c1; +% +% s1ab_s1_xyz_fit_map.p1=0.065; +% s1ab_s1_xyz_fit_map.p2=0.02; +% c2=1-s1ab_s1_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s1_xyz_fit_map.p2; +% s1ab_s1_xyz_fit_map.p3=c2; +% +% %If we can use 3D map, do so. If there aren't enough events do 1D then 2D +% if length(s1ab_z)>90000; %require 100,000 events to do 3D binning +% %Removing zeros from map with nearest neighbor method +% s1ab_xyz_mean_old=s1ab_xyz_mean; +% temp_map=s1ab_xyz_mean; +% q= ~isnan(temp_map); +% r=nearestpoint(find(~q),find(q)); +% s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); +% +% %interpolating with cubic so that we get NaN when extrapolating +% s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); +% s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); +% s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); +% s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); +% +% %Filling in NaN values with the s1a/s1b Z map polynomial +% s1as1b_zvalues= polyval(s1ab_P,drift_time); +% s1as1b_z_at_center=s1as1b_at_center; +% s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); +% s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); +% s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); +% s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); +% +% s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +% s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +% s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +% s1_phe_both=s1_phe_both./s1_3Dfieldremoval; +% +% +% else +% %Removing zeros from map with nearest neighbor method +% s1ab_xy_mean_old=s1ab_xy_mean; +% temp_map=s1ab_xy_mean; +% q= ~isnan(temp_map); +% r=nearestpoint(find(~q),find(q)); +% s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); +% +% %interpolating with cubic so that we get NaN when extrapolating +% s1as1b_zvalues= polyval(s1ab_P,drift_time); +% s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); +% s1as1b_z_at_center=polyval(s1ab_P,z_center); +% s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); +% +% s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); +% s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); +% s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); +% s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); +% +% %Filling in NaN values with no XY correction. (Z dependence should never be NaN) +% s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; +% s2_zfieldremoval(isnan(s2_zfieldremoval))=1; +% s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; +% s1_zfieldremoval(isnan(s1_zfieldremoval))=1; +% +% +% s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +% s2_phe_both=s2_phe_both./(s2_zfieldremoval); +% s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +% s1_phe_both=s1_phe_both./(s1_zfieldremoval); +% +% +% +% end +% + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=1000; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1500]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[5+bin_size, 500] );%from 50 to 300us for the fit, based on when s1as1b values get strange + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + %%Tracker for pseudo-lifetime + s2_at_bottom=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_2015=-320/log(s2_at_bottom/s2_at_top); + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_xbins),floor(s2_ybins)); +Sigma_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); +Count_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_xbins),floor(s1_ybins)); +Sigma_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); +Count_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XYZ. 3D Map, caluculate and Submit IQ +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% if Kr_events>150000 +% +% % LUXkrypCal_S1_3D(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_distance_\mus,user_name,file_id_cp,dp_version,submit); +% LUXkrypCal_S1_3D_Run04_local_2p14FixedZHisto(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_time,x_center,y_center,z_center,det_edge,inpaint_on,user_name,file_id_cp,dp_version, algorithm_name, submit); +% +% +% end +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%Apply Corrections to 2015 DD Data +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\Run04_ERBand\Kr2p14_FixedZHisto\Oct2015_DD.mat'); +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + %% Redo with r<10 cm + +fid_cut=(drift_time< -s2radius.^2+280) & drift_time>50 & drift_time<250; + +DD_s1_2015=s1_phe_both_xyz(fid_cut); +DD_s2_2015=s2_phe_both_xyz(fid_cut); + + +%% Make the plots + + +g1=0.1000; +ee=1.0800; +% g2_sep2014=27.21*ee; %converting to g2 with SE size + g2=25.28*ee; +%Kr 2014 data + +DD_E_2015=(1/73).*(DD_s1_2015./g1+DD_s2_2015./g2); + + +figure +step(DD_E_2015,[0:3:500],'k') +hold on; +line([163.9 163.9],[0 length(DD_E_2015)],'Color','r','LineWidth',2) %Xe131 +% line([236.1 236.1],[0 length(DD_E_2015)],'Color','r','LineWidth',2) %Xe129 +% % line([280 280],[0 length(DD_E_2015)],'Color','r','LineWidth',2) %Xe125? +% line([40 40],[0 length(DD_E_2015)],'Color','r','LineWidth',2) +% line([80 80],[0 length(DD_E_2015)],'Color','r','LineWidth',2) +% % line([33.2 33.2],[0 length(DD_E_2015)],'Color','r','LineWidth',2) %Xray (127?) +% % line([5.3 5.3],[0 length(DD_E_2015)],'Color','r','LineWidth',2) %xray (127?) +% line([275 275],[0 length(DD_E_2015)],'Color','r','LineWidth',2) +ylim([0 100]); +xlim([20 400]); +xlabel('Energy (keV)'); ylabel('Counts'); myfigview(16); +legend('Data','Expected'); + +ht=text(0,0,'Xe125 (275 keV)'); +set(ht,'FontSize',18) +set(ht,'Rotation',90) +set(ht,'Color',[1 0 0]) + +ht=text(0,0,'Xe129 (236 keV)'); +set(ht,'FontSize',18) +set(ht,'Rotation',90) +set(ht,'Color',[1 0 0]) + +ht=text(0,0,'Xe 131 (163.9 keV)'); +set(ht,'FontSize',18) +set(ht,'Rotation',90) +set(ht,'Color',[1 0 0]) + +ht=text(0,0,'Xe 129 (40 keV)'); +set(ht,'FontSize',18) +set(ht,'Rotation',90) +set(ht,'Color',[1 0 0]) + +ht=text(0,0,'Xe 131 (80 keV)'); +set(ht,'FontSize',18) +set(ht,'Rotation',90) +set(ht,'Color',[1 0 0]) + +%% Fit to the mose distinguishable DD peaks + +cut_40kev=inrange(DD_E_2015,[30 60]); +cut_80kev=inrange(DD_E_2015,[70 95]); +cut_164kev=inrange(DD_E_2015,[140 180]); +cut_236kev=inrange(DD_E_2015,[210,250]); +cut_275kev=inrange(DD_E_2015,[265,285]); + +fit_40kev=fit([30:3:60].',hist(DD_E_2015(cut_40kev),[30:3:60]).','gauss1'); +fit_80kev=fit([70:3:95].',hist(DD_E_2015(cut_80kev),[70:3:95]).','gauss1'); +fit_164kev=fit([140:3:180].',hist(DD_E_2015(cut_164kev),[140:3:180]).','gauss1'); +fit_236kev=fit([210:3:250].',hist(DD_E_2015(cut_236kev),[210:3:250]).','gauss1'); +fit_275kev=fit([265:3:285].',hist(DD_E_2015(cut_275kev),[265:3:285]).','gauss1'); + +resolution_40keV=(fit_40kev.c1/sqrt(2))/fit_40kev.b1 +resolution_80keV=(fit_80kev.c1/sqrt(2))/fit_80kev.b1 +resolution_164keV=(fit_164kev.c1/sqrt(2))/fit_164kev.b1 +resolution_236keV=(fit_236kev.c1/sqrt(2))/fit_236kev.b1 +resolution_275keV=(fit_275kev.c1/sqrt(2))/fit_275kev.b1 + +%show the fits +% figure +% step(DD_E_2015,[0:3:500],'-k'); +hold on; +x=[25:1:60]; y=fit_40kev.a1.*exp(-((x-fit_40kev.b1)./fit_40kev.c1).^2); +plot(x,y,'-b','LineWidth',2); +x=[60:3:120]; y=fit_80kev.a1.*exp(-((x-fit_80kev.b1)./fit_80kev.c1).^2); +plot(x,y,'-b','LineWidth',2); +x=[130:3:190]; y=fit_164kev.a1.*exp(-((x-fit_164kev.b1)./fit_164kev.c1).^2); +plot(x,y,'-b','LineWidth',2); +x=[200:3:260]; y=fit_236kev.a1.*exp(-((x-fit_236kev.b1)./fit_236kev.c1).^2); +plot(x,y,'-b','LineWidth',2); +x=[260:3:295]; y=fit_275kev.a1.*exp(-((x-fit_275kev.b1)./fit_275kev.c1).^2); +plot(x,y,'-b','LineWidth',2); +line([236.1 236.1],[0 length(DD_E_2015)],'Color','r','LineWidth',2) %Xe129 +line([40 40],[0 length(DD_E_2015)],'Color','r','LineWidth',2) +line([80 80],[0 length(DD_E_2015)],'Color','r','LineWidth',2) +line([275 275],[0 length(DD_E_2015)],'Color','r','LineWidth',2) +ylim([0 100]); +xlim([20 400]); +legend('Data','Expected','Fits'); + + +Xe129_40keV_mean=fit_40kev.b1 +Xe129_40keV_sig=fit_40kev.c1/sqrt(2) +temp=confint(fit_40kev,0.68); +Xe129_40keV_mean_err=abs(fit_40kev.b1-temp(1,2)) +Xe129_40keV_sig_err=abs(fit_40kev.c1-temp(1,3))/sqrt(2) +Xe129_40keV_resolution=(fit_40kev.c1/sqrt(2))/fit_40kev.b1 +Xe129_40keV_resolution_err=sqrt ( (Xe129_40keV_sig_err./Xe129_40keV_mean).^2 + ( (Xe129_40keV_sig.*Xe129_40keV_mean_err)./(Xe129_40keV_mean.^2)).^2 ) + +Xe131_80keV_mean=fit_80kev.b1 +Xe131_80keV_sig=fit_80kev.c1/sqrt(2) +temp=confint(fit_80kev,0.68); +Xe131_80keV_mean_err=abs(fit_80kev.b1-temp(1,2)) +Xe131_80keV_sig_err=abs(fit_80kev.c1-temp(1,3))/sqrt(2) +Xe131_80keV_resolution=(fit_80kev.c1/sqrt(2))/fit_80kev.b1 +Xe131_80keV_resolution_err=sqrt ( (Xe131_80keV_sig_err./Xe131_80keV_mean).^2 + ( (Xe131_80keV_sig.*Xe131_80keV_mean_err)./(Xe131_80keV_mean.^2)).^2 ) + +Xe131_164keV_mean=fit_164kev.b1 +Xe131_164keV_sig=fit_164kev.c1/sqrt(2) +temp=confint(fit_164kev,0.68); +Xe131_164keV_mean_err=abs(fit_164kev.b1-temp(1,2)) +Xe131_164keV_sig_err=abs(fit_164kev.c1-temp(1,3))/sqrt(2) +Xe131_164keV_resolution=(fit_164kev.c1/sqrt(2))/fit_164kev.b1 +Xe131_164keV_resolution_err=sqrt ( (Xe131_164keV_sig_err./Xe131_164keV_mean).^2 + ( (Xe131_164keV_sig.*Xe131_164keV_mean_err)./(Xe131_164keV_mean.^2)).^2 ) + +Xe129_236keV_mean=fit_236kev.b1 +Xe129_236keV_sig=fit_236kev.c1/sqrt(2) +temp=confint(fit_236kev,0.68); +Xe129_236keV_mean_err=abs(fit_236kev.b1-temp(1,2)) +Xe129_236keV_sig_err=abs(fit_236kev.c1-temp(1,3))/sqrt(2) +Xe129_236keV_resolution=(fit_236kev.c1/sqrt(2))/fit_236kev.b1 +Xe129_236keV_resolution_err=sqrt ( (Xe129_236keV_sig_err./Xe129_236keV_mean).^2 + ( (Xe129_236keV_sig.*Xe129_236keV_mean_err)./(Xe129_236keV_mean.^2)).^2 ) + +Xe125_275keV_mean=fit_275kev.b1 +Xe125_275keV_sig=fit_275kev.c1/sqrt(2) +temp=confint(fit_275kev,0.68); +Xe125_275keV_mean_err=abs(fit_275kev.b1-temp(1,2)) +Xe125_275keV_sig_err=abs(fit_275kev.c1-temp(1,3))/sqrt(2) +Xe125_275keV_resolution=(fit_275kev.c1/sqrt(2))/fit_275kev.b1 +Xe125_275keV_resolution_err=sqrt ( (Xe125_275keV_sig_err./Xe125_275keV_mean).^2 + ( (Xe125_275keV_sig.*Xe125_275keV_mean_err)./(Xe125_275keV_mean.^2)).^2 ) + + diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/EnergyResolution/KrEnergyResolution.m b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/EnergyResolution/KrEnergyResolution.m new file mode 100644 index 0000000..a069b28 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/EnergyResolution/KrEnergyResolution.m @@ -0,0 +1,1600 @@ +% NEED TO UPDATE THESE POLYNOMIALS AND G1/G2 + + +inpaint_on=0; + +%HAVE TO MAKE THIS .MAT FILE STILL - USE class 1 and class 9 for S1 +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\MappingParametersFit_Start_2015_CutDown.mat') + + +s1ab_s2_xyz_fit_map.p1=-0.4988; +s1ab_s2_xyz_fit_map.p2=1.484; +c1=1-s1ab_s2_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s2_xyz_fit_map.p2; +s1ab_s2_xyz_fit_map.p3=c1; + +s1ab_s1_xyz_fit_map.p1=0.065; +s1ab_s1_xyz_fit_map.p2=0.02; +c2=1-s1ab_s1_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s1_xyz_fit_map.p2; +s1ab_s1_xyz_fit_map.p3=c2; + + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>90000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval); + + + + end + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=1000; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1500]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[5+bin_size, 500] );%from 50 to 300us for the fit, based on when s1as1b values get strange + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + %%Tracker for pseudo-lifetime + s2_at_bottom=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_2015=-320/log(s2_at_bottom/s2_at_top); + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_xbins),floor(s2_ybins)); +Sigma_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); +Count_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_xbins),floor(s1_ybins)); +Sigma_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); +Count_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XYZ. 3D Map, caluculate and Submit IQ +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% if Kr_events>150000 +% +% % LUXkrypCal_S1_3D(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_distance_\mus,user_name,file_id_cp,dp_version,submit); +% LUXkrypCal_S1_3D_Run04_local_2p14FixedZHisto(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_time,x_center,y_center,z_center,det_edge,inpaint_on,user_name,file_id_cp,dp_version, algorithm_name, submit); +% +% +% end + + +%% Apply corrections to CH3T and calculate the ER band shift + +%First load the data + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\CH3T_Sep2015_NoCorrections.mat'); + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = S2_x; +s1_y_cm = S2_y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,S2_x,S2_y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + h3_cut= inrange(drift_time,[40 300]) & inrange(s1_phe_both,[0 120]) ... + & (log10(s1_phe_both)+0.8*log10(s2_phe_both)<5.2) .... + & (log10(s1_phe_both)-2*log10(s2_phe_both)>-6.8) & (log10(s1_phe_both)-2*log10(s2_phe_both)<-4.8)... + & s2_phe_both>100 & s2_phe_both<16000 & s2radius<25; %used to be drift time 100 to 250 + +h3_s1_c_2015=s1_phe_both_xyz(h3_cut); +h3_s2_c_2015=s2_phe_both_xyz(h3_cut); + + + kr_cut= inrange(drift_time,[40 300]) & inrange(s1_phe_both,[30 1000]) ... + & (log10(s1_phe_both)+0.6*log10(s2_phe_both)>4.5) & (log10(s1_phe_both)+0.6*log10(s2_phe_both)<5.05) ... + & (log10(s1_phe_both)-2*log10(s2_phe_both)>-7.6) & (log10(s1_phe_both)-2*log10(s2_phe_both)<-4.7) ... + & s2_phe_both>3000 & s2_phe_both<60000 & s2radius<25; %used to be drift time 100 to 250 + +kr_s1_c_2015=s1_phe_both_xyz(kr_cut); +kr_s2_c_2015=s2_phe_both_xyz(kr_cut); +kr_2015_drift_time=drift_time(kr_cut); +kr_2015_s2x=S2_x(kr_cut); +kr_2015_s2y=S2_y(kr_cut); + + clearvars -except param_counter a1_list b1_list a2_list b2_list total_chi2_list h3_chi2_list kr_chi2_list g1_list g2_list total_chi2_map h3_chi2_map kr_chi2_map chi2_midtobot_list... + best_chi2_midtotop besta1_midtotop besta2_midtotop bestb1_midtotop bestb2_midtotop best_chi2_midtobot... + besta1_midtobot besta1_midtotop bestb1_midtobot bestb1_midtotop a1 b1 a2 b2 c2 chi2_midtotop_map chi2_midtobot_map b_counter a_counter... + besta1_combined bestb1_combined besta2_combined bestb2_combined best_chi2_combined chi2_combined_map chi2_combined_list b1_counter a1_counter a2_counter b2_counter... + a1_counter b1_counter a2_counter b2_counter c1_list c2_list bestc1_midtobot bestc2_midtobot bestc1_midtotop bestc2_midtotop bestc1_combined bestc2_combined... + besta1_combined besta2_combined bestb1_combined bestb2_combined besta1 bestb1 bestc1 besta2 bestb2 bestc2 bestg1 bestg2 best_total_chi2 NEST_CH3T_Spectrum inpaint_on... + best_kr_chi2 best_h3_chi2 electron_lifetime_list electron_lifetime_map a2_start a1_start b1_start b2_start ... + total_h3_chi2_list total_kr_chi2_list total_chi2_list h3_chi2_2016_list h3_chi2_2015_list kr_chi2_2016_list kr_chi2_2015_list ... + electron_lifetime_2016_list electron_lifetime_2015_list total_h3_chi2_map total_kr_chi2_map total_chi2_map h3_chi2_2016_map h3_chi2_2015_map ... + kr_chi2_2016_map kr_chi2_2015_map electron_lifetime_2016_map electron_lifetime_2015_map NEST_CH3T_Spectrum_Sep2015 NEST_CH3T_Spectrum_Feb2016 g1 g2 bestg1 bestg2 g1_counter g2_counter ... + firsta1 firstb1 firsta2 firstb2 firstg1 firstg2 kr_means_2015_map kr_means_2016_map kr_sigma_2015_map kr_sigma_2016_map kr_staterr_2015_map kr_staterr_2016_map ... + kr_means_2015_list kr_means_2016_list kr_2015_num_events kr_2016_num_events kr_sigma_2015_list kr_sigma_2016_list kr_staterr_2015_list kr_staterr_2016_list ... + pseudo_lifetime_2016 pseudo_lifetime_2015 kr_s1_c_2015 kr_s2_c_2015 h3_s1_c_2015 h3_s2_c_2015 s1ab_s2_xyz_fit_map s1ab_s1_xyz_fit_map ... + kr_2015_drift_time kr_2015_s2x kr_2015_s2y kr_chi2_2016_zslice_list kr_chi2_2015_zslice_list kr_chi2_zslice_zcenter_list ... + full_kr_chi2_2016_list full_kr_chi2_2015_list best_total_kr_chi2 best_total_h3_chi2 alternate_total_chi2_map alternate_total_chi2_list ... + best_total_alternate_chi2 best_total_alternate_kr_chi2 best_total_alternate_h3_chi2 besta2_alternate bestb2_alternate bestg1_alternate bestg2_alternate bestc2_alternate ... + total_h3_chi2_nothresh_list total_chi2_nothresh_list alternate_total_chi2_nothresh_list h3_chi2_2015_nothresh_list h3_chi2_2016_nothresh_list ... + total_h3_chi2_nothresh_map total_chi2_nothresh_map alternate_total_chi2_nothresh_map h3_chi2_2016_nothresh_map h3_chi2_2015_nothresh_map ... + best_total_chi2_nothresh best_total_kr_chi2_nothresh best_total_h3_chi2_nothresh besta2_nothresh bestb2_nothresh bestc2_nothresh bestg1_nothresh bestEE_nothresh ... + best_total_alternate_chi2_nothresh best_total_alternate_kr_chi2_nothresh best_total_alternate_h3_chi2_nothresh besta2_alternate_nothresh bestb2_alternate_nothresh ... + bestc2_alternate_nothresh bestg1_alternate_nothresh bestEE_alternate_nothresh best_total_chi2_nothresh best_total_alternate_chi2_nothresh ee_list ... + total_h3_chi2_nothresh_separatescaling_list total_chi2_nothresh_separatescaling_list best_total_chi2_nothresh_separatescaling ... + best_total_kr_chi2_nothresh_separatescaling best_total_h3_chi2_nothresh_separatescaling besta2_nothresh_separatescaling ... + bestc2_nothresh_separatescaling bestg1_nothresh_separatescaling bestEE_nothresh_separatescaling ... + total_h3_chi2_nothresh_separatescaling_map total_chi2_nothresh_separatescaling_map bestEE_nothresh ... + h3_chi2_2015_nothresh_separatescaling_list h3_chi2_2016_nothresh_separatescaling_list ee_list ... + h3_chi2_2016_oldsim_list h3_chi2_2015_oldsim_list total_h3_chi2_oldsim_list total_chi2_oldsim_list ... + best_total_chi2_oldsim best_total_kr_chi2_oldsim best_total_h3_chi2_oldsim besta2_oldsim bestb2_oldsim ... + bestc2_oldsim bestg1_oldsim bestEE_oldsim NEST_CH3T_Spectrum_old + + + +%%%%%%%%%%%%%%%%%%%%% +%% REPEAT FOR 2014 DATA +%%%%%%%%%%%%%%%%%%%%% + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\MappingParametersFit_Start_2016_CutDown.mat') + + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>90000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval); + + + + end + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[5+bin_size, 500] );%from 50 to 300us for the fit, based on when s1as1b values get strange + +s2_both_norm_z_index=mean_index(dT_range); +s2_both_norm_z_means=means(dT_range); + s2_at_top=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + %%Tracker for pseudo-lifetime + s2_at_bottom=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_2016=-320/log(s2_at_bottom/s2_at_top); +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_xbins),floor(s2_ybins)); +Sigma_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); +Count_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_xbins),floor(s1_ybins)); +Sigma_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); +Count_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Apply corrections to 2016 Kr data +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\MappingParametersFit_Start_2016_CutDown.mat') + + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; +% +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate ER Band shift +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + liquid_cut= inrange(drift_time,[40 300]) ... + & (log10(s1_phe_both)+0.7*log10(s2_phe_both)>4.9) & (log10(s1_phe_both)+0.7*log10(s2_phe_both)<5.5) ... + & s2_phe_both>3000 & s2_phe_both<80000 & s2radius<25; %used to be drift time 100 to 250 + + +kr_s1_c_2016=s1_phe_both_xyz(liquid_cut); +kr_s2_c_2016=s2_phe_both_xyz(liquid_cut); +kr_2016_drift_time=drift_time(liquid_cut); +kr_2016_s2x=s2x(liquid_cut); +kr_2016_s2y=s2y(liquid_cut); + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%Apply Corrections to 2016 CH3T Data +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\CH3T_Feb2016_NoCorrections.mat'); + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +% electron_lifetime_2016=e_lifetime_both; +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate ER Band shift +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +s1_min=0; +s1_max=120; + + %% Redo with r<10 cm + + + liquid_cut= clean_cut & inrange(drift_time,[40 300]) ... + & (log10(s1_phe_both)+log10(s2_phe_both)<5.9) & (log10(s1_phe_both)-2.*log10(s2_phe_both)<-4.8) ... + & (log10(s1_phe_both)-2.*log10(s2_phe_both)>-6.8) ... + & s2_phe_both>600 & s2_phe_both<16000 & s2radius<25; %used to be drift time 100 to 250 + + + +h3_s1_c_2016=s1_phe_both_xyz(liquid_cut); +h3_s2_c_2016=s2_phe_both_xyz(liquid_cut); + + clearvars -except param_counter a1_list b1_list a2_list b2_list total_chi2_list h3_chi2_list kr_chi2_list g1_list g2_list total_chi2_map h3_chi2_map kr_chi2_map chi2_midtobot_list... + best_chi2_midtotop besta1_midtotop besta2_midtotop bestb1_midtotop bestb2_midtotop best_chi2_midtobot... + besta1_midtobot besta1_midtotop bestb1_midtobot bestb1_midtotop a1 b1 a2 b2 chi2_midtotop_map chi2_midtobot_map b_counter a_counter... + besta1_combined bestb1_combined besta2_combined bestb2_combined best_chi2_combined chi2_combined_map chi2_combined_list b1_counter a1_counter a2_counter b2_counter... + a1_counter b1_counter a2_counter b2_counter c1_list c2_list bestc1_midtobot bestc2_midtobot bestc1_midtotop bestc2_midtotop bestc1_combined bestc2_combined... + besta1_combined besta2_combined bestb1_combined bestb2_combined besta1 bestb1 bestc1 besta2 bestb2 bestc2 bestg1 bestg2 best_total_chi2 NEST_CH3T_Spectrum inpaint_on... + best_kr_chi2 best_h3_chi2 electron_lifetime_list electron_lifetime_map a2_start a1_start b1_start b2_start ... + total_h3_chi2_list total_kr_chi2_list total_chi2_list h3_chi2_2016_list h3_chi2_2015_list kr_chi2_2016_list kr_chi2_2015_list ... + electron_lifetime_2016_list electron_lifetime_2015_list total_h3_chi2_map total_kr_chi2_map total_chi2_map h3_chi2_2016_map h3_chi2_2015_map ... + kr_chi2_2016_map kr_chi2_2015_map electron_lifetime_2016_map electron_lifetime_2015_map NEST_CH3T_Spectrum_Sep2015 NEST_CH3T_Spectrum_Feb2016 g1 g2 bestg1 bestg2 g1_counter g2_counter ... + firsta1 firstb1 firsta2 firstb2 firstg1 firstg2 kr_means_2015_map kr_means_2016_map kr_sigma_2015_map kr_sigma_2016_map kr_staterr_2015_map kr_staterr_2016_map ... + kr_means_2015_list kr_means_2016_list kr_2015_num_events kr_2016_num_events kr_sigma_2015_list kr_sigma_2016_list kr_staterr_2015_list kr_staterr_2016_list ... + pseudo_lifetime_2016 pseudo_lifetime_2015 kr_s1_c_2015 kr_s2_c_2015 h3_s1_c_2015 h3_s2_c_2015 kr_s1_c_2016 kr_s2_c_2016 h3_s1_c_2016 h3_s2_c_2016 ... + kr_2015_drift_time kr_2015_s2x kr_2015_s2y kr_2016_drift_time kr_2016_s2x kr_2016_s2y ... + kr_chi2_2016_zslice_list kr_chi2_2015_zslice_list kr_chi2_zslice_zcenter_list ... + full_kr_chi2_2016_list full_kr_chi2_2015_list best_total_kr_chi2 best_total_h3_chi2 alternate_total_chi2_map alternate_total_chi2_list ... + best_total_alternate_chi2 best_total_alternate_kr_chi2 best_total_alternate_h3_chi2 besta2_alternate bestb2_alternate bestg1_alternate bestg2_alternate bestc2_alternate c2 ... + total_h3_chi2_nothresh_list total_chi2_nothresh_list alternate_total_chi2_nothresh_list h3_chi2_2015_nothresh_list h3_chi2_2016_nothresh_list ... + total_h3_chi2_nothresh_map total_chi2_nothresh_map alternate_total_chi2_nothresh_map h3_chi2_2016_nothresh_map h3_chi2_2015_nothresh_map ... + best_total_chi2_nothresh best_total_kr_chi2_nothresh best_total_h3_chi2_nothresh besta2_nothresh bestb2_nothresh bestc2_nothresh bestg1_nothresh bestEE_nothresh ... + best_total_alternate_chi2_nothresh best_total_alternate_kr_chi2_nothresh best_total_alternate_h3_chi2_nothresh besta2_alternate_nothresh bestb2_alternate_nothresh ... + bestc2_alternate_nothresh bestg1_alternate_nothresh bestEE_alternate_nothresh best_total_chi2_nothresh best_total_alternate_chi2_nothresh ee_list ... + total_h3_chi2_nothresh_separatescaling_list total_chi2_nothresh_separatescaling_list best_total_chi2_nothresh_separatescaling ... + best_total_kr_chi2_nothresh_separatescaling best_total_h3_chi2_nothresh_separatescaling besta2_nothresh_separatescaling ... + bestc2_nothresh_separatescaling bestg1_nothresh_separatescaling bestEE_nothresh_separatescaling ... + total_h3_chi2_nothresh_separatescaling_map total_chi2_nothresh_separatescaling_map bestEE_nothresh ... + h3_chi2_2015_nothresh_separatescaling_list h3_chi2_2016_nothresh_separatescaling_list ee_list ... + h3_chi2_2016_oldsim_list h3_chi2_2015_oldsim_list total_h3_chi2_oldsim_list total_chi2_oldsim_list ... + best_total_chi2_oldsim best_total_kr_chi2_oldsim best_total_h3_chi2_oldsim besta2_oldsim bestb2_oldsim ... + bestc2_oldsim bestg1_oldsim bestEE_oldsim NEST_CH3T_Spectrum_old +%% Make plots + + + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\NEST_CH3T_Spectrum_old.mat') + + + +% +% best_total_chi2=100000000; +% for g1=0.09:0.005:0.125; +% for ee=0.55:0.01:1.0; +% +% % g1=0.1025; ee=0.76; +% g2_sep2014=27.21*ee; %converting to g2 with SE size +% g2_sep2015=25.8536*ee; +% %Kr 2014 data +% +% Kr_E_2014=(1/73).*(kr_s1_c_2014./g1+kr_s2_c_2014./g2_sep2014); +% H3_E_2014=(1/73).*(h3_s1_c_2014./g1+h3_s2_c_2014./g2_sep2014); +% +% Kr_E_2015=(1/73).*(kr_s1_c_2015./g1+kr_s2_c_2015./g2_sep2015); +% H3_E_2015=(1/73).*(h3_s1_c_2015./g1+h3_s2_c_2015./g2_sep2015); +% +% i=1; +% for dT_max=40+20/2:20:300-20/2; +% temp_fit_2014=fit([0:1:100].',hist(Kr_E_2014(inrange(kr_2014_drift_time,[dT_max-20 dT_max])),[0:1:100]).','gauss1'); +% kr_2014_means(i)=temp_fit_2014.b1; +% kr_2014_means_err(i)=temp_fit_2014.c1/sqrt(2)/length(Kr_E_2014(inrange(kr_2014_drift_time,[dT_max-20 dT_max]))); +% +% temp_fit_2015=fit([0:1:100].',hist(Kr_E_2015(inrange(kr_2015_drift_time,[dT_max-20 dT_max])),[0:1:100]).','gauss1'); +% kr_2015_means(i)=temp_fit_2015.b1; +% kr_2015_means_err(i)=temp_fit_2015.c1/sqrt(2)/length(Kr_E_2015(inrange(kr_2015_drift_time,[dT_max-20 dT_max]))); +% +% dT_centers(i)=dT_max-10; +% i=i+1; +% end +% +% kr_2014_chi2_slices=((41.55-kr_2014_means)./0.2395).^2; +% kr_2015_chi2_slices=((41.55-kr_2015_means)./0.2395).^2; +% +% % figure +% % errorbar(dT_centers,kr_2014_means,kr_2014_means_err,'.k'); +% % xlabel('Drift Time (uSec)'); ylabel('Kr Energy Mean (phd)'); +% % title('2014 Data'); +% % myfigview(16); +% % +% % figure +% % errorbar(dT_centers,kr_2015_means,kr_2015_means_err,'.k'); +% % xlabel('Drift Time (uSec)'); ylabel('Kr Energy Mean (phd)'); +% % title('2015 Data'); +% % myfigview(16); +% % +% % figure +% % errorbar(dT_centers,kr_2014_means,kr_2014_means_err,'.k'); +% % hold on; +% % errorbar(dT_centers,kr_2015_means,kr_2015_means_err,'.r'); +% % xlabel('Drift Time (uSec)'); ylabel('Kr Energy Mean (phd)'); +% % legend('2014','2015'); +% % myfigview(16); +% +% +% %make CH3T data spectrum +% [h3_hist_sep2014,h3_hist_bin_sep2014]=hist(H3_E_2014,NEST_CH3T_Spectrum_Sep2014(1,:)); +% [h3_hist_sep2015,h3_hist_bin_sep2015]=hist(H3_E_2015,NEST_CH3T_Spectrum_Sep2015(1,:)); +% +% %scale the simulation to the data +% scale_factor_sep2014=sum(h3_hist_sep2014)./sum(NEST_CH3T_Spectrum_Sep2014(2,:)); +% scale_factor_sep2015=sum(h3_hist_sep2015)./sum(NEST_CH3T_Spectrum_Sep2015(2,:)); +% h3_scaled_sim_sep2014=NEST_CH3T_Spectrum_Sep2014(2,:).*scale_factor_sep2014; +% h3_scaled_sim_sep2015=NEST_CH3T_Spectrum_Sep2015(2,:).*scale_factor_sep2015; +% +% h3_chi2_Sep2014=(1/63).*sum( (h3_scaled_sim_sep2014(15:80) - h3_hist_sep2014(15:80)).^2 ./(h3_hist_sep2014(15:80))); +% h3_chi2_Sep2015=(1/63).*sum( (h3_scaled_sim_sep2015(15:80) - h3_hist_sep2015(15:80)).^2 ./(h3_hist_sep2015(15:80))); +% +% +% total_h3_chi2=(h3_chi2_Sep2014+h3_chi2_Sep2015)/2; +% total_kr_chi2=(mean(kr_2014_chi2_slices)+mean(kr_2015_chi2_slices))/2; +% total_chi2=(total_h3_chi2+total_kr_chi2)/2; +% +% if total_chi290000; %require 100,000 events to do 3D binning +% %Removing zeros from map with nearest neighbor method +% s1ab_xyz_mean_old=s1ab_xyz_mean; +% temp_map=s1ab_xyz_mean; +% q= ~isnan(temp_map); +% r=nearestpoint(find(~q),find(q)); +% s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); +% +% %interpolating with cubic so that we get NaN when extrapolating +% s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); +% s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); +% s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); +% s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); +% +% %Filling in NaN values with the s1a/s1b Z map polynomial +% s1as1b_zvalues= polyval(s1ab_P,drift_time); +% s1as1b_z_at_center=s1as1b_at_center; +% s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); +% s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); +% s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); +% s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); +% +% s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +% s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +% s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +% s1_phe_both=s1_phe_both./s1_3Dfieldremoval; +% +% +% else +% %Removing zeros from map with nearest neighbor method +% s1ab_xy_mean_old=s1ab_xy_mean; +% temp_map=s1ab_xy_mean; +% q= ~isnan(temp_map); +% r=nearestpoint(find(~q),find(q)); +% s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); +% +% %interpolating with cubic so that we get NaN when extrapolating +% s1as1b_zvalues= polyval(s1ab_P,drift_time); +% s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); +% s1as1b_z_at_center=polyval(s1ab_P,z_center); +% s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); +% +% s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); +% s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); +% s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); +% s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); +% +% %Filling in NaN values with no XY correction. (Z dependence should never be NaN) +% s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; +% s2_zfieldremoval(isnan(s2_zfieldremoval))=1; +% s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; +% s1_zfieldremoval(isnan(s1_zfieldremoval))=1; +% +% +% s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +% s2_phe_both=s2_phe_both./(s2_zfieldremoval); +% s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +% s1_phe_both=s1_phe_both./(s1_zfieldremoval); +% +% +% +% end + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=1000; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1500]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[5+bin_size, 500] );%from 50 to 300us for the fit, based on when s1as1b values get strange + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + %%Tracker for pseudo-lifetime + s2_at_bottom=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_2015=-320/log(s2_at_bottom/s2_at_top); + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_xbins),floor(s2_ybins)); +Sigma_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); +Count_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_xbins),floor(s1_ybins)); +Sigma_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); +Count_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XYZ. 3D Map, caluculate and Submit IQ +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% if Kr_events>150000 +% +% % LUXkrypCal_S1_3D(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_distance_\mus,user_name,file_id_cp,dp_version,submit); +% LUXkrypCal_S1_3D_Run04_local_2p14FixedZHisto(s1_phe_both,s1_phe_bottom,s2_phe_both,s2x,s2y,drift_time,x_center,y_center,z_center,det_edge,inpaint_on,user_name,file_id_cp,dp_version, algorithm_name, submit); +% +% +% end + + +%% Apply corrections to CH3T and calculate the ER band shift + +%First load the data + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\CH3T_Sep2015_NoCorrections.mat'); + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = S2_x; +s1_y_cm = S2_y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,S2_x,S2_y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + h3_cut= inrange(drift_time,[40 300]) & inrange(s1_phe_both,[0 120]) ... + & (log10(s1_phe_both)+0.8*log10(s2_phe_both)<5.2) .... + & (log10(s1_phe_both)-2*log10(s2_phe_both)>-6.8) & (log10(s1_phe_both)-2*log10(s2_phe_both)<-4.8)... + & s2_phe_both>100 & s2_phe_both<16000 & s2radius<25; %used to be drift time 100 to 250 + +h3_s1_c_2015=s1_phe_both_xyz(h3_cut); +h3_s2_c_2015=s2_phe_both_xyz(h3_cut); + + + kr_cut= inrange(drift_time,[40 300]) & inrange(s1_phe_both,[30 1000]) ... + & (log10(s1_phe_both)+0.6*log10(s2_phe_both)>4.5) & (log10(s1_phe_both)+0.6*log10(s2_phe_both)<5.05) ... + & (log10(s1_phe_both)-2*log10(s2_phe_both)>-7.6) & (log10(s1_phe_both)-2*log10(s2_phe_both)<-4.7) ... + & s2_phe_both>3000 & s2_phe_both<60000 & s2radius<25; %used to be drift time 100 to 250 + +kr_s1_c_2015=s1_phe_both_xyz(kr_cut); +kr_s2_c_2015=s2_phe_both_xyz(kr_cut); +kr_2015_drift_time=drift_time(kr_cut); +kr_2015_s2x=S2_x(kr_cut); +kr_2015_s2y=S2_y(kr_cut); + + clearvars -except param_counter a1_list b1_list a2_list b2_list total_chi2_list h3_chi2_list kr_chi2_list g1_list g2_list total_chi2_map h3_chi2_map kr_chi2_map chi2_midtobot_list... + best_chi2_midtotop besta1_midtotop besta2_midtotop bestb1_midtotop bestb2_midtotop best_chi2_midtobot... + besta1_midtobot besta1_midtotop bestb1_midtobot bestb1_midtotop a1 b1 a2 b2 c2 chi2_midtotop_map chi2_midtobot_map b_counter a_counter... + besta1_combined bestb1_combined besta2_combined bestb2_combined best_chi2_combined chi2_combined_map chi2_combined_list b1_counter a1_counter a2_counter b2_counter... + a1_counter b1_counter a2_counter b2_counter c1_list c2_list bestc1_midtobot bestc2_midtobot bestc1_midtotop bestc2_midtotop bestc1_combined bestc2_combined... + besta1_combined besta2_combined bestb1_combined bestb2_combined besta1 bestb1 bestc1 besta2 bestb2 bestc2 bestg1 bestg2 best_total_chi2 NEST_CH3T_Spectrum inpaint_on... + best_kr_chi2 best_h3_chi2 electron_lifetime_list electron_lifetime_map a2_start a1_start b1_start b2_start ... + total_h3_chi2_list total_kr_chi2_list total_chi2_list h3_chi2_2016_list h3_chi2_2015_list kr_chi2_2016_list kr_chi2_2015_list ... + electron_lifetime_2016_list electron_lifetime_2015_list total_h3_chi2_map total_kr_chi2_map total_chi2_map h3_chi2_2016_map h3_chi2_2015_map ... + kr_chi2_2016_map kr_chi2_2015_map electron_lifetime_2016_map electron_lifetime_2015_map NEST_CH3T_Spectrum_Sep2015 NEST_CH3T_Spectrum_Feb2016 g1 g2 bestg1 bestg2 g1_counter g2_counter ... + firsta1 firstb1 firsta2 firstb2 firstg1 firstg2 kr_means_2015_map kr_means_2016_map kr_sigma_2015_map kr_sigma_2016_map kr_staterr_2015_map kr_staterr_2016_map ... + kr_means_2015_list kr_means_2016_list kr_2015_num_events kr_2016_num_events kr_sigma_2015_list kr_sigma_2016_list kr_staterr_2015_list kr_staterr_2016_list ... + pseudo_lifetime_2016 pseudo_lifetime_2015 kr_s1_c_2015 kr_s2_c_2015 h3_s1_c_2015 h3_s2_c_2015 s1ab_s2_xyz_fit_map s1ab_s1_xyz_fit_map ... + kr_2015_drift_time kr_2015_s2x kr_2015_s2y kr_chi2_2016_zslice_list kr_chi2_2015_zslice_list kr_chi2_zslice_zcenter_list ... + full_kr_chi2_2016_list full_kr_chi2_2015_list best_total_kr_chi2 best_total_h3_chi2 alternate_total_chi2_map alternate_total_chi2_list ... + best_total_alternate_chi2 best_total_alternate_kr_chi2 best_total_alternate_h3_chi2 besta2_alternate bestb2_alternate bestg1_alternate bestg2_alternate bestc2_alternate ... + total_h3_chi2_nothresh_list total_chi2_nothresh_list alternate_total_chi2_nothresh_list h3_chi2_2015_nothresh_list h3_chi2_2016_nothresh_list ... + total_h3_chi2_nothresh_map total_chi2_nothresh_map alternate_total_chi2_nothresh_map h3_chi2_2016_nothresh_map h3_chi2_2015_nothresh_map ... + best_total_chi2_nothresh best_total_kr_chi2_nothresh best_total_h3_chi2_nothresh besta2_nothresh bestb2_nothresh bestc2_nothresh bestg1_nothresh bestEE_nothresh ... + best_total_alternate_chi2_nothresh best_total_alternate_kr_chi2_nothresh best_total_alternate_h3_chi2_nothresh besta2_alternate_nothresh bestb2_alternate_nothresh ... + bestc2_alternate_nothresh bestg1_alternate_nothresh bestEE_alternate_nothresh best_total_chi2_nothresh best_total_alternate_chi2_nothresh ee_list ... + total_h3_chi2_nothresh_separatescaling_list total_chi2_nothresh_separatescaling_list best_total_chi2_nothresh_separatescaling ... + best_total_kr_chi2_nothresh_separatescaling best_total_h3_chi2_nothresh_separatescaling besta2_nothresh_separatescaling ... + bestc2_nothresh_separatescaling bestg1_nothresh_separatescaling bestEE_nothresh_separatescaling ... + total_h3_chi2_nothresh_separatescaling_map total_chi2_nothresh_separatescaling_map bestEE_nothresh ... + h3_chi2_2015_nothresh_separatescaling_list h3_chi2_2016_nothresh_separatescaling_list ee_list ... + h3_chi2_2016_oldsim_list h3_chi2_2015_oldsim_list total_h3_chi2_oldsim_list total_chi2_oldsim_list ... + best_total_chi2_oldsim best_total_kr_chi2_oldsim best_total_h3_chi2_oldsim besta2_oldsim bestb2_oldsim ... + bestc2_oldsim bestg1_oldsim bestEE_oldsim NEST_CH3T_Spectrum_old + + + +%%%%%%%%%%%%%%%%%%%%% +%% REPEAT FOR 2014 DATA +%%%%%%%%%%%%%%%%%%%%% + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\MappingParametersFit_Start_2016_CutDown.mat') + +% %If we can use 3D map, do so. If there aren't enough events do 1D then 2D +% if length(s1ab_z)>90000; %require 100,000 events to do 3D binning +% %Removing zeros from map with nearest neighbor method +% s1ab_xyz_mean_old=s1ab_xyz_mean; +% temp_map=s1ab_xyz_mean; +% q= ~isnan(temp_map); +% r=nearestpoint(find(~q),find(q)); +% s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); +% +% %interpolating with cubic so that we get NaN when extrapolating +% s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); +% s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); +% s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); +% s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); +% +% %Filling in NaN values with the s1a/s1b Z map polynomial +% s1as1b_zvalues= polyval(s1ab_P,drift_time); +% s1as1b_z_at_center=s1as1b_at_center; +% s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); +% s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); +% s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); +% s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); +% +% s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +% s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +% s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +% s1_phe_both=s1_phe_both./s1_3Dfieldremoval; +% +% +% else +% %Removing zeros from map with nearest neighbor method +% s1ab_xy_mean_old=s1ab_xy_mean; +% temp_map=s1ab_xy_mean; +% q= ~isnan(temp_map); +% r=nearestpoint(find(~q),find(q)); +% s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); +% +% %interpolating with cubic so that we get NaN when extrapolating +% s1as1b_zvalues= polyval(s1ab_P,drift_time); +% s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); +% s1as1b_z_at_center=polyval(s1ab_P,z_center); +% s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); +% +% s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); +% s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); +% s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); +% s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); +% +% %Filling in NaN values with no XY correction. (Z dependence should never be NaN) +% s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; +% s2_zfieldremoval(isnan(s2_zfieldremoval))=1; +% s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; +% s1_zfieldremoval(isnan(s1_zfieldremoval))=1; +% +% +% s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +% s2_phe_both=s2_phe_both./(s2_zfieldremoval); +% s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +% s1_phe_both=s1_phe_both./(s1_zfieldremoval); +% +% +% +% end + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[5+bin_size, 500] );%from 50 to 300us for the fit, based on when s1as1b values get strange + +s2_both_norm_z_index=mean_index(dT_range); +s2_both_norm_z_means=means(dT_range); + s2_at_top=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + %%Tracker for pseudo-lifetime + s2_at_bottom=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_2016=-320/log(s2_at_bottom/s2_at_top); +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_xbins),floor(s2_ybins)); +Sigma_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); +Count_S2_both = zeros(floor(s2_xbins),floor(s2_ybins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_xbins),floor(s1_ybins)); +Sigma_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); +Count_S1_both = zeros(floor(s1_xbins),floor(s1_ybins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Apply corrections to 2016 Kr data +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\MappingParametersFit_Start_2016_CutDown.mat') + + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; +% +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; + +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate ER Band shift +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + liquid_cut= inrange(drift_time,[40 300]) ... + & (log10(s1_phe_both)+0.7*log10(s2_phe_both)>4.9) & (log10(s1_phe_both)+0.7*log10(s2_phe_both)<5.5) ... + & s2_phe_both>3000 & s2_phe_both<80000 & s2radius<25; %used to be drift time 100 to 250 + + +kr_s1_c_2016=s1_phe_both_xyz(liquid_cut); +kr_s2_c_2016=s2_phe_both_xyz(liquid_cut); +kr_2016_drift_time=drift_time(liquid_cut); +kr_2016_s2x=s2x(liquid_cut); +kr_2016_s2y=s2y(liquid_cut); + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%Apply Corrections to 2016 CH3T Data +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +clear s1_phe_both s2_phe_both +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\TritiumMethod\libNEST_CH3TModel\CH3T_Feb2016_NoCorrections.mat'); + + +% Apply the corrections +%----------------------------------- +% Finding the electron lifetime +%----------------------------------- + +% electron_lifetime = e_lifetime_both; + +% electron_lifetime_2016=e_lifetime_both; +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +% %------------------------------------------ +% % Finding the S1 xyz correction map values +% %------------------------------------------ + +% +% if nargin == 3 +% s1_xyz_x_bins = s1xbins_3D; +% s1_xyz_y_bins = s1ybins_3D; +% s1_xyz_z_bins = s1zbins_3D; +% +% % xx = size(s1_xyz_x_bins); yy = size(s1_xyz_y_bins); zz = size(s1_xyz_z_bins); +% +% s1_xyz_map_all = norm_s1_both_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_both_xyz; s1_xyz_map_all = reshape(s1_xyz_map_all,xx(2),yy(2),zz(2)); +% s1_xyz_map_bottom = norm_s1_bottom_xyz; %lug_iqs_xml.iq(s1_xyz_index(index)).correction.fit.norm_s1_bottom_xyz; s1_xyz_map_bottom = reshape(s1_xyz_map_bottom,xx(2),yy(2),zz(2)); +% end + + + +%% Calculating corrections + +%% Finding the drift time, x and y associated with S1 - this isn't how they are actually applied in DP, since DP estimates the S1 and here we know the exact S1. +% It's the best we can do for ease here and it shouldn't matter much + + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +% % Calculate electron lifetime correction (S2 Z-correction) +% electron_lifetime_correction = exp(drift_time./electron_lifetime); +% electron_lifetime_correction(find(isnan(electron_lifetime_correction))) = 1.0; + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%% add RQs of correction factors + +% d.correction_electron_lifetime = single(electron_lifetime_correction); +d.correction_s1_z_dependence = single(s1_z_correction); +d.correction_s1_xyz_dependence = single(s1xyz_correction); %this is either 3D or 1D+2D +d.correction_s1_xy_dependence = single(s1xy_correction); +d.correction_s2_xy_dependence = single(s2xy_correction); + +% d.admin.corrections.electron_lifetime = electron_lifetime; +d.admin.corrections.s1_z_dependence.all = z_dep_par_all; +%-------------------------------------------------------------------------- +% Apply Z corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + + +%% Calculate ER Band shift +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +s1_min=0; +s1_max=120; + + %% Redo with r<10 cm + + + liquid_cut= clean_cut & inrange(drift_time,[40 300]) ... + & (log10(s1_phe_both)+log10(s2_phe_both)<5.9) & (log10(s1_phe_both)-2.*log10(s2_phe_both)<-4.8) ... + & (log10(s1_phe_both)-2.*log10(s2_phe_both)>-6.8) ... + & s2_phe_both>600 & s2_phe_both<16000 & s2radius<25; %used to be drift time 100 to 250 + + + +h3_s1_c_2016=s1_phe_both_xyz(liquid_cut); +h3_s2_c_2016=s2_phe_both_xyz(liquid_cut); + + clearvars -except param_counter a1_list b1_list a2_list b2_list total_chi2_list h3_chi2_list kr_chi2_list g1_list g2_list total_chi2_map h3_chi2_map kr_chi2_map chi2_midtobot_list... + best_chi2_midtotop besta1_midtotop besta2_midtotop bestb1_midtotop bestb2_midtotop best_chi2_midtobot... + besta1_midtobot besta1_midtotop bestb1_midtobot bestb1_midtotop a1 b1 a2 b2 chi2_midtotop_map chi2_midtobot_map b_counter a_counter... + besta1_combined bestb1_combined besta2_combined bestb2_combined best_chi2_combined chi2_combined_map chi2_combined_list b1_counter a1_counter a2_counter b2_counter... + a1_counter b1_counter a2_counter b2_counter c1_list c2_list bestc1_midtobot bestc2_midtobot bestc1_midtotop bestc2_midtotop bestc1_combined bestc2_combined... + besta1_combined besta2_combined bestb1_combined bestb2_combined besta1 bestb1 bestc1 besta2 bestb2 bestc2 bestg1 bestg2 best_total_chi2 NEST_CH3T_Spectrum inpaint_on... + best_kr_chi2 best_h3_chi2 electron_lifetime_list electron_lifetime_map a2_start a1_start b1_start b2_start ... + total_h3_chi2_list total_kr_chi2_list total_chi2_list h3_chi2_2016_list h3_chi2_2015_list kr_chi2_2016_list kr_chi2_2015_list ... + electron_lifetime_2016_list electron_lifetime_2015_list total_h3_chi2_map total_kr_chi2_map total_chi2_map h3_chi2_2016_map h3_chi2_2015_map ... + kr_chi2_2016_map kr_chi2_2015_map electron_lifetime_2016_map electron_lifetime_2015_map NEST_CH3T_Spectrum_Sep2015 NEST_CH3T_Spectrum_Feb2016 g1 g2 bestg1 bestg2 g1_counter g2_counter ... + firsta1 firstb1 firsta2 firstb2 firstg1 firstg2 kr_means_2015_map kr_means_2016_map kr_sigma_2015_map kr_sigma_2016_map kr_staterr_2015_map kr_staterr_2016_map ... + kr_means_2015_list kr_means_2016_list kr_2015_num_events kr_2016_num_events kr_sigma_2015_list kr_sigma_2016_list kr_staterr_2015_list kr_staterr_2016_list ... + pseudo_lifetime_2016 pseudo_lifetime_2015 kr_s1_c_2015 kr_s2_c_2015 h3_s1_c_2015 h3_s2_c_2015 kr_s1_c_2016 kr_s2_c_2016 h3_s1_c_2016 h3_s2_c_2016 ... + kr_2015_drift_time kr_2015_s2x kr_2015_s2y kr_2016_drift_time kr_2016_s2x kr_2016_s2y ... + kr_chi2_2016_zslice_list kr_chi2_2015_zslice_list kr_chi2_zslice_zcenter_list ... + full_kr_chi2_2016_list full_kr_chi2_2015_list best_total_kr_chi2 best_total_h3_chi2 alternate_total_chi2_map alternate_total_chi2_list ... + best_total_alternate_chi2 best_total_alternate_kr_chi2 best_total_alternate_h3_chi2 besta2_alternate bestb2_alternate bestg1_alternate bestg2_alternate bestc2_alternate c2 ... + total_h3_chi2_nothresh_list total_chi2_nothresh_list alternate_total_chi2_nothresh_list h3_chi2_2015_nothresh_list h3_chi2_2016_nothresh_list ... + total_h3_chi2_nothresh_map total_chi2_nothresh_map alternate_total_chi2_nothresh_map h3_chi2_2016_nothresh_map h3_chi2_2015_nothresh_map ... + best_total_chi2_nothresh best_total_kr_chi2_nothresh best_total_h3_chi2_nothresh besta2_nothresh bestb2_nothresh bestc2_nothresh bestg1_nothresh bestEE_nothresh ... + best_total_alternate_chi2_nothresh best_total_alternate_kr_chi2_nothresh best_total_alternate_h3_chi2_nothresh besta2_alternate_nothresh bestb2_alternate_nothresh ... + bestc2_alternate_nothresh bestg1_alternate_nothresh bestEE_alternate_nothresh best_total_chi2_nothresh best_total_alternate_chi2_nothresh ee_list ... + total_h3_chi2_nothresh_separatescaling_list total_chi2_nothresh_separatescaling_list best_total_chi2_nothresh_separatescaling ... + best_total_kr_chi2_nothresh_separatescaling best_total_h3_chi2_nothresh_separatescaling besta2_nothresh_separatescaling ... + bestc2_nothresh_separatescaling bestg1_nothresh_separatescaling bestEE_nothresh_separatescaling ... + total_h3_chi2_nothresh_separatescaling_map total_chi2_nothresh_separatescaling_map bestEE_nothresh ... + h3_chi2_2015_nothresh_separatescaling_list h3_chi2_2016_nothresh_separatescaling_list ee_list ... + h3_chi2_2016_oldsim_list h3_chi2_2015_oldsim_list total_h3_chi2_oldsim_list total_chi2_oldsim_list ... + best_total_chi2_oldsim best_total_kr_chi2_oldsim best_total_h3_chi2_oldsim besta2_oldsim bestb2_oldsim ... + bestc2_oldsim bestg1_oldsim bestEE_oldsim NEST_CH3T_Spectrum_old +%% Make plots + + + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\NEST_CH3T_Spectrum_old.mat') + + + + +% best_total_chi2=100000000; +% for g1=0.09:0.005:0.125; +% for ee=0.75:0.01:1.2; +% +% g2_feb2016=25.05*ee; %converting to g2 with SE size +% g2_sep2015=25.8536*ee; +% %Kr 2014 data +% +% Kr_E_2016=(1/73).*(kr_s1_c_2016./g1+kr_s2_c_2016./g2_feb2016); +% H3_E_2016=(1/73).*(h3_s1_c_2016./g1+h3_s2_c_2016./g2_feb2016); +% +% Kr_E_2015=(1/73).*(kr_s1_c_2015./g1+kr_s2_c_2015./g2_sep2015); +% H3_E_2015=(1/73).*(h3_s1_c_2015./g1+h3_s2_c_2015./g2_sep2015); +% +% i=1; +% for dT_max=40+20/2:20:300-20/2; +% temp_fit_2016=fit([0:1:100].',hist(Kr_E_2016(inrange(kr_2016_drift_time,[dT_max-20 dT_max])),[0:1:100]).','gauss1'); +% kr_2016_means(i)=temp_fit_2016.b1; +% kr_2016_means_err(i)=temp_fit_2016.c1/sqrt(2)/length(Kr_E_2016(inrange(kr_2016_drift_time,[dT_max-20 dT_max]))); +% +% temp_fit_2015=fit([0:1:100].',hist(Kr_E_2015(inrange(kr_2015_drift_time,[dT_max-20 dT_max])),[0:1:100]).','gauss1'); +% kr_2015_means(i)=temp_fit_2015.b1; +% kr_2015_means_err(i)=temp_fit_2015.c1/sqrt(2)/length(Kr_E_2015(inrange(kr_2015_drift_time,[dT_max-20 dT_max]))); +% +% dT_centers(i)=dT_max-10; +% i=i+1; +% end +% +% kr_2016_chi2_slices=((41.55-kr_2016_means)./0.2395).^2; +% kr_2015_chi2_slices=((41.55-kr_2015_means)./0.2395).^2; +% +% %make CH3T data spectrum +% [h3_hist_2016,h3_hist_bin_2016]=hist(H3_E_2016,NEST_CH3T_Spectrum_old(1,:)); +% [h3_hist_2015,h3_hist_bin_2015]=hist(H3_E_2015,NEST_CH3T_Spectrum_old(1,:)); +% +% scale_factor_2015_oldsim=sum(h3_hist_2015(17:80))/sum(NEST_CH3T_Spectrum_old(2,17:80)); +% h3_scaled_oldsim_2015=scale_factor_2015_oldsim.*NEST_CH3T_Spectrum_old(2,:); +% +% scale_factor_2016_oldsim=sum(h3_hist_2016(17:80))/sum(NEST_CH3T_Spectrum_old(2,17:80)); +% h3_scaled_oldsim_2016=scale_factor_2016_oldsim.*NEST_CH3T_Spectrum_old(2,:); +% +% h3_chi2_2016=(1/62).*sum( (h3_scaled_oldsim_2016(17:80) - h3_hist_2016(17:80)).^2 ./(h3_hist_2016(17:80))); %(4:80) is to avoid low stat areas in the simulation +% h3_chi2_2015=(1/62).*sum( (h3_scaled_oldsim_2015(17:80) - h3_hist_2015(17:80)).^2 ./(h3_hist_2015(17:80))); +% +% total_h3_chi2=(h3_chi2_2016+h3_chi2_2015)/2; +% total_kr_chi2=(mean(kr_2016_chi2_slices)+mean(kr_2015_chi2_slices))/2; +% total_chi2=(total_h3_chi2+total_kr_chi2)/2; +% +% if total_chi2 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + clean_cut = (log10(s1_phe_both)+0.6*log10(s2_phe_both)>4.5) & s2radius<25; + + s1_phe_bottom=s1_phe_bottom(clean_cut); + s1_phe_both=s1_phe_both(clean_cut); + s2_phe_bottom=s2_phe_bottom(clean_cut); + s2_phe_both=s2_phe_both(clean_cut); + drift_time=drift_time(clean_cut); + s2x=s2x(clean_cut); + s2y=s2y(clean_cut); + s2radius = (s2x.^2+s2y.^2).^(0.5); + event_timestamp_samples=event_timestamp_samples(clean_cut); + s2_width=s2_width(clean_cut); + s1_width=s1_width(clean_cut); + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + +%% + zcut_min = 10; %field changes at 4 uSec + zcut_max = 0.95*det_edge; + + + if Kr_events < 30000 %then create a 10x10 grid. Otherwise 25x25. Want about 30 evts per bin + + S1xybinsize = sqrt((50*50)/(Kr_events/150)); + S1_xbin_min = -25; + S1_xbin_max = 25; + S1_ybin_min = -25; + S1_ybin_max = 25; + SE_ybin_min = -25; + SE_ybin_max = 25; + + S2xybinsize = sqrt((50*50)/(Kr_events/150));%cm +% SExybinsize = 5; DEFINED LATER, based on number of SE events + S2_xbin_min = -25; + S2_xbin_max = 25; + S2_ybin_min = -25; + S2_ybin_max = 25; + SE_xbin_min = -25; + SE_xbin_max = 25; + + + end + + s1_xbins = (S1_xbin_max-S1_xbin_min)./S1xybinsize; + s1_ybins = (S1_ybin_max-S1_ybin_min)./S1xybinsize; + + s2_xbins = (S2_xbin_max-S2_xbin_min)./S2xybinsize; + s2_ybins = (S2_ybin_max-S2_ybin_min)./S2xybinsize; + + + if Kr_events < 4000; % skip krpCal if less than 4000 events + calibrations=zeros(6,1); + end + +%% +%Set up cuts and variables + s1ab_cut=logical(sum(s1_single_cut(:,:),1)); + s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); + s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); + s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); + s1ab_x=d.x_cm(s2_single_cut); + s1ab_y=d.y_cm(s2_single_cut); + s1ab_z=d.z_drift_samples(s2_single_cut)/100; + s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); + + s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<=25; + %plotting x=s1a v y=s1a/s1b cuts: y<0.035x-1, y>-0.035.*x+5; y>0.01.*x; %y<4.2; x<255 +% s1ab_areacut= (s1a_phe_both./s1b_phe_both-0.035.*s1a_phe_both<-1) & (s1a_phe_both./s1b_phe_both+0.035.*s1a_phe_both>5)... +% & (s1a_phe_both./s1b_phe_both > 0.01.* s1a_phe_both) & (s1a_phe_both./s1b_phe_both<4.2) & (s1a_phe_both<255); + + s1ab_x=s1ab_x(s1ab_timing_cut); + s1ab_y=s1ab_y(s1ab_timing_cut); + s1ab_z=s1ab_z(s1ab_timing_cut); + s1a_phe_both=s1a_phe_both(s1ab_timing_cut); + s1b_phe_both=s1b_phe_both(s1ab_timing_cut); + + dT_step=det_edge/(length(s1ab_z)/1000); %2000 events per z bin + + + clear s1a_z_means s1a_z_means_err s1b_z_means s1b_z_means_err s1ab_bincenters s1ab_z_means s1ab_z_means_err +%Z Dependence of S1a/S1b +i=1; + for z_max=10+dT_step:dT_step:det_edge; + s1a_fit=fit([0:2:400].',hist(s1a_phe_both(s1a_phe_both>0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:400]).','gauss1'); + s1b_fit=fit([0:2:300].',hist(s1b_phe_both(s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:300]).','gauss1'); + s1a_z_means(i)=s1a_fit.b1; + s1a_z_means_err(i)=s1a_fit.c1/sqrt(2)/sqrt(length(s1a_phe_both(s1a_phe_both>0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1b_z_means(i)=s1b_fit.b1; + s1b_z_means_err(i)=s1b_fit.c1/sqrt(2)/sqrt(length(s1b_phe_both(s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1ab_bincenters(i)=z_max-dT_step/2; + i=i+1; + end + +s1ab_z_means=s1a_z_means./s1b_z_means; +s1ab_z_means_err=sqrt( (s1b_z_means_err.*s1a_z_means./(s1b_z_means.^2)).^2 + (s1a_z_means_err./s1b_z_means).^2); + +%fit polynomial to s1az and s1bz, to remove z dependence later in xy fit +[s1a_P, s1a_S]=polyfit(s1ab_bincenters,s1a_z_means,3); +[s1b_P, s1b_S]=polyfit(s1ab_bincenters,s1b_z_means,3); +[s1ab_P, s1ab_S]=polyfit(s1ab_bincenters,s1ab_z_means,2); + +%S1a z dependence plot +s1az_plot=figure; +errorbar(s1ab_bincenters,s1a_z_means,s1a_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a Mean (phe)'); title('S1a Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1a_P,[10:1:320]),'-r','LineWidth',2) + + +%S1b z dependence plot +s1bz_plot=figure; +errorbar(s1ab_bincenters,s1b_z_means,s1b_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1b Mean (phe)'); title('S1b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1b_P,[10:1:320]),'-r','LineWidth',2) + +%S1a/b z dependence plot +s1a_over_bz_plot=figure; +errorbar(s1ab_bincenters,s1ab_z_means,s1ab_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a/b'); title('S1 a/b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1ab_P,[10:1:320]),'-r','LineWidth',2) + +%Correcting z dependence to get XY dependence in same manner that Kr/CH3T +%map does + s1a_phe_both_z=s1a_phe_both.'.*polyval(s1a_P,z_center)./polyval(s1a_P,s1ab_z); + s1b_phe_both_z=s1b_phe_both.'.*polyval(s1b_P,z_center)./polyval(s1b_P,s1ab_z); + +%% S1a/b XY map (after z correction) +s1ab_xbin_min=-25; +s1ab_ybin_min=-25; +s1ab_xbin_max=25; +s1ab_ybin_max=25; +s1ab_xybinsize=sqrt((50*50)/(length(s1ab_z)/300)); +clear s1a_xy_mean s1a_xy_mean_err s1b_xy_mean s1b_xy_mean_err + +s1ab_xbins=s1ab_xbin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_xbin_max; +s1ab_ybins=s1ab_ybin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_ybin_max; + +s1a_xy_mean=zeros(length(s1ab_ybins),length(s1ab_xbins)); +s1b_xy_mean=zeros(length(s1ab_ybins),length(s1ab_xbins)); + + for x_bin=s1ab_xbin_min:s1ab_xybinsize:(s1ab_xbin_max-s1ab_xybinsize/2); + for y_bin=s1ab_ybin_min:s1ab_xybinsize:(s1ab_ybin_max-s1ab_xybinsize/2); + x_min = x_bin; x_max = x_bin+s1ab_xybinsize; + y_min = y_bin; y_max = y_bin+s1ab_xybinsize; + + x_count=int32(1+x_bin/s1ab_xybinsize+s1ab_xbin_max/s1ab_xybinsize); + y_count=int32(1+y_bin/s1ab_xybinsize+s1ab_ybin_max/s1ab_xybinsize); + + bin_cut = s1a_phe_both>0 & s1b_phe_both>0 & inrange(s1ab_x,[x_min,x_max]).' & inrange(s1ab_y,[y_min,y_max]).'; + if length(s1a_phe_both_z(bin_cut))>100; + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400])),[0:2:400]).','gauss1'); + s1a_xy_mean(y_count,x_count)=s1a_z_fit.b1; + s1a_xy_mean_err(y_count,x_count)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300])),[0:2:300]).','gauss1'); + s1b_xy_mean(y_count,x_count)=s1b_z_fit.b1; + s1b_xy_mean_err(y_count,x_count)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300]))); + else + s1a_xy_mean(y_count,x_count)=0; + s1a_xy_mean_err(y_count,x_count)=0; + s1b_xy_mean(y_count,x_count)=0; + s1b_xy_mean_err(y_count,x_count)=0; + end + + end + end + s1ab_xy_mean=s1a_xy_mean./s1b_xy_mean; + s1ab_xy_mean_err=sqrt( (s1b_xy_mean_err.*s1a_xy_mean./(s1b_xy_mean.^2)).^2 + (s1a_xy_mean_err./s1b_xy_mean).^2); + + + %Plot s1a XY means + color_range_max=max(max(s1a_xy_mean)); + color_range_min=min(min(s1a_xy_mean(s1a_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1a_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1a_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + %Plot s1a XY means + color_range_max=max(max(s1b_xy_mean)); + color_range_min=min(min(s1b_xy_mean(s1b_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1b_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1b_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1b Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1b Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + %s1a/b XY Ratio + color_range_max=max(max(s1ab_xy_mean)); + color_range_min=min(min(s1ab_xy_mean(s1ab_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1ab_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a/b Ratio vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a/b Ratio','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + +%% 3D Kr s1a/s1b map + +if length(s1ab_z)>90000; %require 100,000 events to do 3D binning +s1ab_xyz_numbins=floor((length(s1ab_z)/250)^(1/3)); %number of bins in one direction +s1ab_xyz_zstep=det_edge/s1ab_xyz_numbins; +s1ab_xyz_xstep=50/s1ab_xyz_numbins; +s1ab_xyz_ystep=50/s1ab_xyz_numbins; +s1ab_xyz_xmax=25; +r_max=25; + +s1ab_xyz_zbins=10+s1ab_xyz_zstep/2:s1ab_xyz_zstep:10+s1ab_xyz_zstep/2+s1ab_xyz_zstep*s1ab_xyz_numbins; %20 us +s1ab_xyz_xbins=(-r_max+s1ab_xyz_xstep/2):s1ab_xyz_xstep:r_max; +s1ab_xyz_ybins=(-r_max+s1ab_xyz_ystep/2):s1ab_xyz_ystep:r_max; + +s1a_xyz_mean=zeros(length(s1ab_xyz_ybins),length(s1ab_xyz_xbins),length(s1ab_xyz_zbins)); +s1a_xyz_mean_err=zeros(length(s1ab_xyz_ybins),length(s1ab_xyz_xbins),length(s1ab_xyz_zbins)); +s1b_xyz_mean=zeros(length(s1ab_xyz_ybins),length(s1ab_xyz_xbins),length(s1ab_xyz_zbins)); +s1b_xyz_mean_err=zeros(length(s1ab_xyz_ybins),length(s1ab_xyz_xbins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + m=int8(j/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + + %Count the number of events per bin + Count_S1ab_3D(l,m,n)=length(s1a_phe_both(q)); + + if (Count_S1ab_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_xyz_mean(l,m,n)=s1a_z_fit.b1; + s1a_xyz_mean_err(l,m,n)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]) ),[0:2:300]).','gauss1'); + s1b_xyz_mean(l,m,n)=s1b_z_fit.b1; + s1b_xyz_mean_err(l,m,n)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); + else %not enough stats to do the fit + s1a_xyz_mean(l,m,n)=0; + s1a_xyz_mean_err(l,m,n)=0; + s1b_xyz_mean(l,m,n)=0; + s1b_xyz_mean_err(l,m,n)=0; + end + + end + end +k +end + + s1ab_xyz_mean=s1a_xyz_mean./s1b_xyz_mean; + s1ab_xyz_mean_err=sqrt( (s1b_xyz_mean_err.*s1a_xyz_mean./(s1b_xyz_mean.^2)).^2 + (s1a_xyz_mean_err./s1b_xyz_mean).^2); + +end + +save('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\KrypCal2p21_QualityChecks\EnergyResolution\MappingParametersFit_Start_Oct2015DD_CutDown','s1ab_xyz_xbins','s1ab_xyz_ybins','s1ab_xyz_zbins','s1ab_xyz_mean','Kr_events','S1_xbin_max','S1_xbin_min','S1_ybin_max','S1_ybin_min','S1xybinsize','S2_xbin_max','S2_xbin_min','S2_ybin_max','S2_ybin_min','S2xybinsize','det_edge','drift_time','g','grid_size','i','max_num_bins','min_evts_per_bin','rcut_max','rcut_min','s1_phe_both','s1_phe_bottom','s1_width','s1_xbins','s1_ybins','s1a_P','s1a_S','s1a_fit','s1a_over_bz_plot','s1a_xy_fig','s1a_xy_mean','s1a_xy_mean_err','s1a_z_fit','s1a_z_means','s1a_z_means_err','s1ab_P','s1ab_S','s1ab_bincenters','s1ab_x','s1ab_xbin_max','s1ab_xbin_min','s1ab_xbins','s1ab_xy_fig','s1ab_xy_mean','s1ab_xy_mean_err','s1ab_xybinsize','s1ab_y','s1ab_ybin_max','s1ab_ybin_min','s1ab_ybins','s1ab_z','s1ab_z_means','s1ab_z_means_err','s1area_bound_max','s1area_bound_min','s1az_plot','s1b_P','s1b_S','s1b_fit','s1b_xy_fig','s1b_xy_mean','s1b_xy_mean_err','s1b_z_fit','s1b_z_means','s1b_z_means_err','s1bz_plot','s2_phe_both','s2_phe_bottom','s2_width','s2_xbins','s2_ybins','s2area_bound_max','s2area_bound_min','s2radius','s2x','s2y','x_bin','x_center','x_count','x_max','x_min','y_bin','y_center','y_count','y_max','y_min','z_center','z_max','zcut_max','zcut_min'); \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/LifetimeEstimates/Sep2015_Lifetime.m b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/LifetimeEstimates/Sep2015_Lifetime.m new file mode 100644 index 0000000..bd1a05e --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/LifetimeEstimates/Sep2015_Lifetime.m @@ -0,0 +1,993 @@ +%% Make corrections with the chosen polynomial +path='C:\Users\Richard\Desktop\LUX Analysis\lux10_20150929T1905_cp18197'; + + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +delay_min=0; +file_id_cp='test'; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 70000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + + + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + + zcut_min = 10; %field changes at 4 uSec + zcut_max = 0.95*det_edge; + + + if Kr_events < 30000 %then create a 10x10 grid. Otherwise 25x25. Want about 30 evts per bin + + S1xybinsize = sqrt((50*50)/(Kr_events/150)); + S1_xbin_min = -25; + S1_xbin_max = 25; + S1_ybin_min = -25; + S1_ybin_max = 25; + SE_ybin_min = -25; + SE_ybin_max = 25; + + S2xybinsize = sqrt((50*50)/(Kr_events/150));%cm +% SExybinsize = 5; DEFINED LATER, based on number of SE events + S2_xbin_min = -25; + S2_xbin_max = 25; + S2_ybin_min = -25; + S2_ybin_max = 25; + SE_xbin_min = -25; + SE_xbin_max = 25; + + + end + + s1_xbins = (S1_xbin_max-S1_xbin_min)./S1xybinsize; + s1_ybins = (S1_ybin_max-S1_ybin_min)./S1xybinsize; + + s2_xbins = (S2_xbin_max-S2_xbin_min)./S2xybinsize; + s2_ybins = (S2_ybin_max-S2_ybin_min)./S2xybinsize; + + %% Kr S1a/S2b map + +%Set up cuts and variables + s1ab_cut=logical(sum(s1_single_cut(:,:),1)); + s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); + s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); + s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); + s1ab_x=d.x_cm(s2_single_cut); + s1ab_y=d.y_cm(s2_single_cut); + s1ab_z=d.z_drift_samples(s2_single_cut)/100; + s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); + s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<25; + %plotting x=s1a v y=s1a/s1b cuts: y<0.035x-1, y>-0.035.*x+5; y>0.01.*x; %y<4.2; x<255 +% s1ab_areacut= (s1a_phe_both./s1b_phe_both-0.035.*s1a_phe_both<-1) & (s1a_phe_both./s1b_phe_both+0.035.*s1a_phe_both>5)... +% & (s1a_phe_both./s1b_phe_both > 0.01.* s1a_phe_both) & (s1a_phe_both./s1b_phe_both<4.2) & (s1a_phe_both<255); + + s1ab_x=s1ab_x(s1ab_timing_cut); + s1ab_y=s1ab_y(s1ab_timing_cut); + s1ab_z=s1ab_z(s1ab_timing_cut); + s1a_phe_both=s1a_phe_both(s1ab_timing_cut); + s1b_phe_both=s1b_phe_both(s1ab_timing_cut); + s1ab_radius=s1ab_radius(s1ab_timing_cut); + + %fidicual Z cut for s1ab_xy measurement + [s1ab_z_hist s1ab_z_hist_bins]=hist(s1ab_z(inrange(s1ab_z,[0,400])),[0:1:400]); + frac_hist=cumsum(s1ab_z_hist)./sum(s1ab_z_hist); + s1ab_z_cut_lower= min(s1ab_z_hist_bins(frac_hist>.10)); + s1ab_z_cut_upper= max(s1ab_z_hist_bins(frac_hist<.90)); + s1ab_z_cut=inrange(s1ab_z,[s1ab_z_cut_lower,s1ab_z_cut_upper]); + + %R cut for s1ab_Z measurement + [upperz_r_hist upperz_r_hist_bins]=hist(s1ab_radius(s1ab_z>s1ab_z_cut_upper & s1ab_radius<=26),[0:1:26]); + [lowerz_r_hist lowerz_r_hist_bins]=hist(s1ab_radius(s1ab_z0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:400]).','gauss1'); + s1b_fit=fit([0:2:300].',hist(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:300]).','gauss1'); + s1a_z_means(i)=s1a_fit.b1; + s1a_z_means_err(i)=s1a_fit.c1/sqrt(2)/sqrt(length(s1a_phe_both(s1ab_r_cut.' & s1a_phe_both>0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1b_z_means(i)=s1b_fit.b1; + s1b_z_means_err(i)=s1b_fit.c1/sqrt(2)/sqrt(length(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1ab_bincenters(i)=z_max-dT_step/2; + i=i+1; + end + +s1ab_z_means=s1a_z_means./s1b_z_means; +s1ab_z_means_err=sqrt( (s1b_z_means_err.*s1a_z_means./(s1b_z_means.^2)).^2 + (s1a_z_means_err./s1b_z_means).^2); + +%fit polynomial to s1az and s1bz, to remove z dependence later in xy fit +[s1a_P, s1a_S]=polyfit(s1ab_bincenters,s1a_z_means,3); +[s1b_P, s1b_S]=polyfit(s1ab_bincenters,s1b_z_means,3); +[s1ab_P, s1ab_S]=polyfit(s1ab_bincenters,s1ab_z_means,2); + +%S1a z dependence plot +s1az_plot=figure; +errorbar(s1ab_bincenters,s1a_z_means,s1a_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a Mean (phe)'); title('S1a Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1a_P,[10:1:320]),'-r','LineWidth',2) + +%S1b z dependence plot +s1bz_plot=figure; +errorbar(s1ab_bincenters,s1b_z_means,s1b_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1b Mean (phe)'); title('S1b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1b_P,[10:1:320]),'-r','LineWidth',2) + +%S1a/b z dependence plot +s1a_over_bz_plot=figure; +errorbar(s1ab_bincenters,s1ab_z_means,s1ab_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a/b'); title('S1 a/b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1ab_P,[10:1:320]),'-r','LineWidth',2) + + +%Correcting z dependence to get XY dependence in same manner that Kr/CH3T +%map does + s1a_phe_both_z=s1a_phe_both.'.*polyval(s1a_P,z_center)./polyval(s1a_P,s1ab_z); + s1b_phe_both_z=s1b_phe_both.'.*polyval(s1b_P,z_center)./polyval(s1b_P,s1ab_z); + + %% S1a/b XY map (after z correction) +s1ab_xbin_min=-25; +s1ab_ybin_min=-25; +s1ab_xbin_max=25; +s1ab_ybin_max=25; +s1ab_xybinsize=sqrt((50*50)/(length(s1ab_z)/300)); +clear s1a_xy_mean s1a_xy_mean_err s1b_xy_mean s1b_xy_mean_err + +s1ab_xbins=s1ab_xbin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_xbin_max; +s1ab_ybins=s1ab_ybin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_ybin_max; + +s1a_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); +s1b_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); + + for x_bin=s1ab_xbin_min:s1ab_xybinsize:(s1ab_xbin_max-s1ab_xybinsize/2); + for y_bin=s1ab_ybin_min:s1ab_xybinsize:(s1ab_ybin_max-s1ab_xybinsize/2); + x_min = x_bin; x_max = x_bin+s1ab_xybinsize; + y_min = y_bin; y_max = y_bin+s1ab_xybinsize; + + x_count=int32(1+x_bin/s1ab_xybinsize+s1ab_xbin_max/s1ab_xybinsize); + y_count=int32(1+y_bin/s1ab_xybinsize+s1ab_ybin_max/s1ab_xybinsize); + + bin_cut = s1ab_z_cut.' & inrange(s1ab_z,[10 330]).' & s1a_phe_both>0 & s1b_phe_both>0 & inrange(s1ab_x,[x_min,x_max]).' & inrange(s1ab_y,[y_min,y_max]).'; + if length(s1a_phe_both_z(bin_cut))>100; + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400])),[0:2:400]).','gauss1'); + s1a_xy_mean(y_count,x_count)=s1a_z_fit.b1; + s1a_xy_mean_err(y_count,x_count)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300])),[0:2:300]).','gauss1'); + s1b_xy_mean(y_count,x_count)=s1b_z_fit.b1; + s1b_xy_mean_err(y_count,x_count)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300]))); + else + s1a_xy_mean(y_count,x_count)=0; + s1a_xy_mean_err(y_count,x_count)=0; + s1b_xy_mean(y_count,x_count)=0; + s1b_xy_mean_err(y_count,x_count)=0; + end + + end + end + s1ab_xy_mean=s1a_xy_mean./s1b_xy_mean; + s1ab_xy_mean_err=sqrt( (s1b_xy_mean_err.*s1a_xy_mean./(s1b_xy_mean.^2)).^2 + (s1a_xy_mean_err./s1b_xy_mean).^2); + + + %Plot s1a XY means + color_range_max=max(max(s1a_xy_mean)); + color_range_min=min(min(s1a_xy_mean(s1a_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1a_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1a_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %Plot s1a XY means + color_range_max=max(max(s1b_xy_mean)); + color_range_min=min(min(s1b_xy_mean(s1b_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1b_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1b_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1b Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1b Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %s1a/b XY Ratio + color_range_max=max(max(s1ab_xy_mean)); + color_range_min=min(min(s1ab_xy_mean(s1ab_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1ab_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a/b Ratio vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a/b Ratio','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + +%% 3D Kr s1a/s1b map +if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +s1ab_xyz_numbins=floor((length(s1ab_z)/200)^(1/3)); %number of bins in one direction +s1ab_xyz_zstep=det_edge/s1ab_xyz_numbins; +s1ab_xyz_xstep=50/s1ab_xyz_numbins; +s1ab_xyz_ystep=50/s1ab_xyz_numbins; +s1ab_xyz_xmax=25; +r_max=25; + +s1ab_xyz_zbins=10+s1ab_xyz_zstep/2:s1ab_xyz_zstep:10+s1ab_xyz_zstep/2+s1ab_xyz_zstep*s1ab_xyz_numbins; %20 us +s1ab_xyz_xbins=(-r_max+s1ab_xyz_xstep/2):s1ab_xyz_xstep:r_max; +s1ab_xyz_ybins=(-r_max+s1ab_xyz_ystep/2):s1ab_xyz_ystep:r_max; + +s1a_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + + %Count the number of events per bin + Count_S1ab_3D(l,m,n)=length(s1a_phe_both(q)); + + if (Count_S1ab_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_xyz_mean(l,m,n)=s1a_z_fit.b1; + s1a_xyz_mean_err(l,m,n)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]) ),[0:2:300]).','gauss1'); + s1b_xyz_mean(l,m,n)=s1b_z_fit.b1; + s1b_xyz_mean_err(l,m,n)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); + else %not enough stats to do the fit + s1a_xyz_mean(l,m,n)=0; + s1a_xyz_mean_err(l,m,n)=0; + s1b_xyz_mean(l,m,n)=0; + s1b_xyz_mean_err(l,m,n)=0; + end + + end + end +k +end + + s1ab_xyz_mean=s1a_xyz_mean./s1b_xyz_mean; + s1ab_xyz_mean_err=sqrt( (s1b_xyz_mean_err.*s1a_xyz_mean./(s1b_xyz_mean.^2)).^2 + (s1a_xyz_mean_err./s1b_xyz_mean).^2); + +end + %% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % Removing field dependence from S1 and S2 + % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + %Hardcoded numbers from Energy Chi2 Fit + + + +s1ab_s2_xyz_fit_map.p1=-0.4988; +s1ab_s2_xyz_fit_map.p2=1.484; +c1=1-s1ab_s2_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s2_xyz_fit_map.p2; +s1ab_s2_xyz_fit_map.p3=c1; + +s1ab_s1_xyz_fit_map.p1=0.065; +s1ab_s1_xyz_fit_map.p2=0.02; +c2=1-s1ab_s1_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s1_xyz_fit_map.p2; +s1ab_s1_xyz_fit_map.p3=c2; + + + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else %Only do 1D in this case +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval); + + + + end + + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S1 Z-dependence (Both PMT arrays) +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + + light_correction_fig = figure; + errorbar(mean_index,means,means_error,'.k'); + hold on + [yplot_s1_both] = polyval(P_s1_both,dT_fit); + [center_s1_both, center_s1_both_err] = polyval(P_s1_both,z_center, S); %160[us]*1.51[\mus/us] + plot(dT_fit,yplot_s1_both,'-r','LineWidth',1); + xlabel('Depth (\mus)', 'FontSize',16); ylabel('Mean (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S1 Mean vs. Z'), 'FontSize', 16,'Interpreter','none'); + line([0 det_edge],[center_s1_both center_s1_both],'linestyle','--'); + line([z_center; z_center;],[min(means) max(means)],'linestyle','--'); + legend('S1\_both Mean', strcat('y=', num2str(P_s1_both(1),'%10.2e'), '*Z^2 + ', num2str(P_s1_both(2),'%10.2e')... + , '*Z + ', num2str(P_s1_both(3),4)),strcat('Det center = ',num2str(center_s1_both,4), ' [Phe]'),'location','northwest') + + box on; + myfigview(16); + xlim([0 det_edge]); + ylim([0.8*min(means) 1.15*max(means)]); + + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + + + + + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + + %%calculate S2/S1 also, just to double check the lifetime from S2 only + % hist_s2_both_s1(:,bin)= hist(s2_phe_both(time_cut)./s1_phe_both_z(time_cut),x3)'; + % temp_hist=hist_s2_both_s1(:,bin); + %Fit_s2_both_s1{bin}=fit(x3(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + % means_s2_s1(bin)=Fit_s2_both_s1{bin}.b1; + % means_error_s2_s1(bin) = Fit_s2_both_s1{bin}.c1/2/sqrt(sum(hist_s2_both_s1(:,bin))); % == sigma/sqrt(N); + % mean_index_s2_s1(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + + dT_range= inrange( mean_index,[5+bin_size,500] );%from 50 to 300us for the fit + + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + %%Tracker for pseudo-lifetime + s2_at_bottom_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_both=-320/log(s2_at_bottom_both/s2_at_top_both); + + dT_fit=0:1:det_edge; + + Fit_EL= fit(mean_index(dT_range),means(dT_range),'exp1'); + yfitEL = Fit_EL.a.*exp(Fit_EL.b.*dT_fit); + + e_lifetime_both=-1/Fit_EL.b; + s2_z0_both=Fit_EL.a; + + b=confint(Fit_EL, 0.683);%1 sigma matrix + sigma_e_lifetime_both=(1/b(1,2)-1/b(2,2))/2; + sigma_s2_z0_both=(b(2,1)-b(1,1))/2; + + lifetime_fig_both = figure; + errorbar(mean_index(2:end),means(2:end),means_error(2:end),'.k'); %first bin is anode, skip it + hold on + plot(dT_fit,yfitEL,'-r','LineWidth',1); + xlabel('Time (\mus)', 'FontSize',16); ylabel('Mean S2 (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S2_both Electron Lifetime'), 'FontSize', 16,'Interpreter','none'); + legend('S2\_both Mean', strcat( '\lambda= ', num2str(e_lifetime_both,4), ' \pm ', num2str(sigma_e_lifetime_both,2), ' \mus' )... + ,'location','northeast'); + myfigview(16); + xlim([0 det_edge]); + + + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_ybins),floor(s2_xbins)); +Sigma_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); +Count_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + +color_range_max=max(max(mean_S2_both_xy)); +color_range_min=min(min(mean_S2_both_xy(mean_S2_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + +s2_xy_both_fig = figure; +contourf(s2xbins,s2ybins,mean_S2_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. S2 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_ybins),floor(s1_xbins)); +Sigma_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); +Count_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +color_range_max=max(max(mean_S1_both_xy)); +color_range_min=min(min(mean_S1_both_xy(mean_S1_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + + +s1_xy_both_fig = figure; +contourf(s1xbins,s1ybins,mean_S1_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp,'. S1 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/LifetimeEstimates/Sep2015_Lifetime_NoFieldCorr.m b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/LifetimeEstimates/Sep2015_Lifetime_NoFieldCorr.m new file mode 100644 index 0000000..8c00abf --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/LifetimeEstimates/Sep2015_Lifetime_NoFieldCorr.m @@ -0,0 +1,993 @@ +%% Make corrections with the chosen polynomial +path='C:\Users\Richard\Desktop\LUX Analysis\lux10_20150929T1905_cp18197'; + + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +delay_min=0; +file_id_cp='test'; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 70000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + + + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + + zcut_min = 10; %field changes at 4 uSec + zcut_max = 0.95*det_edge; + + + if Kr_events < 30000 %then create a 10x10 grid. Otherwise 25x25. Want about 30 evts per bin + + S1xybinsize = sqrt((50*50)/(Kr_events/150)); + S1_xbin_min = -25; + S1_xbin_max = 25; + S1_ybin_min = -25; + S1_ybin_max = 25; + SE_ybin_min = -25; + SE_ybin_max = 25; + + S2xybinsize = sqrt((50*50)/(Kr_events/150));%cm +% SExybinsize = 5; DEFINED LATER, based on number of SE events + S2_xbin_min = -25; + S2_xbin_max = 25; + S2_ybin_min = -25; + S2_ybin_max = 25; + SE_xbin_min = -25; + SE_xbin_max = 25; + + + end + + s1_xbins = (S1_xbin_max-S1_xbin_min)./S1xybinsize; + s1_ybins = (S1_ybin_max-S1_ybin_min)./S1xybinsize; + + s2_xbins = (S2_xbin_max-S2_xbin_min)./S2xybinsize; + s2_ybins = (S2_ybin_max-S2_ybin_min)./S2xybinsize; + + %% Kr S1a/S2b map + +%Set up cuts and variables + s1ab_cut=logical(sum(s1_single_cut(:,:),1)); + s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); + s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); + s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); + s1ab_x=d.x_cm(s2_single_cut); + s1ab_y=d.y_cm(s2_single_cut); + s1ab_z=d.z_drift_samples(s2_single_cut)/100; + s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); + s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<25; + %plotting x=s1a v y=s1a/s1b cuts: y<0.035x-1, y>-0.035.*x+5; y>0.01.*x; %y<4.2; x<255 +% s1ab_areacut= (s1a_phe_both./s1b_phe_both-0.035.*s1a_phe_both<-1) & (s1a_phe_both./s1b_phe_both+0.035.*s1a_phe_both>5)... +% & (s1a_phe_both./s1b_phe_both > 0.01.* s1a_phe_both) & (s1a_phe_both./s1b_phe_both<4.2) & (s1a_phe_both<255); + + s1ab_x=s1ab_x(s1ab_timing_cut); + s1ab_y=s1ab_y(s1ab_timing_cut); + s1ab_z=s1ab_z(s1ab_timing_cut); + s1a_phe_both=s1a_phe_both(s1ab_timing_cut); + s1b_phe_both=s1b_phe_both(s1ab_timing_cut); + s1ab_radius=s1ab_radius(s1ab_timing_cut); + + %fidicual Z cut for s1ab_xy measurement + [s1ab_z_hist s1ab_z_hist_bins]=hist(s1ab_z(inrange(s1ab_z,[0,400])),[0:1:400]); + frac_hist=cumsum(s1ab_z_hist)./sum(s1ab_z_hist); + s1ab_z_cut_lower= min(s1ab_z_hist_bins(frac_hist>.10)); + s1ab_z_cut_upper= max(s1ab_z_hist_bins(frac_hist<.90)); + s1ab_z_cut=inrange(s1ab_z,[s1ab_z_cut_lower,s1ab_z_cut_upper]); + + %R cut for s1ab_Z measurement + [upperz_r_hist upperz_r_hist_bins]=hist(s1ab_radius(s1ab_z>s1ab_z_cut_upper & s1ab_radius<=26),[0:1:26]); + [lowerz_r_hist lowerz_r_hist_bins]=hist(s1ab_radius(s1ab_z0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:400]).','gauss1'); + s1b_fit=fit([0:2:300].',hist(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:300]).','gauss1'); + s1a_z_means(i)=s1a_fit.b1; + s1a_z_means_err(i)=s1a_fit.c1/sqrt(2)/sqrt(length(s1a_phe_both(s1ab_r_cut.' & s1a_phe_both>0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1b_z_means(i)=s1b_fit.b1; + s1b_z_means_err(i)=s1b_fit.c1/sqrt(2)/sqrt(length(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1ab_bincenters(i)=z_max-dT_step/2; + i=i+1; + end + +s1ab_z_means=s1a_z_means./s1b_z_means; +s1ab_z_means_err=sqrt( (s1b_z_means_err.*s1a_z_means./(s1b_z_means.^2)).^2 + (s1a_z_means_err./s1b_z_means).^2); + +%fit polynomial to s1az and s1bz, to remove z dependence later in xy fit +[s1a_P, s1a_S]=polyfit(s1ab_bincenters,s1a_z_means,3); +[s1b_P, s1b_S]=polyfit(s1ab_bincenters,s1b_z_means,3); +[s1ab_P, s1ab_S]=polyfit(s1ab_bincenters,s1ab_z_means,2); + +%S1a z dependence plot +s1az_plot=figure; +errorbar(s1ab_bincenters,s1a_z_means,s1a_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a Mean (phe)'); title('S1a Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1a_P,[10:1:320]),'-r','LineWidth',2) + +%S1b z dependence plot +s1bz_plot=figure; +errorbar(s1ab_bincenters,s1b_z_means,s1b_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1b Mean (phe)'); title('S1b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1b_P,[10:1:320]),'-r','LineWidth',2) + +%S1a/b z dependence plot +s1a_over_bz_plot=figure; +errorbar(s1ab_bincenters,s1ab_z_means,s1ab_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a/b'); title('S1 a/b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1ab_P,[10:1:320]),'-r','LineWidth',2) + + +%Correcting z dependence to get XY dependence in same manner that Kr/CH3T +%map does + s1a_phe_both_z=s1a_phe_both.'.*polyval(s1a_P,z_center)./polyval(s1a_P,s1ab_z); + s1b_phe_both_z=s1b_phe_both.'.*polyval(s1b_P,z_center)./polyval(s1b_P,s1ab_z); + + %% S1a/b XY map (after z correction) +s1ab_xbin_min=-25; +s1ab_ybin_min=-25; +s1ab_xbin_max=25; +s1ab_ybin_max=25; +s1ab_xybinsize=sqrt((50*50)/(length(s1ab_z)/300)); +clear s1a_xy_mean s1a_xy_mean_err s1b_xy_mean s1b_xy_mean_err + +s1ab_xbins=s1ab_xbin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_xbin_max; +s1ab_ybins=s1ab_ybin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_ybin_max; + +s1a_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); +s1b_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); + + for x_bin=s1ab_xbin_min:s1ab_xybinsize:(s1ab_xbin_max-s1ab_xybinsize/2); + for y_bin=s1ab_ybin_min:s1ab_xybinsize:(s1ab_ybin_max-s1ab_xybinsize/2); + x_min = x_bin; x_max = x_bin+s1ab_xybinsize; + y_min = y_bin; y_max = y_bin+s1ab_xybinsize; + + x_count=int32(1+x_bin/s1ab_xybinsize+s1ab_xbin_max/s1ab_xybinsize); + y_count=int32(1+y_bin/s1ab_xybinsize+s1ab_ybin_max/s1ab_xybinsize); + + bin_cut = s1ab_z_cut.' & inrange(s1ab_z,[10 330]).' & s1a_phe_both>0 & s1b_phe_both>0 & inrange(s1ab_x,[x_min,x_max]).' & inrange(s1ab_y,[y_min,y_max]).'; + if length(s1a_phe_both_z(bin_cut))>100; + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400])),[0:2:400]).','gauss1'); + s1a_xy_mean(y_count,x_count)=s1a_z_fit.b1; + s1a_xy_mean_err(y_count,x_count)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300])),[0:2:300]).','gauss1'); + s1b_xy_mean(y_count,x_count)=s1b_z_fit.b1; + s1b_xy_mean_err(y_count,x_count)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300]))); + else + s1a_xy_mean(y_count,x_count)=0; + s1a_xy_mean_err(y_count,x_count)=0; + s1b_xy_mean(y_count,x_count)=0; + s1b_xy_mean_err(y_count,x_count)=0; + end + + end + end + s1ab_xy_mean=s1a_xy_mean./s1b_xy_mean; + s1ab_xy_mean_err=sqrt( (s1b_xy_mean_err.*s1a_xy_mean./(s1b_xy_mean.^2)).^2 + (s1a_xy_mean_err./s1b_xy_mean).^2); + + + %Plot s1a XY means + color_range_max=max(max(s1a_xy_mean)); + color_range_min=min(min(s1a_xy_mean(s1a_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1a_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1a_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %Plot s1a XY means + color_range_max=max(max(s1b_xy_mean)); + color_range_min=min(min(s1b_xy_mean(s1b_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1b_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1b_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1b Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1b Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %s1a/b XY Ratio + color_range_max=max(max(s1ab_xy_mean)); + color_range_min=min(min(s1ab_xy_mean(s1ab_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1ab_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a/b Ratio vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a/b Ratio','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + +%% 3D Kr s1a/s1b map +if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +s1ab_xyz_numbins=floor((length(s1ab_z)/200)^(1/3)); %number of bins in one direction +s1ab_xyz_zstep=det_edge/s1ab_xyz_numbins; +s1ab_xyz_xstep=50/s1ab_xyz_numbins; +s1ab_xyz_ystep=50/s1ab_xyz_numbins; +s1ab_xyz_xmax=25; +r_max=25; + +s1ab_xyz_zbins=10+s1ab_xyz_zstep/2:s1ab_xyz_zstep:10+s1ab_xyz_zstep/2+s1ab_xyz_zstep*s1ab_xyz_numbins; %20 us +s1ab_xyz_xbins=(-r_max+s1ab_xyz_xstep/2):s1ab_xyz_xstep:r_max; +s1ab_xyz_ybins=(-r_max+s1ab_xyz_ystep/2):s1ab_xyz_ystep:r_max; + +s1a_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + + %Count the number of events per bin + Count_S1ab_3D(l,m,n)=length(s1a_phe_both(q)); + + if (Count_S1ab_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_xyz_mean(l,m,n)=s1a_z_fit.b1; + s1a_xyz_mean_err(l,m,n)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]) ),[0:2:300]).','gauss1'); + s1b_xyz_mean(l,m,n)=s1b_z_fit.b1; + s1b_xyz_mean_err(l,m,n)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); + else %not enough stats to do the fit + s1a_xyz_mean(l,m,n)=0; + s1a_xyz_mean_err(l,m,n)=0; + s1b_xyz_mean(l,m,n)=0; + s1b_xyz_mean_err(l,m,n)=0; + end + + end + end +k +end + + s1ab_xyz_mean=s1a_xyz_mean./s1b_xyz_mean; + s1ab_xyz_mean_err=sqrt( (s1b_xyz_mean_err.*s1a_xyz_mean./(s1b_xyz_mean.^2)).^2 + (s1a_xyz_mean_err./s1b_xyz_mean).^2); + +end + %% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % Removing field dependence from S1 and S2 + % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + %Hardcoded numbers from Energy Chi2 Fit + + +% +% s1ab_s2_xyz_fit_map.p1=-0.4988; +% s1ab_s2_xyz_fit_map.p2=1.484; +% c1=1-s1ab_s2_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s2_xyz_fit_map.p2; +% s1ab_s2_xyz_fit_map.p3=c1; +% +% s1ab_s1_xyz_fit_map.p1=0.065; +% s1ab_s1_xyz_fit_map.p2=0.02; +% c2=1-s1ab_s1_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s1_xyz_fit_map.p2; +% s1ab_s1_xyz_fit_map.p3=c2; +% +% +% %If we can use 3D map, do so. If there aren't enough events do 1D then 2D +% if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +% %Removing zeros from map with nearest neighbor method +% s1ab_xyz_mean_old=s1ab_xyz_mean; +% temp_map=s1ab_xyz_mean; +% q= ~isnan(temp_map); +% r=nearestpoint(find(~q),find(q)); +% s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); +% +% %interpolating with cubic so that we get NaN when extrapolating +% s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); +% s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); +% s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); +% s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); +% +% %Filling in NaN values with the s1a/s1b Z map polynomial +% s1as1b_zvalues= polyval(s1ab_P,drift_time); +% s1as1b_z_at_center=s1as1b_at_center; +% s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); +% s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); +% s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); +% s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); +% +% s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +% s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +% s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +% s1_phe_both=s1_phe_both./s1_3Dfieldremoval; +% +% +% else %Only do 1D in this case +% %Removing zeros from map with nearest neighbor method +% s1ab_xy_mean_old=s1ab_xy_mean; +% temp_map=s1ab_xy_mean; +% q= ~isnan(temp_map); +% r=nearestpoint(find(~q),find(q)); +% s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); +% +% %interpolating with cubic so that we get NaN when extrapolating +% s1as1b_zvalues= polyval(s1ab_P,drift_time); +% s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); +% s1as1b_z_at_center=polyval(s1ab_P,z_center); +% s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); +% +% s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); +% s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); +% s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); +% s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); +% +% %Filling in NaN values with no XY correction. (Z dependence should never be NaN) +% s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; +% s2_zfieldremoval(isnan(s2_zfieldremoval))=1; +% s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; +% s1_zfieldremoval(isnan(s1_zfieldremoval))=1; +% +% +% s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +% s2_phe_both=s2_phe_both./(s2_zfieldremoval); +% s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +% s1_phe_both=s1_phe_both./(s1_zfieldremoval); +% +% +% +% end + + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S1 Z-dependence (Both PMT arrays) +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + + light_correction_fig = figure; + errorbar(mean_index,means,means_error,'.k'); + hold on + [yplot_s1_both] = polyval(P_s1_both,dT_fit); + [center_s1_both, center_s1_both_err] = polyval(P_s1_both,z_center, S); %160[us]*1.51[\mus/us] + plot(dT_fit,yplot_s1_both,'-r','LineWidth',1); + xlabel('Depth (\mus)', 'FontSize',16); ylabel('Mean (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S1 Mean vs. Z'), 'FontSize', 16,'Interpreter','none'); + line([0 det_edge],[center_s1_both center_s1_both],'linestyle','--'); + line([z_center; z_center;],[min(means) max(means)],'linestyle','--'); + legend('S1\_both Mean', strcat('y=', num2str(P_s1_both(1),'%10.2e'), '*Z^2 + ', num2str(P_s1_both(2),'%10.2e')... + , '*Z + ', num2str(P_s1_both(3),4)),strcat('Det center = ',num2str(center_s1_both,4), ' [Phe]'),'location','northwest') + + box on; + myfigview(16); + xlim([0 det_edge]); + ylim([0.8*min(means) 1.15*max(means)]); + + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + + + + + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + + %%calculate S2/S1 also, just to double check the lifetime from S2 only + % hist_s2_both_s1(:,bin)= hist(s2_phe_both(time_cut)./s1_phe_both_z(time_cut),x3)'; + % temp_hist=hist_s2_both_s1(:,bin); + %Fit_s2_both_s1{bin}=fit(x3(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + % means_s2_s1(bin)=Fit_s2_both_s1{bin}.b1; + % means_error_s2_s1(bin) = Fit_s2_both_s1{bin}.c1/2/sqrt(sum(hist_s2_both_s1(:,bin))); % == sigma/sqrt(N); + % mean_index_s2_s1(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + + dT_range= inrange( mean_index,[5+bin_size,500] );%from 50 to 300us for the fit + + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + %%Tracker for pseudo-lifetime + s2_at_bottom_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_both=-320/log(s2_at_bottom_both/s2_at_top_both); + + dT_fit=0:1:det_edge; + + Fit_EL= fit(mean_index(dT_range),means(dT_range),'exp1'); + yfitEL = Fit_EL.a.*exp(Fit_EL.b.*dT_fit); + + e_lifetime_both=-1/Fit_EL.b; + s2_z0_both=Fit_EL.a; + + b=confint(Fit_EL, 0.683);%1 sigma matrix + sigma_e_lifetime_both=(1/b(1,2)-1/b(2,2))/2; + sigma_s2_z0_both=(b(2,1)-b(1,1))/2; + + lifetime_fig_both = figure; + errorbar(mean_index(2:end),means(2:end),means_error(2:end),'.k'); %first bin is anode, skip it + hold on + plot(dT_fit,yfitEL,'-r','LineWidth',1); + xlabel('Time (\mus)', 'FontSize',16); ylabel('Mean S2 (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S2_both Electron Lifetime'), 'FontSize', 16,'Interpreter','none'); + legend('S2\_both Mean', strcat( '\lambda= ', num2str(e_lifetime_both,4), ' \pm ', num2str(sigma_e_lifetime_both,2), ' \mus' )... + ,'location','northeast'); + myfigview(16); + xlim([0 det_edge]); + + + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_ybins),floor(s2_xbins)); +Sigma_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); +Count_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + +color_range_max=max(max(mean_S2_both_xy)); +color_range_min=min(min(mean_S2_both_xy(mean_S2_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + +s2_xy_both_fig = figure; +contourf(s2xbins,s2ybins,mean_S2_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. S2 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_ybins),floor(s1_xbins)); +Sigma_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); +Count_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +color_range_max=max(max(mean_S1_both_xy)); +color_range_min=min(min(mean_S1_both_xy(mean_S1_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + + +s1_xy_both_fig = figure; +contourf(s1xbins,s1ybins,mean_S1_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp,'. S1 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/NRBand_Z_Dependence/NRBand_ZDependence.m b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/NRBand_Z_Dependence/NRBand_ZDependence.m new file mode 100644 index 0000000..15c736b --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/NRBand_Z_Dependence/NRBand_ZDependence.m @@ -0,0 +1,1912 @@ +%% Make corrections with the chosen polynomial +%USES X_CM_TMPLT SICNE THE MERCURY POSITION RQS ARE MESSED UP IN THIS KR DATA SET +% path='C:\Users\Richard\Desktop\LUX Analysis\MultiZDD_KrData\lux10_20140915T1138_cp13945'; %For 3D +path='C:\Users\Richard\Desktop\LUX Analysis\MultiZDD_KrData\lux10_20140920T1613_cp13946'; + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm','x_cm_tmplt','y_cm_tmplt'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +delay_min=0; +file_id_cp='test'; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 70000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + + + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + + zcut_min = 10; %field changes at 4 uSec + zcut_max = 0.95*det_edge; + + + if Kr_events < 30000 %then create a 10x10 grid. Otherwise 25x25. Want about 30 evts per bin + + S1xybinsize = sqrt((50*50)/(Kr_events/150)); + S1_xbin_min = -25; + S1_xbin_max = 25; + S1_ybin_min = -25; + S1_ybin_max = 25; + SE_ybin_min = -25; + SE_ybin_max = 25; + + S2xybinsize = sqrt((50*50)/(Kr_events/150));%cm +% SExybinsize = 5; DEFINED LATER, based on number of SE events + S2_xbin_min = -25; + S2_xbin_max = 25; + S2_ybin_min = -25; + S2_ybin_max = 25; + SE_xbin_min = -25; + SE_xbin_max = 25; + + + end + + s1_xbins = (S1_xbin_max-S1_xbin_min)./S1xybinsize; + s1_ybins = (S1_ybin_max-S1_ybin_min)./S1xybinsize; + + s2_xbins = (S2_xbin_max-S2_xbin_min)./S2xybinsize; + s2_ybins = (S2_ybin_max-S2_ybin_min)./S2xybinsize; + + %% Kr S1a/S2b map + +%Set up cuts and variables + s1ab_cut=logical(sum(s1_single_cut(:,:),1)); + s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); + s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); + s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); + s1ab_x=d.x_cm(s2_single_cut); + s1ab_y=d.y_cm(s2_single_cut); + s1ab_z=d.z_drift_samples(s2_single_cut)/100; + s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); + s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<25; + %plotting x=s1a v y=s1a/s1b cuts: y<0.035x-1, y>-0.035.*x+5; y>0.01.*x; %y<4.2; x<255 +% s1ab_areacut= (s1a_phe_both./s1b_phe_both-0.035.*s1a_phe_both<-1) & (s1a_phe_both./s1b_phe_both+0.035.*s1a_phe_both>5)... +% & (s1a_phe_both./s1b_phe_both > 0.01.* s1a_phe_both) & (s1a_phe_both./s1b_phe_both<4.2) & (s1a_phe_both<255); + + s1ab_x=s1ab_x(s1ab_timing_cut); + s1ab_y=s1ab_y(s1ab_timing_cut); + s1ab_z=s1ab_z(s1ab_timing_cut); + s1a_phe_both=s1a_phe_both(s1ab_timing_cut); + s1b_phe_both=s1b_phe_both(s1ab_timing_cut); + s1ab_radius=s1ab_radius(s1ab_timing_cut); + + %fidicual Z cut for s1ab_xy measurement + [s1ab_z_hist s1ab_z_hist_bins]=hist(s1ab_z(inrange(s1ab_z,[0,400])),[0:1:400]); + frac_hist=cumsum(s1ab_z_hist)./sum(s1ab_z_hist); + s1ab_z_cut_lower= min(s1ab_z_hist_bins(frac_hist>.10)); + s1ab_z_cut_upper= max(s1ab_z_hist_bins(frac_hist<.90)); + s1ab_z_cut=inrange(s1ab_z,[s1ab_z_cut_lower,s1ab_z_cut_upper]); + + %R cut for s1ab_Z measurement + [upperz_r_hist upperz_r_hist_bins]=hist(s1ab_radius(s1ab_z>s1ab_z_cut_upper & s1ab_radius<=26),[0:1:26]); + [lowerz_r_hist lowerz_r_hist_bins]=hist(s1ab_radius(s1ab_z0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:400]).','gauss1'); + s1b_fit=fit([0:2:300].',hist(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:300]).','gauss1'); + s1a_z_means(i)=s1a_fit.b1; + s1a_z_means_err(i)=s1a_fit.c1/sqrt(2)/sqrt(length(s1a_phe_both(s1ab_r_cut.' & s1a_phe_both>0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1b_z_means(i)=s1b_fit.b1; + s1b_z_means_err(i)=s1b_fit.c1/sqrt(2)/sqrt(length(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1ab_bincenters(i)=z_max-dT_step/2; + i=i+1; + end + +s1ab_z_means=s1a_z_means./s1b_z_means; +s1ab_z_means_err=sqrt( (s1b_z_means_err.*s1a_z_means./(s1b_z_means.^2)).^2 + (s1a_z_means_err./s1b_z_means).^2); + +%fit polynomial to s1az and s1bz, to remove z dependence later in xy fit +[s1a_P, s1a_S]=polyfit(s1ab_bincenters,s1a_z_means,3); +[s1b_P, s1b_S]=polyfit(s1ab_bincenters,s1b_z_means,3); +[s1ab_P, s1ab_S]=polyfit(s1ab_bincenters,s1ab_z_means,2); + +%S1a z dependence plot +s1az_plot=figure; +errorbar(s1ab_bincenters,s1a_z_means,s1a_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a Mean (phe)'); title('S1a Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1a_P,[10:1:320]),'-r','LineWidth',2) + +%S1b z dependence plot +s1bz_plot=figure; +errorbar(s1ab_bincenters,s1b_z_means,s1b_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1b Mean (phe)'); title('S1b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1b_P,[10:1:320]),'-r','LineWidth',2) + +%S1a/b z dependence plot +s1a_over_bz_plot=figure; +errorbar(s1ab_bincenters,s1ab_z_means,s1ab_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a/b'); title('S1 a/b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1ab_P,[10:1:320]),'-r','LineWidth',2) + + +%Correcting z dependence to get XY dependence in same manner that Kr/CH3T +%map does + s1a_phe_both_z=s1a_phe_both.'.*polyval(s1a_P,z_center)./polyval(s1a_P,s1ab_z); + s1b_phe_both_z=s1b_phe_both.'.*polyval(s1b_P,z_center)./polyval(s1b_P,s1ab_z); + + %% S1a/b XY map (after z correction) +s1ab_xbin_min=-25; +s1ab_ybin_min=-25; +s1ab_xbin_max=25; +s1ab_ybin_max=25; +s1ab_xybinsize=sqrt((50*50)/(length(s1ab_z)/300)); +clear s1a_xy_mean s1a_xy_mean_err s1b_xy_mean s1b_xy_mean_err + +s1ab_xbins=s1ab_xbin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_xbin_max; +s1ab_ybins=s1ab_ybin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_ybin_max; + +s1a_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); +s1b_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); + + for x_bin=s1ab_xbin_min:s1ab_xybinsize:(s1ab_xbin_max-s1ab_xybinsize/2); + for y_bin=s1ab_ybin_min:s1ab_xybinsize:(s1ab_ybin_max-s1ab_xybinsize/2); + x_min = x_bin; x_max = x_bin+s1ab_xybinsize; + y_min = y_bin; y_max = y_bin+s1ab_xybinsize; + + x_count=int32(1+x_bin/s1ab_xybinsize+s1ab_xbin_max/s1ab_xybinsize); + y_count=int32(1+y_bin/s1ab_xybinsize+s1ab_ybin_max/s1ab_xybinsize); + + bin_cut = s1ab_z_cut.' & inrange(s1ab_z,[10 330]).' & s1a_phe_both>0 & s1b_phe_both>0 & inrange(s1ab_x,[x_min,x_max]).' & inrange(s1ab_y,[y_min,y_max]).'; + if length(s1a_phe_both_z(bin_cut))>100; + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400])),[0:2:400]).','gauss1'); + s1a_xy_mean(y_count,x_count)=s1a_z_fit.b1; + s1a_xy_mean_err(y_count,x_count)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300])),[0:2:300]).','gauss1'); + s1b_xy_mean(y_count,x_count)=s1b_z_fit.b1; + s1b_xy_mean_err(y_count,x_count)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300]))); + else + s1a_xy_mean(y_count,x_count)=0; + s1a_xy_mean_err(y_count,x_count)=0; + s1b_xy_mean(y_count,x_count)=0; + s1b_xy_mean_err(y_count,x_count)=0; + end + + end + end + s1ab_xy_mean=s1a_xy_mean./s1b_xy_mean; + s1ab_xy_mean_err=sqrt( (s1b_xy_mean_err.*s1a_xy_mean./(s1b_xy_mean.^2)).^2 + (s1a_xy_mean_err./s1b_xy_mean).^2); + + + %Plot s1a XY means + color_range_max=max(max(s1a_xy_mean)); + color_range_min=min(min(s1a_xy_mean(s1a_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1a_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1a_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %Plot s1a XY means + color_range_max=max(max(s1b_xy_mean)); + color_range_min=min(min(s1b_xy_mean(s1b_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1b_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1b_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1b Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1b Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %s1a/b XY Ratio + color_range_max=max(max(s1ab_xy_mean)); + color_range_min=min(min(s1ab_xy_mean(s1ab_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1ab_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a/b Ratio vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a/b Ratio','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + +%% 3D Kr s1a/s1b map +if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +s1ab_xyz_numbins=floor((length(s1ab_z)/200)^(1/3)); %number of bins in one direction +s1ab_xyz_zstep=det_edge/s1ab_xyz_numbins; +s1ab_xyz_xstep=50/s1ab_xyz_numbins; +s1ab_xyz_ystep=50/s1ab_xyz_numbins; +s1ab_xyz_xmax=25; +r_max=25; + +s1ab_xyz_zbins=10+s1ab_xyz_zstep/2:s1ab_xyz_zstep:10+s1ab_xyz_zstep/2+s1ab_xyz_zstep*s1ab_xyz_numbins; %20 us +s1ab_xyz_xbins=(-r_max+s1ab_xyz_xstep/2):s1ab_xyz_xstep:r_max; +s1ab_xyz_ybins=(-r_max+s1ab_xyz_ystep/2):s1ab_xyz_ystep:r_max; + +s1a_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + + %Count the number of events per bin + Count_S1ab_3D(l,m,n)=length(s1a_phe_both(q)); + + if (Count_S1ab_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_xyz_mean(l,m,n)=s1a_z_fit.b1; + s1a_xyz_mean_err(l,m,n)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]) ),[0:2:300]).','gauss1'); + s1b_xyz_mean(l,m,n)=s1b_z_fit.b1; + s1b_xyz_mean_err(l,m,n)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); + else %not enough stats to do the fit + s1a_xyz_mean(l,m,n)=0; + s1a_xyz_mean_err(l,m,n)=0; + s1b_xyz_mean(l,m,n)=0; + s1b_xyz_mean_err(l,m,n)=0; + end + + end + end +k +end + + s1ab_xyz_mean=s1a_xyz_mean./s1b_xyz_mean; + s1ab_xyz_mean_err=sqrt( (s1b_xyz_mean_err.*s1a_xyz_mean./(s1b_xyz_mean.^2)).^2 + (s1a_xyz_mean_err./s1b_xyz_mean).^2); + +end + %% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % Removing field dependence from S1 and S2 + % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + %Hardcoded numbers from Energy Chi2 Fit + + + +s1ab_s2_xyz_fit_map.p1=-0.4988; +s1ab_s2_xyz_fit_map.p2=1.484; +c1=1-s1ab_s2_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s2_xyz_fit_map.p2; +s1ab_s2_xyz_fit_map.p3=c1; + +s1ab_s1_xyz_fit_map.p1=0.065; +s1ab_s1_xyz_fit_map.p2=0.02; +c2=1-s1ab_s1_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s1_xyz_fit_map.p2; +s1ab_s1_xyz_fit_map.p3=c2; + + + %If we can use 3D map, do so. If there aren't enough events do 1D then 2D + if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +%Removing zeros from map with nearest neighbor method +s1ab_xyz_mean_old=s1ab_xyz_mean; +temp_map=s1ab_xyz_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); + s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); + s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); + s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); + +%Filling in NaN values with the s1a/s1b Z map polynomial + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_z_at_center=s1as1b_at_center; + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); + s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); + +s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +s1_phe_both=s1_phe_both./s1_3Dfieldremoval; + + + else %Only do 1D in this case +%Removing zeros from map with nearest neighbor method +s1ab_xy_mean_old=s1ab_xy_mean; +temp_map=s1ab_xy_mean; +q= ~isnan(temp_map); +r=nearestpoint(find(~q),find(q)); +s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); + +%interpolating with cubic so that we get NaN when extrapolating + s1as1b_zvalues= polyval(s1ab_P,drift_time); + s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); + s1as1b_z_at_center=polyval(s1ab_P,z_center); + s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); + + s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); + s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); + s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); + s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); + + %Filling in NaN values with no XY correction. (Z dependence should never be NaN) + s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; + s2_zfieldremoval(isnan(s2_zfieldremoval))=1; + s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; + s1_zfieldremoval(isnan(s1_zfieldremoval))=1; + + +s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +s2_phe_both=s2_phe_both./(s2_zfieldremoval); +s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +s1_phe_both=s1_phe_both./(s1_zfieldremoval); + + + + end + + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S1 Z-dependence (Both PMT arrays) +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + + light_correction_fig = figure; + errorbar(mean_index,means,means_error,'.k'); + hold on + [yplot_s1_both] = polyval(P_s1_both,dT_fit); + [center_s1_both, center_s1_both_err] = polyval(P_s1_both,z_center, S); %160[us]*1.51[\mus/us] + plot(dT_fit,yplot_s1_both,'-r','LineWidth',1); + xlabel('Depth (\mus)', 'FontSize',16); ylabel('Mean (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S1 Mean vs. Z'), 'FontSize', 16,'Interpreter','none'); + line([0 det_edge],[center_s1_both center_s1_both],'linestyle','--'); + line([z_center; z_center;],[min(means) max(means)],'linestyle','--'); + legend('S1\_both Mean', strcat('y=', num2str(P_s1_both(1),'%10.2e'), '*Z^2 + ', num2str(P_s1_both(2),'%10.2e')... + , '*Z + ', num2str(P_s1_both(3),4)),strcat('Det center = ',num2str(center_s1_both,4), ' [Phe]'),'location','northwest') + + box on; + myfigview(16); + xlim([0 det_edge]); + ylim([0.8*min(means) 1.15*max(means)]); + + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + + + + + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + + %%calculate S2/S1 also, just to double check the lifetime from S2 only + % hist_s2_both_s1(:,bin)= hist(s2_phe_both(time_cut)./s1_phe_both_z(time_cut),x3)'; + % temp_hist=hist_s2_both_s1(:,bin); + %Fit_s2_both_s1{bin}=fit(x3(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + % means_s2_s1(bin)=Fit_s2_both_s1{bin}.b1; + % means_error_s2_s1(bin) = Fit_s2_both_s1{bin}.c1/2/sqrt(sum(hist_s2_both_s1(:,bin))); % == sigma/sqrt(N); + % mean_index_s2_s1(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + + dT_range= inrange( mean_index,[5+bin_size,500] );%from 50 to 300us for the fit + + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + %%Tracker for pseudo-lifetime + s2_at_bottom_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_both=-320/log(s2_at_bottom_both/s2_at_top_both); + + dT_fit=0:1:det_edge; + + Fit_EL= fit(mean_index(dT_range),means(dT_range),'exp1'); + yfitEL = Fit_EL.a.*exp(Fit_EL.b.*dT_fit); + + e_lifetime_both=-1/Fit_EL.b; + s2_z0_both=Fit_EL.a; + + b=confint(Fit_EL, 0.683);%1 sigma matrix + sigma_e_lifetime_both=(1/b(1,2)-1/b(2,2))/2; + sigma_s2_z0_both=(b(2,1)-b(1,1))/2; + + lifetime_fig_both = figure; + errorbar(mean_index(2:end),means(2:end),means_error(2:end),'.k'); %first bin is anode, skip it + hold on + plot(dT_fit,yfitEL,'-r','LineWidth',1); + xlabel('Time (\mus)', 'FontSize',16); ylabel('Mean S2 (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S2_both Electron Lifetime'), 'FontSize', 16,'Interpreter','none'); + legend('S2\_both Mean', strcat( '\lambda= ', num2str(e_lifetime_both,4), ' \pm ', num2str(sigma_e_lifetime_both,2), ' \mus' )... + ,'location','northeast'); + myfigview(16); + xlim([0 det_edge]); + + + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_ybins),floor(s2_xbins)); +Sigma_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); +Count_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + +color_range_max=max(max(mean_S2_both_xy)); +color_range_min=min(min(mean_S2_both_xy(mean_S2_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + +s2_xy_both_fig = figure; +contourf(s2xbins,s2ybins,mean_S2_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. S2 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_ybins),floor(s1_xbins)); +Sigma_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); +Count_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +color_range_max=max(max(mean_S1_both_xy)); +color_range_min=min(min(mean_S1_both_xy(mean_S1_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + + +s1_xy_both_fig = figure; +contourf(s1xbins,s1ybins,mean_S1_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp,'. S1 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%% Apply corrections to 7p5 DD data and calculate the NRband + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\KrypCal2p21_QualityChecks\NRBand_Z_Dependence\MutliZ_DD_7p5.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +%% Make NR Band +max_r=18; +s1_min=0; +s1_max=50; + + +pulse_area_cut=s2_phe_both_xyz>150 & s2_phe_both<10000 & s1_phe_both<300; +NR_beam_cut=inrange(drift_time,[35 75]) & inrange(s2radius_del,[0,max_r]) & ... + (s2y < -8.*s2x+70) & (s2y>-20.*s2x+10); + + +bin_counter=1; + +DD_cut= clean_cut & pulse_area_cut & NR_beam_cut; + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:0.1:5; + NR_bin_size=2; %3 works + index_i=1; + NR_bins=NR_bin_size/2+s1_min:NR_bin_size:s1_max; + lower_bound=ones(size(NR_bins)); + mean_NR_band=ones(size(NR_bins)); + upper_bound=ones(size(NR_bins)); + counts_NR_hist=ones(size(NR_bins)); + NR_sigma=ones(size(NR_bins)); + NR_sigma_sigma=ones(size(NR_bins)); + +% temporary, for calculating correct E-lifetime + clear mean_NR_band_err lower_bound_err upper_bound_err lower_bound mean_NR_band upper_bound + + for NR_bin = (NR_bin_size/2)+s1_min:NR_bin_size:(s1_max); %HIST uses bin centers + + + NR_fit_cut=DD_cut & inrange(s1_phe_both_xyz,[NR_bin-NR_bin_size/2,NR_bin+NR_bin_size/2]); + + NR_band_hist=hist(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + counts_NR_hist(index_i)=sum(NR_band_hist); + + Fit_NR=fit(s2_s1_bin',NR_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + + %band=confint(Fit_NR,.1); +% NR_sigma(index_i)= Fit_NR.c1/sqrt(2); + NR_sigma(index_i)= sqrt(rms_fit.sig2); + NR_sigma_sigma(index_i)=NR_sigma(index_i)/sqrt(2*counts_NR_hist(index_i)); + + lower_bound(index_i)=Fit_NR.b1-NR_sigma(index_i)*band_sigma; + mean_NR_band(index_i)=Fit_NR.b1; + upper_bound(index_i)=Fit_NR.b1+NR_sigma(index_i)*band_sigma; + + temp_err=confint(Fit_NR,0.68); + mean_NR_band_err(index_i)=abs(temp_err(1,2)-Fit_NR.b1); + lower_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + upper_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + + + %mean_NR_band_sim(index_i)=Fit_NR_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + NR_mean_power_fit=fit(NR_bins(NR_bins>2)',mean_NR_band(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_mean_fit{bin_counter}=NR_mean_power_fit.a.*NR_bins.^(NR_mean_power_fit.b); + + NR_lower_power_fit=fit(NR_bins(NR_bins>2)',lower_bound(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_lower_fit{bin_counter}=NR_lower_power_fit.a.*NR_bins.^(NR_lower_power_fit.b); + + NR_upper_power_fit=fit(NR_bins(NR_bins>2)',upper_bound(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_upper_fit{bin_counter}=NR_upper_power_fit.a.*NR_bins.^(NR_upper_power_fit.b); + + NR_mean_fit_points{bin_counter}=mean_NR_band; + NR_lower_fit_points{bin_counter}=lower_bound; + NR_upper_fit_points{bin_counter}=upper_bound; + + NR_mean_fit_points_err{bin_counter}=mean_NR_band_err; + NR_lower_fit_points_err{bin_counter}=lower_bound_err; + NR_upper_fit_points_err{bin_counter}=upper_bound_err; + + NR_bins_tracked{bin_counter}=NR_bins; + + bin_counter=bin_counter+1; +%% +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\KrypCal2p21_QualityChecks\NRBand_Z_Dependence\MutliZ_DD_15.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +%% Make NR Band +max_r=18; +s1_min=0; +s1_max=50; + + +pulse_area_cut=s2_phe_both_xyz>150 & s2_phe_both<10000 & s1_phe_both<300; +NR_beam_cut=inrange(drift_time,[75 125]) & inrange(s2radius_del,[0,max_r]) & ... + (s2y < -8.*s2x+70) & (s2y>-20.*s2x+10); + + + + +DD_cut= clean_cut & pulse_area_cut & NR_beam_cut; + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:0.1:5; + NR_bin_size=2; %3 works + index_i=1; + NR_bins=NR_bin_size/2+s1_min:NR_bin_size:s1_max; + lower_bound=ones(size(NR_bins)); + mean_NR_band=ones(size(NR_bins)); + upper_bound=ones(size(NR_bins)); + counts_NR_hist=ones(size(NR_bins)); + NR_sigma=ones(size(NR_bins)); + NR_sigma_sigma=ones(size(NR_bins)); + clear mean_NR_band_err lower_bound_err upper_bound_err lower_bound mean_NR_band upper_bound + +% temporary, for calculating correct E-lifetime + for NR_bin = (NR_bin_size/2)+s1_min:NR_bin_size:(s1_max); %HIST uses bin centers + + + NR_fit_cut=DD_cut & inrange(s1_phe_both_xyz,[NR_bin-NR_bin_size/2,NR_bin+NR_bin_size/2]); + + NR_band_hist=hist(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + counts_NR_hist(index_i)=sum(NR_band_hist); + + Fit_NR=fit(s2_s1_bin',NR_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + + %band=confint(Fit_NR,.1); +% NR_sigma(index_i)= Fit_NR.c1/sqrt(2); + NR_sigma(index_i)= sqrt(rms_fit.sig2); + NR_sigma_sigma(index_i)=NR_sigma(index_i)/sqrt(2*counts_NR_hist(index_i)); + + lower_bound(index_i)=Fit_NR.b1-NR_sigma(index_i)*band_sigma; + mean_NR_band(index_i)=Fit_NR.b1; + upper_bound(index_i)=Fit_NR.b1+NR_sigma(index_i)*band_sigma; + + temp_err=confint(Fit_NR,0.68); + mean_NR_band_err(index_i)=abs(temp_err(1,2)-Fit_NR.b1); + lower_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + upper_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + + + %mean_NR_band_sim(index_i)=Fit_NR_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + NR_mean_power_fit=fit(NR_bins(NR_bins>2)',mean_NR_band(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_mean_fit{bin_counter}=NR_mean_power_fit.a.*NR_bins.^(NR_mean_power_fit.b); + + NR_lower_power_fit=fit(NR_bins(NR_bins>2)',lower_bound(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_lower_fit{bin_counter}=NR_lower_power_fit.a.*NR_bins.^(NR_lower_power_fit.b); + + NR_upper_power_fit=fit(NR_bins(NR_bins>2)',upper_bound(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_upper_fit{bin_counter}=NR_upper_power_fit.a.*NR_bins.^(NR_upper_power_fit.b); + + NR_mean_fit_points{bin_counter}=mean_NR_band; + NR_lower_fit_points{bin_counter}=lower_bound; + NR_upper_fit_points{bin_counter}=upper_bound; + + NR_mean_fit_points_err{bin_counter}=mean_NR_band_err; + NR_lower_fit_points_err{bin_counter}=lower_bound_err; + NR_upper_fit_points_err{bin_counter}=upper_bound_err; + + NR_bins_tracked{bin_counter}=NR_bins; + bin_counter=bin_counter+1; + + +%% +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\KrypCal2p21_QualityChecks\NRBand_Z_Dependence\MutliZ_DD_22p5.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +%% Make NR Band +max_r=21; +s1_min=0; +s1_max=50; + + +pulse_area_cut=s2_phe_both_xyz>150 & s2_phe_both<10000 & s1_phe_both<300; +NR_beam_cut=inrange(drift_time,[125 175]) & inrange(s2radius_del,[0,max_r]) & ... + (s2y < -8.*s2x+50) & (s2y>-20.*s2x+10); + + + + +DD_cut= clean_cut & pulse_area_cut & NR_beam_cut; + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:0.1:5; + NR_bin_size=6; %3 works + index_i=1; + NR_bins=NR_bin_size/2+s1_min:NR_bin_size:s1_max; + lower_bound=ones(size(NR_bins)); + mean_NR_band=ones(size(NR_bins)); + upper_bound=ones(size(NR_bins)); + counts_NR_hist=ones(size(NR_bins)); + NR_sigma=ones(size(NR_bins)); + NR_sigma_sigma=ones(size(NR_bins)); +% temporary, for calculating correct E-lifetime + clear mean_NR_band_err lower_bound_err upper_bound_err lower_bound mean_NR_band upper_bound + + for NR_bin = (NR_bin_size/2)+s1_min:NR_bin_size:(s1_max); %HIST uses bin centers + + + NR_fit_cut=DD_cut & inrange(s1_phe_both_xyz,[NR_bin-NR_bin_size/2,NR_bin+NR_bin_size/2]); + + NR_band_hist=hist(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + counts_NR_hist(index_i)=sum(NR_band_hist); + + Fit_NR=fit(s2_s1_bin',NR_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + + %band=confint(Fit_NR,.1); +% NR_sigma(index_i)= Fit_NR.c1/sqrt(2); + NR_sigma(index_i)= sqrt(rms_fit.sig2); + NR_sigma_sigma(index_i)=NR_sigma(index_i)/sqrt(2*counts_NR_hist(index_i)); + + lower_bound(index_i)=Fit_NR.b1-NR_sigma(index_i)*band_sigma; + mean_NR_band(index_i)=Fit_NR.b1; + upper_bound(index_i)=Fit_NR.b1+NR_sigma(index_i)*band_sigma; + + temp_err=confint(Fit_NR,0.68); + mean_NR_band_err(index_i)=abs(temp_err(1,2)-Fit_NR.b1); + lower_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + upper_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + + + %mean_NR_band_sim(index_i)=Fit_NR_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + NR_mean_power_fit=fit(NR_bins(NR_bins>2)',mean_NR_band(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_mean_fit{bin_counter}=NR_mean_power_fit.a.*NR_bins.^(NR_mean_power_fit.b); + + NR_lower_power_fit=fit(NR_bins(NR_bins>2)',lower_bound(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_lower_fit{bin_counter}=NR_lower_power_fit.a.*NR_bins.^(NR_lower_power_fit.b); + + NR_upper_power_fit=fit(NR_bins(NR_bins>2)',upper_bound(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_upper_fit{bin_counter}=NR_upper_power_fit.a.*NR_bins.^(NR_upper_power_fit.b); + + NR_mean_fit_points{bin_counter}=mean_NR_band; + NR_lower_fit_points{bin_counter}=lower_bound; + NR_upper_fit_points{bin_counter}=upper_bound; + + NR_mean_fit_points_err{bin_counter}=mean_NR_band_err; + NR_lower_fit_points_err{bin_counter}=lower_bound_err; + NR_upper_fit_points_err{bin_counter}=upper_bound_err; + + NR_bins_tracked{bin_counter}=NR_bins; + bin_counter=bin_counter+1; + +%% +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\KrypCal2p21_QualityChecks\NRBand_Z_Dependence\MutliZ_DD_30.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +%% Make NR Band +max_r=18; +s1_min=0; +s1_max=50; + + +pulse_area_cut=s2_phe_both_xyz>150 & s2_phe_both<10000 & s1_phe_both<300; +NR_beam_cut=inrange(drift_time,[180 225]) & inrange(s2radius_del,[0,max_r]) & ... + (s2y < -8.*s2x+36) & (s2y>-20.*s2x+5); + + + + +DD_cut= clean_cut & pulse_area_cut & NR_beam_cut; + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:0.1:5; + NR_bin_size=2; %3 works + index_i=1; + NR_bins=NR_bin_size/2+s1_min:NR_bin_size:s1_max; + lower_bound=ones(size(NR_bins)); + mean_NR_band=ones(size(NR_bins)); + upper_bound=ones(size(NR_bins)); + counts_NR_hist=ones(size(NR_bins)); + NR_sigma=ones(size(NR_bins)); + NR_sigma_sigma=ones(size(NR_bins)); + clear mean_NR_band_err lower_bound_err upper_bound_err lower_bound mean_NR_band upper_bound + +% temporary, for calculating correct E-lifetime + for NR_bin = (NR_bin_size/2)+s1_min:NR_bin_size:(s1_max); %HIST uses bin centers + + + NR_fit_cut=DD_cut & inrange(s1_phe_both_xyz,[NR_bin-NR_bin_size/2,NR_bin+NR_bin_size/2]); + + NR_band_hist=hist(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + counts_NR_hist(index_i)=sum(NR_band_hist); + + Fit_NR=fit(s2_s1_bin',NR_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + + %band=confint(Fit_NR,.1); +% NR_sigma(index_i)= Fit_NR.c1/sqrt(2); + NR_sigma(index_i)= sqrt(rms_fit.sig2); + NR_sigma_sigma(index_i)=NR_sigma(index_i)/sqrt(2*counts_NR_hist(index_i)); + + + lower_bound(index_i)=Fit_NR.b1-NR_sigma(index_i)*band_sigma; + mean_NR_band(index_i)=Fit_NR.b1; + upper_bound(index_i)=Fit_NR.b1+NR_sigma(index_i)*band_sigma; + + temp_err=confint(Fit_NR,0.68); + mean_NR_band_err(index_i)=abs(temp_err(1,2)-Fit_NR.b1); + lower_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + upper_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + + + %mean_NR_band_sim(index_i)=Fit_NR_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + NR_mean_power_fit=fit(NR_bins(NR_bins>2)',mean_NR_band(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_mean_fit{bin_counter}=NR_mean_power_fit.a.*NR_bins.^(NR_mean_power_fit.b); + + NR_lower_power_fit=fit(NR_bins(NR_bins>2)',lower_bound(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_lower_fit{bin_counter}=NR_lower_power_fit.a.*NR_bins.^(NR_lower_power_fit.b); + + NR_upper_power_fit=fit(NR_bins(NR_bins>2)',upper_bound(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_upper_fit{bin_counter}=NR_upper_power_fit.a.*NR_bins.^(NR_upper_power_fit.b); + + NR_mean_fit_points{bin_counter}=mean_NR_band; + NR_lower_fit_points{bin_counter}=lower_bound; + NR_upper_fit_points{bin_counter}=upper_bound; + + NR_mean_fit_points_err{bin_counter}=mean_NR_band_err; + NR_lower_fit_points_err{bin_counter}=lower_bound_err; + NR_upper_fit_points_err{bin_counter}=upper_bound_err; + + NR_bins_tracked{bin_counter}=NR_bins; + bin_counter=bin_counter+1; + +%% +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\KrypCal2p21_QualityChecks\NRBand_Z_Dependence\MutliZ_DD_37p5.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +%% Make NR Band +max_r=18; +s1_min=0; +s1_max=50; + + +pulse_area_cut=s2_phe_both_xyz>150 & s2_phe_both<10000 & s1_phe_both<300; +NR_beam_cut=inrange(drift_time,[235 280]) & inrange(s2radius_del,[0,max_r]) & ... + (s2y < -8.*s2x+36) & (s2y>-15.*s2x-5); + + + + +DD_cut= clean_cut & pulse_area_cut & NR_beam_cut; + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:0.1:5; + NR_bin_size=3; %3 works + index_i=1; + NR_bins=NR_bin_size/2+s1_min:NR_bin_size:s1_max; + lower_bound=ones(size(NR_bins)); + mean_NR_band=ones(size(NR_bins)); + upper_bound=ones(size(NR_bins)); + counts_NR_hist=ones(size(NR_bins)); + NR_sigma=ones(size(NR_bins)); + NR_sigma_sigma=ones(size(NR_bins)); + clear mean_NR_band_err lower_bound_err upper_bound_err lower_bound mean_NR_band upper_bound + +% temporary, for calculating correct E-lifetime + for NR_bin = (NR_bin_size/2)+s1_min:NR_bin_size:(s1_max); %HIST uses bin centers + + + NR_fit_cut=DD_cut & inrange(s1_phe_both_xyz,[NR_bin-NR_bin_size/2,NR_bin+NR_bin_size/2]); + + NR_band_hist=hist(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + counts_NR_hist(index_i)=sum(NR_band_hist); + + Fit_NR=fit(s2_s1_bin',NR_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + + %band=confint(Fit_NR,.1); +% NR_sigma(index_i)= Fit_NR.c1/sqrt(2); + NR_sigma(index_i)= sqrt(rms_fit.sig2); + NR_sigma_sigma(index_i)=NR_sigma(index_i)/sqrt(2*counts_NR_hist(index_i)); + + lower_bound(index_i)=Fit_NR.b1-NR_sigma(index_i)*band_sigma; + mean_NR_band(index_i)=Fit_NR.b1; + upper_bound(index_i)=Fit_NR.b1+NR_sigma(index_i)*band_sigma; + + temp_err=confint(Fit_NR,0.68); + mean_NR_band_err(index_i)=abs(temp_err(1,2)-Fit_NR.b1); + lower_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + upper_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + + + %mean_NR_band_sim(index_i)=Fit_NR_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + NR_mean_power_fit=fit(NR_bins(NR_bins>2)',mean_NR_band(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_mean_fit{bin_counter}=NR_mean_power_fit.a.*NR_bins.^(NR_mean_power_fit.b); + + NR_lower_power_fit=fit(NR_bins(NR_bins>2)',lower_bound(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_lower_fit{bin_counter}=NR_lower_power_fit.a.*NR_bins.^(NR_lower_power_fit.b); + + NR_upper_power_fit=fit(NR_bins(NR_bins>2)',upper_bound(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_upper_fit{bin_counter}=NR_upper_power_fit.a.*NR_bins.^(NR_upper_power_fit.b); + + NR_mean_fit_points{bin_counter}=mean_NR_band; + NR_lower_fit_points{bin_counter}=lower_bound; + NR_upper_fit_points{bin_counter}=upper_bound; + + NR_mean_fit_points_err{bin_counter}=mean_NR_band_err; + NR_lower_fit_points_err{bin_counter}=lower_bound_err; + NR_upper_fit_points_err{bin_counter}=upper_bound_err; + + NR_bins_tracked{bin_counter}=NR_bins; + +% bin_counter=bin_counter+1; + + %% + %Make Plot + + figure; + hold on + ylabel('Corrected log10(S2/S1)'); xlabel('S1 corrected (Pulse Area Phe)'); + title(sprintf('Run 04 NR Band, R<%d cm',max_r),'fontsize',16,'Interpreter','none'); + myfigview(16); + ylim([0 3.5]);xlim([0 s1_max]); + + colors={[1 0 0],[0 1 0],[0 0 1],[0 0 0],[1 1 0]}; + color_counter=1; + for i=[1:1:5]; +% plot(NR_bins_tracked{i},NR_lower_fit{i},'--','Color',colors{color_counter},'markersize',14,'linewidth',2) +% plot(NR_bins_tracked{i},NR_mean_fit{i},'-','Color',colors{color_counter},'markersize',20,'linewidth',2) +% plot(NR_bins_tracked{i},NR_upper_fit{i},'--','Color',colors{color_counter},'markersize',14,'linewidth',2) +% + tempx=NR_bins_tracked{i}; + tempy=NR_mean_fit_points{i}; + tempy_err=NR_mean_fit_points_err{i}; + + + errorbar(tempx(2:end-2),tempy(2:end-2),tempy_err(2:end-2),'Color',colors{color_counter}) + + color_counter=color_counter+1; + end + + + + %Adding upper and lower band sections + color_counter=1; + for i=[1:1:5]; + % Upper band + tempx=NR_bins_tracked{i}; + tempy=NR_upper_fit_points{i}; + tempy_err=NR_upper_fit_points_err{i}; + + + errorbar(tempx(2:end-2),tempy(2:end-2),tempy_err(2:end-2),'Color',colors{color_counter}) + +% lower band + tempx=NR_bins_tracked{i}; + tempy=NR_lower_fit_points{i}; + tempy_err=NR_lower_fit_points_err{i}; + + + errorbar(tempx(2:end-2),tempy(2:end-2),tempy_err(2:end-2),'Color',colors{color_counter}) + + color_counter=color_counter+1; + end + +%% Plot power law fits + + figure; + hold on + ylabel('Corrected log10(S2/S1)'); xlabel('S1 corrected (Pulse Area Phe)'); + title(sprintf('Run 04 NR Band, R<%d cm',max_r),'fontsize',16,'Interpreter','none'); + myfigview(16); + ylim([0 3.5]);xlim([0 s1_max]); + + colors={[1 0 0],[0 1 0],[0 0 1],[0 0 0],[1 1 0]}; + color_counter=1; + for i=[1:1:5]; + plot(NR_bins_tracked{i},NR_lower_fit{i},'--','Color',colors{color_counter},'markersize',14,'linewidth',2) +% plot(NR_bins_tracked{i},NR_mean_fit{i},'-','Color',colors{color_counter},'markersize',20,'linewidth',2) +% plot(NR_bins_tracked{i},NR_upper_fit{i},'--','Color',colors{color_counter},'markersize',14,'linewidth',2) + + + color_counter=color_counter+1; + end +legend('35-75 uSec','75-125 uSec','125-175 uSec','180-225 uSec','235-280 uSec') + + colors={[1 0 0],[0 1 0],[0 0 1],[0 0 0],[1 1 0]}; + color_counter=1; + for i=[1:1:5]; +% plot(NR_bins_tracked{i},NR_lower_fit{i},'--','Color',colors{color_counter},'markersize',14,'linewidth',2) + plot(NR_bins_tracked{i},NR_mean_fit{i},'-','Color',colors{color_counter},'markersize',20,'linewidth',2) + plot(NR_bins_tracked{i},NR_upper_fit{i},'--','Color',colors{color_counter},'markersize',14,'linewidth',2) + + + color_counter=color_counter+1; + end + \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/NRBand_Z_Dependence/NRBand_ZDependence_NoFieldCorrection.m b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/NRBand_Z_Dependence/NRBand_ZDependence_NoFieldCorrection.m new file mode 100644 index 0000000..face548 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/NRBand_Z_Dependence/NRBand_ZDependence_NoFieldCorrection.m @@ -0,0 +1,1911 @@ +%% Make corrections with the chosen polynomial +%USES X_CM_TMPLT SICNE THE MERCURY POSITION RQS ARE MESSED UP IN THIS KR DATA SET +% path='C:\Users\Richard\Desktop\LUX Analysis\MultiZDD_KrData\lux10_20140915T1138_cp13945'; %For 3D +path='C:\Users\Richard\Desktop\LUX Analysis\MultiZDD_KrData\lux10_20140920T1613_cp13946'; + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm','x_cm_tmplt','y_cm_tmplt'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +delay_min=0; +file_id_cp='test'; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 70000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + + + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + + zcut_min = 10; %field changes at 4 uSec + zcut_max = 0.95*det_edge; + + + if Kr_events < 30000 %then create a 10x10 grid. Otherwise 25x25. Want about 30 evts per bin + + S1xybinsize = sqrt((50*50)/(Kr_events/150)); + S1_xbin_min = -25; + S1_xbin_max = 25; + S1_ybin_min = -25; + S1_ybin_max = 25; + SE_ybin_min = -25; + SE_ybin_max = 25; + + S2xybinsize = sqrt((50*50)/(Kr_events/150));%cm +% SExybinsize = 5; DEFINED LATER, based on number of SE events + S2_xbin_min = -25; + S2_xbin_max = 25; + S2_ybin_min = -25; + S2_ybin_max = 25; + SE_xbin_min = -25; + SE_xbin_max = 25; + + + end + + s1_xbins = (S1_xbin_max-S1_xbin_min)./S1xybinsize; + s1_ybins = (S1_ybin_max-S1_ybin_min)./S1xybinsize; + + s2_xbins = (S2_xbin_max-S2_xbin_min)./S2xybinsize; + s2_ybins = (S2_ybin_max-S2_ybin_min)./S2xybinsize; + + %% Kr S1a/S2b map + +%Set up cuts and variables + s1ab_cut=logical(sum(s1_single_cut(:,:),1)); + s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); + s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); + s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); + s1ab_x=d.x_cm(s2_single_cut); + s1ab_y=d.y_cm(s2_single_cut); + s1ab_z=d.z_drift_samples(s2_single_cut)/100; + s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); + s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<25; + %plotting x=s1a v y=s1a/s1b cuts: y<0.035x-1, y>-0.035.*x+5; y>0.01.*x; %y<4.2; x<255 +% s1ab_areacut= (s1a_phe_both./s1b_phe_both-0.035.*s1a_phe_both<-1) & (s1a_phe_both./s1b_phe_both+0.035.*s1a_phe_both>5)... +% & (s1a_phe_both./s1b_phe_both > 0.01.* s1a_phe_both) & (s1a_phe_both./s1b_phe_both<4.2) & (s1a_phe_both<255); + + s1ab_x=s1ab_x(s1ab_timing_cut); + s1ab_y=s1ab_y(s1ab_timing_cut); + s1ab_z=s1ab_z(s1ab_timing_cut); + s1a_phe_both=s1a_phe_both(s1ab_timing_cut); + s1b_phe_both=s1b_phe_both(s1ab_timing_cut); + s1ab_radius=s1ab_radius(s1ab_timing_cut); + + %fidicual Z cut for s1ab_xy measurement + [s1ab_z_hist s1ab_z_hist_bins]=hist(s1ab_z(inrange(s1ab_z,[0,400])),[0:1:400]); + frac_hist=cumsum(s1ab_z_hist)./sum(s1ab_z_hist); + s1ab_z_cut_lower= min(s1ab_z_hist_bins(frac_hist>.10)); + s1ab_z_cut_upper= max(s1ab_z_hist_bins(frac_hist<.90)); + s1ab_z_cut=inrange(s1ab_z,[s1ab_z_cut_lower,s1ab_z_cut_upper]); + + %R cut for s1ab_Z measurement + [upperz_r_hist upperz_r_hist_bins]=hist(s1ab_radius(s1ab_z>s1ab_z_cut_upper & s1ab_radius<=26),[0:1:26]); + [lowerz_r_hist lowerz_r_hist_bins]=hist(s1ab_radius(s1ab_z0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:400]).','gauss1'); + s1b_fit=fit([0:2:300].',hist(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'),[0:2:300]).','gauss1'); + s1a_z_means(i)=s1a_fit.b1; + s1a_z_means_err(i)=s1a_fit.c1/sqrt(2)/sqrt(length(s1a_phe_both(s1ab_r_cut.' & s1a_phe_both>0 & s1a_phe_both<400 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1b_z_means(i)=s1b_fit.b1; + s1b_z_means_err(i)=s1b_fit.c1/sqrt(2)/sqrt(length(s1b_phe_both(s1ab_r_cut.' & s1b_phe_both>0 & s1b_phe_both<300 & inrange(s1ab_z,[z_max-dT_step,z_max]).'))); + s1ab_bincenters(i)=z_max-dT_step/2; + i=i+1; + end + +s1ab_z_means=s1a_z_means./s1b_z_means; +s1ab_z_means_err=sqrt( (s1b_z_means_err.*s1a_z_means./(s1b_z_means.^2)).^2 + (s1a_z_means_err./s1b_z_means).^2); + +%fit polynomial to s1az and s1bz, to remove z dependence later in xy fit +[s1a_P, s1a_S]=polyfit(s1ab_bincenters,s1a_z_means,3); +[s1b_P, s1b_S]=polyfit(s1ab_bincenters,s1b_z_means,3); +[s1ab_P, s1ab_S]=polyfit(s1ab_bincenters,s1ab_z_means,2); + +%S1a z dependence plot +s1az_plot=figure; +errorbar(s1ab_bincenters,s1a_z_means,s1a_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a Mean (phe)'); title('S1a Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1a_P,[10:1:320]),'-r','LineWidth',2) + +%S1b z dependence plot +s1bz_plot=figure; +errorbar(s1ab_bincenters,s1b_z_means,s1b_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1b Mean (phe)'); title('S1b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1b_P,[10:1:320]),'-r','LineWidth',2) + +%S1a/b z dependence plot +s1a_over_bz_plot=figure; +errorbar(s1ab_bincenters,s1ab_z_means,s1ab_z_means_err,'.k') +xlabel('Drift Time (uSec)');ylabel('S1a/b'); title('S1 a/b Z Dependence'); myfigview(16); +hold on; +plot([10:1:320],polyval(s1ab_P,[10:1:320]),'-r','LineWidth',2) + + +%Correcting z dependence to get XY dependence in same manner that Kr/CH3T +%map does + s1a_phe_both_z=s1a_phe_both.'.*polyval(s1a_P,z_center)./polyval(s1a_P,s1ab_z); + s1b_phe_both_z=s1b_phe_both.'.*polyval(s1b_P,z_center)./polyval(s1b_P,s1ab_z); + + %% S1a/b XY map (after z correction) +s1ab_xbin_min=-25; +s1ab_ybin_min=-25; +s1ab_xbin_max=25; +s1ab_ybin_max=25; +s1ab_xybinsize=sqrt((50*50)/(length(s1ab_z)/300)); +clear s1a_xy_mean s1a_xy_mean_err s1b_xy_mean s1b_xy_mean_err + +s1ab_xbins=s1ab_xbin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_xbin_max; +s1ab_ybins=s1ab_ybin_min+s1ab_xybinsize/2:s1ab_xybinsize:s1ab_ybin_max; + +s1a_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); +s1b_xy_mean=zeros(length(s1ab_xbins),length(s1ab_ybins)); + + for x_bin=s1ab_xbin_min:s1ab_xybinsize:(s1ab_xbin_max-s1ab_xybinsize/2); + for y_bin=s1ab_ybin_min:s1ab_xybinsize:(s1ab_ybin_max-s1ab_xybinsize/2); + x_min = x_bin; x_max = x_bin+s1ab_xybinsize; + y_min = y_bin; y_max = y_bin+s1ab_xybinsize; + + x_count=int32(1+x_bin/s1ab_xybinsize+s1ab_xbin_max/s1ab_xybinsize); + y_count=int32(1+y_bin/s1ab_xybinsize+s1ab_ybin_max/s1ab_xybinsize); + + bin_cut = s1ab_z_cut.' & inrange(s1ab_z,[10 330]).' & s1a_phe_both>0 & s1b_phe_both>0 & inrange(s1ab_x,[x_min,x_max]).' & inrange(s1ab_y,[y_min,y_max]).'; + if length(s1a_phe_both_z(bin_cut))>100; + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400])),[0:2:400]).','gauss1'); + s1a_xy_mean(y_count,x_count)=s1a_z_fit.b1; + s1a_xy_mean_err(y_count,x_count)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both_z(bin_cut.' & inrange(s1a_phe_both_z,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300])),[0:2:300]).','gauss1'); + s1b_xy_mean(y_count,x_count)=s1b_z_fit.b1; + s1b_xy_mean_err(y_count,x_count)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both_z(bin_cut.' & inrange(s1b_phe_both_z,[0 300]))); + else + s1a_xy_mean(y_count,x_count)=0; + s1a_xy_mean_err(y_count,x_count)=0; + s1b_xy_mean(y_count,x_count)=0; + s1b_xy_mean_err(y_count,x_count)=0; + end + + end + end + s1ab_xy_mean=s1a_xy_mean./s1b_xy_mean; + s1ab_xy_mean_err=sqrt( (s1b_xy_mean_err.*s1a_xy_mean./(s1b_xy_mean.^2)).^2 + (s1a_xy_mean_err./s1b_xy_mean).^2); + + + %Plot s1a XY means + color_range_max=max(max(s1a_xy_mean)); + color_range_min=min(min(s1a_xy_mean(s1a_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1a_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1a_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %Plot s1a XY means + color_range_max=max(max(s1b_xy_mean)); + color_range_min=min(min(s1b_xy_mean(s1b_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1b_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1b_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1b Mean vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1b Mean (phe)','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + + + %s1a/b XY Ratio + color_range_max=max(max(s1ab_xy_mean)); + color_range_min=min(min(s1ab_xy_mean(s1ab_xy_mean>0))); + vc_step=(color_range_max-color_range_min)/50; + vc=color_range_min:vc_step:color_range_max; + + s1ab_xy_fig = figure; + contourf(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,vc,'LineColor','none'); + xlabel('x (cm)','fontsize', 18); + ylabel('y (cm)','fontsize', 18); + title(strcat(file_id_cp, '. S1a/b Ratio vs. XY.'),'fontsize',16,'Interpreter','none'); + caxis([color_range_min color_range_max]) + g=colorbar; + ylabel(g,'S1a/b Ratio','FontSize',16) + set(g,'FontSize',18) + hold on + LUXPlotTopPMTs + axis([-25 25 -25 25]) + myfigview(16); + + +%% 3D Kr s1a/s1b map +if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +s1ab_xyz_numbins=floor((length(s1ab_z)/200)^(1/3)); %number of bins in one direction +s1ab_xyz_zstep=det_edge/s1ab_xyz_numbins; +s1ab_xyz_xstep=50/s1ab_xyz_numbins; +s1ab_xyz_ystep=50/s1ab_xyz_numbins; +s1ab_xyz_xmax=25; +r_max=25; + +s1ab_xyz_zbins=10+s1ab_xyz_zstep/2:s1ab_xyz_zstep:10+s1ab_xyz_zstep/2+s1ab_xyz_zstep*s1ab_xyz_numbins; %20 us +s1ab_xyz_xbins=(-r_max+s1ab_xyz_xstep/2):s1ab_xyz_xstep:r_max; +s1ab_xyz_ybins=(-r_max+s1ab_xyz_ystep/2):s1ab_xyz_ystep:r_max; + +s1a_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1a_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); +s1b_xyz_mean_err=zeros(length(s1ab_xyz_xbins),length(s1ab_xyz_ybins),length(s1ab_xyz_zbins)); + +for k = s1ab_xyz_zbins; %s1zbins are the center of the bin + for i = (-r_max+s1ab_xyz_xstep):s1ab_xyz_xstep:r_max %map to rows going down (y_cm) -- s1x bins are the max edge of the bin + for j = (-r_max+s1ab_xyz_ystep):s1ab_xyz_ystep:r_max %map columns across (x_cm) -- s1y bins are the max edge of the bin + + l=int8(i/s1ab_xyz_xstep+s1ab_xyz_xmax/s1ab_xyz_xstep); + m=int8(j/s1ab_xyz_ystep+s1ab_xyz_xmax/s1ab_xyz_ystep); + n=int8((k-(10+s1ab_xyz_zstep/2))/s1ab_xyz_zstep + 1); + + %sort, and make the cut. using the variable q + q = s1ab_x(j-s1ab_xyz_xstep) & s1ab_y(i-s1ab_xyz_ystep) & inrange(s1ab_z,[(k-s1ab_xyz_zstep/2) , (k+s1ab_xyz_zstep/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + + %Count the number of events per bin + Count_S1ab_3D(l,m,n)=length(s1a_phe_both(q)); + + if (Count_S1ab_3D(l,m,n) >= 100) % at least 100 counts before fitting. + s1a_z_fit=fit([0:2:400].',hist(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); + s1a_xyz_mean(l,m,n)=s1a_z_fit.b1; + s1a_xyz_mean_err(l,m,n)=s1a_z_fit.c1/sqrt(2)/length(s1a_phe_both(q.' & inrange(s1a_phe_both,[0 400]))); + + + s1b_z_fit=fit([0:2:300].',hist(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]) ),[0:2:300]).','gauss1'); + s1b_xyz_mean(l,m,n)=s1b_z_fit.b1; + s1b_xyz_mean_err(l,m,n)=s1b_z_fit.c1/sqrt(2)/length(s1b_phe_both(q.' & inrange(s1b_phe_both,[0 300]))); + else %not enough stats to do the fit + s1a_xyz_mean(l,m,n)=0; + s1a_xyz_mean_err(l,m,n)=0; + s1b_xyz_mean(l,m,n)=0; + s1b_xyz_mean_err(l,m,n)=0; + end + + end + end +k +end + + s1ab_xyz_mean=s1a_xyz_mean./s1b_xyz_mean; + s1ab_xyz_mean_err=sqrt( (s1b_xyz_mean_err.*s1a_xyz_mean./(s1b_xyz_mean.^2)).^2 + (s1a_xyz_mean_err./s1b_xyz_mean).^2); + +end + %% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % + % Removing field dependence from S1 and S2 + % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + %Hardcoded numbers from Energy Chi2 Fit + +% +% +% s1ab_s2_xyz_fit_map.p1=-0.4988; +% s1ab_s2_xyz_fit_map.p2=1.484; +% c1=1-s1ab_s2_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s2_xyz_fit_map.p2; +% s1ab_s2_xyz_fit_map.p3=c1; +% +% s1ab_s1_xyz_fit_map.p1=0.065; +% s1ab_s1_xyz_fit_map.p2=0.02; +% c2=1-s1ab_s1_xyz_fit_map.p1.*2.7303.^2-2.7303.*s1ab_s1_xyz_fit_map.p2; +% s1ab_s1_xyz_fit_map.p3=c2; +% +% +% %If we can use 3D map, do so. If there aren't enough events do 1D then 2D +% if length(s1ab_z)>100000; %require 100,000 events to do 3D binning +% %Removing zeros from map with nearest neighbor method +% s1ab_xyz_mean_old=s1ab_xyz_mean; +% temp_map=s1ab_xyz_mean; +% q= ~isnan(temp_map); +% r=nearestpoint(find(~q),find(q)); +% s1ab_xyz_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xyz_mean(~q)=temp_mapQ(r);s1ab_xyz_mean=reshape(s1ab_xyz_mean,size(s1ab_xyz_mean_old,1),size(s1ab_xyz_mean_old,2),size(s1ab_xyz_mean_old,3)); +% +% %interpolating with cubic so that we get NaN when extrapolating +% s1as1b_values=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,s2x,s2y,drift_time,'cubic'); +% s1as1b_at_center=interp3(s1ab_xyz_xbins,s1ab_xyz_ybins,s1ab_xyz_zbins,s1ab_xyz_mean,x_center,y_center,z_center,'cubic'); +% s2_3Dfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_values+s1ab_s2_xyz_fit_map.p3); +% s1_3Dfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_values.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_values+s1ab_s1_xyz_fit_map.p3); +% +% %Filling in NaN values with the s1a/s1b Z map polynomial +% s1as1b_zvalues= polyval(s1ab_P,drift_time); +% s1as1b_z_at_center=s1as1b_at_center; +% s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); +% s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); +% s2_3Dfieldremoval(isnan(s2_3Dfieldremoval))=s2_zfieldremoval(isnan(s2_3Dfieldremoval)); +% s1_3Dfieldremoval(isnan(s1_3Dfieldremoval))=s1_zfieldremoval(isnan(s1_3Dfieldremoval)); +% +% s2_phe_bottom=s2_phe_bottom./s2_3Dfieldremoval; +% s2_phe_both=s2_phe_both./s2_3Dfieldremoval; +% s1_phe_bottom=s1_phe_bottom./s1_3Dfieldremoval; +% s1_phe_both=s1_phe_both./s1_3Dfieldremoval; +% +% +% else %Only do 1D in this case +% %Removing zeros from map with nearest neighbor method +% s1ab_xy_mean_old=s1ab_xy_mean; +% temp_map=s1ab_xy_mean; +% q= ~isnan(temp_map); +% r=nearestpoint(find(~q),find(q)); +% s1ab_xy_mean=temp_map; temp_mapQ=temp_map(q); s1ab_xy_mean(~q)=temp_mapQ(r);s1ab_xy_mean=reshape(s1ab_xy_mean,size(s1ab_xy_mean_old,1),size(s1ab_xy_mean_old,2)); +% +% %interpolating with cubic so that we get NaN when extrapolating +% s1as1b_zvalues= polyval(s1ab_P,drift_time); +% s1as1b_zcorr_xyvalues=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,s2x,s2y,'cubic'); +% s1as1b_z_at_center=polyval(s1ab_P,z_center); +% s1as1b_xy_at_center=interp2(s1ab_xbins,s1ab_ybins,s1ab_xy_mean,x_center,y_center,'cubic'); +% +% s2_zfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s2_xyz_fit_map.p3); +% s2_xyfieldremoval= (s1ab_s2_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s2_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s2_xyz_fit_map.p3); +% s1_zfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zvalues+s1ab_s1_xyz_fit_map.p3); +% s1_xyfieldremoval= (s1ab_s1_xyz_fit_map.p1.*s1as1b_zcorr_xyvalues.^2+s1ab_s1_xyz_fit_map.p2.*s1as1b_zcorr_xyvalues+s1ab_s1_xyz_fit_map.p3); +% +% %Filling in NaN values with no XY correction. (Z dependence should never be NaN) +% s2_xyfieldremoval(isnan(s2_xyfieldremoval))=1; +% s2_zfieldremoval(isnan(s2_zfieldremoval))=1; +% s1_xyfieldremoval(isnan(s1_xyfieldremoval))=1; +% s1_zfieldremoval(isnan(s1_zfieldremoval))=1; +% +% +% s2_phe_bottom=s2_phe_bottom./(s2_zfieldremoval); +% s2_phe_both=s2_phe_both./(s2_zfieldremoval); +% s1_phe_bottom=s1_phe_bottom./(s1_zfieldremoval); +% s1_phe_both=s1_phe_both./(s1_zfieldremoval); +% +% +% +% end + + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S1 Z-dependence (Both PMT arrays) +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + + clear y_s1_both y_s1_bottom Fit_s1_both Fit_s1_bottom mean_s1_both mean_s1_both + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both x xfit S + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s1_phe_both,[s1_bin_min,s1_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + + A = sort(size(s1_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. ~49.0 cm. Bin centers every 4\mus + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + + hist_s1_both = zeros(length(x),bins); + Fit_s1_both = cell(1,bins); + means = zeros(bins,1); + means_error = zeros(bins,1); + mean_index = zeros(bins,1); + + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s1_both(:,bin)= hist(s1_phe_both(time_cut),x)'/bin_s1; + temp_hist=hist_s1_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x)/sum(temp_hist); + sigma_start=std(temp_hist.*x); + Fit_s1_both{bin}=fit(x(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + means(bin)=Fit_s1_both{bin}.b1; + means_error(bin) = Fit_s1_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s1_both(:,bin))*bin_s1); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + dT_range= inrange( mean_index,[zcut_min, zcut_max] ); + dT_fit=0:1:det_edge; + [P_s1_both S] = polyfit(mean_index(dT_range),means(dT_range),2); + sigma_P_s1_both = sqrt(diag(inv(S.R)*inv(S.R')).*S.normr.^2./S.df)'; + + + light_correction_fig = figure; + errorbar(mean_index,means,means_error,'.k'); + hold on + [yplot_s1_both] = polyval(P_s1_both,dT_fit); + [center_s1_both, center_s1_both_err] = polyval(P_s1_both,z_center, S); %160[us]*1.51[\mus/us] + plot(dT_fit,yplot_s1_both,'-r','LineWidth',1); + xlabel('Depth (\mus)', 'FontSize',16); ylabel('Mean (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S1 Mean vs. Z'), 'FontSize', 16,'Interpreter','none'); + line([0 det_edge],[center_s1_both center_s1_both],'linestyle','--'); + line([z_center; z_center;],[min(means) max(means)],'linestyle','--'); + legend('S1\_both Mean', strcat('y=', num2str(P_s1_both(1),'%10.2e'), '*Z^2 + ', num2str(P_s1_both(2),'%10.2e')... + , '*Z + ', num2str(P_s1_both(3),4)),strcat('Det center = ',num2str(center_s1_both,4), ' [Phe]'),'location','northwest') + + box on; + myfigview(16); + xlim([0 det_edge]); + ylim([0.8*min(means) 1.15*max(means)]); + + + s1_both_means=means; + s1_both_means_sigma=means_error; + s1_both_means_bin=mean_index; + + + + + + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. + s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time); + + %s1_both_z_correction=interp1(s1_both_means_bin,s1_both_means,160)./interp1(s1_both_means_bin,s1_both_means,drift_time); + s1_phe_both_z=s1_phe_both.*s1_z_correction; + + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Calculating the S2 Z-dependence (i.e. electron lifetime) +% Using Both PMT arrays +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear y_s1_both y_s1_both Fit_s1_both Fit_EL xEL yfitEL xfit + clear sigma_s1_both sigma_s1_both mean_index means mean_index means_error x temp_hist + clear hist_s1_both dT_range dT_fit S x2 + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + + cut = inrange(s2radius,[rcut_min,rcut_max]) & inrange(s2_phe_both,[s2_bin_min,s2_bin_max]) & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]) ; + A = sort(size(s2_phe_both(cut))); %%sort, incase 1xn or nx1 vector is defined. + bins = ceil(A(2)./min_evts_per_bin); %get the number of points, adjust binning if stats are low. + if bins>max_num_bins + bins = max_num_bins; % usually we will have 65 bin. 0:5:325 + end +% bin_size = (488/bins);%span the entire detector. 325us. typically = 5us + bin_size = (floor(det_edge/bins*4)/4);%span the entire detector. 325us. typically = 5us. Round to nearest 0.25. + + hist_s2_both = zeros(length(x2),bins); + Fit_s2_both = cell(1,bins); + means=zeros(bins,1); + means_error = zeros(bins,1); + mean_index= zeros(bins,1); + + for bin=1:bins + + binStart = ((bin-1).*bin_size); binEnd = (bin.*bin_size); + +% time_cut = inrange(drift_distance_\mus,[binStart,binEnd]) & cut==1; + time_cut = inrange(drift_time,[binStart,binEnd]) & cut==1; + + hist_s2_both(:,bin)= hist(s2_phe_both(time_cut),x2)'/bin_s2; + temp_hist=hist_s2_both(:,bin); + amp_start=max(temp_hist); + mean_start=sum(temp_hist.*x2)/sum(temp_hist); + sigma_start=std(temp_hist.*x2); + Fit_s2_both{bin}=fit(x2(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + + + means(bin)=Fit_s2_both{bin}.b1; + means_error(bin) = Fit_s2_both{bin}.c1/sqrt(2)/sqrt(sum(hist_s2_both(:,bin))*bin_s2); % == sigma/sqrt(N); + mean_index(bin) = (binStart+binEnd)/2; + + + %%calculate S2/S1 also, just to double check the lifetime from S2 only + % hist_s2_both_s1(:,bin)= hist(s2_phe_both(time_cut)./s1_phe_both_z(time_cut),x3)'; + % temp_hist=hist_s2_both_s1(:,bin); + %Fit_s2_both_s1{bin}=fit(x3(2:end-1),temp_hist(2:end-1),'gauss1');%remove bin edges + % means_s2_s1(bin)=Fit_s2_both_s1{bin}.b1; + % means_error_s2_s1(bin) = Fit_s2_both_s1{bin}.c1/2/sqrt(sum(hist_s2_both_s1(:,bin))); % == sigma/sqrt(N); + % mean_index_s2_s1(bin) = (binStart+binEnd)/2; + + end + + % //////////////////////////////Make Plots///////////////////////////////// + + + dT_range= inrange( mean_index,[5+bin_size,500] );%from 50 to 300us for the fit + + + s2_both_norm_z_index=mean_index(dT_range); + s2_both_norm_z_means=means(dT_range); + s2_at_top_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4); %normalize to right below the gate + s2_both_norm_z=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,4)./s2_both_norm_z_means; + + %%Tracker for pseudo-lifetime + s2_at_bottom_both=RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z_means,320); + pseudo_lifetime_both=-320/log(s2_at_bottom_both/s2_at_top_both); + + dT_fit=0:1:det_edge; + + Fit_EL= fit(mean_index(dT_range),means(dT_range),'exp1'); + yfitEL = Fit_EL.a.*exp(Fit_EL.b.*dT_fit); + + e_lifetime_both=-1/Fit_EL.b; + s2_z0_both=Fit_EL.a; + + b=confint(Fit_EL, 0.683);%1 sigma matrix + sigma_e_lifetime_both=(1/b(1,2)-1/b(2,2))/2; + sigma_s2_z0_both=(b(2,1)-b(1,1))/2; + + lifetime_fig_both = figure; + errorbar(mean_index(2:end),means(2:end),means_error(2:end),'.k'); %first bin is anode, skip it + hold on + plot(dT_fit,yfitEL,'-r','LineWidth',1); + xlabel('Time (\mus)', 'FontSize',16); ylabel('Mean S2 (Pulse Area Phe)', 'FontSize', 16); + title(strcat(file_id_cp,'.Kr83m. S2_both Electron Lifetime'), 'FontSize', 16,'Interpreter','none'); + legend('S2\_both Mean', strcat( '\lambda= ', num2str(e_lifetime_both,4), ' \pm ', num2str(sigma_e_lifetime_both,2), ' \mus' )... + ,'location','northeast'); + myfigview(16); + xlim([0 det_edge]); + + + + s2_both_means=means; + s2_both_means_sigma=means_error; + s2_both_means_bin=mean_index; + + s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S2 in XY (after correcting for Z-dep). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + clear x2 hist_bin + + %set up energy bins for the gaussian fit. Using both S2 only + bin_s2=500; + s2_bin_min=1000; + s2_bin_max=40000; + x2=s2_bin_min:bin_s2:s2_bin_max; + x2=x2'; + +%set up matricies to be filled +mean_S2_both_xy = zeros(floor(s2_ybins),floor(s2_xbins)); +Sigma_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); +Count_S2_both = zeros(floor(s2_ybins),floor(s2_xbins)); + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[100,s1area_bound_max]) & inrange(s2_phe_both_z,[s2_bin_min,s2_bin_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + & inrange(s2_width,[100,1000]) & inrange(s1_width,[30,400]); + +%%%%variables for uber turbo boost! +s2_phe_both_z_2=s2_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s2_phe_both_z_2(bin_cut) ,x2)'/bin_s2; + Count_S2_both(y_count,x_count)=sum(hist_bin)*bin_s2; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s2_phe_both_z_2=s2_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S2_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x2)/sum(hist_bin); + sigma_start=std(hist_bin.*x2); + Fit_S2_both_xy= fit(x2(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S2_both_xy(y_count,x_count)=Fit_S2_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S2_both_xy.c1/sqrt(2)/sqrt(Count_S2_both(y_count,x_count)); %sigma/sqrt(N) + + + %Fit error checking + if(isnan(Sig_b)) + mean_S2_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S2_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S2_both_xy(y_count,x_count)=0; %don't so gaussin fit if less than 30 events + + end + end + end + + mean_S2_both_xy(isnan(mean_S2_both_xy)) = 0; + + +%%Plot the mean S2_XY both %%%%%%%%%%%%%%%% + +s2xbins=(S2_xbin_min+S2xybinsize/2):S2xybinsize:(S2_xbin_max-S2xybinsize/2); +s2ybins=(S2_ybin_min+S2xybinsize/2):S2xybinsize:(S2_ybin_max-S2xybinsize/2); + +color_range_max=max(max(mean_S2_both_xy)); +color_range_min=min(min(mean_S2_both_xy(mean_S2_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + +s2_xy_both_fig = figure; +contourf(s2xbins,s2ybins,mean_S2_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. S2 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S2_both_xy(mean_S2_both_xy==0)=nan; mean_S2_both_xy=inpaint_nans(mean_S2_both_xy,3); end; +center=interp2(s2xbins,s2ybins,mean_S2_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S2_all=center./mean_S2_both_xy; +norm_S2_all(isinf(norm_S2_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S2_all(isnan(norm_S2_all))=1; + +% if inpaint_on==1; Sigma_S2_both(Sigma_S2_both==0)=nan; Sigma_S2_both=inpaint_nans(Sigma_S2_both,3); end; +sigma_center=interp2(s2xbins,s2ybins,Sigma_S2_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S2_all=sqrt((sigma_center./mean_S2_both_xy).^2+(Sigma_S2_both.*center./mean_S2_both_xy.^2).^2); +sigma_norm_S2_all(isinf(sigma_norm_S2_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S2_all(isnan(sigma_norm_S2_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + + +s2_both_center_xyz=center; +s2_both_center_xyz_error=sigma_center; + +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% +% Mapping S1 in XY (after correction for S1 Z-dependence). Both PMT +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + +clear hist_bin x + + + %set up energy bins for the gaussian fit + bin_s1=8;%5 + s1_bin_min=100; + s1_bin_max=500; + x=s1_bin_min:bin_s1:s1_bin_max; %150:bin_s1:500; + x=x'; + +%set up matricies to be filled +mean_S1_both_xy = zeros(floor(s1_ybins),floor(s1_xbins)); +Sigma_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); +Count_S1_both = zeros(floor(s1_ybins),floor(s1_xbins)); + +% s1_z_correction=polyval(P_s1_both,241.6)./polyval(P_s1_both,drift_distance_\mus);%normalize s1 to 160 ns. +s1_z_correction=polyval(P_s1_both,z_center)./polyval(P_s1_both,drift_time);%normalize s1 to 160 ns. + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +% s2_phe_both_z=s2_phe_both.*exp(drift_distance_\mus/e_lifetime); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +% s2_phe_both_z=s2_phe_both.*exp(drift_time/e_lifetime_both); %Correct S2 for lifeimte %s2_phe_both_z[5000,18000] +s2_phe_both_z=s2_phe_both.*RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + + + +time_energy_cut = inrange(drift_time,[zcut_min,zcut_max]) & inrange(s1_phe_both_z,[s1_bin_min,s1_bin_max]) & inrange(s2_phe_both_z,[1000,s2area_bound_max]) & inrange(s2radius,[rcut_min,rcut_max]) ... + &inrange(s2_width,[100 1000]) & inrange(s1_width,[30 400]); + + +%%%%variables for uber turbo boost! +s1_phe_both_z_2=s1_phe_both_z(time_energy_cut); +s2x_2=s2x(time_energy_cut); +s2y_2=s2y(time_energy_cut); +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + for x_bin=S2_xbin_min:S2xybinsize:(S2_xbin_max-S2xybinsize); + %fprintf('X = %d \n',x_bin) + for y_bin=S2_ybin_min:S2xybinsize:(S2_ybin_max-S2xybinsize); + x_min = x_bin; x_max = x_bin+S2xybinsize; + y_min = y_bin; y_max = y_bin+S2xybinsize; + + x_count=int32(1+x_bin/S2xybinsize+S2_xbin_max/S2xybinsize); + y_count=int32(1+y_bin/S2xybinsize+S2_ybin_max/S2xybinsize); + + + bin_cut = inrange(s2x_2,[x_min,x_max]) & inrange(s2y_2,[y_min,y_max]); + + hist_bin = hist(s1_phe_both_z_2(bin_cut) ,x)'/bin_s1; + Count_S1_both(y_count,x_count)=sum(hist_bin)*bin_s1; % X and Y flip ... because MATLAB + + %%%%%%%%Truncate variables after binning is complete + s1_phe_both_z_2=s1_phe_both_z_2(~bin_cut); + s2x_2=s2x_2(~bin_cut); + s2y_2=s2y_2(~bin_cut); + clear bin_cut; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if Count_S1_both(y_count,x_count)>350; + + amp_start=max(hist_bin); + mean_start=sum(hist_bin.*x)/sum(hist_bin); + sigma_start=std(hist_bin.*x); + Fit_S1_both_xy= fit(x(2:end-1),hist_bin(2:end-1),'gauss1'); %remove edges + + %Peak location (mean) + mean_S1_both_xy(y_count,x_count)=Fit_S1_both_xy.b1; % X and Y flip ... because MATLAB + + %1-sigma of peak position + Sig_b=Fit_S1_both_xy.c1/sqrt(2)/sqrt(Count_S1_both(y_count,x_count)); %sigma/sqrt(N) + + %Fit error checking + if(isnan(Sig_b)) + mean_S1_both_xy(y_count,x_count)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_both(y_count,x_count)=Sig_b;% X and Y flip ... because MATLAB + + else + + mean_S1_both_xy(y_count,x_count)=0; + + end + end + end + + mean_S1_both_xy(isnan(mean_S1_both_xy)) = 0; + + +%%Plot the correction S1_XY both %%%%%%%%%%%% + +s1xbins=(S1_xbin_min+S1xybinsize/2):S1xybinsize:(S1_xbin_max-S1xybinsize/2); +s1ybins=(S1_ybin_min+S1xybinsize/2):S1xybinsize:(S1_ybin_max-S1xybinsize/2); + +color_range_max=max(max(mean_S1_both_xy)); +color_range_min=min(min(mean_S1_both_xy(mean_S1_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; + +vc=color_range_min:vc_step:color_range_max; + + +s1_xy_both_fig = figure; +contourf(s1xbins,s1ybins,mean_S1_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp,'. S1 Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%Calculate corrections matrix and 1 sigma corrections matrix +% if inpaint_on==1; mean_S1_both_xy(mean_S1_both_xy==0)=nan; mean_S1_both_xy=inpaint_nans(mean_S1_both_xy,3); end; +center=interp2(s1xbins,s1ybins,mean_S1_both_xy,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +norm_S1_all=center./mean_S1_both_xy; +norm_S1_all(isinf(norm_S1_all))=1;%no infinity! Do not correct events outside r=25cm +norm_S1_all(isnan(norm_S1_all))=1; + +% if inpaint_on==1; Sigma_S1_both(Sigma_S1_both==0)=nan; Sigma_S1_both=inpaint_nans(Sigma_S1_both,3); end; +sigma_center=interp2(s1xbins,s1ybins,Sigma_S1_both,x_center,y_center,'cubic');%Normalize to the center (x=y=0) +sigma_norm_S1_all=sqrt((sigma_center./mean_S1_both_xy).^2+(Sigma_S1_both.*center./mean_S1_both_xy.^2).^2); +sigma_norm_S1_all(isinf(sigma_norm_S1_all))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +sigma_norm_S1_all(isnan(sigma_norm_S1_all))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +s1_both_center_xyz=center; +s1_both_center_xyz_error=sigma_center; + +%% Apply corrections to 7p5 DD data and calculate the NRband + +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\KrypCal2p21_QualityChecks\NRBand_Z_Dependence\MutliZ_DD_7p5.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +%% Make NR Band +max_r=18; +s1_min=0; +s1_max=50; + + +pulse_area_cut=s2_phe_both_xyz>150 & s2_phe_both<10000 & s1_phe_both<300; +NR_beam_cut=inrange(drift_time,[35 75]) & inrange(s2radius_del,[0,max_r]) & ... + (s2y < -8.*s2x+70) & (s2y>-20.*s2x+10); + + +bin_counter=1; + +DD_cut= clean_cut & pulse_area_cut & NR_beam_cut; + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:0.1:5; + NR_bin_size=2; %3 works + index_i=1; + NR_bins=NR_bin_size/2+s1_min:NR_bin_size:s1_max; + lower_bound=ones(size(NR_bins)); + mean_NR_band=ones(size(NR_bins)); + upper_bound=ones(size(NR_bins)); + counts_NR_hist=ones(size(NR_bins)); + NR_sigma=ones(size(NR_bins)); + NR_sigma_sigma=ones(size(NR_bins)); + +% temporary, for calculating correct E-lifetime + clear mean_NR_band_err lower_bound_err upper_bound_err lower_bound mean_NR_band upper_bound + + for NR_bin = (NR_bin_size/2)+s1_min:NR_bin_size:(s1_max); %HIST uses bin centers + + + NR_fit_cut=DD_cut & inrange(s1_phe_both_xyz,[NR_bin-NR_bin_size/2,NR_bin+NR_bin_size/2]); + + NR_band_hist=hist(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + counts_NR_hist(index_i)=sum(NR_band_hist); + + Fit_NR=fit(s2_s1_bin',NR_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + + %band=confint(Fit_NR,.1); +% NR_sigma(index_i)= Fit_NR.c1/sqrt(2); + NR_sigma(index_i)= sqrt(rms_fit.sig2); + NR_sigma_sigma(index_i)=NR_sigma(index_i)/sqrt(2*counts_NR_hist(index_i)); + + lower_bound(index_i)=Fit_NR.b1-NR_sigma(index_i)*band_sigma; + mean_NR_band(index_i)=Fit_NR.b1; + upper_bound(index_i)=Fit_NR.b1+NR_sigma(index_i)*band_sigma; + + temp_err=confint(Fit_NR,0.68); + mean_NR_band_err(index_i)=abs(temp_err(1,2)-Fit_NR.b1); + lower_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + upper_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + + + %mean_NR_band_sim(index_i)=Fit_NR_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + NR_mean_power_fit=fit(NR_bins(NR_bins>2)',mean_NR_band(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_mean_fit{bin_counter}=NR_mean_power_fit.a.*NR_bins.^(NR_mean_power_fit.b); + + NR_lower_power_fit=fit(NR_bins(NR_bins>2)',lower_bound(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_lower_fit{bin_counter}=NR_lower_power_fit.a.*NR_bins.^(NR_lower_power_fit.b); + + NR_upper_power_fit=fit(NR_bins(NR_bins>2)',upper_bound(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_upper_fit{bin_counter}=NR_upper_power_fit.a.*NR_bins.^(NR_upper_power_fit.b); + + NR_mean_fit_points{bin_counter}=mean_NR_band; + NR_lower_fit_points{bin_counter}=lower_bound; + NR_upper_fit_points{bin_counter}=upper_bound; + + NR_mean_fit_points_err{bin_counter}=mean_NR_band_err; + NR_lower_fit_points_err{bin_counter}=lower_bound_err; + NR_upper_fit_points_err{bin_counter}=upper_bound_err; + + NR_bins_tracked{bin_counter}=NR_bins; + + bin_counter=bin_counter+1; +%% +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\KrypCal2p21_QualityChecks\NRBand_Z_Dependence\MutliZ_DD_15.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +%% Make NR Band +max_r=18; +s1_min=0; +s1_max=50; + + +pulse_area_cut=s2_phe_both_xyz>150 & s2_phe_both<10000 & s1_phe_both<300; +NR_beam_cut=inrange(drift_time,[75 125]) & inrange(s2radius_del,[0,max_r]) & ... + (s2y < -8.*s2x+70) & (s2y>-20.*s2x+10); + + + + +DD_cut= clean_cut & pulse_area_cut & NR_beam_cut; + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:0.1:5; + NR_bin_size=2; %3 works + index_i=1; + NR_bins=NR_bin_size/2+s1_min:NR_bin_size:s1_max; + lower_bound=ones(size(NR_bins)); + mean_NR_band=ones(size(NR_bins)); + upper_bound=ones(size(NR_bins)); + counts_NR_hist=ones(size(NR_bins)); + NR_sigma=ones(size(NR_bins)); + NR_sigma_sigma=ones(size(NR_bins)); + clear mean_NR_band_err lower_bound_err upper_bound_err lower_bound mean_NR_band upper_bound + +% temporary, for calculating correct E-lifetime + for NR_bin = (NR_bin_size/2)+s1_min:NR_bin_size:(s1_max); %HIST uses bin centers + + + NR_fit_cut=DD_cut & inrange(s1_phe_both_xyz,[NR_bin-NR_bin_size/2,NR_bin+NR_bin_size/2]); + + NR_band_hist=hist(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + counts_NR_hist(index_i)=sum(NR_band_hist); + + Fit_NR=fit(s2_s1_bin',NR_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + + %band=confint(Fit_NR,.1); +% NR_sigma(index_i)= Fit_NR.c1/sqrt(2); + NR_sigma(index_i)= sqrt(rms_fit.sig2); + NR_sigma_sigma(index_i)=NR_sigma(index_i)/sqrt(2*counts_NR_hist(index_i)); + + lower_bound(index_i)=Fit_NR.b1-NR_sigma(index_i)*band_sigma; + mean_NR_band(index_i)=Fit_NR.b1; + upper_bound(index_i)=Fit_NR.b1+NR_sigma(index_i)*band_sigma; + + temp_err=confint(Fit_NR,0.68); + mean_NR_band_err(index_i)=abs(temp_err(1,2)-Fit_NR.b1); + lower_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + upper_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + + + %mean_NR_band_sim(index_i)=Fit_NR_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + NR_mean_power_fit=fit(NR_bins(NR_bins>2)',mean_NR_band(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_mean_fit{bin_counter}=NR_mean_power_fit.a.*NR_bins.^(NR_mean_power_fit.b); + + NR_lower_power_fit=fit(NR_bins(NR_bins>2)',lower_bound(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_lower_fit{bin_counter}=NR_lower_power_fit.a.*NR_bins.^(NR_lower_power_fit.b); + + NR_upper_power_fit=fit(NR_bins(NR_bins>2)',upper_bound(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_upper_fit{bin_counter}=NR_upper_power_fit.a.*NR_bins.^(NR_upper_power_fit.b); + + NR_mean_fit_points{bin_counter}=mean_NR_band; + NR_lower_fit_points{bin_counter}=lower_bound; + NR_upper_fit_points{bin_counter}=upper_bound; + + NR_mean_fit_points_err{bin_counter}=mean_NR_band_err; + NR_lower_fit_points_err{bin_counter}=lower_bound_err; + NR_upper_fit_points_err{bin_counter}=upper_bound_err; + + NR_bins_tracked{bin_counter}=NR_bins; + bin_counter=bin_counter+1; + + +%% +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\KrypCal2p21_QualityChecks\NRBand_Z_Dependence\MutliZ_DD_22p5.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +%% Make NR Band +max_r=21; +s1_min=0; +s1_max=50; + + +pulse_area_cut=s2_phe_both_xyz>150 & s2_phe_both<10000 & s1_phe_both<300; +NR_beam_cut=inrange(drift_time,[125 175]) & inrange(s2radius_del,[0,max_r]) & ... + (s2y < -8.*s2x+50) & (s2y>-20.*s2x+10); + + + + +DD_cut= clean_cut & pulse_area_cut & NR_beam_cut; + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:0.1:5; + NR_bin_size=6; %3 works + index_i=1; + NR_bins=NR_bin_size/2+s1_min:NR_bin_size:s1_max; + lower_bound=ones(size(NR_bins)); + mean_NR_band=ones(size(NR_bins)); + upper_bound=ones(size(NR_bins)); + counts_NR_hist=ones(size(NR_bins)); + NR_sigma=ones(size(NR_bins)); + NR_sigma_sigma=ones(size(NR_bins)); +% temporary, for calculating correct E-lifetime + clear mean_NR_band_err lower_bound_err upper_bound_err lower_bound mean_NR_band upper_bound + + for NR_bin = (NR_bin_size/2)+s1_min:NR_bin_size:(s1_max); %HIST uses bin centers + + + NR_fit_cut=DD_cut & inrange(s1_phe_both_xyz,[NR_bin-NR_bin_size/2,NR_bin+NR_bin_size/2]); + + NR_band_hist=hist(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + counts_NR_hist(index_i)=sum(NR_band_hist); + + Fit_NR=fit(s2_s1_bin',NR_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + + %band=confint(Fit_NR,.1); +% NR_sigma(index_i)= Fit_NR.c1/sqrt(2); + NR_sigma(index_i)= sqrt(rms_fit.sig2); + NR_sigma_sigma(index_i)=NR_sigma(index_i)/sqrt(2*counts_NR_hist(index_i)); + + lower_bound(index_i)=Fit_NR.b1-NR_sigma(index_i)*band_sigma; + mean_NR_band(index_i)=Fit_NR.b1; + upper_bound(index_i)=Fit_NR.b1+NR_sigma(index_i)*band_sigma; + + temp_err=confint(Fit_NR,0.68); + mean_NR_band_err(index_i)=abs(temp_err(1,2)-Fit_NR.b1); + lower_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + upper_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + + + %mean_NR_band_sim(index_i)=Fit_NR_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + NR_mean_power_fit=fit(NR_bins(NR_bins>2)',mean_NR_band(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_mean_fit{bin_counter}=NR_mean_power_fit.a.*NR_bins.^(NR_mean_power_fit.b); + + NR_lower_power_fit=fit(NR_bins(NR_bins>2)',lower_bound(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_lower_fit{bin_counter}=NR_lower_power_fit.a.*NR_bins.^(NR_lower_power_fit.b); + + NR_upper_power_fit=fit(NR_bins(NR_bins>2)',upper_bound(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_upper_fit{bin_counter}=NR_upper_power_fit.a.*NR_bins.^(NR_upper_power_fit.b); + + NR_mean_fit_points{bin_counter}=mean_NR_band; + NR_lower_fit_points{bin_counter}=lower_bound; + NR_upper_fit_points{bin_counter}=upper_bound; + + NR_mean_fit_points_err{bin_counter}=mean_NR_band_err; + NR_lower_fit_points_err{bin_counter}=lower_bound_err; + NR_upper_fit_points_err{bin_counter}=upper_bound_err; + + NR_bins_tracked{bin_counter}=NR_bins; + bin_counter=bin_counter+1; + +%% +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\KrypCal2p21_QualityChecks\NRBand_Z_Dependence\MutliZ_DD_30.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +%% Make NR Band +max_r=18; +s1_min=0; +s1_max=50; + + +pulse_area_cut=s2_phe_both_xyz>150 & s2_phe_both<10000 & s1_phe_both<300; +NR_beam_cut=inrange(drift_time,[180 225]) & inrange(s2radius_del,[0,max_r]) & ... + (s2y < -8.*s2x+36) & (s2y>-20.*s2x+5); + + + + +DD_cut= clean_cut & pulse_area_cut & NR_beam_cut; + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:0.1:5; + NR_bin_size=2; %3 works + index_i=1; + NR_bins=NR_bin_size/2+s1_min:NR_bin_size:s1_max; + lower_bound=ones(size(NR_bins)); + mean_NR_band=ones(size(NR_bins)); + upper_bound=ones(size(NR_bins)); + counts_NR_hist=ones(size(NR_bins)); + NR_sigma=ones(size(NR_bins)); + NR_sigma_sigma=ones(size(NR_bins)); + clear mean_NR_band_err lower_bound_err upper_bound_err lower_bound mean_NR_band upper_bound + +% temporary, for calculating correct E-lifetime + for NR_bin = (NR_bin_size/2)+s1_min:NR_bin_size:(s1_max); %HIST uses bin centers + + + NR_fit_cut=DD_cut & inrange(s1_phe_both_xyz,[NR_bin-NR_bin_size/2,NR_bin+NR_bin_size/2]); + + NR_band_hist=hist(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + counts_NR_hist(index_i)=sum(NR_band_hist); + + Fit_NR=fit(s2_s1_bin',NR_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + + %band=confint(Fit_NR,.1); +% NR_sigma(index_i)= Fit_NR.c1/sqrt(2); + NR_sigma(index_i)= sqrt(rms_fit.sig2); + NR_sigma_sigma(index_i)=NR_sigma(index_i)/sqrt(2*counts_NR_hist(index_i)); + + + lower_bound(index_i)=Fit_NR.b1-NR_sigma(index_i)*band_sigma; + mean_NR_band(index_i)=Fit_NR.b1; + upper_bound(index_i)=Fit_NR.b1+NR_sigma(index_i)*band_sigma; + + temp_err=confint(Fit_NR,0.68); + mean_NR_band_err(index_i)=abs(temp_err(1,2)-Fit_NR.b1); + lower_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + upper_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + + + %mean_NR_band_sim(index_i)=Fit_NR_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + NR_mean_power_fit=fit(NR_bins(NR_bins>2)',mean_NR_band(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_mean_fit{bin_counter}=NR_mean_power_fit.a.*NR_bins.^(NR_mean_power_fit.b); + + NR_lower_power_fit=fit(NR_bins(NR_bins>2)',lower_bound(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_lower_fit{bin_counter}=NR_lower_power_fit.a.*NR_bins.^(NR_lower_power_fit.b); + + NR_upper_power_fit=fit(NR_bins(NR_bins>2)',upper_bound(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_upper_fit{bin_counter}=NR_upper_power_fit.a.*NR_bins.^(NR_upper_power_fit.b); + + NR_mean_fit_points{bin_counter}=mean_NR_band; + NR_lower_fit_points{bin_counter}=lower_bound; + NR_upper_fit_points{bin_counter}=upper_bound; + + NR_mean_fit_points_err{bin_counter}=mean_NR_band_err; + NR_lower_fit_points_err{bin_counter}=lower_bound_err; + NR_upper_fit_points_err{bin_counter}=upper_bound_err; + + NR_bins_tracked{bin_counter}=NR_bins; + bin_counter=bin_counter+1; + +%% +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal_RD\KrypCal_2p21\KrypCal2p21_QualityChecks\NRBand_Z_Dependence\MutliZ_DD_37p5.mat'); +clear s1_phe_both_xyz s2_phe_both_xyz s1_phe_both_z s2_phe_both_z + +%----------------------------------- +% Finding the S1 Z-dep values +%----------------------------------- + +z_dep_both_values = P_s1_both; +z_dep_par_all = z_dep_both_values; + +%------------------------------------------ +% Finding the S2 xy correction map values +%------------------------------------------ + + s2_x_bins = s2xbins; + s2_y_bins = s2ybins; + s2_map_all = norm_S2_all; + +%------------------------------------------ +% Finding the S1 xy correction map values +%------------------------------------------ + + + s1_x_bins = s1xbins; + s1_y_bins = s1ybins; + s1_map_all = norm_S1_all; + + +%------------------------------------------ +% Calculating corrections +%------------------------------------------ + +s1_drift_ns = drift_time.*1000; +s1_ref_z_ns=z_center*1000; +s1_x_cm = s2x; +s1_y_cm = s2y; + +%-------------------------------------------------------------------------- +% Calculate Z corrections +%-------------------------------------------------------------------------- + +% Calculate S1 Z-correction +s1_z_correction = polyval(z_dep_par_all,s1_ref_z_ns./1000)./polyval(z_dep_par_all,s1_drift_ns./1000); +s1_z_correction(find(isnan(s1_z_correction))) = 1.0; + +s2_z_correction = RK_1DCubicInterp_LinearExtrap(s2_both_norm_z_index,s2_both_norm_z, drift_time); + +%-------------------------------------------------------------------------- +% Calculate XY corrections +%-------------------------------------------------------------------------- + +% Calculate S1 XY-only corrections +s1xy_correction = interp2(s1_x_bins,s1_y_bins,s1_map_all,s1_x_cm,s1_y_cm,'cubic'); +s1xy_correction(find(s1xy_correction==0))=1.0; s1xy_correction(find(isnan(s1xy_correction)))=1.0; + +% Calculate S2 XY corrections +s2xy_correction = interp2(s2_x_bins,s2_y_bins,s2_map_all,s2x,s2y,'cubic'); +s2xy_correction(find(s2xy_correction==0))=1.0; s2xy_correction(find(isnan(s2xy_correction)))=1.0; + +%-------------------------------------------------------------------------- +% Calculate XYZ corrections +%-------------------------------------------------------------------------- + +s1xyz_correction=s1xy_correction.*s1_z_correction; + +%-------------------------------------------------------------------------- +% Apply corrections +%-------------------------------------------------------------------------- + +s1_phe_both_z=s1_phe_both.*s1_z_correction; +s2_phe_both_z=s2_phe_both.*s2_z_correction; + +% Calculate Energy spectra +s1_phe_both_xyz=s1_phe_both.*s1xyz_correction; +s2_phe_both_xyz=s2_phe_both.*s2_z_correction.*s2xy_correction; + + +%% Make NR Band +max_r=18; +s1_min=0; +s1_max=50; + + +pulse_area_cut=s2_phe_both_xyz>150 & s2_phe_both<10000 & s1_phe_both<300; +NR_beam_cut=inrange(drift_time,[235 280]) & inrange(s2radius_del,[0,max_r]) & ... + (s2y < -8.*s2x+36) & (s2y>-15.*s2x-5); + + + + +DD_cut= clean_cut & pulse_area_cut & NR_beam_cut; + + +%% Make Band Plot + band_sigma=1.28; %90% confidence bounds + + + s2_s1_bin= 1:0.1:5; + NR_bin_size=3; %3 works + index_i=1; + NR_bins=NR_bin_size/2+s1_min:NR_bin_size:s1_max; + lower_bound=ones(size(NR_bins)); + mean_NR_band=ones(size(NR_bins)); + upper_bound=ones(size(NR_bins)); + counts_NR_hist=ones(size(NR_bins)); + NR_sigma=ones(size(NR_bins)); + NR_sigma_sigma=ones(size(NR_bins)); + clear mean_NR_band_err lower_bound_err upper_bound_err lower_bound mean_NR_band upper_bound + +% temporary, for calculating correct E-lifetime + for NR_bin = (NR_bin_size/2)+s1_min:NR_bin_size:(s1_max); %HIST uses bin centers + + + NR_fit_cut=DD_cut & inrange(s1_phe_both_xyz,[NR_bin-NR_bin_size/2,NR_bin+NR_bin_size/2]); + + NR_band_hist=hist(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + counts_NR_hist(index_i)=sum(NR_band_hist); + + Fit_NR=fit(s2_s1_bin',NR_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2_phe_both_xyz(NR_fit_cut)./s1_phe_both_xyz(NR_fit_cut)),s2_s1_bin); + + %band=confint(Fit_NR,.1); +% NR_sigma(index_i)= Fit_NR.c1/sqrt(2); + NR_sigma(index_i)= sqrt(rms_fit.sig2); + NR_sigma_sigma(index_i)=NR_sigma(index_i)/sqrt(2*counts_NR_hist(index_i)); + + lower_bound(index_i)=Fit_NR.b1-NR_sigma(index_i)*band_sigma; + mean_NR_band(index_i)=Fit_NR.b1; + upper_bound(index_i)=Fit_NR.b1+NR_sigma(index_i)*band_sigma; + + temp_err=confint(Fit_NR,0.68); + mean_NR_band_err(index_i)=abs(temp_err(1,2)-Fit_NR.b1); + lower_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + upper_bound_err(index_i)=sqrt(mean_NR_band_err(index_i).^2 + (band_sigma.*abs(temp_err(1,3)-Fit_NR.c1)/sqrt(2)).^2); + + + %mean_NR_band_sim(index_i)=Fit_NR_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + NR_mean_power_fit=fit(NR_bins(NR_bins>2)',mean_NR_band(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_mean_fit{bin_counter}=NR_mean_power_fit.a.*NR_bins.^(NR_mean_power_fit.b); + + NR_lower_power_fit=fit(NR_bins(NR_bins>2)',lower_bound(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_lower_fit{bin_counter}=NR_lower_power_fit.a.*NR_bins.^(NR_lower_power_fit.b); + + NR_upper_power_fit=fit(NR_bins(NR_bins>2)',upper_bound(NR_bins>2)',g,'startpoint',[ 2.5 -.1]); + NR_upper_fit{bin_counter}=NR_upper_power_fit.a.*NR_bins.^(NR_upper_power_fit.b); + + NR_mean_fit_points{bin_counter}=mean_NR_band; + NR_lower_fit_points{bin_counter}=lower_bound; + NR_upper_fit_points{bin_counter}=upper_bound; + + NR_mean_fit_points_err{bin_counter}=mean_NR_band_err; + NR_lower_fit_points_err{bin_counter}=lower_bound_err; + NR_upper_fit_points_err{bin_counter}=upper_bound_err; + + NR_bins_tracked{bin_counter}=NR_bins; + +% bin_counter=bin_counter+1; + + %% + %Make Plot + figure; + hold on + ylabel('Corrected log10(S2/S1)'); xlabel('S1 corrected (Pulse Area Phe)'); + title(sprintf('Run 04 NR Band, R<%d cm',max_r),'fontsize',16,'Interpreter','none'); + myfigview(16); + ylim([0 3.5]);xlim([0 s1_max]); + + colors={[1 0 0],[0 1 0],[0 0 1],[0 0 0],[1 1 0]}; + color_counter=1; + for i=[1:1:5]; +% plot(NR_bins_tracked{i},NR_lower_fit{i},'--','Color',colors{color_counter},'markersize',14,'linewidth',2) +% plot(NR_bins_tracked{i},NR_mean_fit{i},'-','Color',colors{color_counter},'markersize',20,'linewidth',2) +% plot(NR_bins_tracked{i},NR_upper_fit{i},'--','Color',colors{color_counter},'markersize',14,'linewidth',2) +% + tempx=NR_bins_tracked{i}; + tempy=NR_mean_fit_points{i}; + tempy_err=NR_mean_fit_points_err{i}; + + + errorbar(tempx(2:end-2),tempy(2:end-2),tempy_err(2:end-2),'Color',colors{color_counter}) + + color_counter=color_counter+1; + end + + + + %Adding upper and lower band sections + color_counter=1; + for i=[1:1:5]; + % Upper band + tempx=NR_bins_tracked{i}; + tempy=NR_upper_fit_points{i}; + tempy_err=NR_upper_fit_points_err{i}; + + + errorbar(tempx(2:end-2),tempy(2:end-2),tempy_err(2:end-2),'Color',colors{color_counter}) + +% lower band + tempx=NR_bins_tracked{i}; + tempy=NR_lower_fit_points{i}; + tempy_err=NR_lower_fit_points_err{i}; + + + errorbar(tempx(2:end-2),tempy(2:end-2),tempy_err(2:end-2),'Color',colors{color_counter}) + + color_counter=color_counter+1; + end + +%% Plot power law fits + + figure; + hold on + ylabel('Corrected log10(S2/S1)'); xlabel('S1 corrected (Pulse Area Phe)'); + title(sprintf('Run 04 NR Band, R<%d cm',max_r),'fontsize',16,'Interpreter','none'); + myfigview(16); + ylim([0 3.5]);xlim([0 s1_max]); + + colors={[1 0 0],[0 1 0],[0 0 1],[0 0 0],[1 1 0]}; + color_counter=1; + for i=[1:1:5]; + plot(NR_bins_tracked{i},NR_lower_fit{i},'--','Color',colors{color_counter},'markersize',14,'linewidth',2) +% plot(NR_bins_tracked{i},NR_mean_fit{i},'-','Color',colors{color_counter},'markersize',20,'linewidth',2) +% plot(NR_bins_tracked{i},NR_upper_fit{i},'--','Color',colors{color_counter},'markersize',14,'linewidth',2) + + + color_counter=color_counter+1; + end +legend('35-75 uSec','75-125 uSec','125-175 uSec','180-225 uSec','235-280 uSec') + + colors={[1 0 0],[0 1 0],[0 0 1],[0 0 0],[1 1 0]}; + color_counter=1; + for i=[1:1:5]; +% plot(NR_bins_tracked{i},NR_lower_fit{i},'--','Color',colors{color_counter},'markersize',14,'linewidth',2) + plot(NR_bins_tracked{i},NR_mean_fit{i},'-','Color',colors{color_counter},'markersize',20,'linewidth',2) + plot(NR_bins_tracked{i},NR_upper_fit{i},'--','Color',colors{color_counter},'markersize',14,'linewidth',2) + + + color_counter=color_counter+1; + end + \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/QuestionsToAnswer.docx b/CodeForLUX/Matlab/MyScripts/KrypCal_QualityChecks/QuestionsToAnswer.docx new file mode 100644 index 0000000000000000000000000000000000000000..b334db0e50da28ad6b817030b97bf82a3bac71a4 GIT binary patch literal 21412 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 literal 0 HcmV?d00001 diff --git a/CodeForLUX/Matlab/MyScripts/LUG_Queries/get_IQs_LUG_Run04.m b/CodeForLUX/Matlab/MyScripts/LUG_Queries/get_IQs_LUG_Run04.m new file mode 100644 index 0000000..08d5b3d --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/LUG_Queries/get_IQs_LUG_Run04.m @@ -0,0 +1,297 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Purpose: +% This script queries the LUG and produces a number of plots which track S1, S2, and SE +% information over the course of Run04. MUST BE LOGGED INTO SANFORD VPN TO RUN THIS +% +% Author: +% - Richard Knoche +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% Get electron lifetime and 1-sigma from lug + +%get all the IQs that contain the term 'electron_lifetime' and store them +out = MySQLQuery('select values_xml from control.lug_iqs where iq_type = "electron_lifetime" and iq > 8934 and strikeme = 0 and algorithm_version = 2.22;'); + +for j=1:size(out.values_xml,1); % 22(first entry) to last entry + + %read in electron lifetime and 1 sigma, using the XMLParser function + value1 = XMLParser(out.values_xml{j}); + lifetime(j) = value1.iq.correction.fit.electron_attenuation_us; %#ok<*SAGROW> + sigma_lifetime(j) = value1.iq.correction.fit.sigma_electron_attenuation_us; + num_events(j) = value1.iq.correction.fit.number_of_kr_events; + pseduo_lifetime(j) = value1.iq.correction.fit.pseudo_lifetime_both; + corrected_s2_at_top(j) = value1.iq.correction.fit.s2_both_mean_at_top_z; + corrected_s2_at_top_err(j)= value1.iq.correction.fit.s2_both_mean_at_top_err_z; + + %get the date from file name prexix (as Matlab time) + file_date = value1.iq.global.filename_prefix; + Date_MatTime(j) = datenum(file_date(7:19),'yyyymmddTHHMM'); + +end + +%% Make a plot of the electron lifetime, including circulation outages +%Manually putting in low purity data sets which KrypCal didn't process +manual_lifetime = [92.16,99.5, 113.15, 124.3, 131.95, 136.2, 48.75, 59.21, 75.88, 91.67, 102.8,... + 135.3,177.1, 228.5, 232]; +manual_sigma_lifetime = [2.3,1.4, 0.7, 0.8, 1.1, 0.95, 1.5,1.6, 1.41, 1.5, 3.9,... + 1.2,2.28, 2.84, 1.19]; +manual_Date_MatTime = [datenum('20150406T1558','yyyymmddTHHMM'),datenum('20150415T1902','yyyymmddTHHMM'),... + datenum('20150420T1904','yyyymmddTHHMM'),datenum('20150423T1723','yyyymmddTHHMM'),... + datenum('20150426T1216','yyyymmddTHHMM'),datenum('20150429T1606','yyyymmddTHHMM'),datenum('20150503T1043','yyyymmddTHHMM'),... + datenum('20150505T1934','yyyymmddTHHMM'),datenum('20150511T2036','yyyymmddTHHMM'),... + datenum('20150514T2141','yyyymmddTHHMM'),datenum('20150517T1053','yyyymmddTHHMM'),... + datenum('20150520T1940','yyyymmddTHHMM'),datenum('20150523T1945','yyyymmddTHHMM'),... + datenum('20150526T1747','yyyymmddTHHMM'),datenum('20150527T1032','yyyymmddTHHMM')]; + +Date_MatTime_patched = [Date_MatTime,manual_Date_MatTime]; +lifetime_patched = [lifetime,manual_lifetime]; +sigma_lifetime_patched = [sigma_lifetime,manual_sigma_lifetime]; +pseudo_lifetime_patched = [pseduo_lifetime,manual_lifetime]; + + +% Get outage data from SC +if ~exist('xml_settings','var') + xmlsettings = XMLReader('defaultSCSettings.xml'); %using lux.sanfordlab.org as default +end + + +%Get MFC1 Settings -- have to do this in steps, otherwise we run out of memory +%Could do this in a loop.. but copy/paste was easier =) (This code won't change in the future, so not a big deal) +disp('Starting MFC1 Data Collecting') +start_time = (datenum(2014,09,01,0,0,0)-datenum(1970,1,1))*86400; +end_time =(datenum(2014,10,01,0,0,0)-datenum(1970,1,1))*86400; +querystr = sprintf('select * from control.sc_sens_ACRS_Flow where time > %d and time < %d order by time asc',start_time,end_time); +query_result = MySQLQuery(querystr); +MFC1_time = query_result.time; +MFC1_value = query_result.value; +sprintf('Finished Month of %d',09) +clear query_result +for i=10:11; +start_time = (datenum(2014,i,01,0,0,0)-datenum(1970,1,1))*86400; +end_time = (datenum(2014,i+1,01,0,0,0)-datenum(1970,1,1))*86400; +querystr = sprintf('select * from control.sc_sens_ACRS_Flow where time > %d and time < %d order by time asc',start_time,end_time); +query_result = MySQLQuery(querystr); +MFC1_time = [MFC1_time;query_result.time]; +MFC1_value = [MFC1_value;query_result.value]; %#ok<*AGROW> +sprintf('Finished Month of %d',i) +clear query_result +end +start_time = (datenum(2014,12,01,0,0,0)-datenum(1970,1,1))*86400; +end_time = (datenum(2015,1,01,0,0,0)-datenum(1970,1,1))*86400; +querystr = sprintf('select * from control.sc_sens_ACRS_Flow where time > %d and time < %d order by time asc',start_time,end_time); +query_result = MySQLQuery(querystr); +MFC1_time = [MFC1_time;query_result.time]; +MFC1_value = [MFC1_value;query_result.value]; +sprintf('Finished Month of %d',12) +clear query_result +for i=1:12; +start_time = (datenum(2015,i,01,0,0,0)-datenum(1970,1,1))*86400; +end_time = (datenum(2015,i+1,01,0,0,0)-datenum(1970,1,1))*86400; +querystr = sprintf('select * from control.sc_sens_ACRS_Flow where time > %d and time < %d order by time asc',start_time,end_time); +query_result = MySQLQuery(querystr); +MFC1_time = [MFC1_time;query_result.time]; +MFC1_value = [MFC1_value;query_result.value]; +sprintf('Finished Month of %d',i) +clear query_result +end +clear query_result +for i=1:6; +start_time = (datenum(2016,i,01,0,0,0)-datenum(1970,1,1))*86400; +end_time = (datenum(2016,i+1,01,0,0,0)-datenum(1970,1,1))*86400; +querystr = sprintf('select * from control.sc_sens_ACRS_Flow where time > %d and time < %d order by time asc',start_time,end_time); +query_result = MySQLQuery(querystr); +MFC1_time = [MFC1_time;query_result.time]; +MFC1_value = [MFC1_value;query_result.value]; +sprintf('Finished Month of %d',i) +clear query_result +end + +MFC1_date = (MFC1_time./86400 + datenum(1970,1,1)); +noflow_times = (MFC1_value<15); + + +%Plot lifetime with flow outages shaded in +figure +hold on; + +%Loop to turn fill on/off during circulation outages +noflow=1; +first_noflow=1; +last_noflow=0; +for scan=1:length(noflow_times); + if noflow_times(scan)==1; %if we hit a one, record the start date + if first_noflow==1; + start_noflow_date= MFC1_date(scan); + first_noflow = 0; %got the start date, scan through rest without carring about date + last_noflow = 1; %the next zero will be recorded as the end date + end + else + if last_noflow==1; + end_noflow_date = MFC1_date(scan-1); %zero-1 is the end date + last_noflow = 0; + first_noflow = 1; %next one will be recored as the start date + h = fill([start_noflow_date start_noflow_date end_noflow_date end_noflow_date], [0 4000 4000 0],[0.8 0.5 0.5]);%FILL IN THE COLOR FROM START TO END; + set(h,'EdgeColor','None'); + end + end +end +errorbar(Date_MatTime_patched([1:32,34:end]),lifetime_patched([1:32,34:end]),sigma_lifetime_patched([1:32,34:end]),'.k') +errorbar(Date_MatTime_patched([1:32,34:end]),pseudo_lifetime_patched([1:32,34:end]),sigma_lifetime_patched([1:32,34:end]),'.b') +datetick %formats the x axis to be a date label +ylim([0 3000]); +myfigview(16); xlabel('Date'); ylabel('Electron Lifetime (\mus)'); + + +%Make a plot of Z and Field Corrected S2 over time +figure +hold on; +h=fill([735781 735781 736500 736500],[mean(corrected_s2_at_top)-std(corrected_s2_at_top) mean(corrected_s2_at_top)+std(corrected_s2_at_top) mean(corrected_s2_at_top)+std(corrected_s2_at_top) mean(corrected_s2_at_top)-std(corrected_s2_at_top)],[0.8 0.8 0.8]); +set(h,'EdgeColor','None'); +plot([735781 736500],[mean(corrected_s2_at_top) mean(corrected_s2_at_top)],'--b') +errorbar(Date_MatTime([1:32,34:end]),corrected_s2_at_top([1:32,34:end]),corrected_s2_at_top_err([1:32,34:end]),'.k'); +xlabel('Date'); ylabel('Z and Field Corrected Kr S2 Peak (phe)'); +datetick('x',3); +xlim([735831 736500]);ylim([0 25000]); +myfigview(16); + +%% Make a plot of S2 XYZ corrected peaks + +%get all the IQs that contain the term 'electron_lifetime' and store them +clear Date_MatTime +out = MySQLQuery('select values_xml from control.lug_iqs where iq_type = "s2_xy_correction" and iq > 8934 and strikeme = 0 and algorithm_version = 2.22;'); + +for j=1:size(out.values_xml,1); % 22(first entry) to last entry + +%read in electron lifetime and 1 sigma, using the XMLParser function +value1 = XMLParser(out.values_xml{j}); + +xyz_corrected_s2_at_top(j) = value1.iq.correction.fit.s2_both_mean_at_top_xyz; +xyz_corrected_s2_at_top_err(j) = value1.iq.correction.fit.s2_both_mean_at_top_err_xyz; + +%get the date from file name prexix (as Matlab time) +file_date = value1.iq.global.filename_prefix; +Date_MatTime(j) = datenum(file_date(7:19),'yyyymmddTHHMM'); + +end + +figure +hold on; +h=fill([735781 735781 736500 736500],[mean(xyz_corrected_s2_at_top)-std(xyz_corrected_s2_at_top) mean(xyz_corrected_s2_at_top)+std(xyz_corrected_s2_at_top) mean(xyz_corrected_s2_at_top)+std(xyz_corrected_s2_at_top) mean(xyz_corrected_s2_at_top)-std(xyz_corrected_s2_at_top)],[0.8 0.8 0.8]); +set(h,'EdgeColor','None'); +plot([735781 736500],[mean(xyz_corrected_s2_at_top) mean(xyz_corrected_s2_at_top)],'--b') +errorbar(Date_MatTime([1:32,34:end]),xyz_corrected_s2_at_top([1:32,34:end]),xyz_corrected_s2_at_top_err([1:32,34:end]),'.k'); +xlabel('Date');ylabel('Field and KrypCal XYZ Corrected S2 (phe)'); +datetick('x',3); +xlim([735831 736500]);ylim([0 25000]); +myfigview(16); + +%% Make a plot of S1 Z correction IQs +out = MySQLQuery('select values_xml from control.lug_iqs where iq_type = "z_dep_s1_correction" and iq > 8934 and strikeme = 0 and algorithm_version = 2.22;'); +clear Date_MatTime j value1 + +for j=1:size(out.values_xml,1); % 22(first entry) to last entry + +%read in electron lifetime and 1 sigma, using the XMLParser function +value1 = XMLParser(out.values_xml{j}); + +%technically this is not a fit to a gaussian, it is the value of S1 at the center of the detector +%from the Z dependence plot. S2 above is found from a gaussian fit though +corrected_s1_at_center(j) = value1.iq.correction.fit.center_s1_both_z; +corrected_s1_at_center_err(j) = value1.iq.correction.fit.center_s1_both_err_z; + +%get the date from file name prexix (as Matlab time) +file_date = value1.iq.global.filename_prefix; +Date_MatTime(j) = datenum(file_date(7:19),'yyyymmddTHHMM'); + +end + + +%Make a plot of Z and Field Corrected S1 over time +figure +hold on; +h=fill([735781 735781 736500 736500],[mean(corrected_s1_at_center)-std(corrected_s1_at_center) mean(corrected_s1_at_center)+std(corrected_s1_at_center) mean(corrected_s1_at_center)+std(corrected_s1_at_center) mean(corrected_s1_at_center)-std(corrected_s1_at_center)],[0.8 0.8 0.8]); +set(h,'EdgeColor','None'); +plot([735781 736500],[mean(corrected_s1_at_center) mean(corrected_s1_at_center)],'--b') +errorbar(Date_MatTime([1:32,34:end]),corrected_s1_at_center([1:32,34:end]),corrected_s1_at_center_err([1:32,34:end]),'.k'); +xlabel('Date'); ylabel('Z and Field Corrected Kr S1 Peak (phe)'); +datetick('x',3); +xlim([735831 736500]);ylim([150 300]); +myfigview(16); + +%% Make a plot of S1 XYZ correction IQs +clear Date_MatTime +out = MySQLQuery('select values_xml from control.lug_iqs where iq_type = "s1_xy_correction" and iq > 8934 and strikeme = 0 and algorithm_version = 2.22;'); + +for j=1:size(out.values_xml,1); % 22(first entry) to last entry + +%read in electron lifetime and 1 sigma, using the XMLParser function +value1 = XMLParser(out.values_xml{j}); + +xyz_corrected_s1_at_center(j) = value1.iq.correction.fit.center_s1_both_z; %really this is xyz, bad labeling in KrypCal +xyz_corrected_s1_at_center_err(j) = value1.iq.correction.fit.center_s1_both_err_z; + +%get the date from file name prexix (as Matlab time) +file_date = value1.iq.global.filename_prefix; +Date_MatTime(j) = datenum(file_date(7:19),'yyyymmddTHHMM'); + +end + +figure +hold on; +h=fill([735781 735781 736500 736500],[mean(xyz_corrected_s1_at_center)-std(xyz_corrected_s1_at_center) mean(xyz_corrected_s1_at_center)+std(xyz_corrected_s1_at_center) mean(xyz_corrected_s1_at_center)+std(xyz_corrected_s1_at_center) mean(xyz_corrected_s1_at_center)-std(xyz_corrected_s1_at_center)],[0.8 0.8 0.8]); +set(h,'EdgeColor','None'); +plot([735781 736500],[mean(xyz_corrected_s1_at_center) mean(xyz_corrected_s1_at_center)],'--b') +errorbar(Date_MatTime([1:32,34:end]),xyz_corrected_s1_at_center([1:32,34:end]),xyz_corrected_s1_at_center_err([1:32,34:end]),'.k'); +xlabel('Date');ylabel('Field and KrypCal XYZ Corrected S1 (phe)'); +datetick('x',3); +xlim([735831 736500]);ylim([150 300]); +myfigview(16); + +%% Make a plot of SE Size IQs + +out = MySQLQuery('select values_xml from control.lug_iqs where iq_type = "single_e_kr" and strikeme = 0 and algorithm_version = 2.22;'); + +for j=1:size(out.values_xml,1); % 22(first entry) to last entry + + %read in electron lifetime and 1 sigma, using the XMLParser function + value1 = XMLParser(out.values_xml{j}); + + single_e_both(j) = value1.iq.correction.fit.e_mean_both; + error_single_e_both(j) = value1.iq.correction.fit.e_mean_err_both; + single_e_bottom(j) = value1.iq.correction.fit.e_mean_bottom; + error_single_e_bottom(j) = value1.iq.correction.fit.e_mean_err_bottom; + single_e_top(j) = value1.iq.correction.fit.e_mean_top; + error_single_e_top(j) = value1.iq.correction.fit.e_mean_err_top; + + sigma_single_e_both(j) = value1.iq.correction.fit.e_sig_both; + error_sigma_single_e_both(j) = value1.iq.correction.fit.e_sig_err_both; + sigma_single_e_bottom(j) = value1.iq.correction.fit.e_sig_bottom; + error_sigma_single_e_bottom(j) = value1.iq.correction.fit.e_sig_err_bottom; + sigma_single_e_top(j) = value1.iq.correction.fit.e_sig_top; + error_sigma_single_e_top(j) = value1.iq.correction.fit.e_sig_err_top; + + efit_skew_both(j) = value1.iq.correction.fit.e_fit_skew_both; + efit_skew_bottom(j) = value1.iq.correction.fit.e_fit_skew_bottom; + efit_skew_top(j) = value1.iq.correction.fit.e_fit_skew_top; + + + %get the date from file name prexix (as Matlab time) + file_date = value1.iq.global.filename_prefix; + readable_date{j} = file_date; + Date_MatTime(j) = datenum(file_date(7:19),'yyyymmddTHHMM'); + +end + + +figure +hold on; +h=fill([735781 735781 736500 736500],[mean(single_e_both)-std(single_e_both) mean(single_e_both)+std(single_e_both) mean(single_e_both)+std(single_e_both) mean(single_e_both)-std(single_e_both)],[0.8 0.8 0.8]); +set(h,'EdgeColor','None'); +plot([735781 736500],[mean(single_e_both) mean(single_e_both)],'--b') +errorbar(Date_MatTime([1:end]),single_e_both([1:end]),error_single_e_both([1:end]),'.k'); %#ok<*NBRAK> +xlabel('Date');ylabel('SE Size (phe)'); +datetick('x',3); +xlim([735831 736500]);ylim([23 29]); +myfigview(16); diff --git a/CodeForLUX/Matlab/MyScripts/PMTxPMTMethod/KrypCal_S1_PMTxPMT.m b/CodeForLUX/Matlab/MyScripts/PMTxPMTMethod/KrypCal_S1_PMTxPMT.m new file mode 100644 index 0000000..4e8c41b --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/PMTxPMTMethod/KrypCal_S1_PMTxPMT.m @@ -0,0 +1,405 @@ +%Have to use inpainting to avoid zeros in the interpolation +%Can not use cubic interpolation and set NaN -> sum of S1, since there are too many NaN +%The typical S1 correction using a spline that works a little better, so it handles corrections outside the fiducial better +%This improves resoultion inside the fiducial, where we interpolate instead of extrapolate +%This is also much more computationally intensive than the other correction method + +%% Get 3D S1 correction + + +rqs_to_load = {'pulse_area_phe','full_evt_area_phe','peak_area_phe','event_timestamp_samples','aft_t1_samples','event_number','pulse_classification','top_bottom_ratio','livetime_latch_samples','livetime_end_samples','pulse_start_samples','pulse_end_samples','z_drift_samples','x_cm','y_cm','aft_t0_samples','aft_t2_samples','s1s2_pairing','s1_before_s2','x_corrected','y_corrected'}; + +path='C:\\Users\\Richard\\Desktop\\LUX Analysis\\TestData'; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +d.s1s2_pairing(isnan(d.s1s2_pairing))=0; %by default it returns nan when there is no pair +d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + +s1s2_pairing = d.s1s2_pairing; +num_paired_pulses = sum(s1s2_pairing); +num_S1_before_S2 = sum(d.s1_before_s2); + +s1area_bound_min = 150;%150 +s1area_bound_max = 500;%500 + +s2area_bound_min = 1000;%1000 +s2area_bound_max = 20000;%20000 + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + +s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); +s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + +s1_class=d.pulse_classification==1 & s1_area_cut ; %area cut for Kr events +s2_class=d.pulse_classification==2 & s2_area_cut ; + +s1_before_s2_cut = repmat(num_paired_pulses ==2 ,events(1),1) & repmat(num_S1_before_S2 == 1,events(1),1) ... + & repmat(sum(s1_class,1)>=1,events(1),1) & repmat(sum(s2_class,1)==1,events(1),1)... + & cumsum(s1_class+s2_class)<=2 ; % ignore all S1 that happen after the s2 ! + +s1_single_cut = s1_class & s1_before_s2_cut; % +s2_single_cut = s2_class & s1_before_s2_cut; + + +drift_time = d.z_drift_samples(s2_single_cut)/100; +original_drift_time=drift_time; + + + + + %%%% Detector Edge Detection %%%%%%% + +%Finding R_cut +edge_r_max=sqrt(4000*(25^2)/length(drift_time)); + +if edge_r_max <2 + edge_r_max=2; +end + +% edge_r_cut=inrange(drift_radius,[0,edge_r_max]); +bin_size=2; + +drift_time_bins=0:bin_size:1000; +drift_time_hist=hist(drift_time,drift_time_bins); + + + +%Finds first 10 consecutive zeros... replace this with first 10 less than +%10% of average at start +zero_count=zeros(length(drift_time_hist)); +mean_drift_time=mean(drift_time_hist(30:80)); + + +for i=2:length(drift_time_hist) + if drift_time_hist(i-1)< 0.50*mean_drift_time; + zero_count(i)=1+zero_count(i-1); + if zero_count(i)==10; + det_edge=(i-11)*bin_size; + end + end +end + + +num_bins=(length(drift_time)/900)^(1/3); +r_max=25; +xy_step=r_max*2/(num_bins-1);% Change to depend on size of pulse_area_phe +s1xbins=-r_max+xy_step/2:xy_step:r_max-xy_step/2; +s1ybins=-r_max+xy_step/2:xy_step:r_max-xy_step/2; +z_step=ceil( (0.95*det_edge-0.05*det_edge)/num_bins ); %xy_step size about = 30 mm, to create 16 z bins +s1zbins=floor(0.05*det_edge):z_step:floor(0.05*det_edge)+z_step*num_bins; %20 us + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +disp('Calculating light maps for each PMT Group '); + +% norm_s1_both_xyz=cell(122,1); % CHANGE THIS TO WORK WITH GROUPS +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +tic + +s2=d.pulse_area_phe(s2_single_cut); +s2x = d.x_cm(s2_single_cut); +s2y = d.y_cm(s2_single_cut); +radius=sqrt(s2x.^2+s2y.^2); + + +s2=s2(radius<25); +s2_cut=inrange(s2,[200 30000]);%cut on appropriate S2 size + + +s2x = s2x(radius<25); +s2y = s2y(radius<25); + +drift_time=original_drift_time(radius<25); +drift_time=drift_time(s2_cut); +dT=drift_time; + + +xc=s2x(s2_cut); +yc=s2y(s2_cut); + +%%%%%%%%%%%%%%%%%%%%%% +s1_top=d.pulse_area_phe(s1_single_cut); +s1_top=s1_top(radius<25); +s1_top=s1_top(s2_cut); + +hold_s1_top=s1_top; +% bin=5; +% x=100:bin:500; %Set up S1 energy bins +% x=x'; + + +clear q temp_norm_s1_both_xyz center_phe_both_xyz Sigma_S1_3D_bottom Sigma_S1_3D_both Sig_b Sig Mean_S1_3D_bottom Mean_S1_3D_both; + +i_min=-r_max+xy_step; %#ok<*NASGU> +j_min=-r_max+xy_step; +Mean_S1_3D=zeros(length(s1xbins),length(s1ybins),length(s1zbins)); + +for k = s1zbins; % out to 485 mm % start at 5 mm. steps of 30 mm + for i = (-r_max+xy_step):xy_step:r_max %map to rows going down (y_cm) + for j = (-r_max+xy_step):xy_step:r_max %map columns across (x_cm) + + l=int8(i/xy_step+(r_max)/xy_step); %real y from 1:25 + m=int8(j/xy_step+(r_max)/xy_step); % real x from 1:25 + n=(k-floor(0.05*det_edge))/z_step + 1; %z from 1:16 + + + clear q; + q = xc(j-xy_step) & yc(i-xy_step) & inrange(dT,[(k-z_step/2) , (k+z_step/2)]); %no 0th element + + if (length(s1_top(q)) >= 30) + Mean_S1_3D(l,m,n)=mean(s1_top(q)); + clear temp_s1 + else + + Mean_S1_3D(l,m,n)=0; + end + + if(strcmp(num2str(Mean_S1_3D(l,m,n)),'NaN')) + Mean_S1_3D(l,m,n)=0; + end + + end + end +end + +Mean_S1_3D(Mean_S1_3D==0)=nan; +Mean_S1_3D=inpaint_nans3(Mean_S1_3D); + +summed_center=interp3(s1xbins,s1ybins,s1zbins,Mean_S1_3D,0,0,(det_edge-4)/2,'spline'); +clear Mean_S1_3D +%%%%%%%%%%%%%%%%%%%%%%%% + +counter=1; +energy_estimate=zeros(length(xc(dT>(floor(0.05*det_edge)-z_step/2) & dT<=(floor(0.05*det_edge)+z_step*10+z_step/2))),1); +variance=zeros(length(xc(dT>(floor(0.05*det_edge)-z_step/2) & dT<=(floor(0.05*det_edge)+z_step*10+z_step/2))),1); + +for jj=1:122; + + if jj ~= 5 && jj ~= 32 && jj~= 93; + clear peak_areas s1 temp_energy_est temp_var normalized_s1 + peak_areas=d.peak_area_phe(:,jj,:); + +drift_time=original_drift_time(radius<25); +drift_time=drift_time(s2_cut); +dT=drift_time; + +xc=s2x(s2_cut); +yc=s2y(s2_cut); + s1=peak_areas(s1_single_cut); + s1=s1(radius<25); + s1=s1(s2_cut); + s1(s1<=0)=0; + + + Mean_S1_3D=zeros(length(s1xbins),length(s1ybins),length(s1zbins)); +% stand_dev=zeros(length(s1),1); +clear q temp_norm_s1_both_xyz center_phe_both_xyz Sigma_S1_3D_bottom Sigma_S1_3D_both Sig_b Sig Mean_S1_3D_bottom Mean_S1_3D_both; + +for k = s1zbins; % out to 485 mm % start at 5 mm. steps of 30 mm + for i = (-r_max+xy_step):xy_step:r_max %map to rows going down (y_cm) + for j = (-r_max+xy_step):xy_step:r_max %map columns across (x_cm) + + clear l m n + l=int8(i/xy_step+(r_max)/xy_step); %real y from 1:25 + m=int8(j/xy_step+(r_max)/xy_step); % real x from 1:25 + n=int8((k-floor(0.05*det_edge))/z_step + 1); %z from 1:16 + + clear q temp_s1; + q = xc<=j & xc>(j-xy_step) & yc<=i & yc>(i-xy_step) & dT <=(k+z_step/2) & dT>(k-z_step/2); %no 0th element + temp_s1=s1(q); + + if (length(temp_s1(temp_s1>0)) >= 30) + Mean_S1_3D(l,m,n)=mean(temp_s1(temp_s1>0)); + else + Mean_S1_3D(l,m,n)=0; + end + + end + end +end +% +% center_phe_both_xyz=interp3(s1xbins,s1ybins,s1zbins,Mean_S1_3D,0,0,(det_edge-4)/2,'spline');%Normalize to the center (x=y=0. dT=160us) +center_phe_both_xyz=summed_center; + +Mean_S1_3D(Mean_S1_3D==0)=nan; +Mean_S1_3D=inpaint_nans3(Mean_S1_3D); + +norm_s1=center_phe_both_xyz./Mean_S1_3D; %Normalize to center (x=y=0. dT=160) +norm_s1(isinf(norm_s1))=1;%remove infinity. no correction outside 25cm +norm_s1(isnan(norm_s1))=1;%remove nan. no correction outside 25cm + +normalized_s1=s1.*interp3(s1xbins,s1ybins,s1zbins,norm_s1,xc,yc,dT,'spline'); + +clear q temp_norm_s1_both_xyz center_phe_both_xyz Sigma_S1_3D_bottom Sigma_S1_3D_both Sig_b Sig Mean_S1_3D_bottom Mean_S1_3D; + +Mean_S1_3D=zeros(length(s1xbins),length(s1ybins),length(s1zbins)); +stand_dev=zeros(length(s1xbins),length(s1ybins),length(s1zbins)); + +for k = s1zbins; % out to 485 mm % start at 5 mm. steps of 30 mm + for i = (-r_max+xy_step):xy_step:r_max %map to rows going down (y_cm) + for j = (-r_max+xy_step):xy_step:r_max %map columns across (x_cm) + + l=int8(i/xy_step+(r_max)/xy_step); %real y from 1:25 + m=int8(j/xy_step+(r_max)/xy_step); % real x from 1:25 + n=int8((k-floor(0.05*det_edge))/z_step + 1); %z from 1:16 + + clear q temp_s1; + q = xc<=j & xc>(j-xy_step) & yc<=i & yc>(i-xy_step) & dT <=(k+z_step/2) & dT>(k-z_step/2); %no 0th element + temp_s1=normalized_s1(q); + + if (length(temp_s1(temp_s1>0)) >= 30) + Mean_S1_3D(l,m,n)=mean(temp_s1(temp_s1>0)); + stand_dev(l,m,n)=std(normalized_s1(q)); + else + Mean_S1_3D(l,m,n)=0; + stand_dev(l,m,n)=0; + end + + end + end +end + +Mean_S1_3D(Mean_S1_3D==0)=nan; +Mean_S1_3D=inpaint_nans3(Mean_S1_3D); + +stand_dev(stand_dev==0)=nan; +stand_dev=inpaint_nans3(stand_dev); + +temp_energy_est=summed_center*normalized_s1./interp3(s1xbins,s1ybins,s1zbins,Mean_S1_3D,xc,yc,dT,'spline'); +temp_var=interp3(s1xbins,s1ybins,s1zbins,stand_dev,xc,yc,dT,'spline').^2; + +energy_estimate(:,counter)=temp_energy_est; %Only events where the bin had >30 nonzero events for the PMT have nonzero entries. If the PMT doesn't see >30 nonzero events, we say it didn't see anything at all +variance(:,counter)=temp_var; + +counter=counter+1; + end +disp(['Finished PMT ' num2str(jj)]); +end + + +disp('Calculating weighted arethmetic means') +s1_corrected=zeros(length(s1),1); +for i=1:length(normalized_s1); + clear temp_energy_estimate temp_variance + + temp_energy_estimate=energy_estimate(i,:); + temp_variance=variance(i,:); + + temp_variance(temp_energy_estimate==0)=[]; + temp_energy_estimate(temp_energy_estimate==0)=[]; + + +s1_corrected(i)=sum(temp_energy_estimate./temp_variance)/sum(1./temp_variance); %should peak at summed_center keV +end + +%%% SAVE WORKSPACE %%%%%%% +% disp('Saving Workspace'); +% pause(0.1); +% save('Latest_S1_PMTxPMT_v1_TestingWeights'); +% pause(0.1); + +%% KrypCal Method -- added 5/19/2016 + +xc=s2x; +yc=s2y; +dT=drift_time; + +clear q temp_norm_s1_both_xyz center_phe_both_xyz Sigma_S1_3D_bottom Sigma_S1_3D_both Sig_b Sig Mean_S1_3D_bottom Mean_S1_3D_both; +bin=0.1; %was 5 +x=100:bin:500; +x=x'; +cut_fit=x>100 & x<500; + + +i_min=-r_max+xy_step; +j_min=-r_max+xy_step; +s1_phe_both=d.pulse_area_phe(s1_single_cut); +s1_phe_both=s1_phe_both(radius<25); +s1_phe_both=s1_phe_both(s2_cut); + + +for k = s1zbins; % out to 485 mm % start at 5 mm. steps of 30 mm + for i = i_min:xy_step:r_max %map to rows going down (y_cm) + for j = j_min:xy_step:r_max %map columns across (x_cm) + l=int8(i/xy_step+(r_max)/xy_step); %real y from 1:25 + m=int8(j/xy_step+(r_max)/xy_step); % real x from 1:25 + n=(k-floor(0.05*det_edge))/z_step + 1; %z from 1:16 + + %sort, and make the cut. using the variable q + q = xc(j-xy_step) & yc(i-xy_step) & inrange(dT,[(k-z_step/2) , (k+z_step/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + + % Hist + hist_q = hist(s1_phe_both(q) ,x)'/bin; + + %Count the number of events per bin + Count_S1_3D(l,m,n)=sum(hist_q)*bin; %#ok<*SAGROW> + + if (Count_S1_3D(l,m,n) >= 30) % at least 30 counts before fitting. + + yqfit=hist_q; + amp_start=max(yqfit(cut_fit)); + mean_start=sum(yqfit(cut_fit).*x(cut_fit))/sum(yqfit(cut_fit)); + sigma_start=std(yqfit(cut_fit).*x(cut_fit)); + Fit_q= fit(x(cut_fit),yqfit(cut_fit),'gauss1','start',[amp_start mean_start sigma_start]); + + %Peak location (mean) + Mean_S1_3D_both(l,m,n)=Fit_q.b1; + + %1-sigma of peak position + Sig_b=Fit_q.c1/sqrt(2)/sqrt(Count_S1_3D(l,m,n)); + + + %error checking + if(strcmp(num2str(Sig_b),'NaN')) + Mean_S1_3D_both(l,m,n)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_3D_both(l,m,n)=Sig_b; + + + else %not enough stats to do the fit + + Fit_q= 0; + %Find Peak location + Mean_S1_3D_both(l,m,n)=0; + %1-sigma + Sigma_S1_3D_both(l,m,n)=0; + end + + end + end +end + +s1xbins=-r_max+xy_step/2:xy_step:r_max-xy_step/2; +s1ybins=-r_max+xy_step/2:xy_step:r_max-xy_step/2; + +center_phe_both_xyz=interp3(s1xbins,s1ybins,s1zbins,Mean_S1_3D_both,0,0,(det_edge-4)/2,'spline');%Normalize to the center (x=y=0. dT=160us) +norm_s1_both_xyz=center_phe_both_xyz./Mean_S1_3D_both; %Normalize to center (x=y=0. dT=160) +norm_s1_both_xyz(isinf(norm_s1_both_xyz))=1;%remove infinity. no correction outside 25cm +norm_s1_both_xyz(isnan(norm_s1_both_xyz))=1;%remove nan. no correction outside 25cm + +s1_phe_both_xyz=s1_phe_both.*interp3(s1xbins,s1ybins,s1zbins,norm_s1_both_xyz,s2x,s2y,dT,'spline'); + + +%Compare the two results +figure +step(s1_corrected(radius(s2_cut)<18 & inrange(dT,[40 260])),[150:1:600],'-r') %#ok<*NBRAK> +hold on; +step(s1_phe_both_xyz(radius(s2_cut)<18 & inrange(dT,[40 260])),[150:1:600],'-k') +xlabel('Corrected S1 (phe)'); ylabel('Count'); +myfigview(20); +legend('PMTxPMT Map','KrypCal'); + + +%Compare the two results with No Fiducial +figure +step(s1_corrected,[150:1:600],'-r') +hold on; +step(s1_phe_both_xyz,[150:1:600],'-k') +xlabel('Corrected S1 (phe)'); ylabel('Count'); +myfigview(20); +legend('PMTxPMT Map','KrypCal'); diff --git a/CodeForLUX/Matlab/MyScripts/PMTxPMTMethod/KrypCal_S1_PMTxPMT_MeanWeights.m b/CodeForLUX/Matlab/MyScripts/PMTxPMTMethod/KrypCal_S1_PMTxPMT_MeanWeights.m new file mode 100644 index 0000000..c5a8635 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/PMTxPMTMethod/KrypCal_S1_PMTxPMT_MeanWeights.m @@ -0,0 +1,357 @@ +%Have to use inpainting to avoid zeros in the interpolation +%Can not use cubic interpolation and set NaN -> sum of S1, since there are too many NaN +%The typical S1 correction using a spline that works a little better, so it handles corrections outside the fiducial better +%This improves resoultion inside the fiducial, where we interpolate instead of extrapolate +%This is also much more computationally intensive than the other correction method + +%% Get 3D S1 correction + + +rqs_to_load = {'pulse_area_phe','full_evt_area_phe','peak_area_phe','event_timestamp_samples','aft_t1_samples','event_number','pulse_classification','top_bottom_ratio','livetime_latch_samples','livetime_end_samples','pulse_start_samples','pulse_end_samples','z_drift_samples','x_cm','y_cm','aft_t0_samples','aft_t2_samples','s1s2_pairing','s1_before_s2','x_corrected','y_corrected'}; + +path='C:\\Users\\Richard\\Desktop\\LUX Analysis\\TestData'; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +d.s1s2_pairing(isnan(d.s1s2_pairing))=0; %by default it returns nan when there is no pair +d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + +s1s2_pairing = d.s1s2_pairing; +num_paired_pulses = sum(s1s2_pairing); +num_S1_before_S2 = sum(d.s1_before_s2); + +s1area_bound_min = 150;%150 +s1area_bound_max = 500;%500 + +s2area_bound_min = 1000;%1000 +s2area_bound_max = 20000;%20000 + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + +s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); +s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + +s1_class=d.pulse_classification==1 & s1_area_cut ; %area cut for Kr events +s2_class=d.pulse_classification==2 & s2_area_cut ; + +s1_before_s2_cut = repmat(num_paired_pulses ==2 ,events(1),1) & repmat(num_S1_before_S2 == 1,events(1),1) ... + & repmat(sum(s1_class,1)>=1,events(1),1) & repmat(sum(s2_class,1)==1,events(1),1)... + & cumsum(s1_class+s2_class)<=2 ; % ignore all S1 that happen after the s2 ! + +s1_single_cut = s1_class & s1_before_s2_cut; % +s2_single_cut = s2_class & s1_before_s2_cut; + + +drift_time = d.z_drift_samples(s2_single_cut)/100; +original_drift_time=drift_time; + + +%%%% Detector Edge Detection %%%%%%% + +%Finding R_cut +edge_r_max=sqrt(4000*(25^2)/length(drift_time)); + +if edge_r_max <2 + edge_r_max=2; +end + +% edge_r_cut=inrange(drift_radius,[0,edge_r_max]); +bin_size=2; + +drift_time_bins=0:bin_size:1000; +drift_time_hist=hist(drift_time,drift_time_bins); + + + +%Finds first 10 consecutive zeros... replace this with first 10 less than +%10% of average at start +zero_count=zeros(length(drift_time_hist)); +mean_drift_time=mean(drift_time_hist(30:80)); + + +for i=2:length(drift_time_hist) + if drift_time_hist(i-1)< 0.50*mean_drift_time; + zero_count(i)=1+zero_count(i-1); + if zero_count(i)==10; + det_edge=(i-11)*bin_size; + end + end +end + + +num_bins=(length(drift_time)/900)^(1/3); +r_max=25; +xy_step=r_max*2/(num_bins-1);% Change to depend on size of pulse_area_phe +s1xbins=-r_max+xy_step/2:xy_step:r_max-xy_step/2; +s1ybins=-r_max+xy_step/2:xy_step:r_max-xy_step/2; +z_step=ceil( (0.95*det_edge-0.05*det_edge)/num_bins ); %xy_step size about = 30 mm, to create 16 z bins +s1zbins=floor(0.05*det_edge):z_step:floor(0.05*det_edge)+z_step*num_bins; %20 us + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +disp('Calculating light maps for each PMT Group '); + +tic + +s2=d.pulse_area_phe(s2_single_cut); +s2x = d.x_cm(s2_single_cut); +s2y = d.y_cm(s2_single_cut); +radius=sqrt(s2x.^2+s2y.^2); + + +s2=s2(radius<25); +s2_cut=inrange(s2,[200 30000]);%cut on appropriate S2 size + + +s2x = s2x(radius<25); +s2y = s2y(radius<25); + +drift_time=original_drift_time(radius<25); +drift_time=drift_time(s2_cut); +dT=drift_time; + + +xc=s2x(s2_cut); +yc=s2y(s2_cut); + +%%%%%%%%%%%%%%%%%%%%%% +s1_top=d.pulse_area_phe(s1_single_cut); +s1_top=s1_top(radius<25); +s1_top=s1_top(s2_cut); + +hold_s1_top=s1_top; + +clear q temp_norm_s1_both_xyz center_phe_both_xyz Sigma_S1_3D_bottom Sigma_S1_3D_both Sig_b Sig Mean_S1_3D_bottom Mean_S1_3D_both; + +i_min=-r_max+xy_step; %#ok<*NASGU> +j_min=-r_max+xy_step; +Mean_S1_3D=zeros(length(s1xbins),length(s1ybins),length(s1zbins)); + +for k = s1zbins; % out to 485 mm % start at 5 mm. steps of 30 mm + for i = (-r_max+xy_step):xy_step:r_max %map to rows going down (y_cm) + for j = (-r_max+xy_step):xy_step:r_max %map columns across (x_cm) + + l=int8(i/xy_step+(r_max)/xy_step); %real y from 1:25 + m=int8(j/xy_step+(r_max)/xy_step); % real x from 1:25 + n=(k-floor(0.05*det_edge))/z_step + 1; %z from 1:16 + + + clear q; + q = xc(j-xy_step) & yc(i-xy_step) & inrange(dT,[(k-z_step/2) , (k+z_step/2)]); %no 0th element + + if (length(s1_top(q)) >= 30) + Mean_S1_3D(l,m,n)=mean(s1_top(q)); + clear temp_s1 + else + + Mean_S1_3D(l,m,n)=0; + end + + if(strcmp(num2str(Mean_S1_3D(l,m,n)),'NaN')) + Mean_S1_3D(l,m,n)=0; + end + + + end + end +end + +Mean_S1_3D(Mean_S1_3D==0)=nan; +Mean_S1_3D=inpaint_nans3(Mean_S1_3D); + +summed_center=interp3(s1xbins,s1ybins,s1zbins,Mean_S1_3D,0,0,(det_edge-4)/2,'spline'); +clear Mean_S1_3D +%%%%%%%%%%%%%%%%%%%%%%%% + +counter=1; +energy_estimate=zeros(length(xc(dT>(floor(0.05*det_edge)-z_step/2) & dT<=(floor(0.05*det_edge)+z_step*10+z_step/2))),1); +variance=zeros(length(xc(dT>(floor(0.05*det_edge)-z_step/2) & dT<=(floor(0.05*det_edge)+z_step*10+z_step/2))),1); +means=zeros(length(xc(dT>(floor(0.05*det_edge)-z_step/2) & dT<=(floor(0.05*det_edge)+z_step*10+z_step/2))),1); + +for jj=1:122; + + if jj ~= 5 && jj ~= 32 && jj~= 93; + clear peak_areas s1 temp_energy_est temp_var normalized_s1 + peak_areas=d.peak_area_phe(:,jj,:); + + drift_time=original_drift_time(radius<25); + drift_time=drift_time(s2_cut); + dT=drift_time; + + xc=s2x(s2_cut); + yc=s2y(s2_cut); + s1=peak_areas(s1_single_cut); + s1=s1(radius<25); + s1=s1(s2_cut); + s1(s1<=0)=0; + + + clear q temp_norm_s1_both_xyz center_phe_both_xyz Sigma_S1_3D_bottom Sigma_S1_3D_both Sig_b Sig Mean_S1_3D_bottom Mean_S1_3D; + + Mean_S1_3D=zeros(length(s1xbins),length(s1ybins),length(s1zbins)); + stand_dev=zeros(length(s1xbins),length(s1ybins),length(s1zbins)); + + for k = s1zbins; % out to 485 mm % start at 5 mm. steps of 30 mm + for i = (-r_max+xy_step):xy_step:r_max %map to rows going down (y_cm) + for j = (-r_max+xy_step):xy_step:r_max %map columns across (x_cm) + + l=int8(i/xy_step+(r_max)/xy_step); %real y from 1:25 + m=int8(j/xy_step+(r_max)/xy_step); % real x from 1:25 + n=int8((k-floor(0.05*det_edge))/z_step + 1); %z from 1:16 + + clear q temp_s1; + q = xc<=j & xc>(j-xy_step) & yc<=i & yc>(i-xy_step) & dT <=(k+z_step/2) & dT>(k-z_step/2); %no 0th element + temp_s1=s1(q); + + if (length(temp_s1(temp_s1>0)) >= 30) + Mean_S1_3D(l,m,n)=mean(temp_s1(temp_s1>0)); + stand_dev(l,m,n)=std(s1(q)); + else + Mean_S1_3D(l,m,n)=0; + stand_dev(l,m,n)=0; + end + + end + end + end + + Mean_S1_3D(Mean_S1_3D==0)=nan; + Mean_S1_3D=inpaint_nans3(Mean_S1_3D); + + stand_dev(stand_dev==0)=nan; + stand_dev=inpaint_nans3(stand_dev); + + temp_energy_est=summed_center*s1./interp3(s1xbins,s1ybins,s1zbins,Mean_S1_3D,xc,yc,dT,'spline'); + temp_var=interp3(s1xbins,s1ybins,s1zbins,stand_dev,xc,yc,dT,'spline').^2; + temp_means=interp3(s1xbins,s1ybins,s1zbins,Mean_S1_3D,xc,yc,dT,'spline').^2; + + energy_estimate(:,counter)=temp_energy_est; %Only events where the bin had >30 nonzero events for the PMT have nonzero entries. If the PMT doesn't see >30 nonzero events, we say it didn't see anything at all + variance(:,counter)=temp_var; + means(:,counter)=temp_means; + + counter=counter+1; + end +disp(['Finished PMT ' num2str(jj)]); +end + + +disp('Calculating weighted arethmetic means') +s1_corrected=zeros(length(s1),1); +for i=1:length(s1); + clear temp_energy_estimate temp_variance + + temp_energy_estimate=energy_estimate(i,:); + temp_variance=variance(i,:); + temp_means=means(i,:); + + temp_variance(temp_energy_estimate==0)=[]; + temp_means(temp_energy_estimate==0)=[]; + temp_energy_estimate(temp_energy_estimate==0)=[]; + +s1_corrected(i)=sum(temp_energy_estimate.*((temp_means.^2)./temp_variance))./sum((temp_means.^2)./temp_variance); %should peak at summed_center keV +end + + +%% KrypCal Method -- added 5/19/2016 + +xc=s2x; +yc=s2y; +dT=drift_time; + +clear q temp_norm_s1_both_xyz center_phe_both_xyz Sigma_S1_3D_bottom Sigma_S1_3D_both Sig_b Sig Mean_S1_3D_bottom Mean_S1_3D_both; +bin=0.1; %was 5 +x=100:bin:500; +x=x'; +cut_fit=x>100 & x<500; + + +i_min=-r_max+xy_step; +j_min=-r_max+xy_step; +s1_phe_both=d.pulse_area_phe(s1_single_cut); +s1_phe_both=s1_phe_both(radius<25); +s1_phe_both=s1_phe_both(s2_cut); + + +for k = s1zbins; % out to 485 mm % start at 5 mm. steps of 30 mm + for i = i_min:xy_step:r_max %map to rows going down (y_cm) + for j = j_min:xy_step:r_max %map columns across (x_cm) + l=int8(i/xy_step+(r_max)/xy_step); %real y from 1:25 + m=int8(j/xy_step+(r_max)/xy_step); % real x from 1:25 + n=(k-floor(0.05*det_edge))/z_step + 1; %z from 1:16 + + %sort, and make the cut. using the variable q + q = xc(j-xy_step) & yc(i-xy_step) & inrange(dT,[(k-z_step/2) , (k+z_step/2)]); %no 0th element! + %swap x,y due to matrix x-row, y-column definition + + % Hist + hist_q = hist(s1_phe_both(q) ,x)'/bin; + + %Count the number of events per bin + Count_S1_3D(l,m,n)=sum(hist_q)*bin; %#ok<*SAGROW> + + if (Count_S1_3D(l,m,n) >= 30) % at least 30 counts before fitting. + + yqfit=hist_q; + amp_start=max(yqfit(cut_fit)); + mean_start=sum(yqfit(cut_fit).*x(cut_fit))/sum(yqfit(cut_fit)); + sigma_start=std(yqfit(cut_fit).*x(cut_fit)); + Fit_q= fit(x(cut_fit),yqfit(cut_fit),'gauss1','start',[amp_start mean_start sigma_start]); + + %Peak location (mean) + Mean_S1_3D_both(l,m,n)=Fit_q.b1; + + %1-sigma of peak position + Sig_b=Fit_q.c1/sqrt(2)/sqrt(Count_S1_3D(l,m,n)); + + + %error checking + if(strcmp(num2str(Sig_b),'NaN')) + Mean_S1_3D_both(l,m,n)=0; + Sig_b=0; + end + + %uncertainty in mean + Sigma_S1_3D_both(l,m,n)=Sig_b; + + else %not enough stats to do the fit + + Fit_q= 0; + %Find Peak location + Mean_S1_3D_both(l,m,n)=0; + %1-sigma + Sigma_S1_3D_both(l,m,n)=0; + end + + end + end +end + +s1xbins=-r_max+xy_step/2:xy_step:r_max-xy_step/2; +s1ybins=-r_max+xy_step/2:xy_step:r_max-xy_step/2; + +center_phe_both_xyz=interp3(s1xbins,s1ybins,s1zbins,Mean_S1_3D_both,0,0,(det_edge-4)/2,'spline');%Normalize to the center (x=y=0. dT=160us) +norm_s1_both_xyz=center_phe_both_xyz./Mean_S1_3D_both; %Normalize to center (x=y=0. dT=160) +norm_s1_both_xyz(isinf(norm_s1_both_xyz))=1;%remove infinity. no correction outside 25cm +norm_s1_both_xyz(isnan(norm_s1_both_xyz))=1;%remove nan. no correction outside 25cm + +s1_phe_both_xyz=s1_phe_both.*interp3(s1xbins,s1ybins,s1zbins,norm_s1_both_xyz,s2x,s2y,dT,'spline'); + + +%Compare the two results +figure +step(s1_corrected(radius(s2_cut)<18 & inrange(dT,[40 260])),[150:1:600],'-r') %#ok<*NBRAK> +hold on; +step(s1_phe_both_xyz(radius(s2_cut)<18 & inrange(dT,[40 260])),[150:1:600],'-k') +xlabel('Corrected S1 (phe)'); ylabel('Count'); +myfigview(20); +legend('PMTxPMT Map','KrypCal'); + + +%Compare the two results with No Fiducial +figure +step(s1_corrected,[150:1:600],'-r') +hold on; +step(s1_phe_both_xyz,[150:1:600],'-k') +xlabel('Corrected S1 (phe)'); ylabel('Count'); +myfigview(20); +legend('PMTxPMT Map','KrypCal'); diff --git a/CodeForLUX/Matlab/MyScripts/PMTxPMTMethod/SimulatedS1.m b/CodeForLUX/Matlab/MyScripts/PMTxPMTMethod/SimulatedS1.m new file mode 100644 index 0000000..623b79c --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/PMTxPMTMethod/SimulatedS1.m @@ -0,0 +1,386 @@ +%Need to run this with Gaussian and Poissons Data +%Mainly interested in the result of KrypCal, norm_finalweights, and nonorms +%Everything should be essentially the same under poisson stats, and should be better with PMTxPMT method without poisson stats + +PMT_Radius=2.5; %5cm diameter PMTs + +disp('Setting Up PMT Coords') +%Set up hexagonal pattern of PMTs +PMT_X_Spacing=(50-PMT_Radius*18)/10; +PMT_Y_Spacing=(50-PMT_Radius*18)/10; +PMT_row=[1,2,3,4,2,3,4,3,4,4,5,6,7,8,5,6,7,5,6,5,9,9,9,9,8,8,8,7,7,6,9,8,7,6,8,7,6,7,6,6,5,4,3,2,5,4,3,5,4,5,1,1,1,1,2,2,2,3,3,4,1,2,3,4,2,3,4,3,4,4,5,6,7,8,5,6,7,5,6,5,9,9,9,9,8,8,8,7,7,6,9,8,7,6,8,7,6,7,6,6,5,4,3,2,5,4,3,5,4,5,1,1,1,1,2,2,2,3,3,4,5,5]; +PMT_column=[5,4,3,2,6,5,4,7,6,8,1,2,3,4,3,4,5,5,6,7,5,7,9,11,6,8,10,7,9,8,13,14,15,16,12,13,14,11,12,10,17,16,15,14,15,14,13,13,12,11,13,11,9,7,12,10,8,11,9,10,5,4,3,2,6,5,4,7,6,8,1,2,3,4,3,4,5,5,6,7,5,7,9,11,6,8,10,7,9,8,13,14,15,16,12,13,14,11,12,10,17,16,15,14,15,14,13,13,12,11,13,11,9,7,12,10,8,11,9,10,9,9]; +PMT_Y_Coord=(5-PMT_row)*PMT_Radius*sqrt(3)+((5-PMT_row)/2)*PMT_Y_Spacing; +PMT_X_Coord=(PMT_column-9)*PMT_Radius+((PMT_column-9)/2)*PMT_X_Spacing; + + %Detector height is 360 microseconds here +PMT_Z_Coord([1:60,121])=360*.151; %360 uSec converted to cm +PMT_Z_Coord([61:120,122])=0; + +%Assign random QE to each PMT from 0.3 to 0.4 +PMT_QE=0.3 + (0.4-0.3).*rand(122,1); + +%Generate an S1 event from a Gaussian distibution center at 10,000 with a +%Sigma of 667 (correspond to a Sigma of 20 and Mean of 300 in real data) +%and assign a x,y,z coord + + +Gaussian_Noise_Sigma=0.5; +% num_events=1000000; +num_events=300000; + +disp('Setting Up Events') +Event_Signal=10000;%normrnd(10000,670,1,num_events); used to be 500 +Event_X_Coord=-25 + 50.*rand(num_events,1); +Event_Y_Coord=-25 + 50.*rand(num_events,1); +Event_Z_Coord=10+220.*rand(num_events,1).*0.151; %360 uSec Z Coverted into cm, events cant be within 10 cm of PMTs + +%Distribute the signal among all PMTs, giving each PMT a portion of the +%gaussian center divided by ((delta theta + delta phi)/360*2) which is the +%fraction of radians the PMT face covers over a sphere from the location of +%the event + +Delta_Theta=zeros(num_events,122); +Delta_Phi=zeros(num_events,122); +PMT_Signal=zeros(num_events,122); +PMT_Signal2=zeros(num_events,122); +PMT_Distance=zeros(num_events,122); +Poisson_PMT_Signal=zeros(num_events,122); +Gaussian_Noise_PMT_Signal=zeros(num_events,122); + +disp('Setting Up Unattenuated PMT Signals') +% Setting up PMT Signals + +for jj=1:122 + + v_center = [Event_X_Coord(:)-PMT_X_Coord(jj),Event_Y_Coord(:)-PMT_Y_Coord(jj),Event_Z_Coord(:)-PMT_Z_Coord(jj)]; % Vector from B to A + + if jj<=60 || jj==121 + v_norm=[0,0,-1]; + v_norm=repmat(v_norm,num_events,1); + else + v_norm=[0,0,1]; + v_norm=repmat(v_norm,num_events,1); + end + + Delta_Phi(:,jj) = (180/pi).*atan2( sqrt(sum(cross(v_center(:,:),v_norm(:,:),2).^2,2)),dot(v_norm,v_center,2)); + + PMT_Distance(:,jj) = sqrt((Event_X_Coord(:)-PMT_X_Coord(jj)).^2+(Event_Y_Coord(:)-PMT_Y_Coord(jj)).^2+(Event_Z_Coord(:)-PMT_Z_Coord(jj)).^2); + +PMT_Signal(:,jj)=cosd(Delta_Phi(:,jj)).*((PMT_Radius^2)./(4.*PMT_Distance(:,jj).^2)).*Event_Signal(:).*PMT_QE(jj); %Divides signal based on fraction angle over 4*pi steradians +Poisson_PMT_Signal(:,jj)=poissrnd(PMT_Signal(:,jj)); +Gaussian_Noise_PMT_Signal(:,jj)=normrnd(Poisson_PMT_Signal(:,jj),Gaussian_Noise_Sigma); + +end + +disp('Calculating Summed PMT Signal') +Summed_PMT_Signal=zeros(num_events,1); +Summed_Poisson_PMT_Signal=zeros(num_events,1); +Summed_Gaussian_Noise_PMT_Signal=zeros(num_events,1); +for i=1:num_events; +Summed_PMT_Signal(i)=sum(PMT_Signal(i,:)); +Summed_Poisson_PMT_Signal(i)=sum(Poisson_PMT_Signal(i,:)); +Summed_Gaussian_Noise_PMT_Signal(i)=sum(Gaussian_Noise_PMT_Signal(i,:)); +end + + +summed_s1=Summed_Poisson_PMT_Signal; + +num_bins=(num_events/900)^(1/3); +r_max=25; +xy_step=r_max*2/(num_bins-1);% Change to depend on size of pulse_area_phe +det_edge=360*.151; +z_step=ceil( (0.95*det_edge-0.05*det_edge)/num_bins ); %xy_step size about = 30 mm, to create 16 z bins +s1xbins=-r_max+xy_step/2:xy_step:r_max-xy_step/2; +s1ybins=-r_max+xy_step/2:xy_step:r_max-xy_step/2; +s1zbins=floor(0.05*det_edge):z_step:floor(0.05*det_edge)+z_step*num_bins; %20 us + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% %Calculating PMTxPMT light map with Normalization +% disp('Calculating PMTxPMT Light Map with Normalization') +% +% %Calculating detector center +disp('Calculating Summed Center') +Mean_S1_3D=zeros(length(s1xbins),length(s1ybins),length(s1zbins)); + +for k = s1zbins; % out to 485 mm % start at 5 mm. steps of 30 mm + for i = (-r_max+xy_step):xy_step:r_max %map to rows going down (y_cm) + for j = (-r_max+xy_step):xy_step:r_max %map columns across (x_cm) + + clear l m n + l=int8(i/xy_step+(r_max)/xy_step); %real y from 1:25 + m=int8(j/xy_step+(r_max)/xy_step); % real x from 1:25 + n=(k-floor(0.05*det_edge))/z_step + 1; %z from 1:16 + + clear q; + q = Event_X_Coord(j-xy_step) & Event_Y_Coord(i-xy_step) & inrange(Event_Z_Coord,[(k-z_step/2) , (k+z_step/2)]); %no 0th element + + if (length(summed_s1(q)) >= 30) + Mean_S1_3D(l,m,n)=mean(summed_s1(q)); + else + + Mean_S1_3D(l,m,n)=0; + end + + if(strcmp(num2str(Mean_S1_3D(l,m,n)),'NaN')) + Mean_S1_3D(l,m,n)=0; + end + + end + end +end + +Mean_S1_3D(Mean_S1_3D==0)=nan; +Mean_S1_3D=inpaint_nans3(Mean_S1_3D); +summed_center=interp3(s1xbins,s1ybins,s1zbins,Mean_S1_3D,0,0,(det_edge-4)/2,'spline'); +clear Mean_S1_3D + +counter=1; +energy_estimate=zeros(length(Event_X_Coord),1); +variance=zeros(length(Event_X_Coord),1); +means=zeros(length(Event_X_Coord),1); + +for jj=1:122; + +clear Mean_S1_3D; +Mean_S1_3D=zeros(length(s1xbins),length(s1ybins),length(s1zbins)); + +s1=Poisson_PMT_Signal(:,jj); + +for k = s1zbins; % out to 485 mm % start at 5 mm. steps of 30 mm + for i = (-r_max+xy_step):xy_step:r_max %map to rows going down (y_cm) + for j = (-r_max+xy_step):xy_step:r_max %map columns across (x_cm) + + clear l m n q + l=int8(i/xy_step+(r_max)/xy_step); %real y from 1:25 + m=int8(j/xy_step+(r_max)/xy_step); % real x from 1:25 + n=int8((k-floor(0.05*det_edge))/z_step + 1); %z from 1:16 + + q = Event_X_Coord<=j & Event_X_Coord>(j-xy_step) & Event_Y_Coord<=i & Event_Y_Coord>(i-xy_step) & Event_Z_Coord <=(k+z_step/2) & Event_Z_Coord>(k-z_step/2); %no 0th element + + if (length(s1(q)) >= 30) + Mean_S1_3D(l,m,n)=mean(s1(q)); + else + Mean_S1_3D(l,m,n)=0; + end + + end + end +end + +Mean_S1_3D(Mean_S1_3D==0)=nan; +Mean_S1_3D=inpaint_nans3(Mean_S1_3D); + +norm_s1=summed_center./Mean_S1_3D; %Normalize to center (x=y=0. Event_Z_Coord=160) +norm_s1(isinf(norm_s1))=1;%remove infinity. no correction outside 25cm +norm_s1(isnan(norm_s1))=1;%remove nan. no correction outside 25cm + +normalized_s1=s1.*interp3(s1xbins,s1ybins,s1zbins,norm_s1,Event_X_Coord,Event_Y_Coord,Event_Z_Coord,'spline'); + +disp('Calculating Summed Normalized Signal') +Summed_Norm_S1=zeros(num_events,1); +for i=1:num_events; +Summed_Norm_S1(i)=sum(normalized_s1(i,:)); +end + +clear Mean_S1_3D stand_dev; + +Mean_S1_3D=zeros(length(s1xbins),length(s1ybins),length(s1zbins)); +stand_dev=zeros(length(s1xbins),length(s1ybins),length(s1zbins)); + +for k = s1zbins; % out to 485 mm % start at 5 mm. steps of 30 mm + for i = (-r_max+xy_step):xy_step:r_max %map to rows going down (y_cm) + for j = (-r_max+xy_step):xy_step:r_max %map columns across (x_cm) + + clear l m n q + l=int8(i/xy_step+(r_max)/xy_step); %real y from 1:25 + m=int8(j/xy_step+(r_max)/xy_step); % real x from 1:25 + n=int8((k-floor(0.05*det_edge))/z_step + 1); %z from 1:16 + + q = Event_X_Coord<=j & Event_X_Coord>(j-xy_step) & Event_Y_Coord<=i & Event_Y_Coord>(i-xy_step) & Event_Z_Coord <=(k+z_step/2) & Event_Z_Coord>(k-z_step/2); %no 0th element + + if (length(normalized_s1(q)) >= 30) + Mean_S1_3D(l,m,n)=mean(normalized_s1(q)); + stand_dev(l,m,n)=std(normalized_s1(q)); + else + Mean_S1_3D(l,m,n)=0; + stand_dev(l,m,n)=0; + end + + end + end +end + + Mean_S1_3D(Mean_S1_3D==0)=nan; +Mean_S1_3D=inpaint_nans3(Mean_S1_3D); + +stand_dev(stand_dev==0)=nan; +stand_dev=inpaint_nans3(stand_dev); + +energy_estimate(:,counter)=summed_center*normalized_s1./interp3(s1xbins,s1ybins,s1zbins,Mean_S1_3D,Event_X_Coord,Event_Y_Coord,Event_Z_Coord,'spline'); %Only events where the bin had >30 nonzero events for the PMT have nonzero entries. If the PMT doesn't see >30 nonzero events, we say it didn't see anything at all +variance(:,counter)=interp3(s1xbins,s1ybins,s1zbins,stand_dev,Event_X_Coord,Event_Y_Coord,Event_Z_Coord,'spline').^2; +means(:,counter)=interp3(s1xbins,s1ybins,s1zbins,Mean_S1_3D,Event_X_Coord,Event_Y_Coord,Event_Z_Coord,'spline'); + +counter=counter+1; + +disp(['Finished PMT ', num2str(jj)]); +end + + +disp('Calculating weighted arethmetic means for Previous Light Map') +s1_corrected_norms=zeros(length(normalized_s1),1); +s1_corrected_norms_meanweights=zeros(length(normalized_s1),1); +s1_corrected_norms_finalweights=zeros(length(normalized_s1),1); +for i=1:length(normalized_s1); + clear temp_energy_estimate temp_variance + + temp_energy_estimate=energy_estimate(i,:); + temp_variance=variance(i,:); + temp_means=means(i,:); + +s1_corrected_norms(i)=sum(temp_energy_estimate.*((temp_means.^2)./temp_variance))./sum((temp_means.^2)./temp_variance); %should peak at summed_center keV +s1_corrected_norms_meanweights(i)=sum(temp_energy_estimate.*(temp_means))./sum(temp_means); %should peak at summed_center keV +s1_corrected_norms_finalweights(i)=sum(temp_energy_estimate./temp_variance)/sum(1./temp_variance); %should peak at summed_center keV +end + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%Calculating PMTxPMT light map without Normalization +disp('Calculating PMTxPMT Light Map without Normalization') + +counter=1; +energy_estimate=zeros(length(Event_X_Coord),1); +variance=zeros(length(Event_X_Coord),1); +means=zeros(length(Event_X_Coord),1); + + +for jj=1:122; + +clear Mean_S1_3D; + +s1=Poisson_PMT_Signal(:,jj); + +Mean_S1_3D=zeros(length(s1xbins),length(s1ybins),length(s1zbins)); +stand_dev=zeros(length(s1xbins),length(s1ybins),length(s1zbins)); + +for k = s1zbins; % out to 485 mm % start at 5 mm. steps of 30 mm + for i = (-r_max+xy_step):xy_step:r_max %map to rows going down (y_cm) + for j = (-r_max+xy_step):xy_step:r_max %map columns across (x_cm) + + clear l m n q + l=int8(i/xy_step+(r_max)/xy_step); %real y from 1:25 + m=int8(j/xy_step+(r_max)/xy_step); % real x from 1:25 + n=int8((k-floor(0.05*det_edge))/z_step + 1); %z from 1:16 + + q = Event_X_Coord<=j & Event_X_Coord>(j-xy_step) & Event_Y_Coord<=i & Event_Y_Coord>(i-xy_step) & Event_Z_Coord <=(k+z_step/2) & Event_Z_Coord>(k-z_step/2); %no 0th element + + if (length(s1(q)) >= 30) + Mean_S1_3D(l,m,n)=mean(s1(q)); + stand_dev(l,m,n)=std(s1(q)); + else + Mean_S1_3D(l,m,n)=0; + stand_dev(l,m,n)=0; + end + + end + end +end + + Mean_S1_3D(Mean_S1_3D==0)=nan; +Mean_S1_3D=inpaint_nans3(Mean_S1_3D); + +stand_dev(stand_dev==0)=nan; +stand_dev=inpaint_nans3(stand_dev); + +energy_estimate(:,counter)=summed_center*s1./interp3(s1xbins,s1ybins,s1zbins,Mean_S1_3D,Event_X_Coord,Event_Y_Coord,Event_Z_Coord,'spline'); %Only events where the bin had >30 nonzero events for the PMT have nonzero entries. If the PMT doesn't see >30 nonzero events, we say it didn't see anything at all +variance(:,counter)=interp3(s1xbins,s1ybins,s1zbins,stand_dev,Event_X_Coord,Event_Y_Coord,Event_Z_Coord,'spline').^2; +means(:,counter)=interp3(s1xbins,s1ybins,s1zbins,Mean_S1_3D,Event_X_Coord,Event_Y_Coord,Event_Z_Coord,'spline'); + +counter=counter+1; + +disp(['Finished PMT ', num2str(jj)]); +end + + +disp('Calculating weighted arethmetic means for Previous Light Map') +s1_corrected_nonorms=zeros(length(s1),1); +s1_corrected_nonorms_meanweights=zeros(length(s1),1); +s1_corrected_nonorms_finalweights=zeros(length(s1),1); +for i=1:length(s1); + clear temp_energy_estimate temp_variance + + temp_energy_estimate=energy_estimate(i,:); + temp_variance=variance(i,:); + temp_means=means(i,:); + +s1_corrected_nonorms(i)=sum(temp_energy_estimate.*((temp_means.^2)./temp_variance))./sum((temp_means.^2)./temp_variance); %should peak at summed_center keV +s1_corrected_nonorms_meanweights(i)=sum(temp_energy_estimate.*(temp_means))./sum(temp_means); %should peak at summed_center keV +s1_corrected_nonorms_finalweights(i)=sum(temp_energy_estimate./temp_variance)/sum(1./temp_variance); %should peak at summed_center keV + +end + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%Calculating KrypCal Light Map +disp('Calculating Krypcal Light Map') + +%Calculating detector center +disp('Calculating Summed Center') +i_min=-r_max+xy_step; +j_min=-r_max+xy_step; +Mean_S1_3D=zeros(length(s1xbins),length(s1ybins),length(s1zbins)); + +for k = s1zbins; % out to 485 mm % start at 5 mm. steps of 30 mm + for i = (-r_max+xy_step):xy_step:r_max %map to rows going down (y_cm) + for j = (-r_max+xy_step):xy_step:r_max %map columns across (x_cm) + + clear l m n + l=int8(i/xy_step+(r_max)/xy_step); %real y from 1:25 + m=int8(j/xy_step+(r_max)/xy_step); % real x from 1:25 + n=(k-floor(0.05*det_edge))/z_step + 1; %z from 1:16 + + clear q; + q = Event_X_Coord(j-xy_step) & Event_Y_Coord(i-xy_step) & inrange(Event_Z_Coord,[(k-z_step/2) , (k+z_step/2)]); %no 0th element + + if (length(summed_s1(q)) >= 30) + Mean_S1_3D(l,m,n)=mean(summed_s1(q)); + else + + Mean_S1_3D(l,m,n)=0; + end + + if(strcmp(num2str(Mean_S1_3D(l,m,n)),'NaN')) + Mean_S1_3D(l,m,n)=0; + end + + end + end +end + +Mean_S1_3D(Mean_S1_3D==0)=nan; +Mean_S1_3D=inpaint_nans3(Mean_S1_3D); +summed_center=interp3(s1xbins,s1ybins,s1zbins,Mean_S1_3D,0,0,(det_edge-4)/2,'spline'); + +norm_s1=summed_center./Mean_S1_3D; %Normalize to center (x=y=0. Event_Z_Coord=160) +norm_s1(isinf(norm_s1))=1;%remove infinity. no correction outside 25cm +norm_s1(isnan(norm_s1))=1;%remove nan. no correction outside 25cm + +krypcal_corrected_s1=summed_s1.*interp3(s1xbins,s1ybins,s1zbins,norm_s1,Event_X_Coord,Event_Y_Coord,Event_Z_Coord,'spline'); + +%PLOTS +% +% figure +% step(s1_corrected_norms,[0:5:1000],'c') +% hold on; +% step(s1_corrected_nonorms,[0:5:1000],'r') +% step(s1_corrected_nonorms_meanweights,[0:5:1000],'g') +% % step(s1_corrected_norms_meanweights,[0:5:1000],'m') +% step(krypcal_corrected_s1,[0:5:1000],'b') +% logy + +% save('SimS1_V2_Gauss00') \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/RadonMLE/ExctractDataFromPlot.m b/CodeForLUX/Matlab/MyScripts/RadonMLE/ExctractDataFromPlot.m new file mode 100644 index 0000000..7985d4b --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/RadonMLE/ExctractDataFromPlot.m @@ -0,0 +1,14 @@ +h=gca; +axesObjs = get(h, 'Children'); %axes handles +dataObjs = get(axesObjs, 'Children'); %handles to low-level graphics objects in axes +objTypes = get(dataObjs, 'Type'); %type of low-level graphics object +xplotdata = get(dataObjs, 'XData'); %data from low-level grahics objects +yplotdata = get(dataObjs, 'YData') + +xdata=xplotdata{1}; +ydata=yplotdata{1}; +temperrdata=yplotdata{2}; +ydata_err=abs(ydata-temperrdata(1:9:end)); + +xscale=735406.6479-59.0586; +xdata=xdata+xscale; \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/RadonMLE/LoadAllRadon.m b/CodeForLUX/Matlab/MyScripts/RadonMLE/LoadAllRadon.m new file mode 100644 index 0000000..28a3974 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/RadonMLE/LoadAllRadon.m @@ -0,0 +1,236 @@ +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm','x_cm_tmplt','y_cm_tmplt'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin',... + 'hft_t50r_samples','hft_t50l_samples','z_corrected_pulse_area_all_phe','xyz_corrected_pulse_area_all_phe',... + 'z_corrected_pulse_area_bot_phe','xyz_corrected_pulse_area_bot_phe','x_corrected','y_corrected'}; + + +% defining cuts +zcut_min = 30;%us +zcut_max = 300;%us +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 0;%2 PMT hits +s1area_bound_max = 10^5;%include Kr 83 data and gammas + +s2area_bound_min = 100;%100 ~ 0.5 keVee +s2area_bound_max = 2*10^6;% %both PMT Arrays and Kr83 + + +folders_to_load=dir('C:\Users\Richard\Desktop\Run03Radon\'); +folders_to_load(1:2)=[]; + + +ii=1; +path=strcat('C:\Users\Richard\Desktop\Run03Radon\',folders_to_load(ii).name); +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + + +d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + +s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); +s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + +s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events +s2_class=(d.pulse_classification==2) & s2_area_cut ; +s4_class=(d.pulse_classification==4) ; + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + +drift_time = d.z_drift_samples(s2_single_cut)/100; %units of us + + +d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + +s1_phe_both = d.pulse_area_phe(s1_single_cut); +s1_phe_bottom = d.phe_bottom(s1_single_cut); +s1_phe_both_z=d.z_corrected_pulse_area_all_phe(s1_single_cut); +s1_phe_both_xyz=d.xyz_corrected_pulse_area_all_phe(s1_single_cut); + +s2_phe_both = d.pulse_area_phe(s2_single_cut); +s2_phe_bottom = d.phe_bottom(s2_single_cut); +s2_phe_bottom_z=d.z_corrected_pulse_area_bot_phe(s2_single_cut); +s2_phe_bottom_xyz=d.xyz_corrected_pulse_area_bot_phe(s2_single_cut); + +s2x = d.x_cm(s2_single_cut); +s2y = d.y_cm(s2_single_cut); +s2radius = (s2x.^2+s2y.^2).^(0.5); +s2x_c = d.x_corrected(s2_single_cut); +s2y_c = d.y_corrected(s2_single_cut); +s2radius_c = (s2x_c.^2+s2y_c.^2).^(0.5); + + +timestamp_vec_1 = sort([d.livetime_latch_samples d.livetime_end_samples]); +livetime_sec = sum(timestamp_vec_1(2:2:end) - timestamp_vec_1(1:2:end)) / 1e8; + +evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut +event_number=d.event_number(evt_cut)'; +event_timestamp_samples=d.event_timestamp_samples(evt_cut)'; + + + +clean_cut=-(s1_phe_both+s2_phe_both)' + d.full_evt_area_phe(logical(squeeze(sum(s2_single_cut,1)))) < 100 ... +& drift_time' > 0;%more than 1/2 the area is S1+S2. And S1 before S2 +clean_cut=clean_cut'; + + +s1_phe_both_2=s1_phe_both; +s1_phe_both_z_2=s1_phe_both_z ; +s1_phe_both_xyz_2=s1_phe_both_xyz ; +s2_phe_bottom_2=s2_phe_bottom ; +s2_phe_bottom_xyz_2= s2_phe_bottom_xyz ; +s2_phe_bottom_z_2= s2_phe_bottom_z ; +s2_phe_both_2=s2_phe_both ; +drift_time_2=drift_time ; +event_timestamp_samples_2=event_timestamp_samples ; +event_number_2=event_number; +s2x_2=s2x ; +s2y_2=s2y ; +s2x_c_2 = s2x_c ; +s2y_c_2 = s2y_c ; +clean_cut_2=clean_cut; + + +time_diff_samples_1=0; %no time difference from first file +file_start_samples(ii)=time_diff_samples_1; +file_end_samples(ii)=time_diff_samples_1+d.event_timestamp_samples(end); + +for ii=2:length(folders_to_load) % + tic; + path=strcat('C:\Users\Richard\Desktop\Run03Radon\',folders_to_load(ii).name); + clear d1; + d1=d; + clear d; + + d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; + cut_pulse_s2 = d.pulse_classification == 2; + cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 + cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts + cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still + cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event + cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event + % select Kr83 events with cut on S2 + cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); + cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); + cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds + cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds + cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds + %Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events + s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); + s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; %units of us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + s1_phe_both_z=d.z_corrected_pulse_area_all_phe(s1_single_cut); + s1_phe_both_xyz=d.xyz_corrected_pulse_area_all_phe(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + s2_phe_bottom_z=d.z_corrected_pulse_area_bot_phe(s2_single_cut); + s2_phe_bottom_xyz=d.xyz_corrected_pulse_area_bot_phe(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + s2radius = (s2x.^2+s2y.^2).^(0.5); + s2x_c = d.x_corrected(s2_single_cut); + s2y_c = d.y_corrected(s2_single_cut); + s2radius_c = (s2x_c.^2+s2y_c.^2).^(0.5); + + timestamp_vec_1 = sort([d.livetime_latch_samples d.livetime_end_samples]); + livetime_sec = livetime_sec + sum(timestamp_vec_1(2:2:end) - timestamp_vec_1(1:2:end)) / 1e8; + + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_number=d.event_number(evt_cut)'; + event_timestamp_samples=d.event_timestamp_samples(evt_cut)'; + + clean_cut=-(s1_phe_both+s2_phe_both)' + d.full_evt_area_phe(logical(squeeze(sum(s2_single_cut,1)))) < 100 ... + & drift_time' > 0;%more than 1/2 the area is S1+S2. And S1 before S2 + clean_cut=clean_cut'; + + + s1_phe_both=[s1_phe_both ; s1_phe_both_2]; %#ok<*AGROW> + s1_phe_both_z=[s1_phe_both_z ; s1_phe_both_z_2]; + s1_phe_both_xyz=[s1_phe_both_xyz ; s1_phe_both_xyz_2] ; + s2_phe_bottom=[s2_phe_bottom ; s2_phe_bottom_2] ; + s2_phe_bottom_xyz= [s2_phe_bottom_xyz ; s2_phe_bottom_xyz_2]; + s2_phe_bottom_z= [s2_phe_bottom_z ; s2_phe_bottom_z_2]; + s2_phe_both=[s2_phe_both ; s2_phe_both_2]; + drift_time=[drift_time ; drift_time_2]; + event_timestamp_samples=[event_timestamp_samples_2 ; event_timestamp_samples+time_diff_samples_1;]; + event_number=[event_number; event_number_2]; + s2x=[s2x ; s2x_2]; + s2y=[s2y ; s2y_2]; + s2radius = (s2x.^2+s2y.^2).^(0.5); + s2x_c = [s2x_c ; s2x_c_2]; + s2y_c = [s2y_c ; s2y_c_2]; + s2radius_c = (s2x_c.^2+s2y_c.^2).^(0.5); + clean_cut=[clean_cut ; clean_cut_2 ]; + + s1_phe_both_2=s1_phe_both; + s1_phe_both_z_2=s1_phe_both_z ; + s1_phe_both_xyz_2=s1_phe_both_xyz ; + s2_phe_bottom_2=s2_phe_bottom ; + s2_phe_bottom_xyz_2= s2_phe_bottom_xyz ; + s2_phe_bottom_z_2= s2_phe_bottom_z ; + s2_phe_both_2=s2_phe_both ; + drift_time_2=drift_time ; + event_timestamp_samples_2=event_timestamp_samples ; + event_number_2=event_number; + s2x_2=s2x ; + s2y_2=s2y ; + s2x_c_2 = s2x_c ; + s2y_c_2 = s2y_c ; + clean_cut_2=clean_cut; + + save('ALL_alpha_data','drift_time','s2radius','s1_phe_both_xyz','s1_phe_both','s2_phe_bottom_xyz','event_timestamp_samples'... + ,'s2radius_c','s1_phe_both','s2_phe_bottom','s2_phe_both','s2_phe_bottom','event_number','s2x','s2y','s2x_c','s2y_c','livetime_sec','clean_cut'... + , 'file_start_samples','file_end_samples'); + + fprintf(strcat(num2str(ii),' out of ', num2str(length(folders_to_load)),' data sets loaded') ); + + toc; + +end + + +fprintf('Finished'); \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/RadonMLE/MakeRadonMLEPlots.m b/CodeForLUX/Matlab/MyScripts/RadonMLE/MakeRadonMLEPlots.m new file mode 100644 index 0000000..dc62cca --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/RadonMLE/MakeRadonMLEPlots.m @@ -0,0 +1,16 @@ +load('AttenPDFData.mat') +figure +hold on; +errorbar(AttenXData,AttenYData,AttenYData_err,'.','Color',[0.6 0.6 1]) + +load('CorrPDFData.mat') +errorbar(CorrXData,CorrYData,CorrYData_err,'.','Color',[1 0.6 0.6]) + +load('Run03Lifetimes.mat') + +errorbar(Date_MatTime,lifetime,sigma_lifetime,'.k','MarkerSize',12,'LineWidth',2) +datetick('x',6) %formats the x axis to be a date label +myfigview(22); xlabel('Date'); ylabel('Electron Lifetime (\mus)'); +xlim([735343,735480]); +ylim([400, 1300]); +legend('Attenuated Gaussian PDF','Corrected Gaussian PDF','Kr83m Measurement') diff --git a/CodeForLUX/Matlab/MyScripts/RadonMLE/MakeRadonSelection.m b/CodeForLUX/Matlab/MyScripts/RadonMLE/MakeRadonSelection.m new file mode 100644 index 0000000..5d5effb --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/RadonMLE/MakeRadonSelection.m @@ -0,0 +1,19 @@ +load('ALL_alpha_data.mat') +cut=(s1_phe_both<(34.*drift_time+34500)) & (s1_phe_both>(31.*drift_time+32500)) & drift_time<240 & s2radius_c<23; + + +figure +plot(drift_time(drift_time<330 &s2radius_c<23),s1_phe_both(drift_time<330 & s2radius_c<23),'.k') +hold on; +plot(drift_time(cut),s1_phe_both(cut),'.r') +x=[0:1:240]; +y=31.*x+32500; +plot(x,y,'-r') +y=34.*x+34500; +plot(x,y,'-r') +line([240 240],[240*31+32500,240*34+34500],'Color',[1 0 0]) +xlim([0 320]); +ylim([28000 52000]); +xlabel('Drift Time (uSec)'); ylabel('S1 Pulse Area (phe)'); +legend('Alphas','Radon 222','Box Cut') +myfigview(22); \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/RadonMLE/QueryLugFor_DP2p0_Lifetimes.m b/CodeForLUX/Matlab/MyScripts/RadonMLE/QueryLugFor_DP2p0_Lifetimes.m new file mode 100644 index 0000000..0797afe --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/RadonMLE/QueryLugFor_DP2p0_Lifetimes.m @@ -0,0 +1,35 @@ + +%% Get electron lifetime and 1-sigma from lug%%%%%%%%%%%%%%%%%%%%%%%% + +%get all the IQs that contain the term 'electron_lifetime' and store them +%as an XLM structure +out = MySQLQuery('select values_xml from control.lug_iqs where iq_type = "electron_lifetime" and strikeme = 0 and algorithm_version = 2.0;'); + +for j=1:size(out.values_xml,1); % 22(first entry) to last entry + + %read in electron lifetime and 1 sigma, using the XMLParser function + value1 = XMLParser(out.values_xml{j}); + lifetime(j)=value1.iq.correction.fit.electron_attenuation_us; + sigma_lifetime(j)=value1.iq.correction.fit.sigma_electron_attenuation_us; + + %get the date from file name prexix (as Matlab time) + file_date=value1.iq.global.filename_prefix; + readable_date{j}=file_date; + Date_MatTime(j)=datenum(file_date(7:19),'yyyymmddTHHMM'); + +end + + +%% Make a quick plot of the electron lifetime +cut=Date_MatTime<735466; + +Date_MatTime=Date_MatTime(cut); +lifetime=lifetime(cut); +sigma_lifetime=sigma_lifetime(cut); + +%Zoomed In +figure +errorbar(Date_MatTime,lifetime,sigma_lifetime,'.k','MarkerSize',12,'LineWidth',1) +datetick('x',6) %formats the x axis to be a date label +myfigview(16); xlabel('Date'); ylabel('Electron Lifetime (\mus)');title('Run03 Lifetime'); + diff --git a/CodeForLUX/Matlab/MyScripts/Run03_CH3T_Outliers/AugOutliers_spiky.m b/CodeForLUX/Matlab/MyScripts/Run03_CH3T_Outliers/AugOutliers_spiky.m new file mode 100644 index 0000000..f145b98 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/Run03_CH3T_Outliers/AugOutliers_spiky.m @@ -0,0 +1,231 @@ +load('C:\Program Files\MATLAB\R2012a\bin\Run03_CH3T_Outliers\Run03_Aug_Golden_CH3T.mat') + + +radius=(x_corr.^2 + y_corr.^2).^(1/2); + +s1_min=0; +s1_max=50; + +% liquid_cut= inrange(drift_time,[30 300]) & inrange(s2radius_c,[0,18]) & inrange(s1area,[s1_min s1_max]) ... +% & (log10(s1area)+0.5*log10(s2area)<3.8) & s2_phe_both>100 ; %used to be drift time 100 to 250 + + + band_sigma=3.5; %3.5 sigma = 1 in 4,000 chance of being outside this + + + s2_s1_bin= 1:.05:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=inrange(spikyS1,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(s2area(ER_fit_cut)./spikyS1(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2area(ER_fit_cut)./spikyS1(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); + %ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + b=confint(ER_mean_power_fit,.68); + sigma_a_ER_mean=(b(2,1)-b(1,1))/2; + sigma_b_ER_mean=(b(2,2)-b(1,2))/2; + + ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + b=confint(ER_lower_power_fit,.68); + sigma_a_ER_lower=(b(2,1)-b(1,1))/2; + sigma_b_ER_lower=(b(2,2)-b(1,2))/2; + + ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + b=confint(ER_upper_power_fit,.68); + sigma_a_ER_upper=(b(2,1)-b(1,1))/2; + sigma_b_ER_upper=(b(2,2)-b(1,2))/2; + + + %Make Plot + + no_fid_new=figure; + hold on + + scatter(spikyS1,log10(s2area./spikyS1),'.k'); + ylabel('Corrected log10(S2/S1)'); xlabel('S1 corrected (Pulse Area Phe)'); + title('Corrected CH3T','fontsize',16,'Interpreter','none'); + myfigview(16); + ylim([0 3]);xlim([0 s1_max]); +% plot(ER_bins,lower_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_lower_fit,'--r','markersize',14,'linewidth',2) +% plot(ER_bins,mean_ER_band,'ok','markersize',6,'linewidth',2)%plot mean of ER band + plot(ER_bins,ER_mean_fit,'-r','markersize',20,'linewidth',2) +% plot(ER_bins,upper_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_upper_fit,'--r','markersize',14,'linewidth',2) + bin_step=2; + + total_count=length(log10(s2area)); + + + box; + text(10,2.8,strcat('Total Count= ',num2str(total_count)),'fontsize',16); + %text(5,.7,strcat('NEST\_SE_{bot} Fit=',num2str(ER_mean_NEST_fit.SE_ER_fit*73/64*27/24.5,3),'\pm ', num2str(sigma_SE_ER_fit*73/64*27/24.5,2),'[Phe]'),'fontsize',16,'color','m','interpreter','tex'); + %text(5,.8,'NEST Platinum V4-b', 'fontsize',16,'color','m','interpreter','tex' ); +% text(5,.55,strcat('+',num2str(band_sigma),'\sigma = (',num2str(ER_upper_power_fit.a,3),'\pm', num2str(sigma_a_ER_upper,1) ,')\times S1_c ^{', num2str(ER_upper_power_fit.b,3),'\pm',num2str(sigma_b_ER_upper,1),'}'),'fontsize',16,'interpreter','tex'); +% text(5,.3,strcat('Mean=(',num2str(ER_mean_power_fit.a,3),'\pm', num2str(sigma_a_ER_mean,1),')\times S1_c ^{', num2str(ER_mean_power_fit.b,3),'\pm', num2str(sigma_b_ER_mean,1),'}'),'fontsize',16,'interpreter','tex'); +% text(5,.05,strcat('-',num2str(band_sigma),'\sigma = (',num2str(ER_lower_power_fit.a,3),'\pm', num2str(sigma_a_ER_lower,1),')\times S1_c ^{', num2str(ER_lower_power_fit.b,3),'\pm', num2str(sigma_b_ER_lower,1),'}'),'fontsize',16,'interpreter','tex'); +% + + +%% Cutting on populations above and below the band width + +below_band_cut=log10(s2area./spikyS1)< (ER_lower_power_fit.a.*(spikyS1.^ER_lower_power_fit.b)); +above_band_cut=log10(s2area./spikyS1)> (ER_upper_power_fit.a.*(spikyS1.^ER_upper_power_fit.b)); +hold on; +plot(spikyS1(below_band_cut),log10(s2area(below_band_cut)./spikyS1(below_band_cut)),'+m','MarkerSize',10,'LineWidth',2); +plot(spikyS1(above_band_cut),log10(s2area(above_band_cut)./spikyS1(above_band_cut)),'+b','MarkerSize',10,'LineWidth',2); + +%% Printing Luxstamps +belowband_events=luxstamp(below_band_cut); +aboveband_events=luxstamp(above_band_cut); + + +%% Plotting XY dist of below band population + +figure +scatter(x_corr(below_band_cut),y_corr(below_band_cut),'.k') +hold on; +scatter(x_corr(above_band_cut),y_corr(above_band_cut),'.r') +circle(0,0,25); +legend('Below Band','Above Band','R=25cm'); +xlabel('Corrected x (cm)');ylabel('Corrected y (cm)'); +myfigview(16); + +%% Checking corrections are okay by comparing raw and corrected pulse area +figure +scatter(s1area_raw,s1area,'.k'); +hold on; +scatter(s1area_raw(below_band_cut),s1area(below_band_cut),'.m'); +scatter(s1area_raw(above_band_cut),s1area(above_band_cut),'.b'); +xlabel('Uncorrected S1');ylabel('Corrected S1'); myfigview(16); +legend('All Events','Below Band','Above Band'); + + +figure +scatter(s2area_raw,s2area,'.k'); +hold on; +scatter(s2area_raw(below_band_cut),s2area(below_band_cut),'.m'); +scatter(s2area_raw(above_band_cut),s2area(above_band_cut),'.b'); +xlabel('Uncorrected S2');ylabel('Corrected S2'); myfigview(16); +legend('All Events','Below Band','Above Band'); + +%% Checking that corrections are okay by making the raw ER band and looking at events + + s2_s1_bin= 1:.05:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=inrange(s1area_raw,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(s2area_raw(ER_fit_cut)./s1area_raw(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2area_raw(ER_fit_cut)./s1area_raw(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); + %ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + b=confint(ER_mean_power_fit,.68); + sigma_a_ER_mean=(b(2,1)-b(1,1))/2; + sigma_b_ER_mean=(b(2,2)-b(1,2))/2; + + ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + b=confint(ER_lower_power_fit,.68); + sigma_a_ER_lower=(b(2,1)-b(1,1))/2; + sigma_b_ER_lower=(b(2,2)-b(1,2))/2; + + ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + b=confint(ER_upper_power_fit,.68); + sigma_a_ER_upper=(b(2,1)-b(1,1))/2; + sigma_b_ER_upper=(b(2,2)-b(1,2))/2; + + + %Make Plot + + no_fid_new=figure; + hold on + + scatter(s1area_raw,log10(s2area_raw./s1area_raw),'.k'); + ylabel('Uncorrected log10(S2/S1)'); xlabel('S1 Uncorrected (Pulse Area Phe)'); + title('Uncorrected CH3T','fontsize',16,'Interpreter','none'); + myfigview(16); + ylim([0 3]);xlim([0 s1_max]); +% plot(ER_bins,lower_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_lower_fit,'--r','markersize',14,'linewidth',2) +% plot(ER_bins,mean_ER_band,'ok','markersize',6,'linewidth',2)%plot mean of ER band + plot(ER_bins,ER_mean_fit,'-r','markersize',20,'linewidth',2) +% plot(ER_bins,upper_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_upper_fit,'--r','markersize',14,'linewidth',2) + bin_step=2; +scatter(s1area_raw(below_band_cut),log10(s2area_raw(below_band_cut)./s1area_raw(below_band_cut)),'.m'); +scatter(s1area_raw(above_band_cut),log10(s2area_raw(above_band_cut)./s1area_raw(above_band_cut)),'.b'); + + diff --git a/CodeForLUX/Matlab/MyScripts/Run03_CH3T_Outliers/DecemberOutliers.m b/CodeForLUX/Matlab/MyScripts/Run03_CH3T_Outliers/DecemberOutliers.m new file mode 100644 index 0000000..21d5be9 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/Run03_CH3T_Outliers/DecemberOutliers.m @@ -0,0 +1,226 @@ +load('Run03_Dec_Golden_CH3T.mat') + +radius=(x_corr.^2 + y_corr.^2).^(1/2); + +s1_min=0; +s1_max=50; + +% liquid_cut= inrange(drift_time,[30 300]) & inrange(s2radius_c,[0,18]) & inrange(s1area,[s1_min s1_max]) ... +% & (log10(s1area)+0.5*log10(s2area)<3.8) & s2_phe_both>100 ; %used to be drift time 100 to 250 + + + band_sigma=4.5; %4.5 sigma = 1 in 150,000 chance of being outside this + + + s2_s1_bin= 1:.05:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=inrange(s1area,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(s2area(ER_fit_cut)./s1area(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2area(ER_fit_cut)./s1area(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); + %ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + b=confint(ER_mean_power_fit,.68); + sigma_a_ER_mean=(b(2,1)-b(1,1))/2; + sigma_b_ER_mean=(b(2,2)-b(1,2))/2; + + ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + b=confint(ER_lower_power_fit,.68); + sigma_a_ER_lower=(b(2,1)-b(1,1))/2; + sigma_b_ER_lower=(b(2,2)-b(1,2))/2; + + ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + b=confint(ER_upper_power_fit,.68); + sigma_a_ER_upper=(b(2,1)-b(1,1))/2; + sigma_b_ER_upper=(b(2,2)-b(1,2))/2; + + + %Make Plot + + no_fid_new=figure; + hold on + + scatter(s1area,log10(s2area./s1area),'.k'); + ylabel('Corrected log10(S2/S1)'); xlabel('S1 corrected (Pulse Area Phe)'); + title('Corrected CH3T','fontsize',16,'Interpreter','none'); + myfigview(16); + ylim([0 3]);xlim([0 s1_max]); +% plot(ER_bins,lower_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_lower_fit,'--r','markersize',14,'linewidth',2) +% plot(ER_bins,mean_ER_band,'ok','markersize',6,'linewidth',2)%plot mean of ER band + plot(ER_bins,ER_mean_fit,'-r','markersize',20,'linewidth',2) +% plot(ER_bins,upper_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_upper_fit,'--r','markersize',14,'linewidth',2) + bin_step=2; + + total_count=length(log10(s2area)); + + + box; + text(10,2.8,strcat('Total Count= ',num2str(total_count)),'fontsize',16); + %text(5,.7,strcat('NEST\_SE_{bot} Fit=',num2str(ER_mean_NEST_fit.SE_ER_fit*73/64*27/24.5,3),'\pm ', num2str(sigma_SE_ER_fit*73/64*27/24.5,2),'[Phe]'),'fontsize',16,'color','m','interpreter','tex'); + %text(5,.8,'NEST Platinum V4-b', 'fontsize',16,'color','m','interpreter','tex' ); + text(5,.55,strcat('+',num2str(band_sigma),'\sigma = (',num2str(ER_upper_power_fit.a,3),'\pm', num2str(sigma_a_ER_upper,1) ,')\times S1_c ^{', num2str(ER_upper_power_fit.b,3),'\pm',num2str(sigma_b_ER_upper,1),'}'),'fontsize',16,'interpreter','tex'); + text(5,.3,strcat('Mean=(',num2str(ER_mean_power_fit.a,3),'\pm', num2str(sigma_a_ER_mean,1),')\times S1_c ^{', num2str(ER_mean_power_fit.b,3),'\pm', num2str(sigma_b_ER_mean,1),'}'),'fontsize',16,'interpreter','tex'); + text(5,.05,strcat('-',num2str(band_sigma),'\sigma = (',num2str(ER_lower_power_fit.a,3),'\pm', num2str(sigma_a_ER_lower,1),')\times S1_c ^{', num2str(ER_lower_power_fit.b,3),'\pm', num2str(sigma_b_ER_lower,1),'}'),'fontsize',16,'interpreter','tex'); + + + +%% Cutting on populations above and below the band width + +below_band_cut=log10(s2area./s1area)< (ER_lower_power_fit.a.*(s1area.^ER_lower_power_fit.b)); +above_band_cut=log10(s2area./s1area)> (ER_upper_power_fit.a.*(s1area.^ER_upper_power_fit.b)); +hold on; +scatter(s1area(below_band_cut),log10(s2area(below_band_cut)./s1area(below_band_cut)),'.m'); +scatter(s1area(above_band_cut),log10(s2area(above_band_cut)./s1area(above_band_cut)),'.b'); + +%% Plotting XY dist of below band population + +figure +scatter(x_corr(below_band_cut),y_corr(below_band_cut),'.k') +hold on; +circle(0,0,25); +xlabel('Corrected x (cm)');ylabel('Corrected y (cm)'); +myfigview(16); + +%% Checking corrections are okay by comparing raw and corrected pulse area +figure +scatter(s1area_raw,s1area,'.k'); +hold on; +scatter(s1area_raw(below_band_cut),s1area(below_band_cut),'.m'); +scatter(s1area_raw(above_band_cut),s1area(above_band_cut),'.b'); +xlabel('Uncorrected S1');ylabel('Corrected S1'); myfigview(16); +legend('All Events','Below Band','Above Band'); + + +figure +scatter(s2area_raw,s2area,'.k'); +hold on; +scatter(s2area_raw(below_band_cut),s2area(below_band_cut),'.m'); +scatter(s2area_raw(above_band_cut),s2area(above_band_cut),'.b'); +xlabel('Uncorrected S2');ylabel('Corrected S2'); myfigview(16); +legend('All Events','Below Band','Above Band'); + +%% Checking that corrections are okay by making the raw ER band and looking at events + + s2_s1_bin= 1:.05:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=inrange(s1area_raw,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(s2area_raw(ER_fit_cut)./s1area_raw(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2area_raw(ER_fit_cut)./s1area_raw(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); + %ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + b=confint(ER_mean_power_fit,.68); + sigma_a_ER_mean=(b(2,1)-b(1,1))/2; + sigma_b_ER_mean=(b(2,2)-b(1,2))/2; + + ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + b=confint(ER_lower_power_fit,.68); + sigma_a_ER_lower=(b(2,1)-b(1,1))/2; + sigma_b_ER_lower=(b(2,2)-b(1,2))/2; + + ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + b=confint(ER_upper_power_fit,.68); + sigma_a_ER_upper=(b(2,1)-b(1,1))/2; + sigma_b_ER_upper=(b(2,2)-b(1,2))/2; + + + %Make Plot + + no_fid_new=figure; + hold on + + scatter(s1area_raw,log10(s2area_raw./s1area_raw),'.k'); + ylabel('Uncorrected log10(S2/S1)'); xlabel('S1 Uncorrected (Pulse Area Phe)'); + title('Uncorrected CH3T','fontsize',16,'Interpreter','none'); + myfigview(16); + ylim([0 3]);xlim([0 s1_max]); +% plot(ER_bins,lower_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_lower_fit,'--r','markersize',14,'linewidth',2) +% plot(ER_bins,mean_ER_band,'ok','markersize',6,'linewidth',2)%plot mean of ER band + plot(ER_bins,ER_mean_fit,'-r','markersize',20,'linewidth',2) +% plot(ER_bins,upper_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_upper_fit,'--r','markersize',14,'linewidth',2) + bin_step=2; +scatter(s1area_raw(below_band_cut),log10(s2area_raw(below_band_cut)./s1area_raw(below_band_cut)),'.m'); +scatter(s1area_raw(above_band_cut),log10(s2area_raw(above_band_cut)./s1area_raw(above_band_cut)),'.b'); + +%% Printing Luxstamps +belowband_events=luxstamp(below_band_cut); +aboveband_events=luxstamp(above_band_cut); + diff --git a/CodeForLUX/Matlab/MyScripts/Run03_CH3T_Outliers/DecemberOutliers_spiky.m b/CodeForLUX/Matlab/MyScripts/Run03_CH3T_Outliers/DecemberOutliers_spiky.m new file mode 100644 index 0000000..a777d5c --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/Run03_CH3T_Outliers/DecemberOutliers_spiky.m @@ -0,0 +1,364 @@ +load('Run03_Dec_Golden_CH3T.mat') + +radius=(x_corr.^2 + y_corr.^2).^(1/2); +s1_min=0; +s1_max=50; + +% liquid_cut= inrange(drift_time,[30 300]) & inrange(s2radius_c,[0,18]) & inrange(s1area,[s1_min s1_max]) ... +% & (log10(s1area)+0.5*log10(s2area)<3.8) & s2_phe_both>100 ; %used to be drift time 100 to 250 + + + band_sigma=4; %4 sigma = 1 in 15,000 chance of being outside this + + + s2_s1_bin= 1:.05:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=inrange(spikyS1,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(s2area(ER_fit_cut)./spikyS1(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2area(ER_fit_cut)./spikyS1(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); + %ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + b=confint(ER_mean_power_fit,.68); + sigma_a_ER_mean=(b(2,1)-b(1,1))/2; + sigma_b_ER_mean=(b(2,2)-b(1,2))/2; + + ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + b=confint(ER_lower_power_fit,.68); + sigma_a_ER_lower=(b(2,1)-b(1,1))/2; + sigma_b_ER_lower=(b(2,2)-b(1,2))/2; + + ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + b=confint(ER_upper_power_fit,.68); + sigma_a_ER_upper=(b(2,1)-b(1,1))/2; + sigma_b_ER_upper=(b(2,2)-b(1,2))/2; + + + %Make Plot + + no_fid_new=figure; + hold on + + scatter(spikyS1,log10(s2area./spikyS1),'.k'); + ylabel('Corrected log10(S2/S1)'); xlabel('S1 corrected (Pulse Area Phe)'); + title('Corrected CH3T','fontsize',16,'Interpreter','none'); + myfigview(16); + ylim([0 3]);xlim([0 s1_max]); +% plot(ER_bins,lower_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_lower_fit,'--r','markersize',14,'linewidth',2) +% plot(ER_bins,mean_ER_band,'ok','markersize',6,'linewidth',2)%plot mean of ER band + plot(ER_bins,ER_mean_fit,'-r','markersize',20,'linewidth',2) +% plot(ER_bins,upper_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_upper_fit,'--r','markersize',14,'linewidth',2) + bin_step=2; + + total_count=length(log10(s2area)); + + + box; + text(10,2.8,strcat('Total Count= ',num2str(total_count)),'fontsize',16); +% %text(5,.7,strcat('NEST\_SE_{bot} Fit=',num2str(ER_mean_NEST_fit.SE_ER_fit*73/64*27/24.5,3),'\pm ', num2str(sigma_SE_ER_fit*73/64*27/24.5,2),'[Phe]'),'fontsize',16,'color','m','interpreter','tex'); +% %text(5,.8,'NEST Platinum V4-b', 'fontsize',16,'color','m','interpreter','tex' ); +% text(5,.55,strcat('+',num2str(band_sigma),'\sigma = (',num2str(ER_upper_power_fit.a,3),'\pm', num2str(sigma_a_ER_upper,1) ,')\times S1_c ^{', num2str(ER_upper_power_fit.b,3),'\pm',num2str(sigma_b_ER_upper,1),'}'),'fontsize',16,'interpreter','tex'); +% text(5,.3,strcat('Mean=(',num2str(ER_mean_power_fit.a,3),'\pm', num2str(sigma_a_ER_mean,1),')\times S1_c ^{', num2str(ER_mean_power_fit.b,3),'\pm', num2str(sigma_b_ER_mean,1),'}'),'fontsize',16,'interpreter','tex'); +% text(5,.05,strcat('-',num2str(band_sigma),'\sigma = (',num2str(ER_lower_power_fit.a,3),'\pm', num2str(sigma_a_ER_lower,1),')\times S1_c ^{', num2str(ER_lower_power_fit.b,3),'\pm', num2str(sigma_b_ER_lower,1),'}'),'fontsize',16,'interpreter','tex'); +% + + +%% Cutting on populations above and below the band width + +below_band_cut=log10(s2area./spikyS1)< (ER_lower_power_fit.a.*(spikyS1.^ER_lower_power_fit.b)); +above_band_cut=log10(s2area./spikyS1)> (ER_upper_power_fit.a.*(spikyS1.^ER_upper_power_fit.b)); +in_band_cut=log10(s2area./spikyS1)< (ER_upper_power_fit.a.*(spikyS1.^ER_upper_power_fit.b)) & log10(s2area./spikyS1)> (ER_lower_power_fit.a.*(spikyS1.^ER_lower_power_fit.b)); + +%Categories of events +hold on; +plot(spikyS1(below_band_cut),log10(s2area(below_band_cut)./spikyS1(below_band_cut)),'+m','MarkerSize',10,'LineWidth',2); +plot(spikyS1(above_band_cut),log10(s2area(above_band_cut)./spikyS1(above_band_cut)),'+b','MarkerSize',10,'LineWidth',2); + + +%% New version that classifies based on hand scan +% +% %Make Plot +% +% no_fid_new=figure; +% hold on +% +% scatter(spikyS1,log10(s2area./spikyS1),'.k'); +% ylabel('Corrected log10(S2/S1)'); xlabel('S1 corrected (Pulse Area Phe)'); +% title('Corrected CH3T','fontsize',16,'Interpreter','none'); +% myfigview(16); +% ylim([0 3]);xlim([0 s1_max]); +% % plot(ER_bins,lower_bound,'ok','markersize',6,'linewidth',2) +% plot(ER_bins,ER_lower_fit,'--r','markersize',14,'linewidth',2) +% % plot(ER_bins,mean_ER_band,'ok','markersize',6,'linewidth',2)%plot mean of ER band +% plot(ER_bins,ER_mean_fit,'-r','markersize',20,'linewidth',2) +% % plot(ER_bins,upper_bound,'ok','markersize',6,'linewidth',2) +% plot(ER_bins,ER_upper_fit,'--r','markersize',14,'linewidth',2) +% bin_step=2; +% +% total_count=length(log10(s2area)); +% +% plot(spikyS1(not_in_vislux),log10(s2area(not_in_vislux)./spikyS1(not_in_vislux)),'+m','MarkerSize',10,'LineWidth',2); +% plot(spikyS1(seem_fine),log10(s2area(seem_fine)./spikyS1(seem_fine)),'+g','MarkerSize',10,'LineWidth',2); +% plot(spikyS1(spheinbetween),log10(s2area(spheinbetween)./spikyS1(spheinbetween)),'+b','MarkerSize',10,'LineWidth',2); +% plot(spikyS1(cutoffs2),log10(s2area(cutoffs2)./spikyS1(cutoffs2)),'+r','MarkerSize',10,'LineWidth',2); + + +%% Printing Luxstamps +% clear below_band_indices below_band_events +% counter=1; +% for ii=1:length(below_band_cut); +% if below_band_cut(1,ii)==1; +% below_band_indices(counter)=(ii); +% counter=counter+1; +% end +% end +% +% for ii=1:length(below_band_indices); +% below_band_events{ii}=stamps(below_band_indices(ii),:); +% end +% %sprintf('%s, \n',below_band_events{:}) +% +% clear above_band_indices +% counter=1; +% for ii=1:length(above_band_cut); +% if above_band_cut(1,ii)~=0; +% above_band_indices(counter)=(ii); +% counter=counter+1; +% end +% end +% +% for ii=1:length(above_band_indices); +% above_band_events{ii}=stamps(above_band_indices(ii),:); +% end + %sprintf('%s, \n',above_band_events{:}) + +belowband_events=luxstamp(below_band_cut); +aboveband_events=luxstamp(above_band_cut); +withinband_events=luxstamp(in_band_cut); +% sprintf('%15d, \n',luxstamp(below_band_cut)') + +%% Plotting ER Band with below band events labeled + +%The <= >= parts are to account for rounding error +s2_cutoff_events=( (luxstamp >= 9345476575688025 & luxstamp <= 9345476575688026 ) | luxstamp == 9345636686627672 | luxstamp ==9346286182335170 ... +| (luxstamp >=9346338646205858 & luxstamp <=9346338646205859) | luxstamp == 9353211711501746 | (luxstamp >= 9353850500120662 & luxstamp <= 9353850500120663) ... +| (luxstamp >=9354500564535586 & luxstamp <=9354500564535587) ... +| luxstamp == 9355207286744840| luxstamp ==9357718732440018 ); + +s1_sphe_events= ( (luxstamp >= 9347665873639937 & luxstamp <= 9347665873639939) | (luxstamp >= 9353409153802245 & luxstamp <= 9353409153802247) | (luxstamp >= 9353545137965615 & luxstamp <= 9353545137965617) ... + | (luxstamp >= 9353836499369423 & luxstamp <= 9353836499369425) | (luxstamp >= 9355338271581951 & luxstamp <= 9355338271581953) | (luxstamp >= 9356366230146049 & luxstamp <= 9356366230146051) ... + | (luxstamp >= 9357490076460473 & luxstamp <= 9357490076460475 ) ... + | (luxstamp >= 9358350130729310 & luxstamp <= 9358350130729312 ) | luxstamp == 9344432895860114 | (luxstamp >= 9345470424648252 & luxstamp <= 9345470424648254) ... + | (luxstamp >= 9346148377561980 & luxstamp <= 9346148377561982 ) ... + | (luxstamp >= 9353404051387488 & luxstamp <= 9353404051387490 ) | (luxstamp >= 9356324167913316 & luxstamp <= 9356324167913318) ... + | (luxstamp >= 9357464869795738 & luxstamp <= 9357464869795740)); + +look_fine_events = ( (luxstamp >= 9344054807376460 & luxstamp <= 9344054807376462) | (luxstamp >= 9344586269804138 & luxstamp <= 9344586269804140) | luxstamp == 9345132068186502 ... +| luxstamp == 9353562076837210 | (luxstamp >= 9354685871936240 & luxstamp <= 9354685871936242) | luxstamp == 9357003913822558 | ( luxstamp >= 9358257329458430 & luxstamp <= 9358257329458432) ); + +figure + + no_fid_new=figure; + hold on + scatter(spikyS1,log10(s2area./spikyS1),'.k'); + plot(spikyS1(s2_cutoff_events),log10(s2area(s2_cutoff_events)./spikyS1(s2_cutoff_events)),'+r','MarkerSize',10,'LineWidth',2); + plot(spikyS1(s1_sphe_events),log10(s2area(s1_sphe_events)./spikyS1(s1_sphe_events)),'+b','MarkerSize',10,'LineWidth',2); + plot(spikyS1(look_fine_events),log10(s2area(look_fine_events)./spikyS1(look_fine_events)),'+g','MarkerSize',10,'LineWidth',2); + ylabel('Corrected log10(S2/S1)'); xlabel('S1 corrected (Pulse Area Phe)'); + title('Corrected CH3T','fontsize',16,'Interpreter','none'); + myfigview(16); + ylim([0 3]);xlim([0 s1_max]); + plot(ER_bins,ER_lower_fit,'--r','markersize',14,'linewidth',2) + plot(ER_bins,ER_mean_fit,'-r','markersize',20,'linewidth',2) + plot(ER_bins,ER_upper_fit,'--r','markersize',14,'linewidth',2) + bin_step=2; + + total_count=length(log10(s2area)); + + + box; + text(10,2.8,strcat('Total Count= ',num2str(total_count)),'fontsize',16); + + +%% Plotting XY dist of below band population + +figure +plot(x_corr,y_corr,'.k'); +hold on; +plot(x_corr(above_band_cut),y_corr(above_band_cut),'+b','MarkerSize',10,'LineWidth',2); +plot(x_corr(below_band_cut),y_corr(below_band_cut),'+r','MarkerSize',10,'LineWidth',2); +circle(0,0,25); +legend('All Events','Above Band','Below Band'); +xlabel('Corrected x (cm)');ylabel('Corrected y (cm)'); +myfigview(16); + +%% Plotting RvZ dist of below and above band events + +figure +hold on; +plot(radius.^2,drift,'.k','MarkerSize',10,'LineWidth',2); +plot(radius(above_band_cut).^2,drift(above_band_cut),'+b','MarkerSize',10,'LineWidth',2); +plot(radius(below_band_cut).^2,drift(below_band_cut),'+r','MarkerSize',10,'LineWidth',2); +legend('All Events','Above Band','Below Band'); +xlabel('Corrected Radius (cm^2)');ylabel('Drift Time(uSec)'); +myfigview(16); + +%% Plot the one unaccounted "background event" location + +mycut=(inrange(spikyS1,[15.5,16.5]) & inrange(log10(s2area./spikyS1),[1.25,1.3])); + +figure +plot(radius.^2,drift,'.k','MarkerSize',10,'LineWidth',2); +hold on; +plot(radius(mycut).^2,drift(mycut),'+r','MarkerSize',10,'LineWidth',2); +xlabel('Corrected Radius (cm^2)');ylabel('Drift Time(uSec)'); +myfigview(16); + +figure +plot(x_corr,y_corr,'.k'); +hold on; +plot(x_corr(mycut),y_corr(mycut),'+r','MarkerSize',10,'LineWidth',2); +xlabel('Corrected x (cm)');ylabel('Corrected y (cm)'); +myfigview(16); + +%% Checking corrections are okay by comparing raw and corrected pulse area +figure +scatter(s1area_raw,s1area,'.k'); +hold on; +scatter(s1area_raw(below_band_cut),s1area(below_band_cut),'.m'); +scatter(s1area_raw(above_band_cut),s1area(above_band_cut),'.b'); +xlabel('Uncorrected S1');ylabel('Corrected S1'); myfigview(16); +legend('All Events','Below Band','Above Band'); + + +figure +scatter(s2area_raw,s2area,'.k'); +hold on; +scatter(s2area_raw(below_band_cut),s2area(below_band_cut),'.m'); +scatter(s2area_raw(above_band_cut),s2area(above_band_cut),'.b'); +xlabel('Uncorrected S2');ylabel('Corrected S2'); myfigview(16); +legend('All Events','Below Band','Above Band'); + +%% Checking that corrections are okay by making the raw ER band and looking at events + + s2_s1_bin= 1:.05:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=inrange(s1area_raw,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(s2area_raw(ER_fit_cut)./s1area_raw(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2area_raw(ER_fit_cut)./s1area_raw(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); + %ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + b=confint(ER_mean_power_fit,.68); + sigma_a_ER_mean=(b(2,1)-b(1,1))/2; + sigma_b_ER_mean=(b(2,2)-b(1,2))/2; + + ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + b=confint(ER_lower_power_fit,.68); + sigma_a_ER_lower=(b(2,1)-b(1,1))/2; + sigma_b_ER_lower=(b(2,2)-b(1,2))/2; + + ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + b=confint(ER_upper_power_fit,.68); + sigma_a_ER_upper=(b(2,1)-b(1,1))/2; + sigma_b_ER_upper=(b(2,2)-b(1,2))/2; + + + %Make Plot + + no_fid_new=figure; + hold on + + scatter(s1area_raw,log10(s2area_raw./s1area_raw),'.k'); + ylabel('Uncorrected log10(S2/S1)'); xlabel('S1 Uncorrected (Pulse Area Phe)'); + title('Uncorrected CH3T','fontsize',16,'Interpreter','none'); + myfigview(16); + ylim([0 3]);xlim([0 s1_max]); +% plot(ER_bins,lower_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_lower_fit,'--r','markersize',14,'linewidth',2) +% plot(ER_bins,mean_ER_band,'ok','markersize',6,'linewidth',2)%plot mean of ER band + plot(ER_bins,ER_mean_fit,'-r','markersize',20,'linewidth',2) +% plot(ER_bins,upper_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_upper_fit,'--r','markersize',14,'linewidth',2) + bin_step=2; +scatter(s1area_raw(below_band_cut),log10(s2area_raw(below_band_cut)./s1area_raw(below_band_cut)),'.m'); +scatter(s1area_raw(above_band_cut),log10(s2area_raw(above_band_cut)./s1area_raw(above_band_cut)),'.b'); + + +% sprintf('%d, \n',belowband_events) \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/Run03_CH3T_Outliers/SimulationData.m b/CodeForLUX/Matlab/MyScripts/Run03_CH3T_Outliers/SimulationData.m new file mode 100644 index 0000000..c89b20b --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/Run03_CH3T_Outliers/SimulationData.m @@ -0,0 +1,114 @@ +load('Tritium_SIM_cp14477.mat') +spikyS1=to_save(:,1); +s2area=to_save(:,2); +drift=to_save(:,4); +s1_min=0; +s1_max=50; + + + + s2_s1_bin= 1:.05:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% temporary, for calculating correct E-lifetime + for ER_bin = (ER_bin_size/2)+s1_min:ER_bin_size:(s1_max); %HIST uses bin centers + + + ER_fit_cut=inrange(spikyS1,[ER_bin-ER_bin_size/2,ER_bin+ER_bin_size/2]); + + ER_band_hist=hist(log10(s2area(ER_fit_cut)./spikyS1(ER_fit_cut)),s2_s1_bin); + counts_ER_hist(index_i)=sum(ER_band_hist); + + Fit_ER=fit(s2_s1_bin',ER_band_hist','gauss1'); + + rms_fit=fit_ML_normal(log10(s2area(ER_fit_cut)./spikyS1(ER_fit_cut)),s2_s1_bin); + + %band=confint(Fit_ER,.1); + %ER_sigma(index_i)= Fit_ER.c1/sqrt(2); + ER_sigma(index_i)= sqrt(rms_fit.sig2); + ER_sigma_sigma(index_i)=ER_sigma(index_i)/sqrt(2*counts_ER_hist(index_i)); + + lower_bound(index_i)=Fit_ER.b1-ER_sigma(index_i)*band_sigma; + mean_ER_band(index_i)=Fit_ER.b1; + upper_bound(index_i)=Fit_ER.b1+ER_sigma(index_i)*band_sigma; + + %mean_ER_band_sim(index_i)=Fit_ER_sim.b1; + + index_i=index_i+1; + end + + + % Fit power law to the mean + g=fittype('a*x^b'); + ER_mean_power_fit=fit(ER_bins(ER_bins>2)',mean_ER_band(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_mean_fit=ER_mean_power_fit.a.*ER_bins.^(ER_mean_power_fit.b); + b=confint(ER_mean_power_fit,.68); + sigma_a_ER_mean=(b(2,1)-b(1,1))/2; + sigma_b_ER_mean=(b(2,2)-b(1,2))/2; + + ER_lower_power_fit=fit(ER_bins(ER_bins>2)',lower_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_lower_fit=ER_lower_power_fit.a.*ER_bins.^(ER_lower_power_fit.b); + b=confint(ER_lower_power_fit,.68); + sigma_a_ER_lower=(b(2,1)-b(1,1))/2; + sigma_b_ER_lower=(b(2,2)-b(1,2))/2; + + ER_upper_power_fit=fit(ER_bins(ER_bins>2)',upper_bound(ER_bins>2)',g,'startpoint',[ 2.5 -.1]); + ER_upper_fit=ER_upper_power_fit.a.*ER_bins.^(ER_upper_power_fit.b); + b=confint(ER_upper_power_fit,.68); + sigma_a_ER_upper=(b(2,1)-b(1,1))/2; + sigma_b_ER_upper=(b(2,2)-b(1,2))/2; + + + %Make Plot + + no_fid_new=figure; + hold on + + scatter(spikyS1,log10(s2area./spikyS1),'.k'); + ylabel('Corrected log10(S2/S1)'); xlabel('S1 corrected (Pulse Area Phe)'); + title('Corrected CH3T','fontsize',16,'Interpreter','none'); + myfigview(16); + ylim([0 3]);xlim([0 s1_max]); +% plot(ER_bins,lower_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_lower_fit,'--r','markersize',14,'linewidth',2) +% plot(ER_bins,mean_ER_band,'ok','markersize',6,'linewidth',2)%plot mean of ER band + plot(ER_bins,ER_mean_fit,'-r','markersize',20,'linewidth',2) +% plot(ER_bins,upper_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_upper_fit,'--r','markersize',14,'linewidth',2) + bin_step=2; + + total_count=length(log10(s2area)); + + + box; + text(10,2.8,strcat('Total Count= ',num2str(total_count)),'fontsize',16); +% %text(5,.7,strcat('NEST\_SE_{bot} Fit=',num2str(ER_mean_NEST_fit.SE_ER_fit*73/64*27/24.5,3),'\pm ', num2str(sigma_SE_ER_fit*73/64*27/24.5,2),'[Phe]'),'fontsize',16,'color','m','interpreter','tex'); +% %text(5,.8,'NEST Platinum V4-b', 'fontsize',16,'color','m','interpreter','tex' ); +% text(5,.55,strcat('+',num2str(band_sigma),'\sigma = (',num2str(ER_upper_power_fit.a,3),'\pm', num2str(sigma_a_ER_upper,1) ,')\times S1_c ^{', num2str(ER_upper_power_fit.b,3),'\pm',num2str(sigma_b_ER_upper,1),'}'),'fontsize',16,'interpreter','tex'); +% text(5,.3,strcat('Mean=(',num2str(ER_mean_power_fit.a,3),'\pm', num2str(sigma_a_ER_mean,1),')\times S1_c ^{', num2str(ER_mean_power_fit.b,3),'\pm', num2str(sigma_b_ER_mean,1),'}'),'fontsize',16,'interpreter','tex'); +% text(5,.05,strcat('-',num2str(band_sigma),'\sigma = (',num2str(ER_lower_power_fit.a,3),'\pm', num2str(sigma_a_ER_lower,1),')\times S1_c ^{', num2str(ER_lower_power_fit.b,3),'\pm', num2str(sigma_b_ER_lower,1),'}'),'fontsize',16,'interpreter','tex'); +% + + +%% Cutting on populations above and below the band width + +below_band_cut=log10(s2area./spikyS1)< (ER_lower_power_fit.a.*(spikyS1.^ER_lower_power_fit.b)); +above_band_cut=log10(s2area./spikyS1)> (ER_upper_power_fit.a.*(spikyS1.^ER_upper_power_fit.b)); +in_band_cut=log10(s2area./spikyS1)< (ER_upper_power_fit.a.*(spikyS1.^ER_upper_power_fit.b)) & log10(s2area./spikyS1)> (ER_lower_power_fit.a.*(spikyS1.^ER_lower_power_fit.b)); + +%Categories of events +seem_fine=(luxstamp == 9344432895860114 | luxstamp == 9345132068186502 | luxstamp == 9353562076837210 | luxstamp == 9357003913822558 | luxstamp == 9357490076460474); +not_in_vislux=(luxstamp==9344054807376460 | luxstamp == 9344586269804140 | luxstamp ==9345470424648252 | luxstamp == 9345476575688024 | luxstamp == 9346148377561980 | luxstamp == 9346338646205860 | luxstamp == 9353404051387488 | luxstamp ==9353850500120664 | luxstamp == 9354500564535588 | luxstamp == 9354685871936240 | luxstamp == 9356324167913316 | luxstamp == 9356366230146050 | luxstamp == 9357464869795740 | luxstamp == 9358257329458432 | luxstamp == 9358350130729312 ); +cutoffs2=(luxstamp==9345636686627672 | luxstamp == 9346286182335170 | luxstamp == 9353211711501746 | luxstamp==9355207286744840 | luxstamp == 9357718732440018); +spheinbetween= (luxstamp == 9347665873639938 | luxstamp == 9353409153802246 | luxstamp ==9353545137965616 | luxstamp == 9355338271581952 | luxstamp == 9353836499369424 | luxstamp == 9356324167913316 ); +hold on; +plot(spikyS1(below_band_cut),log10(s2area(below_band_cut)./spikyS1(below_band_cut)),'+m','MarkerSize',10,'LineWidth',2); +plot(spikyS1(above_band_cut),log10(s2area(above_band_cut)./spikyS1(above_band_cut)),'+b','MarkerSize',10,'LineWidth',2); diff --git a/CodeForLUX/Matlab/MyScripts/Run03_CH3T_Outliers/WS_ERBand.m b/CodeForLUX/Matlab/MyScripts/Run03_CH3T_Outliers/WS_ERBand.m new file mode 100644 index 0000000..06fb271 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/Run03_CH3T_Outliers/WS_ERBand.m @@ -0,0 +1,56 @@ +load('Run03_WS.mat'); +load('DecERBand'); + +s1_min=0; +s1_max=50; + + band_sigma=4; %4 sigma = 1 in 15,000 chance of being outside this + + + s2_s1_bin= 1:.05:5; + ER_bin_size=2; %3 works + index_i=1; + ER_bins=ER_bin_size/2+s1_min:ER_bin_size:s1_max; + lower_bound=ones(size(ER_bins)); + mean_ER_band=ones(size(ER_bins)); + upper_bound=ones(size(ER_bins)); + counts_ER_hist=ones(size(ER_bins)); + ER_sigma=ones(size(ER_bins)); + ER_sigma_sigma=ones(size(ER_bins)); + +% Draw 4 sigma ER Band with WS data + figure + scatter(spikyS1,log10(s2area./spikyS1),'.k'); + hold on; + ylabel('Corrected log10(S2/S1)'); xlabel('S1 corrected (Pulse Area Phe)'); + title('Corrected WS Data','fontsize',16,'Interpreter','none'); + myfigview(16); + ylim([0 3]);xlim([0 s1_max]); +% plot(ER_bins,lower_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_lower_fit,'--r','markersize',14,'linewidth',2) +% plot(ER_bins,mean_ER_band,'ok','markersize',6,'linewidth',2)%plot mean of ER band + plot(ER_bins,ER_mean_fit,'-r','markersize',20,'linewidth',2) +% plot(ER_bins,upper_bound,'ok','markersize',6,'linewidth',2) + plot(ER_bins,ER_upper_fit,'--r','markersize',14,'linewidth',2) + bin_step=2; + + total_count=length(log10(s2area)); + + + box; + text(10,2.8,strcat('Total Count= ',num2str(total_count)),'fontsize',16); + + +below_band_cut=log10(s2area./spikyS1)< (ER_lower_power_fit.a.*(spikyS1.^ER_lower_power_fit.b)) & spikyS1<50; +above_band_cut=log10(s2area./spikyS1)> (ER_upper_power_fit.a.*(spikyS1.^ER_upper_power_fit.b)) & spikyS1<50; +in_band_cut=log10(s2area./spikyS1)< (ER_upper_power_fit.a.*(spikyS1.^ER_upper_power_fit.b)) & log10(s2area./spikyS1)> (ER_lower_power_fit.a.*(spikyS1.^ER_lower_power_fit.b)); +hold on; +plot(spikyS1(below_band_cut),log10(s2area(below_band_cut)./spikyS1(below_band_cut)),'+m','MarkerSize',10,'LineWidth',2); +plot(spikyS1(above_band_cut),log10(s2area(above_band_cut)./spikyS1(above_band_cut)),'+b','MarkerSize',10,'LineWidth',2); + +%% Printing Luxstamps +belowband_events=luxstamp(below_band_cut); +aboveband_events=luxstamp(above_band_cut); +withinband_events=luxstamp(in_band_cut); + +% sprintf('%d, \n',belowband_events) diff --git a/CodeForLUX/Matlab/MyScripts/Run04_libNEST_DetectorParameters/Feb2015_Run04_DetectorParameters.m b/CodeForLUX/Matlab/MyScripts/Run04_libNEST_DetectorParameters/Feb2015_Run04_DetectorParameters.m new file mode 100644 index 0000000..ec3035d --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/Run04_libNEST_DetectorParameters/Feb2015_Run04_DetectorParameters.m @@ -0,0 +1,350 @@ +path='C:\Users\Richard\Desktop\LUX Analysis\CH3T_KrData\lux10_20150226T1943'; %cp_18525 is 2.18 corrected + + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples','xyz_corrected_pulse_area_all_phe'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +distinguish_string='test'; + +%Hardcoding inputs for ease of use during testing +user_name='RichardKnoche'; +dp_version='2.15_test'; +algorithm_name='test_KrypCal'; +submit=0; +delay_min=0; +inpaint_on=1; + + file=char(d.files_loaded(1)); + file_id=file(1:19); + cp_start=strfind(file,'cp')+2;%find location of 'cp' in string + cp=file(cp_start:cp_start+4);%cp number has four digits + file_id_cp = [file_id '_cp' cp '_' distinguish_string]; + + + gs=0; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 32000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + clean_cut = (log10(s1_phe_both)+0.6*log10(s2_phe_both)>4.5) & s2radius<25; + + s1_phe_bottom=s1_phe_bottom(clean_cut); + s1_phe_both=s1_phe_both(clean_cut); + s2_phe_bottom=s2_phe_bottom(clean_cut); + s2_phe_both=s2_phe_both(clean_cut); + drift_time=drift_time(clean_cut); + s2x=s2x(clean_cut); + s2y=s2y(clean_cut); + s2radius = (s2x.^2+s2y.^2).^(0.5); + event_timestamp_samples=event_timestamp_samples(clean_cut); + s2_width=s2_width(clean_cut); + s1_width=s1_width(clean_cut); + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + +z_center +%% + + % Calculate Single Electron Size + s4_class=(d.pulse_classification==4) ; %Use or class=2 to fix 33 phe cut off... have to edit se_wrt_first_s1_func tho + d = se_wrt_first_s1_func(d); + cut_se_s1_z = d.t_btw_se_first_s1 > 100*10; + + SE_good_cut =logical( cut_se_s1_z & s4_class & ( cumsum(s1_single_cut)-cumsum(s2_single_cut) ) ); % only events between good S1 and S2s + + SE_phe_both=d.pulse_area_phe(SE_good_cut); + SE_phe_bot=d.phe_bottom(SE_good_cut); + SE_phe_top=SE_phe_both-SE_phe_bot; + + SE_x=d.x_cm(SE_good_cut); + SE_y=d.y_cm(SE_good_cut); + SE_radius=(SE_x.^2+SE_y.^2).^(1/2); + + %Both PMT first fit + SE_fit=fit([0:1:60]',hist(SE_phe_both(SE_radius<17 & inrange(SE_phe_both,[0 60])),[0:1:60])','gauss1'); + SE_Size=SE_fit.b1; + SE_sig=SE_fit.c1/sqrt(2); + SE_both_conf=confint(SE_fit,0.683); + SE_sig_mu_both=abs(SE_Size-SE_both_conf(1,2)); % one sigma + SE_sig_sig_both=abs(SE_sig-SE_both_conf(1,3)/sqrt(2)); % one sigma + + %Both PMT Second fit + n_sig_fit=2; + + fit_start=SE_Size-n_sig_fit*SE_sig; + fit_end=SE_Size+n_sig_fit*SE_sig; + xfit=fit_start:0.1:fit_end; + + SE_cut=SE_phe_both(SE_radius<17); + [xxo, yyo, xo, no] = step(SE_cut(inrange(SE_cut,[fit_start fit_end])),[0:0.2:60]); + s = fitoptions('Method','NonlinearLeastSquares','Robust','On','Algorithm','Trust-Region','Lower',[-5,0,0,0],'Upper',[5,Inf,Inf,Inf],... + 'Startpoint',[1,max(no),10,5]); + skewGauss1 = fittype('a1/c1*exp(-((x-b1)/c1)^2)*(1+erf(a*(x-b1)/c1))','options',s); + + [f_both,g_both] = fit(xo',no',skewGauss1); + delta_both = f_both.a/sqrt(1+f_both.a^2); + SE_mu_both = f_both.b1 + f_both.c1/sqrt(2)*delta_both*sqrt(2/pi); + SE_sig_both = sqrt((f_both.c1/sqrt(2))^2 * (1 - 2 * (delta_both)^2/pi)); + skew_both = (4-pi)/2 * (delta_both * sqrt(2/pi))^3 / (1 - 2 * delta_both^2/pi)^(3/2); + kurt_both = 2*(pi-3) * (delta_both * sqrt(2/pi))^3 / (1 - 2 * delta_both^2/pi)^2; + ci_both = confint(f_both,0.683); + y_fit_both = f_both(xfit); + + both_SE_fig=figure; + hold on; + step(SE_cut,[0:0.2:60],'k'); + h_fit=plot(xfit,y_fit_both,'-r','linewidth',2); + box on; + myfigview(18); + xlabel('Pulse Area Phe (Phe) '); ylabel('Count/Phe '); + legend([h_fit],strcat('\mu = ',num2str(SE_mu_both,'%2.2f'),'\newline \sigma= ',num2str(SE_sig_both,'%2.2f'),'\newline skew=', num2str(skew_both,'%2.2f') ), 'location','northeast'); + + + %% SE Both XY Map + SExybinsize=sqrt((50*50)/(length(SE_phe_both)/100)); + num_SE_events=length(SE_phe_both); + se_xbins=SE_xbin_min+SExybinsize/2:SExybinsize:SE_xbin_max; + se_ybins=SE_ybin_min+SExybinsize/2:SExybinsize:SE_ybin_max; + + mean_SE_both_xy = zeros(length(se_xbins),length(se_ybins)); + mean_err_SE_both_xy = zeros(length(se_xbins),length(se_ybins)); + skew_SE_both_xy = zeros(length(se_xbins),length(se_ybins)); + sigma_SE_both_xy = zeros(length(se_xbins),length(se_ybins)); + kurt_SE_both_xy = zeros(length(se_xbins),length(se_ybins)); + sigma_err_SE_both_xy = zeros(length(se_xbins),length(se_ybins)); + + for x_bin=SE_xbin_min:SExybinsize:(SE_xbin_max-SExybinsize); + for y_bin=SE_ybin_min:SExybinsize:(SE_ybin_max-SExybinsize); + x_min = x_bin; x_max = x_bin+SExybinsize; + y_min = y_bin; y_max = y_bin+SExybinsize; + + x_count=int32(1+x_bin/SExybinsize+SE_xbin_max/SExybinsize); + y_count=int32(1+y_bin/SExybinsize+SE_ybin_max/SExybinsize); + + + bin_cut = (SE_phe_both>0) & inrange(SE_x,[x_min,x_max]) & inrange(SE_y,[y_min,y_max]); + + if length(SE_phe_both(bin_cut)) > 60; + %Both PMT first fit + clear temp_SE + temp_SE=SE_phe_both(bin_cut); + SE_fit_xy=fit([0:1:60]',hist(temp_SE(inrange(temp_SE,[0 60])),[0:1:60])','gauss1'); + SE_Size_xy=SE_fit_xy.b1; + SE_sig_xy=SE_fit_xy.c1/sqrt(2); + SE_both_conf_xy=confint(SE_fit_xy,0.683); + SE_sig_mu_both_xy=abs(SE_Size_xy-SE_both_conf_xy(1,2)); % one sigma + SE_sig_sig_both_xy=abs(SE_sig_xy-SE_both_conf_xy(1,3)/sqrt(2)); % one sigma + + %Both PMT Second fit + n_sig_fit=2; + + fit_start=SE_Size_xy-n_sig_fit*SE_sig_xy; + fit_end=SE_Size_xy+n_sig_fit*SE_sig_xy; + xfit=fit_start:0.1:fit_end; + + [xxo, yyo, xo, no] = step(temp_SE(inrange(temp_SE,[fit_start fit_end])),[0:0.2:60]); + s = fitoptions('Method','NonlinearLeastSquares','Robust','On','Algorithm','Trust-Region','Lower',[-5,0,0,0],'Upper',[5,Inf,Inf,Inf],... + 'Startpoint',[1,max(no),10,5]); + skewGauss1 = fittype('a1/c1*exp(-((x-b1)/c1)^2)*(1+erf(a*(x-b1)/c1))','options',s); + + [f_both_xy,g_both_xy] = fit(xo',no',skewGauss1); + delta_both_xy = f_both_xy.a/sqrt(1+f_both_xy.a^2); + SE_mu_both_xy = f_both_xy.b1 + f_both_xy.c1/sqrt(2)*delta_both_xy*sqrt(2/pi); + SE_sig_both_xy = sqrt((f_both_xy.c1/sqrt(2))^2 * (1 - 2 * (delta_both_xy)^2/pi)); + skew_both_xy = (4-pi)/2 * (delta_both_xy * sqrt(2/pi))^3 / (1 - 2 * delta_both_xy^2/pi)^(3/2); + kurt_both_xy = 2*(pi-3) * (delta_both_xy * sqrt(2/pi))^3 / (1 - 2 * delta_both_xy^2/pi)^2; + ci_both_xy = confint(f_both_xy,0.683); + y_fit_both_xy = f_both_xy(xfit); + + mean_SE_both_xy(y_count,x_count)=SE_mu_both_xy; + skew_SE_both_xy(y_count,x_count)=skew_both_xy; + sigma_SE_both_xy(y_count,x_count)=SE_sig_both_xy; + kurt_SE_both_xy(y_count,x_count)=kurt_both_xy; + mean_err_SE_both_xy(y_count,x_count)=SE_sig_mu_both_xy; + sigma_err_SE_both_xy(y_count,x_count)=SE_sig_sig_both_xy; + + + else + + mean_SE_both_xy(y_count,x_count)=0; + skew_SE_both_xy(y_count,x_count)=0; + sigma_SE_both_xy(y_count,x_count)=0; + kurt_SE_both_xy(y_count,x_count)=0; + mean_err_SE_both_xy(y_count,x_count)=0; + sigma_err_SE_both_xy(y_count,x_count)=0; + + end + end + end + +%%Plot the mean SE_XY both %%%%%%%%%%%%%%%% +color_range_max=max(max(mean_SE_both_xy)); +color_range_min=min(min(mean_SE_both_xy(mean_SE_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; + +SE_xy_both_fig = figure; +contourf(se_xbins,se_ybins,mean_SE_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. SE Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%%Plot the 1 sigma of the mean + +color_range_max=max(max(mean_err_SE_both_xy)); +color_range_min=min(min(mean_err_SE_both_xy(mean_err_SE_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; + +sigma_SE_xy_both_fig = figure; +contourf(se_xbins,se_ybins,mean_err_SE_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. 1-Sigma SE Mean(Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + +%Calculate corrections matrix and 1 sigma corrections matrix for SE_both +% if inpaint_on==1; mean_SE_both_xy(mean_SE_both_xy==0)=nan; mean_SE_both_xy=inpaint_nans(mean_SE_both_xy,3); end; +SE_both_mu_center=interp2(se_xbins,se_ybins,mean_SE_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_SE_both_mu=SE_both_mu_center./mean_SE_both_xy; +norm_SE_both_mu(isinf(norm_SE_both_mu))=1;%no infinity! Do not correct events outside r=25cm +norm_SE_both_mu(isnan(norm_SE_both_mu))=1; + +%Calculate error on SE center +% if inpaint_on==1; mean_err_SE_both_xy(mean_err_SE_both_xy==0)=nan; mean_err_SE_both_xy=inpaint_nans(mean_err_SE_both_xy,3); end; +error_SE_both_mu_center=interp2(se_xbins,se_ybins,mean_err_SE_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +error_SE_both_mu_norm=sqrt((error_SE_both_mu_center./mean_SE_both_xy).^2+(mean_err_SE_both_xy.*SE_both_mu_center./mean_SE_both_xy.^2).^2); +error_SE_both_mu_norm(isinf(error_SE_both_mu_norm))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +error_SE_both_mu_norm(isnan(error_SE_both_mu_norm))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +%Calculate kurt,sigma, and skew at center +% if inpaint_on==1; kurt_SE_both_xy(kurt_SE_both_xy==0)=nan; kurt_SE_both_xy=inpaint_nans(kurt_SE_both_xy,3); end; +% if inpaint_on==1; skew_SE_both_xy(skew_SE_both_xy==0)=nan; skew_SE_both_xy=inpaint_nans(skew_SE_both_xy,3); end; +% if inpaint_on==1; sigma_SE_both_xy(sigma_SE_both_xy==0)=nan; sigma_SE_both_xy=inpaint_nans(sigma_SE_both_xy,3); end; +SE_both_kurt_center=interp2(se_xbins,se_ybins,kurt_SE_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +SE_both_skew_center=interp2(se_xbins,se_ybins,skew_SE_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +SE_both_sigma_center=interp2(se_xbins,se_ybins,sigma_SE_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) + + +%% Assuming working corrections, find the optimal g2 with g1=0.105 from Kr2.18 + +s2_c=d.xyz_corrected_pulse_area_all_phe(s2_single_cut); +s1_c=d.xyz_corrected_pulse_area_all_phe(s1_single_cut); + +% cut=inrange(log10(s2_c),[4.1,5.1]) & inrange(log10(s1_c),[2 2.6]); \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/Run04_libNEST_DetectorParameters/Nov2014_Run04_DetectorParameters.m b/CodeForLUX/Matlab/MyScripts/Run04_libNEST_DetectorParameters/Nov2014_Run04_DetectorParameters.m new file mode 100644 index 0000000..76ad8d8 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/Run04_libNEST_DetectorParameters/Nov2014_Run04_DetectorParameters.m @@ -0,0 +1,350 @@ +path='C:\Users\Richard\Desktop\LUX Analysis\CH3T_KrData\lux10_20141104T1748'; %cp18524 is 2.18 corrected + + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples','xyz_corrected_pulse_area_all_phe'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +distinguish_string='test'; + +%Hardcoding inputs for ease of use during testing +user_name='RichardKnoche'; +dp_version='2.15_test'; +algorithm_name='test_KrypCal'; +submit=0; +delay_min=0; +inpaint_on=1; + + file=char(d.files_loaded(1)); + file_id=file(1:19); + cp_start=strfind(file,'cp')+2;%find location of 'cp' in string + cp=file(cp_start:cp_start+4);%cp number has four digits + file_id_cp = [file_id '_cp' cp '_' distinguish_string]; + + + gs=0; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 32000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + clean_cut = (log10(s1_phe_both)+0.6*log10(s2_phe_both)>4.5) & s2radius<25; + + s1_phe_bottom=s1_phe_bottom(clean_cut); + s1_phe_both=s1_phe_both(clean_cut); + s2_phe_bottom=s2_phe_bottom(clean_cut); + s2_phe_both=s2_phe_both(clean_cut); + drift_time=drift_time(clean_cut); + s2x=s2x(clean_cut); + s2y=s2y(clean_cut); + s2radius = (s2x.^2+s2y.^2).^(0.5); + event_timestamp_samples=event_timestamp_samples(clean_cut); + s2_width=s2_width(clean_cut); + s1_width=s1_width(clean_cut); + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + +z_center +%% + + % Calculate Single Electron Size + s4_class=(d.pulse_classification==4) ; %Use or class=2 to fix 33 phe cut off... have to edit se_wrt_first_s1_func tho + d = se_wrt_first_s1_func(d); + cut_se_s1_z = d.t_btw_se_first_s1 > 100*10; + + SE_good_cut =logical( cut_se_s1_z & s4_class & ( cumsum(s1_single_cut)-cumsum(s2_single_cut) ) ); % only events between good S1 and S2s + + SE_phe_both=d.pulse_area_phe(SE_good_cut); + SE_phe_bot=d.phe_bottom(SE_good_cut); + SE_phe_top=SE_phe_both-SE_phe_bot; + + SE_x=d.x_cm(SE_good_cut); + SE_y=d.y_cm(SE_good_cut); + SE_radius=(SE_x.^2+SE_y.^2).^(1/2); + + %Both PMT first fit + SE_fit=fit([0:1:60]',hist(SE_phe_both(SE_radius<17 & inrange(SE_phe_both,[0 60])),[0:1:60])','gauss1'); + SE_Size=SE_fit.b1; + SE_sig=SE_fit.c1/sqrt(2); + SE_both_conf=confint(SE_fit,0.683); + SE_sig_mu_both=abs(SE_Size-SE_both_conf(1,2)); % one sigma + SE_sig_sig_both=abs(SE_sig-SE_both_conf(1,3)/sqrt(2)); % one sigma + + %Both PMT Second fit + n_sig_fit=2; + + fit_start=SE_Size-n_sig_fit*SE_sig; + fit_end=SE_Size+n_sig_fit*SE_sig; + xfit=fit_start:0.1:fit_end; + + SE_cut=SE_phe_both(SE_radius<17); + [xxo, yyo, xo, no] = step(SE_cut(inrange(SE_cut,[fit_start fit_end])),[0:0.2:60]); + s = fitoptions('Method','NonlinearLeastSquares','Robust','On','Algorithm','Trust-Region','Lower',[-5,0,0,0],'Upper',[5,Inf,Inf,Inf],... + 'Startpoint',[1,max(no),10,5]); + skewGauss1 = fittype('a1/c1*exp(-((x-b1)/c1)^2)*(1+erf(a*(x-b1)/c1))','options',s); + + [f_both,g_both] = fit(xo',no',skewGauss1); + delta_both = f_both.a/sqrt(1+f_both.a^2); + SE_mu_both = f_both.b1 + f_both.c1/sqrt(2)*delta_both*sqrt(2/pi); + SE_sig_both = sqrt((f_both.c1/sqrt(2))^2 * (1 - 2 * (delta_both)^2/pi)); + skew_both = (4-pi)/2 * (delta_both * sqrt(2/pi))^3 / (1 - 2 * delta_both^2/pi)^(3/2); + kurt_both = 2*(pi-3) * (delta_both * sqrt(2/pi))^3 / (1 - 2 * delta_both^2/pi)^2; + ci_both = confint(f_both,0.683); + y_fit_both = f_both(xfit); + + both_SE_fig=figure; + hold on; + step(SE_cut,[0:0.2:60],'k'); + h_fit=plot(xfit,y_fit_both,'-r','linewidth',2); + box on; + myfigview(18); + xlabel('Pulse Area Phe (Phe) '); ylabel('Count/Phe '); + legend([h_fit],strcat('\mu = ',num2str(SE_mu_both,'%2.2f'),'\newline \sigma= ',num2str(SE_sig_both,'%2.2f'),'\newline skew=', num2str(skew_both,'%2.2f') ), 'location','northeast'); + + + %% SE Both XY Map + SExybinsize=sqrt((50*50)/(length(SE_phe_both)/100)); + num_SE_events=length(SE_phe_both); + se_xbins=SE_xbin_min+SExybinsize/2:SExybinsize:SE_xbin_max; + se_ybins=SE_ybin_min+SExybinsize/2:SExybinsize:SE_ybin_max; + + mean_SE_both_xy = zeros(length(se_xbins),length(se_ybins)); + mean_err_SE_both_xy = zeros(length(se_xbins),length(se_ybins)); + skew_SE_both_xy = zeros(length(se_xbins),length(se_ybins)); + sigma_SE_both_xy = zeros(length(se_xbins),length(se_ybins)); + kurt_SE_both_xy = zeros(length(se_xbins),length(se_ybins)); + sigma_err_SE_both_xy = zeros(length(se_xbins),length(se_ybins)); + + for x_bin=SE_xbin_min:SExybinsize:(SE_xbin_max-SExybinsize); + for y_bin=SE_ybin_min:SExybinsize:(SE_ybin_max-SExybinsize); + x_min = x_bin; x_max = x_bin+SExybinsize; + y_min = y_bin; y_max = y_bin+SExybinsize; + + x_count=int32(1+x_bin/SExybinsize+SE_xbin_max/SExybinsize); + y_count=int32(1+y_bin/SExybinsize+SE_ybin_max/SExybinsize); + + + bin_cut = (SE_phe_both>0) & inrange(SE_x,[x_min,x_max]) & inrange(SE_y,[y_min,y_max]); + + if length(SE_phe_both(bin_cut)) > 60; + %Both PMT first fit + clear temp_SE + temp_SE=SE_phe_both(bin_cut); + SE_fit_xy=fit([0:1:60]',hist(temp_SE(inrange(temp_SE,[0 60])),[0:1:60])','gauss1'); + SE_Size_xy=SE_fit_xy.b1; + SE_sig_xy=SE_fit_xy.c1/sqrt(2); + SE_both_conf_xy=confint(SE_fit_xy,0.683); + SE_sig_mu_both_xy=abs(SE_Size_xy-SE_both_conf_xy(1,2)); % one sigma + SE_sig_sig_both_xy=abs(SE_sig_xy-SE_both_conf_xy(1,3)/sqrt(2)); % one sigma + + %Both PMT Second fit + n_sig_fit=2; + + fit_start=SE_Size_xy-n_sig_fit*SE_sig_xy; + fit_end=SE_Size_xy+n_sig_fit*SE_sig_xy; + xfit=fit_start:0.1:fit_end; + + [xxo, yyo, xo, no] = step(temp_SE(inrange(temp_SE,[fit_start fit_end])),[0:0.2:60]); + s = fitoptions('Method','NonlinearLeastSquares','Robust','On','Algorithm','Trust-Region','Lower',[-5,0,0,0],'Upper',[5,Inf,Inf,Inf],... + 'Startpoint',[1,max(no),10,5]); + skewGauss1 = fittype('a1/c1*exp(-((x-b1)/c1)^2)*(1+erf(a*(x-b1)/c1))','options',s); + + [f_both_xy,g_both_xy] = fit(xo',no',skewGauss1); + delta_both_xy = f_both_xy.a/sqrt(1+f_both_xy.a^2); + SE_mu_both_xy = f_both_xy.b1 + f_both_xy.c1/sqrt(2)*delta_both_xy*sqrt(2/pi); + SE_sig_both_xy = sqrt((f_both_xy.c1/sqrt(2))^2 * (1 - 2 * (delta_both_xy)^2/pi)); + skew_both_xy = (4-pi)/2 * (delta_both_xy * sqrt(2/pi))^3 / (1 - 2 * delta_both_xy^2/pi)^(3/2); + kurt_both_xy = 2*(pi-3) * (delta_both_xy * sqrt(2/pi))^3 / (1 - 2 * delta_both_xy^2/pi)^2; + ci_both_xy = confint(f_both_xy,0.683); + y_fit_both_xy = f_both_xy(xfit); + + mean_SE_both_xy(y_count,x_count)=SE_mu_both_xy; + skew_SE_both_xy(y_count,x_count)=skew_both_xy; + sigma_SE_both_xy(y_count,x_count)=SE_sig_both_xy; + kurt_SE_both_xy(y_count,x_count)=kurt_both_xy; + mean_err_SE_both_xy(y_count,x_count)=SE_sig_mu_both_xy; + sigma_err_SE_both_xy(y_count,x_count)=SE_sig_sig_both_xy; + + + else + + mean_SE_both_xy(y_count,x_count)=0; + skew_SE_both_xy(y_count,x_count)=0; + sigma_SE_both_xy(y_count,x_count)=0; + kurt_SE_both_xy(y_count,x_count)=0; + mean_err_SE_both_xy(y_count,x_count)=0; + sigma_err_SE_both_xy(y_count,x_count)=0; + + end + end + end + +%%Plot the mean SE_XY both %%%%%%%%%%%%%%%% +color_range_max=max(max(mean_SE_both_xy)); +color_range_min=min(min(mean_SE_both_xy(mean_SE_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; + +SE_xy_both_fig = figure; +contourf(se_xbins,se_ybins,mean_SE_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. SE Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%%Plot the 1 sigma of the mean + +color_range_max=max(max(mean_err_SE_both_xy)); +color_range_min=min(min(mean_err_SE_both_xy(mean_err_SE_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; + +sigma_SE_xy_both_fig = figure; +contourf(se_xbins,se_ybins,mean_err_SE_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. 1-Sigma SE Mean(Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + +%Calculate corrections matrix and 1 sigma corrections matrix for SE_both +% if inpaint_on==1; mean_SE_both_xy(mean_SE_both_xy==0)=nan; mean_SE_both_xy=inpaint_nans(mean_SE_both_xy,3); end; +SE_both_mu_center=interp2(se_xbins,se_ybins,mean_SE_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_SE_both_mu=SE_both_mu_center./mean_SE_both_xy; +norm_SE_both_mu(isinf(norm_SE_both_mu))=1;%no infinity! Do not correct events outside r=25cm +norm_SE_both_mu(isnan(norm_SE_both_mu))=1; + +%Calculate error on SE center +% if inpaint_on==1; mean_err_SE_both_xy(mean_err_SE_both_xy==0)=nan; mean_err_SE_both_xy=inpaint_nans(mean_err_SE_both_xy,3); end; +error_SE_both_mu_center=interp2(se_xbins,se_ybins,mean_err_SE_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +error_SE_both_mu_norm=sqrt((error_SE_both_mu_center./mean_SE_both_xy).^2+(mean_err_SE_both_xy.*SE_both_mu_center./mean_SE_both_xy.^2).^2); +error_SE_both_mu_norm(isinf(error_SE_both_mu_norm))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +error_SE_both_mu_norm(isnan(error_SE_both_mu_norm))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +%Calculate kurt,sigma, and skew at center +% if inpaint_on==1; kurt_SE_both_xy(kurt_SE_both_xy==0)=nan; kurt_SE_both_xy=inpaint_nans(kurt_SE_both_xy,3); end; +% if inpaint_on==1; skew_SE_both_xy(skew_SE_both_xy==0)=nan; skew_SE_both_xy=inpaint_nans(skew_SE_both_xy,3); end; +% if inpaint_on==1; sigma_SE_both_xy(sigma_SE_both_xy==0)=nan; sigma_SE_both_xy=inpaint_nans(sigma_SE_both_xy,3); end; +SE_both_kurt_center=interp2(se_xbins,se_ybins,kurt_SE_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +SE_both_skew_center=interp2(se_xbins,se_ybins,skew_SE_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +SE_both_sigma_center=interp2(se_xbins,se_ybins,sigma_SE_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) + +%% + +s2_c=d.xyz_corrected_pulse_area_all_phe(s2_single_cut); +s1_c=d.xyz_corrected_pulse_area_all_phe(s1_single_cut); + +cut=inrange(log10(s2_c),[4.1,5.1]) & inrange(log10(s1_c),[2 2.6]); + \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/Run04_libNEST_DetectorParameters/Sep2014_Run04_DetectorParameters.m b/CodeForLUX/Matlab/MyScripts/Run04_libNEST_DetectorParameters/Sep2014_Run04_DetectorParameters.m new file mode 100644 index 0000000..6359a95 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/Run04_libNEST_DetectorParameters/Sep2014_Run04_DetectorParameters.m @@ -0,0 +1,342 @@ +path='C:\Users\Richard\Desktop\LUX Analysis\lux10_20140903T1918_cp17059\'; %this is 2.13 corrected NEED TO UPDATE + + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +distinguish_string='test'; + +%Hardcoding inputs for ease of use during testing +user_name='RichardKnoche'; +dp_version='2.15_test'; +algorithm_name='test_KrypCal'; +submit=0; +delay_min=0; +inpaint_on=1; + + file=char(d.files_loaded(1)); + file_id=file(1:19); + cp_start=strfind(file,'cp')+2;%find location of 'cp' in string + cp=file(cp_start:cp_start+4);%cp number has four digits + file_id_cp = [file_id '_cp' cp '_' distinguish_string]; + + + gs=0; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 32000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + clean_cut = (log10(s1_phe_both)+0.6*log10(s2_phe_both)>4.5) & s2radius<25; + + s1_phe_bottom=s1_phe_bottom(clean_cut); + s1_phe_both=s1_phe_both(clean_cut); + s2_phe_bottom=s2_phe_bottom(clean_cut); + s2_phe_both=s2_phe_both(clean_cut); + drift_time=drift_time(clean_cut); + s2x=s2x(clean_cut); + s2y=s2y(clean_cut); + s2radius = (s2x.^2+s2y.^2).^(0.5); + event_timestamp_samples=event_timestamp_samples(clean_cut); + s2_width=s2_width(clean_cut); + s1_width=s1_width(clean_cut); + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + +z_center +%% + + % Calculate Single Electron Size + s4_class=(d.pulse_classification==4) ; %Use or class=2 to fix 33 phe cut off... have to edit se_wrt_first_s1_func tho + d = se_wrt_first_s1_func(d); + cut_se_s1_z = d.t_btw_se_first_s1 > 100*10; + + SE_good_cut =logical( cut_se_s1_z & s4_class & ( cumsum(s1_single_cut)-cumsum(s2_single_cut) ) ); % only events between good S1 and S2s + + SE_phe_both=d.pulse_area_phe(SE_good_cut); + SE_phe_bot=d.phe_bottom(SE_good_cut); + SE_phe_top=SE_phe_both-SE_phe_bot; + + SE_x=d.x_cm(SE_good_cut); + SE_y=d.y_cm(SE_good_cut); + SE_radius=(SE_x.^2+SE_y.^2).^(1/2); + + %Both PMT first fit + SE_fit=fit([0:1:60]',hist(SE_phe_both(SE_radius<17 & inrange(SE_phe_both,[0 60])),[0:1:60])','gauss1'); + SE_Size=SE_fit.b1; + SE_sig=SE_fit.c1/sqrt(2); + SE_both_conf=confint(SE_fit,0.683); + SE_sig_mu_both=abs(SE_Size-SE_both_conf(1,2)); % one sigma + SE_sig_sig_both=abs(SE_sig-SE_both_conf(1,3)/sqrt(2)); % one sigma + + %Both PMT Second fit + n_sig_fit=2; + + fit_start=SE_Size-n_sig_fit*SE_sig; + fit_end=SE_Size+n_sig_fit*SE_sig; + xfit=fit_start:0.1:fit_end; + + SE_cut=SE_phe_both(SE_radius<17); + [xxo, yyo, xo, no] = step(SE_cut(inrange(SE_cut,[fit_start fit_end])),[0:0.2:60]); + s = fitoptions('Method','NonlinearLeastSquares','Robust','On','Algorithm','Trust-Region','Lower',[-5,0,0,0],'Upper',[5,Inf,Inf,Inf],... + 'Startpoint',[1,max(no),10,5]); + skewGauss1 = fittype('a1/c1*exp(-((x-b1)/c1)^2)*(1+erf(a*(x-b1)/c1))','options',s); + + [f_both,g_both] = fit(xo',no',skewGauss1); + delta_both = f_both.a/sqrt(1+f_both.a^2); + SE_mu_both = f_both.b1 + f_both.c1/sqrt(2)*delta_both*sqrt(2/pi); + SE_sig_both = sqrt((f_both.c1/sqrt(2))^2 * (1 - 2 * (delta_both)^2/pi)); + skew_both = (4-pi)/2 * (delta_both * sqrt(2/pi))^3 / (1 - 2 * delta_both^2/pi)^(3/2); + kurt_both = 2*(pi-3) * (delta_both * sqrt(2/pi))^3 / (1 - 2 * delta_both^2/pi)^2; + ci_both = confint(f_both,0.683); + y_fit_both = f_both(xfit); + + both_SE_fig=figure; + hold on; + step(SE_cut,[0:0.2:60],'k'); + h_fit=plot(xfit,y_fit_both,'-r','linewidth',2); + box on; + myfigview(18); + xlabel('Pulse Area Phe (Phe) '); ylabel('Count/Phe '); + legend([h_fit],strcat('\mu = ',num2str(SE_mu_both,'%2.2f'),'\newline \sigma= ',num2str(SE_sig_both,'%2.2f'),'\newline skew=', num2str(skew_both,'%2.2f') ), 'location','northeast'); + + + %% SE Both XY Map + SExybinsize=sqrt((50*50)/(length(SE_phe_both)/100)); + num_SE_events=length(SE_phe_both); + se_xbins=SE_xbin_min+SExybinsize/2:SExybinsize:SE_xbin_max; + se_ybins=SE_ybin_min+SExybinsize/2:SExybinsize:SE_ybin_max; + + mean_SE_both_xy = zeros(length(se_xbins),length(se_ybins)); + mean_err_SE_both_xy = zeros(length(se_xbins),length(se_ybins)); + skew_SE_both_xy = zeros(length(se_xbins),length(se_ybins)); + sigma_SE_both_xy = zeros(length(se_xbins),length(se_ybins)); + kurt_SE_both_xy = zeros(length(se_xbins),length(se_ybins)); + sigma_err_SE_both_xy = zeros(length(se_xbins),length(se_ybins)); + + for x_bin=SE_xbin_min:SExybinsize:(SE_xbin_max-SExybinsize); + for y_bin=SE_ybin_min:SExybinsize:(SE_ybin_max-SExybinsize); + x_min = x_bin; x_max = x_bin+SExybinsize; + y_min = y_bin; y_max = y_bin+SExybinsize; + + x_count=int32(1+x_bin/SExybinsize+SE_xbin_max/SExybinsize); + y_count=int32(1+y_bin/SExybinsize+SE_ybin_max/SExybinsize); + + + bin_cut = (SE_phe_both>0) & inrange(SE_x,[x_min,x_max]) & inrange(SE_y,[y_min,y_max]); + + if length(SE_phe_both(bin_cut)) > 60; + %Both PMT first fit + clear temp_SE + temp_SE=SE_phe_both(bin_cut); + SE_fit_xy=fit([0:1:60]',hist(temp_SE(inrange(temp_SE,[0 60])),[0:1:60])','gauss1'); + SE_Size_xy=SE_fit_xy.b1; + SE_sig_xy=SE_fit_xy.c1/sqrt(2); + SE_both_conf_xy=confint(SE_fit_xy,0.683); + SE_sig_mu_both_xy=abs(SE_Size_xy-SE_both_conf_xy(1,2)); % one sigma + SE_sig_sig_both_xy=abs(SE_sig_xy-SE_both_conf_xy(1,3)/sqrt(2)); % one sigma + + %Both PMT Second fit + n_sig_fit=2; + + fit_start=SE_Size_xy-n_sig_fit*SE_sig_xy; + fit_end=SE_Size_xy+n_sig_fit*SE_sig_xy; + xfit=fit_start:0.1:fit_end; + + [xxo, yyo, xo, no] = step(temp_SE(inrange(temp_SE,[fit_start fit_end])),[0:0.2:60]); + s = fitoptions('Method','NonlinearLeastSquares','Robust','On','Algorithm','Trust-Region','Lower',[-5,0,0,0],'Upper',[5,Inf,Inf,Inf],... + 'Startpoint',[1,max(no),10,5]); + skewGauss1 = fittype('a1/c1*exp(-((x-b1)/c1)^2)*(1+erf(a*(x-b1)/c1))','options',s); + + [f_both_xy,g_both_xy] = fit(xo',no',skewGauss1); + delta_both_xy = f_both_xy.a/sqrt(1+f_both_xy.a^2); + SE_mu_both_xy = f_both_xy.b1 + f_both_xy.c1/sqrt(2)*delta_both_xy*sqrt(2/pi); + SE_sig_both_xy = sqrt((f_both_xy.c1/sqrt(2))^2 * (1 - 2 * (delta_both_xy)^2/pi)); + skew_both_xy = (4-pi)/2 * (delta_both_xy * sqrt(2/pi))^3 / (1 - 2 * delta_both_xy^2/pi)^(3/2); + kurt_both_xy = 2*(pi-3) * (delta_both_xy * sqrt(2/pi))^3 / (1 - 2 * delta_both_xy^2/pi)^2; + ci_both_xy = confint(f_both_xy,0.683); + y_fit_both_xy = f_both_xy(xfit); + + mean_SE_both_xy(y_count,x_count)=SE_mu_both_xy; + skew_SE_both_xy(y_count,x_count)=skew_both_xy; + sigma_SE_both_xy(y_count,x_count)=SE_sig_both_xy; + kurt_SE_both_xy(y_count,x_count)=kurt_both_xy; + mean_err_SE_both_xy(y_count,x_count)=SE_sig_mu_both_xy; + sigma_err_SE_both_xy(y_count,x_count)=SE_sig_sig_both_xy; + + + else + + mean_SE_both_xy(y_count,x_count)=0; + skew_SE_both_xy(y_count,x_count)=0; + sigma_SE_both_xy(y_count,x_count)=0; + kurt_SE_both_xy(y_count,x_count)=0; + mean_err_SE_both_xy(y_count,x_count)=0; + sigma_err_SE_both_xy(y_count,x_count)=0; + + end + end + end + +%%Plot the mean SE_XY both %%%%%%%%%%%%%%%% +color_range_max=max(max(mean_SE_both_xy)); +color_range_min=min(min(mean_SE_both_xy(mean_SE_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; + +SE_xy_both_fig = figure; +contourf(se_xbins,se_ybins,mean_SE_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. SE Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%%Plot the 1 sigma of the mean + +color_range_max=max(max(mean_err_SE_both_xy)); +color_range_min=min(min(mean_err_SE_both_xy(mean_err_SE_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; + +sigma_SE_xy_both_fig = figure; +contourf(se_xbins,se_ybins,mean_err_SE_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. 1-Sigma SE Mean(Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + +%Calculate corrections matrix and 1 sigma corrections matrix for SE_both +% if inpaint_on==1; mean_SE_both_xy(mean_SE_both_xy==0)=nan; mean_SE_both_xy=inpaint_nans(mean_SE_both_xy,3); end; +SE_both_mu_center=interp2(se_xbins,se_ybins,mean_SE_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_SE_both_mu=SE_both_mu_center./mean_SE_both_xy; +norm_SE_both_mu(isinf(norm_SE_both_mu))=1;%no infinity! Do not correct events outside r=25cm +norm_SE_both_mu(isnan(norm_SE_both_mu))=1; + +%Calculate error on SE center +% if inpaint_on==1; mean_err_SE_both_xy(mean_err_SE_both_xy==0)=nan; mean_err_SE_both_xy=inpaint_nans(mean_err_SE_both_xy,3); end; +error_SE_both_mu_center=interp2(se_xbins,se_ybins,mean_err_SE_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +error_SE_both_mu_norm=sqrt((error_SE_both_mu_center./mean_SE_both_xy).^2+(mean_err_SE_both_xy.*SE_both_mu_center./mean_SE_both_xy.^2).^2); +error_SE_both_mu_norm(isinf(error_SE_both_mu_norm))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +error_SE_both_mu_norm(isnan(error_SE_both_mu_norm))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +%Calculate kurt,sigma, and skew at center +% if inpaint_on==1; kurt_SE_both_xy(kurt_SE_both_xy==0)=nan; kurt_SE_both_xy=inpaint_nans(kurt_SE_both_xy,3); end; +% if inpaint_on==1; skew_SE_both_xy(skew_SE_both_xy==0)=nan; skew_SE_both_xy=inpaint_nans(skew_SE_both_xy,3); end; +% if inpaint_on==1; sigma_SE_both_xy(sigma_SE_both_xy==0)=nan; sigma_SE_both_xy=inpaint_nans(sigma_SE_both_xy,3); end; +SE_both_kurt_center=interp2(se_xbins,se_ybins,kurt_SE_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +SE_both_skew_center=interp2(se_xbins,se_ybins,skew_SE_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +SE_both_sigma_center=interp2(se_xbins,se_ybins,sigma_SE_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) diff --git a/CodeForLUX/Matlab/MyScripts/Run04_libNEST_DetectorParameters/Sep2015_Run04_DetectorParameters.m b/CodeForLUX/Matlab/MyScripts/Run04_libNEST_DetectorParameters/Sep2015_Run04_DetectorParameters.m new file mode 100644 index 0000000..c40ceb8 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/Run04_libNEST_DetectorParameters/Sep2015_Run04_DetectorParameters.m @@ -0,0 +1,363 @@ +%originally this used 2.13 cp17*** to define SE size. Very small difference, but not significant. + +path='C:\Users\Richard\Desktop\LUX Analysis\lux10_20150929T1905_cp18197'; %this is 2.18 corrected + + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples','xyz_corrected_pulse_area_all_phe',... + 'correction_s1_z_dependence','correction_s1_xyz_dependence','correction_s2_xy_dependence','correction_s1_z_dependence_bot',... + 'correction_s1_xy_dependence','correction_s1_xy_dependence_bot','correction_s2_xy_dependence_bot','z_corrected_pulse_area_all_phe'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +distinguish_string='test'; + +%Hardcoding inputs for ease of use during testing +user_name='RichardKnoche'; +dp_version='2.15_test'; +algorithm_name='test_KrypCal'; +submit=0; +delay_min=0; +inpaint_on=1; + + file=char(d.files_loaded(1)); + file_id=file(1:19); + cp_start=strfind(file,'cp')+2;%find location of 'cp' in string + cp=file(cp_start:cp_start+4);%cp number has four digits + file_id_cp = [file_id '_cp' cp '_' distinguish_string]; + + + gs=0; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 32000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +% s1_single_cut =logical( (s1_class & d.golden & d.selected_s1_s2).*repmat(sum(s2_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); % was s1_before_s2_cut before using golden +% s2_single_cut =logical( (s2_class & d.golden & d.selected_s1_s2).*repmat(sum(s1_class & d.golden & d.selected_s1_s2)==1,events(1),1) ); + + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + drift_time = d.z_drift_samples(s2_single_cut)/100; % us + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_bottom = d.phe_bottom(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_bottom = d.phe_bottom(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + + d.livetime_sec=sum(d.livetime_end_samples-d.livetime_latch_samples)/1e8; + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_timestamp_samples=d.event_timestamp_samples(evt_cut); + + time_wait_cut=event_timestamp_samples/1e8/60 > delay_min; %allow x min for Kr mixing + + s2_width=(d.aft_t2_samples(s2_single_cut)-d.aft_t0_samples(s2_single_cut)); %cut above 800 samples + s1_width=d.pulse_end_samples(s1_single_cut)-d.pulse_start_samples(s1_single_cut); + + s2radius = (s2x.^2+s2y.^2).^(0.5); + clean_cut = (log10(s1_phe_both)+0.6*log10(s2_phe_both)>4.5) & s2radius<25; +s2_c=d.xyz_corrected_pulse_area_all_phe(s2_single_cut); +s1_c=d.xyz_corrected_pulse_area_all_phe(s1_single_cut); + + s1_phe_bottom=s1_phe_bottom(clean_cut); + s1_phe_both=s1_phe_both(clean_cut); + s2_phe_bottom=s2_phe_bottom(clean_cut); + s2_phe_both=s2_phe_both(clean_cut); + drift_time=drift_time(clean_cut); + s2x=s2x(clean_cut); + s2y=s2y(clean_cut); + s2radius = (s2x.^2+s2y.^2).^(0.5); + event_timestamp_samples=event_timestamp_samples(clean_cut); + s2_width=s2_width(clean_cut); + s1_width=s1_width(clean_cut); + s2_c=s2_c(clean_cut); + s1_c=s1_c(clean_cut); + +kr_energy_cut = inrange(s1_phe_both,[s1area_bound_min s1area_bound_max]) & inrange(s2_phe_both,[s2area_bound_min s2area_bound_max]);%for counting Kr events +Kr_events=length(drift_time(kr_energy_cut));% Are there enough events for the XY or XYZ map? + +%%%% Detector Center Detection %%%%%%% +x_center=mean(s2x(drift_time>4)); %exclude extraction field region at uSec<4 +y_center=mean(s2y(drift_time>4)); +z_center=mean(drift_time(drift_time>4)); +det_edge=330; + +z_center +%% + + % Calculate Single Electron Size + s4_class=(d.pulse_classification==4) ; %Use or class=2 to fix 33 phe cut off... have to edit se_wrt_first_s1_func tho + d = se_wrt_first_s1_func(d); + cut_se_s1_z = d.t_btw_se_first_s1 > 100*10; + + SE_good_cut =logical( cut_se_s1_z & s4_class & ( cumsum(s1_single_cut)-cumsum(s2_single_cut) ) ); % only events between good S1 and S2s + + SE_phe_both=d.pulse_area_phe(SE_good_cut); + SE_phe_bot=d.phe_bottom(SE_good_cut); + SE_phe_top=SE_phe_both-SE_phe_bot; + + SE_x=d.x_cm(SE_good_cut); + SE_y=d.y_cm(SE_good_cut); + SE_radius=(SE_x.^2+SE_y.^2).^(1/2); + + %Both PMT first fit + SE_fit=fit([0:1:60]',hist(SE_phe_both(SE_radius<17 & inrange(SE_phe_both,[0 60])),[0:1:60])','gauss1'); + SE_Size=SE_fit.b1; + SE_sig=SE_fit.c1/sqrt(2); + SE_both_conf=confint(SE_fit,0.683); + SE_sig_mu_both=abs(SE_Size-SE_both_conf(1,2)); % one sigma + SE_sig_sig_both=abs(SE_sig-SE_both_conf(1,3)/sqrt(2)); % one sigma + + %Both PMT Second fit + n_sig_fit=2; + + fit_start=SE_Size-n_sig_fit*SE_sig; + fit_end=SE_Size+n_sig_fit*SE_sig; + xfit=fit_start:0.1:fit_end; + + SE_cut=SE_phe_both(SE_radius<17); + [xxo, yyo, xo, no] = step(SE_cut(inrange(SE_cut,[fit_start fit_end])),[0:0.2:60]); + s = fitoptions('Method','NonlinearLeastSquares','Robust','On','Algorithm','Trust-Region','Lower',[-5,0,0,0],'Upper',[5,Inf,Inf,Inf],... + 'Startpoint',[1,max(no),10,5]); + skewGauss1 = fittype('a1/c1*exp(-((x-b1)/c1)^2)*(1+erf(a*(x-b1)/c1))','options',s); + + [f_both,g_both] = fit(xo',no',skewGauss1); + delta_both = f_both.a/sqrt(1+f_both.a^2); + SE_mu_both = f_both.b1 + f_both.c1/sqrt(2)*delta_both*sqrt(2/pi); + SE_sig_both = sqrt((f_both.c1/sqrt(2))^2 * (1 - 2 * (delta_both)^2/pi)); + skew_both = (4-pi)/2 * (delta_both * sqrt(2/pi))^3 / (1 - 2 * delta_both^2/pi)^(3/2); + kurt_both = 2*(pi-3) * (delta_both * sqrt(2/pi))^3 / (1 - 2 * delta_both^2/pi)^2; + ci_both = confint(f_both,0.683); + y_fit_both = f_both(xfit); + + both_SE_fig=figure; + hold on; + step(SE_cut,[0:0.2:60],'k'); + h_fit=plot(xfit,y_fit_both,'-r','linewidth',2); + box on; + myfigview(18); + xlabel('Pulse Area Phe (Phe) '); ylabel('Count/Phe '); + legend([h_fit],strcat('\mu = ',num2str(SE_mu_both,'%2.2f'),'\newline \sigma= ',num2str(SE_sig_both,'%2.2f'),'\newline skew=', num2str(skew_both,'%2.2f') ), 'location','northeast'); + + + %% SE Both XY Map + SExybinsize=sqrt((50*50)/(length(SE_phe_both)/100)); + num_SE_events=length(SE_phe_both); + se_xbins=SE_xbin_min+SExybinsize/2:SExybinsize:SE_xbin_max; + se_ybins=SE_ybin_min+SExybinsize/2:SExybinsize:SE_ybin_max; + + mean_SE_both_xy = zeros(length(se_xbins),length(se_ybins)); + mean_err_SE_both_xy = zeros(length(se_xbins),length(se_ybins)); + skew_SE_both_xy = zeros(length(se_xbins),length(se_ybins)); + sigma_SE_both_xy = zeros(length(se_xbins),length(se_ybins)); + kurt_SE_both_xy = zeros(length(se_xbins),length(se_ybins)); + sigma_err_SE_both_xy = zeros(length(se_xbins),length(se_ybins)); + + for x_bin=SE_xbin_min:SExybinsize:(SE_xbin_max-SExybinsize); + for y_bin=SE_ybin_min:SExybinsize:(SE_ybin_max-SExybinsize); + x_min = x_bin; x_max = x_bin+SExybinsize; + y_min = y_bin; y_max = y_bin+SExybinsize; + + x_count=int32(1+x_bin/SExybinsize+SE_xbin_max/SExybinsize); + y_count=int32(1+y_bin/SExybinsize+SE_ybin_max/SExybinsize); + + + bin_cut = (SE_phe_both>0) & inrange(SE_x,[x_min,x_max]) & inrange(SE_y,[y_min,y_max]); + + if length(SE_phe_both(bin_cut)) > 60; + %Both PMT first fit + clear temp_SE + temp_SE=SE_phe_both(bin_cut); + SE_fit_xy=fit([0:1:60]',hist(temp_SE(inrange(temp_SE,[0 60])),[0:1:60])','gauss1'); + SE_Size_xy=SE_fit_xy.b1; + SE_sig_xy=SE_fit_xy.c1/sqrt(2); + SE_both_conf_xy=confint(SE_fit_xy,0.683); + SE_sig_mu_both_xy=abs(SE_Size_xy-SE_both_conf_xy(1,2)); % one sigma + SE_sig_sig_both_xy=abs(SE_sig_xy-SE_both_conf_xy(1,3)/sqrt(2)); % one sigma + + %Both PMT Second fit + n_sig_fit=2; + + fit_start=SE_Size_xy-n_sig_fit*SE_sig_xy; + fit_end=SE_Size_xy+n_sig_fit*SE_sig_xy; + xfit=fit_start:0.1:fit_end; + + [xxo, yyo, xo, no] = step(temp_SE(inrange(temp_SE,[fit_start fit_end])),[0:0.2:60]); + s = fitoptions('Method','NonlinearLeastSquares','Robust','On','Algorithm','Trust-Region','Lower',[-5,0,0,0],'Upper',[5,Inf,Inf,Inf],... + 'Startpoint',[1,max(no),10,5]); + skewGauss1 = fittype('a1/c1*exp(-((x-b1)/c1)^2)*(1+erf(a*(x-b1)/c1))','options',s); + + [f_both_xy,g_both_xy] = fit(xo',no',skewGauss1); + delta_both_xy = f_both_xy.a/sqrt(1+f_both_xy.a^2); + SE_mu_both_xy = f_both_xy.b1 + f_both_xy.c1/sqrt(2)*delta_both_xy*sqrt(2/pi); + SE_sig_both_xy = sqrt((f_both_xy.c1/sqrt(2))^2 * (1 - 2 * (delta_both_xy)^2/pi)); + skew_both_xy = (4-pi)/2 * (delta_both_xy * sqrt(2/pi))^3 / (1 - 2 * delta_both_xy^2/pi)^(3/2); + kurt_both_xy = 2*(pi-3) * (delta_both_xy * sqrt(2/pi))^3 / (1 - 2 * delta_both_xy^2/pi)^2; + ci_both_xy = confint(f_both_xy,0.683); + y_fit_both_xy = f_both_xy(xfit); + + mean_SE_both_xy(y_count,x_count)=SE_mu_both_xy; + skew_SE_both_xy(y_count,x_count)=skew_both_xy; + sigma_SE_both_xy(y_count,x_count)=SE_sig_both_xy; + kurt_SE_both_xy(y_count,x_count)=kurt_both_xy; + mean_err_SE_both_xy(y_count,x_count)=SE_sig_mu_both_xy; + sigma_err_SE_both_xy(y_count,x_count)=SE_sig_sig_both_xy; + + + else + + mean_SE_both_xy(y_count,x_count)=0; + skew_SE_both_xy(y_count,x_count)=0; + sigma_SE_both_xy(y_count,x_count)=0; + kurt_SE_both_xy(y_count,x_count)=0; + mean_err_SE_both_xy(y_count,x_count)=0; + sigma_err_SE_both_xy(y_count,x_count)=0; + + end + end + end + +%%Plot the mean SE_XY both %%%%%%%%%%%%%%%% +color_range_max=max(max(mean_SE_both_xy)); +color_range_min=min(min(mean_SE_both_xy(mean_SE_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; + +SE_xy_both_fig = figure; +contourf(se_xbins,se_ybins,mean_SE_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. SE Mean (Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + + +%%Plot the 1 sigma of the mean + +color_range_max=max(max(mean_err_SE_both_xy)); +color_range_min=min(min(mean_err_SE_both_xy(mean_err_SE_both_xy>0))); +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; + +sigma_SE_xy_both_fig = figure; +contourf(se_xbins,se_ybins,mean_err_SE_both_xy,vc,'LineColor','none'); +xlabel('x (cm)','fontsize', 18); +ylabel('y (cm)','fontsize', 18); +title(strcat(file_id_cp, '. 1-Sigma SE Mean(Both PMT) vs. XY.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'phe','FontSize',16) +set(g,'FontSize',18) +hold on +LUXPlotTopPMTs +axis([-25 25 -25 25]) +myfigview(16); + +%Calculate corrections matrix and 1 sigma corrections matrix for SE_both +% if inpaint_on==1; mean_SE_both_xy(mean_SE_both_xy==0)=nan; mean_SE_both_xy=inpaint_nans(mean_SE_both_xy,3); end; +SE_both_mu_center=interp2(se_xbins,se_ybins,mean_SE_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +norm_SE_both_mu=SE_both_mu_center./mean_SE_both_xy; +norm_SE_both_mu(isinf(norm_SE_both_mu))=1;%no infinity! Do not correct events outside r=25cm +norm_SE_both_mu(isnan(norm_SE_both_mu))=1; + +%Calculate error on SE center +% if inpaint_on==1; mean_err_SE_both_xy(mean_err_SE_both_xy==0)=nan; mean_err_SE_both_xy=inpaint_nans(mean_err_SE_both_xy,3); end; +error_SE_both_mu_center=interp2(se_xbins,se_ybins,mean_err_SE_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +error_SE_both_mu_norm=sqrt((error_SE_both_mu_center./mean_SE_both_xy).^2+(mean_err_SE_both_xy.*SE_both_mu_center./mean_SE_both_xy.^2).^2); +error_SE_both_mu_norm(isinf(error_SE_both_mu_norm))=1;%no infinity. Set Sigma=1, which is 100% uncertainty +error_SE_both_mu_norm(isnan(error_SE_both_mu_norm))=1;%no nan. Set Sigma=1, which is 100% uncertainty + +%Calculate kurt,sigma, and skew at center +% if inpaint_on==1; kurt_SE_both_xy(kurt_SE_both_xy==0)=nan; kurt_SE_both_xy=inpaint_nans(kurt_SE_both_xy,3); end; +% if inpaint_on==1; skew_SE_both_xy(skew_SE_both_xy==0)=nan; skew_SE_both_xy=inpaint_nans(skew_SE_both_xy,3); end; +% if inpaint_on==1; sigma_SE_both_xy(sigma_SE_both_xy==0)=nan; sigma_SE_both_xy=inpaint_nans(sigma_SE_both_xy,3); end; +SE_both_kurt_center=interp2(se_xbins,se_ybins,kurt_SE_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +SE_both_skew_center=interp2(se_xbins,se_ybins,skew_SE_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) +SE_both_sigma_center=interp2(se_xbins,se_ybins,sigma_SE_both_xy,x_center,y_center,'spline');%Normalize to the center (x=y=0) + + +%% Assuming working corrections, find the optimal g2 with g1=0.105 from Kr2.18 + +s2_c=d.xyz_corrected_pulse_area_all_phe(s2_single_cut); +s1_c=d.xyz_corrected_pulse_area_all_phe(s1_single_cut); +% s2_c=d.z_corrected_pulse_area_all_phe(s2_single_cut); +% s1_c=d.pulse_area_phe(s1_single_cut).*d.correction_s1_z_dependence(s1_single_cut).*d.correction_s1_xy_dependence(s1_single_cut); + +% cut=inrange(log10(s2_c),[4.1,5.1]) & inrange(log10(s1_c),[2 2.6]); + +% for g2=15:0.01:22; + \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/S1aS1b_to_Field_Measurements/Make3DInterpMap_FromLucieMap_2014.m b/CodeForLUX/Matlab/MyScripts/S1aS1b_to_Field_Measurements/Make3DInterpMap_FromLucieMap_2014.m new file mode 100644 index 0000000..4fe5dec --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/S1aS1b_to_Field_Measurements/Make3DInterpMap_FromLucieMap_2014.m @@ -0,0 +1,54 @@ +load('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\Run04_CH3T\KrypCal2p18_IQs\MakePlots\ERBand\LucieSep2014_Map'); +x= LucieSep2014Map(:,1); +y= LucieSep2014Map(:,2); +z = LucieSep2014Map(:,3); +field = LucieSep2014Map(:,4); +dT=LucieSep2014Map(:,7); +r=sqrt(x.^2+y.^2); +event_class=LucieSep2014Map(:,8); + + +%Convert z to cathode at 0, and in mm +z=(z+34.175)*10; + +%Spacing in Lucie's map +x_step=1; +y_step=1; +z_step=10; + +%Starting and end points in Lucie's map +x_start= -23.5; +y_start= -23.5; +z_start= 2; +x_end= 23.5; +y_end= 23.5; +z_end= 482; + +%Make a 3D map out of Lucie's map + +i=1; j=1; k=1; +for x_max=x_start+x_step/2:x_step:x_end+x_step/2 + j=1; + for y_max=y_start+y_step/2:y_step:y_end+y_step/2 + k=1; + for z_max=z_start+z_step/2:z_step:z_end+z_step/2 + cut=inrange(x,[x_max-x_step,x_max]) & inrange(y,[y_max-y_step,y_max]) & inrange(z,[z_max-z_step,z_max]); + FieldMap(i,j,k)=mean(field(cut)); %This is for python, so do not switch i,j index + DriftTimeMap(i,j,k)=mean(dT(cut)); + if length(field(cut)) ~= 1 + disp('Problem') + end + k=k+1; + end + j=j+1; + end + i=i+1; +end + +x_bins=x_start:x_step:x_end; +y_bins=y_start:y_step:y_end; +z_bins=z_start:z_step:z_end; + +%To interpolate in python, do +%fn = RegularGridInterpolator((x_bins,y_bins,z_bins), FieldMap) +%interp_val = fn(xo,yo,zo) diff --git a/CodeForLUX/Matlab/MyScripts/S1aS1b_to_Field_Measurements/Make3DInterpMap_FromLucieMap_2015.m b/CodeForLUX/Matlab/MyScripts/S1aS1b_to_Field_Measurements/Make3DInterpMap_FromLucieMap_2015.m new file mode 100644 index 0000000..fc1d0cc --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/S1aS1b_to_Field_Measurements/Make3DInterpMap_FromLucieMap_2015.m @@ -0,0 +1,54 @@ +load('C:\Program Files\MATLAB\R2012a\bin\Run04_ERBand\Kr2p20\LucieSep2015_Map'); +x= LucieSep2015Map(:,1); +y= LucieSep2015Map(:,2); +z = LucieSep2015Map(:,3); +field = LucieSep2015Map(:,4); +dT=LucieSep2015Map(:,7); +r=sqrt(x.^2+y.^2); +event_class=LucieSep2015Map(:,8); + + +%Convert z to cathode at 0, and in mm +z=(z+34.175)*10; + +%Spacing in Lucie's map +x_step=1; +y_step=1; +z_step=10; + +%Starting and end points in Lucie's map +x_start= -23.5; +y_start= -23.5; +z_start= 2; +x_end= 23.5; +y_end= 23.5; +z_end= 482; + +%Make a 3D map out of Lucie's map + +i=1; j=1; k=1; +for x_max=x_start+x_step/2:x_step:x_end+x_step/2 + j=1; + for y_max=y_start+y_step/2:y_step:y_end+y_step/2 + k=1; + for z_max=z_start+z_step/2:z_step:z_end+z_step/2 + cut=inrange(x,[x_max-x_step,x_max]) & inrange(y,[y_max-y_step,y_max]) & inrange(z,[z_max-z_step,z_max]); + FieldMap(i,j,k)=mean(field(cut)); %This is for python, so do not switch i,j index + DriftTimeMap(i,j,k)=mean(dT(cut)); + if length(field(cut)) ~= 1 + disp('Problem') + end + k=k+1; + end + j=j+1; + end + i=i+1; +end + +x_bins=x_start:x_step:x_end; +y_bins=y_start:y_step:y_end; +z_bins=z_start:z_step:z_end; + +%To interpolate in python, do +%fn = RegularGridInterpolator((x_bins,y_bins,z_bins), FieldMap) +%interp_val = fn(xo,yo,zo) diff --git a/CodeForLUX/Matlab/MyScripts/S1aS1b_to_Field_Measurements/S1aS1b_to_Field_2014.m b/CodeForLUX/Matlab/MyScripts/S1aS1b_to_Field_Measurements/S1aS1b_to_Field_2014.m new file mode 100644 index 0000000..dd9f892 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/S1aS1b_to_Field_Measurements/S1aS1b_to_Field_2014.m @@ -0,0 +1,297 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Purpose: +% This script compares Kr S1a/S1b data to Scott's field simulations in Sep2014 so that +% we can use S1a/S1b as a measure of field in Kr calibrations. Sorry for the mess... +% this is mostly pieced together from other code I've already written. I doubt anybody else +% will look at this script anyway. +% +% Author: +% - Richard Knoche +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +%% Load in data + +path='C:\Users\Richard\Desktop\LUX Analysis\lux10_20140903T1918_cp17059'; + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing','golden'... + ,'selected_s1_s2','top_bottom_ratio','x_cm','y_cm'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +distinguish_string='test'; + +%Hardcoding inputs for ease of use +user_name='RichardKnoche'; +dp_version='2.15_test'; +algorithm_name='test_KrypCal'; +submit=0; +delay_min=0; +inpaint_on=1; +file=char(d.files_loaded(1)); +file_id=file(1:19); +cp_start=strfind(file,'cp')+2;%find location of 'cp' in string +cp=file(cp_start:cp_start+4);%cp number has four digits +file_id_cp = [file_id '_cp' cp '_' distinguish_string]; + + +gs=0; +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 32000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + +d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN +events=sort(size(d.pulse_area_phe)); %#ok<*NASGU> %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + +s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); +s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + +s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events +s2_class=(d.pulse_classification==2) & s2_area_cut ; +s4_class=(d.pulse_classification==4) ; + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event + +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds + +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + +%% Set up cuts and variables +s1ab_cut=logical(sum(s1_single_cut(:,:),1)); +s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); +s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); +s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); +s1ab_x=d.x_cm(s2_single_cut); +s1ab_y=d.y_cm(s2_single_cut); +s1ab_z=d.z_drift_samples(s2_single_cut)/100; +s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); +s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<25; + +s1ab_x=s1ab_x(s1ab_timing_cut); +s1ab_y=s1ab_y(s1ab_timing_cut); +s1ab_z=s1ab_z(s1ab_timing_cut); +s1a_phe_both=s1a_phe_both(s1ab_timing_cut); +s1b_phe_both=s1b_phe_both(s1ab_timing_cut); +s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); + +%% S1a/b R^2 v Z map +s1ab_r2bin_min=0; +s1ab_r2bin_max=25*25; +s1ab_zbin_min=10; +s1ab_zbin_max=330; + +s1ab_r2z_binnum=(length(s1ab_z))/300; +s1ab_r2_binnum=floor(sqrt(s1ab_r2z_binnum))-1; +s1ab_z_binnum=floor(sqrt(s1ab_r2z_binnum)); + +s1ab_r2_binsize=(s1ab_r2bin_max-s1ab_r2bin_min)/s1ab_r2_binnum; +s1ab_z_binsize=(s1ab_zbin_max-s1ab_zbin_min)/s1ab_z_binnum; + +s1ab_r2bins=s1ab_r2bin_min+s1ab_r2_binsize/2:s1ab_r2_binsize:s1ab_r2bin_max; +s1ab_zbins=s1ab_zbin_min+s1ab_z_binsize/2:s1ab_z_binsize:s1ab_zbin_max; + +s1a_r2z_mean=zeros(length(s1ab_zbins),length(s1ab_r2bins)); +s1b_r2z_mean=zeros(length(s1ab_zbins),length(s1ab_r2bins)); +s1a_r2z_mean_err=zeros(length(s1ab_zbins),length(s1ab_r2bins)); +s1b_r2z_mean_err=zeros(length(s1ab_zbins),length(s1ab_r2bins)); +field_map_2014=zeros(length(s1ab_zbins),length(s1ab_r2bins)); +field_map_2015=zeros(length(s1ab_zbins),length(s1ab_r2bins)); +field_map_error=zeros(length(s1ab_zbins),length(s1ab_r2bins)); + +r2_counter=1; + for r2_bin_max=s1ab_r2bin_min+s1ab_r2_binsize:s1ab_r2_binsize:s1ab_r2bin_max; + z_counter=1; + for z_bin_max=s1ab_zbin_min+s1ab_z_binsize:s1ab_z_binsize:s1ab_zbin_max; + + bin_cut = s1a_phe_both>0 & s1b_phe_both>0 & inrange(s1ab_radius.^2,[r2_bin_max-s1ab_r2_binsize,r2_bin_max]).' & inrange(s1ab_z,[z_bin_max-s1ab_z_binsize,z_bin_max]).'; + if length(s1a_phe_both(bin_cut))>100; + clear s1a_confint s1b_confint + s1a_r2z_fit=fit([0:2:400].',hist(s1a_phe_both(bin_cut & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); %#ok<*NBRAK> + s1a_r2z_mean(z_counter,r2_counter)=s1a_r2z_fit.b1; + s1a_confint=confint(s1a_r2z_fit,0.68); + s1a_r2z_mean_err(z_counter,r2_counter)=abs(s1a_confint(1,2)-s1a_r2z_fit.b1); + field_map_2014(z_counter,r2_counter)=EstimateField_Sep2014((r2_bin_max-s1ab_r2_binsize/2)^(1/2),z_bin_max-s1ab_z_binsize/2); + field_map_2015(z_counter,r2_counter)=EstimateField_Sep2015((r2_bin_max-s1ab_r2_binsize/2)^(1/2),z_bin_max-s1ab_z_binsize/2); + field_map_error(z_counter,r2_counter)=std([EstimateField_Sep2015((r2_bin_max-s1ab_r2_binsize/2)^(1/2),z_bin_max-s1ab_z_binsize/2) EstimateField_Sep2014((r2_bin_max-s1ab_r2_binsize/2)^(1/2),z_bin_max-s1ab_z_binsize/2)]); + + s1b_r2z_fit=fit([0:2:300].',hist(s1b_phe_both(bin_cut & inrange(s1b_phe_both,[0 300])),[0:2:300]).','gauss1'); + s1b_r2z_mean(z_counter,r2_counter)=s1b_r2z_fit.b1; + s1b_confint=confint(s1b_r2z_fit,0.68); + s1b_r2z_mean_err(z_counter,r2_counter)=abs(s1b_confint(1,2)-s1b_r2z_fit.b1); + else + s1a_r2z_mean(z_counter,r2_counter)=0; + s1a_r2z_mean_err(z_counter,r2_counter)=0; + s1b_r2z_mean(z_counter,r2_counter)=0; + s1b_r2z_mean_err(z_counter,r2_counter)=0; + field_map_2014(z_counter,r2_counter)=0; + field_map_2015(z_counter,r2_counter)=0; + + end + z_counter=z_counter+1; + end + r2_counter=r2_counter+1; + end + s1ab_r2z_mean=s1a_r2z_mean./s1b_r2z_mean; + s1ab_r2z_mean_err=sqrt( (s1b_r2z_mean_err.*s1a_r2z_mean./(s1b_r2z_mean.^2)).^2 + (s1a_r2z_mean_err./s1b_r2z_mean).^2); + +%Plot s1a R2Z means +color_range_max=max(max(s1a_r2z_mean)); +color_range_min=min(min(s1a_r2z_mean(s1a_r2z_mean>0))); +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; + +s1a_r2z_fig = figure; +contourf(s1ab_r2bins,s1ab_zbins,s1a_r2z_mean,vc,'LineColor','none'); +xlabel('R^2 (cm^2)','fontsize', 18); +ylabel('Z (uSec)','fontsize', 18); +title(strcat('2014 S1a Mean vs. R^2 v Z.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'S1a Mean (phe)','FontSize',16) +set(g,'FontSize',18) +hold on +axis([0 625 0 330]) +myfigview(16); +set(gca,'Ydir','reverse') + +%Plot s1a R2Z means +color_range_max=max(max(s1b_r2z_mean)); +color_range_min=min(min(s1b_r2z_mean(s1b_r2z_mean>0))); +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; + +s1b_r2z_fig = figure; +contourf(s1ab_r2bins,s1ab_zbins,s1b_r2z_mean,vc,'LineColor','none'); +xlabel('R^2 (cm^2)','fontsize', 18); +ylabel('Z (uSec)','fontsize', 18); +title(strcat('2014 S1b Mean vs. R^2 v Z.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'S1b Mean (phe)','FontSize',16) +set(g,'FontSize',18) +hold on +axis([0 625 0 330]) +myfigview(16); +set(gca,'Ydir','reverse') + +%s1a/b R2Z Ratio +color_range_max=max(max(s1ab_r2z_mean)); +color_range_min=min(min(s1ab_r2z_mean(s1ab_r2z_mean>0))); +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; + +s1ab_r2z_fig = figure; +contourf(s1ab_r2bins,s1ab_zbins,s1ab_r2z_mean,vc,'LineColor','none'); +xlabel('R^2 (cm^2)','fontsize', 18); +ylabel('Z (uSec)','fontsize', 18); +title(strcat('2014 S1a/S1b Mean vs. R^2 v Z.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'S1a/b Ratio','FontSize',16) +set(g,'FontSize',18) +hold on +axis([0 625 0 330]) +myfigview(16); +set(gca,'Ydir','reverse') + +%Field R2Z Map +color_range_max=max(max(field_map_2014)); +color_range_min=min(min(field_map_2014(field_map_2014>0))); +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; + +field_map_fig = figure; +contourf(s1ab_r2bins,s1ab_zbins,field_map_2014,vc,'LineColor','none'); +xlabel('R^2 (cm^2)','fontsize', 18); +ylabel('Z (uSec)','fontsize', 18); +title(strcat('2014 Field Value vs. R^2 v Z.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'Field (V/cm)','FontSize',16) +set(g,'FontSize',18) +hold on +axis([0 625 0 330]) +myfigview(16); +set(gca,'Ydir','reverse') + +%% Fit a polynomial +% Call fminsearch with a random starting point. +cut= ~isnan(s1ab_r2z_mean) & ~isnan(field_map_2014) & s1ab_r2z_mean>0 & field_map_2014>0; +data.xdata=s1ab_r2z_mean(cut); +data.ydata=field_map_2014(cut); +data.xdataerr=s1ab_r2z_mean_err(cut); +data.ydataerr=field_map_error(cut); +[S1aS1b_fit_2014, S1aS1b_fit_2014_error]=polyfit(data.xdata,data.ydata,2); %given X +%example usage [a b]=polyval(S1aS1b_fit_2015,[2.2:0.01:3],S1aS1b_fit_2015_error); + +%This is used for fitting and taking x and y errors into account... but since errors are underestimated on some points I'm not going to factor them in +% +% inv_sigma2=@(theta,data) 1./(data.ydataerr.^2); +% % inv_sigma2 = @(theta,data) 1./( ( (2.*theta(1).*data.xdata+theta(2)).*data.xdataerr).^2 + data.ydataerr.^2); +% +% modelfun = @(x,theta) theta(1).*x.^2+theta(2).*x+theta(3); +% ssfun = @(theta,data) 0.5.*( sum( (data.ydata - modelfun(data.xdata,theta)).^2.*inv_sigma2(theta,data) - log(inv_sigma2(theta,data)) )); +% polyval(data.xdata,data.ydata,3) +% +% init=polyfit(data.xdata,data.ydata,2); +% [tmin,ssmin]=fminsearch(ssfun,[init(1);init(2);init(3)],[],data); %minimizing sum of squares + +%% Comparing S1a/S1b RvZ to Scott's field map +% figure +% errorbar(field_map_2014(:),s1ab_r2z_mean(:),s1ab_r2z_mean_err(:),'.k'); +% xlabel('Field (V/cm)'); ylabel('S1a/S1b Ratio'); myfigview(16); +% + figure + rkploterr(s1ab_r2z_mean(:),field_map_2014(:),s1ab_r2z_mean_err(:),field_map_error(:),[ ],[],[],2); + ylabel('Field (V/cm)'); xlabel('S1a/S1b Ratio'); myfigview(16); + x=[0:0.1:3]; + y=polyval(S1aS1b_fit_2014,x); + plot(x,y,'-k') + +%% saving +save('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal\KrypCal_2p20_Code\2014_Field_to_S1aS1b','S1aS1b_fit_2014','S1aS1b_fit_2014_error'); diff --git a/CodeForLUX/Matlab/MyScripts/S1aS1b_to_Field_Measurements/S1aS1b_to_Field_2015.m b/CodeForLUX/Matlab/MyScripts/S1aS1b_to_Field_Measurements/S1aS1b_to_Field_2015.m new file mode 100644 index 0000000..1215049 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/S1aS1b_to_Field_Measurements/S1aS1b_to_Field_2015.m @@ -0,0 +1,310 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Purpose: +% This script compares Kr S1a/S1b data to Scott's field simulations in Sep2015 so that +% we can use S1a/S1b as a measure of field in Kr calibrations. Sorry for the mess... +% this is mostly pieced together from other code I've already written. I doubt anybody else +% will look at this script anyway. +% +% Author: +% - Richard Knoche +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%% Loading Data + +path='C:\Users\Richard\Desktop\LUX Analysis\lux10_20150929T1905_cp17548'; + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing','golden'... + ,'selected_s1_s2','top_bottom_ratio','x_cm','y_cm'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples'}; + +d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + +distinguish_string='test'; + +%Hardcoding inputs for ease of use during testing +user_name='RichardKnoche'; +dp_version='2.15_test'; +algorithm_name='test_KrypCal'; +submit=0; +delay_min=0; +inpaint_on=1; + +file=char(d.files_loaded(1)); +file_id=file(1:19); +cp_start=strfind(file,'cp')+2;%find location of 'cp' in string +cp=file(cp_start:cp_start+4);%cp number has four digits +file_id_cp = [file_id '_cp' cp '_' distinguish_string]; + + +gs=0; + +grid_size=3; %cm XY plane +rcut_min = 0; +rcut_max = 25;%cm +s1area_bound_min = 50;%100 +s1area_bound_max = 650;%600 +s2area_bound_min = 1000;%200 +s2area_bound_max = 32000;%30000 +min_evts_per_bin = 300; +max_num_bins = 65; + +S1xybinsize = grid_size;%cm +S1_xbin_min = -25; +S1_xbin_max = 25; +S1_ybin_min = -25; +S1_ybin_max = 25; + + +SE_xbin_min = -25; +SE_xbin_max = 25; +SE_ybin_min = -25; +SE_ybin_max = 25; +% SExybinsize = grid_size; Defined later, based on number of SE events + +S2xybinsize = grid_size;%cm +S2_xbin_min = -25; +S2_xbin_max = 25; +S2_ybin_min = -25; +S2_ybin_max = 25; + + +d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN +events=sort(size(d.pulse_area_phe)); %#ok<*NASGU> %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 + +s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); +s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + +s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events +s2_class=(d.pulse_classification==2) & s2_area_cut ; +s4_class=(d.pulse_classification==4) ; + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1 | d.pulse_classification == 9; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + +%% Set up cuts and variables +s1ab_cut=logical(sum(s1_single_cut(:,:),1)); +s1a_phe_both=d.Kr83fit_s1a_area_phe(s1ab_cut); +s1b_phe_both=d.Kr83fit_s1b_area_phe(s1ab_cut); +s1ab_timing=d.Kr83fit_dt_samples(s1ab_cut); +s1ab_x=d.x_cm(s2_single_cut); +s1ab_y=d.y_cm(s2_single_cut); +s1ab_z=d.z_drift_samples(s2_single_cut)/100; +s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); +s1ab_timing_cut=s1ab_timing>13 & s1b_phe_both>30 & s1ab_radius.'<25; + +s1ab_x=s1ab_x(s1ab_timing_cut); +s1ab_y=s1ab_y(s1ab_timing_cut); +s1ab_z=s1ab_z(s1ab_timing_cut); +s1a_phe_both=s1a_phe_both(s1ab_timing_cut); +s1b_phe_both=s1b_phe_both(s1ab_timing_cut); +s1ab_radius=sqrt(s1ab_x.^2+s1ab_y.^2); + +%% S1a/b R^2 v Z map +s1ab_r2bin_min=0; +s1ab_r2bin_max=25*25; +s1ab_zbin_min=10; +s1ab_zbin_max=330; + +s1ab_r2z_binnum=(length(s1ab_z))/300; +s1ab_r2_binnum=floor(sqrt(s1ab_r2z_binnum))-1; +s1ab_z_binnum=floor(sqrt(s1ab_r2z_binnum)); + +s1ab_r2_binsize=(s1ab_r2bin_max-s1ab_r2bin_min)/s1ab_r2_binnum; +s1ab_z_binsize=(s1ab_zbin_max-s1ab_zbin_min)/s1ab_z_binnum; + +s1ab_r2bins=s1ab_r2bin_min+s1ab_r2_binsize/2:s1ab_r2_binsize:s1ab_r2bin_max; +s1ab_zbins=s1ab_zbin_min+s1ab_z_binsize/2:s1ab_z_binsize:s1ab_zbin_max; + +s1a_r2z_mean=zeros(length(s1ab_zbins),length(s1ab_r2bins)); +s1b_r2z_mean=zeros(length(s1ab_zbins),length(s1ab_r2bins)); +s1a_r2z_mean_err=zeros(length(s1ab_zbins),length(s1ab_r2bins)); +s1b_r2z_mean_err=zeros(length(s1ab_zbins),length(s1ab_r2bins)); +field_map_2014=zeros(length(s1ab_zbins),length(s1ab_r2bins)); +field_map_2015=zeros(length(s1ab_zbins),length(s1ab_r2bins)); +field_map_error=zeros(length(s1ab_zbins),length(s1ab_r2bins)); + +r2_counter=1; + for r2_bin_max=s1ab_r2bin_min+s1ab_r2_binsize:s1ab_r2_binsize:s1ab_r2bin_max; + z_counter=1; + for z_bin_max=s1ab_zbin_min+s1ab_z_binsize:s1ab_z_binsize:s1ab_zbin_max; + + bin_cut = s1a_phe_both>0 & s1b_phe_both>0 & inrange(s1ab_radius.^2,[r2_bin_max-s1ab_r2_binsize,r2_bin_max]).' & inrange(s1ab_z,[z_bin_max-s1ab_z_binsize,z_bin_max]).'; + if length(s1a_phe_both(bin_cut))>100; + clear s1a_confint s1b_confint + s1a_r2z_fit=fit([0:2:400].',hist(s1a_phe_both(bin_cut & inrange(s1a_phe_both,[0 400])),[0:2:400]).','gauss1'); %#ok<*NBRAK> + s1a_r2z_mean(z_counter,r2_counter)=s1a_r2z_fit.b1; + s1a_confint=confint(s1a_r2z_fit,0.68); + s1a_r2z_mean_err(z_counter,r2_counter)=abs(s1a_confint(1,2)-s1a_r2z_fit.b1); + field_map_2014(z_counter,r2_counter)=EstimateField_Sep2014((r2_bin_max-s1ab_r2_binsize/2)^(1/2),z_bin_max-s1ab_z_binsize/2); + field_map_2015(z_counter,r2_counter)=EstimateField_Sep2015((r2_bin_max-s1ab_r2_binsize/2)^(1/2),z_bin_max-s1ab_z_binsize/2); + field_map_error(z_counter,r2_counter)=std([EstimateField_Sep2015((r2_bin_max-s1ab_r2_binsize/2)^(1/2),z_bin_max-s1ab_z_binsize/2) EstimateField_Sep2014((r2_bin_max-s1ab_r2_binsize/2)^(1/2),z_bin_max-s1ab_z_binsize/2)]); + + s1b_r2z_fit=fit([0:2:300].',hist(s1b_phe_both(bin_cut & inrange(s1b_phe_both,[0 300])),[0:2:300]).','gauss1'); + s1b_r2z_mean(z_counter,r2_counter)=s1b_r2z_fit.b1; + s1b_confint=confint(s1b_r2z_fit,0.68); + s1b_r2z_mean_err(z_counter,r2_counter)=abs(s1b_confint(1,2)-s1b_r2z_fit.b1); + else + s1a_r2z_mean(z_counter,r2_counter)=0; + s1a_r2z_mean_err(z_counter,r2_counter)=0; + s1b_r2z_mean(z_counter,r2_counter)=0; + s1b_r2z_mean_err(z_counter,r2_counter)=0; + field_map_2014(z_counter,r2_counter)=0; + field_map_2015(z_counter,r2_counter)=0; + + end + z_counter=z_counter+1; + end + r2_counter=r2_counter+1; + end +s1ab_r2z_mean=s1a_r2z_mean./s1b_r2z_mean; +s1ab_r2z_mean_err=sqrt( (s1b_r2z_mean_err.*s1a_r2z_mean./(s1b_r2z_mean.^2)).^2 + (s1a_r2z_mean_err./s1b_r2z_mean).^2); + +%Plot s1a R2Z means +color_range_max=max(max(s1a_r2z_mean)); +color_range_min=min(min(s1a_r2z_mean(s1a_r2z_mean>0))); +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; + +s1a_r2z_fig = figure; +contourf(s1ab_r2bins,s1ab_zbins,s1a_r2z_mean,vc,'LineColor','none'); +xlabel('R^2 (cm^2)','fontsize', 18); +ylabel('Z (uSec)','fontsize', 18); +title(strcat('2015 S1a Mean vs. R^2 v Z.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'S1a Mean (phe)','FontSize',16) +set(g,'FontSize',18) +hold on +axis([0 625 0 330]) +myfigview(16); +set(gca,'Ydir','reverse') + +%Plot s1a R2Z means +color_range_max=max(max(s1b_r2z_mean)); +color_range_min=min(min(s1b_r2z_mean(s1b_r2z_mean>0))); +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; + +s1b_r2z_fig = figure; +contourf(s1ab_r2bins,s1ab_zbins,s1b_r2z_mean,vc,'LineColor','none'); +xlabel('R^2 (cm^2)','fontsize', 18); +ylabel('Z (uSec)','fontsize', 18); +title(strcat('2015 S1b Mean vs. R^2 v Z.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'S1b Mean (phe)','FontSize',16) +set(g,'FontSize',18) +hold on +axis([0 625 0 330]) +myfigview(16); +set(gca,'Ydir','reverse') + +%s1a/b R2Z Ratio +color_range_max=max(max(s1ab_r2z_mean)); +color_range_min=min(min(s1ab_r2z_mean(s1ab_r2z_mean>0))); +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; + +s1ab_r2z_fig = figure; +contourf(s1ab_r2bins,s1ab_zbins,s1ab_r2z_mean,vc,'LineColor','none'); +xlabel('R^2 (cm^2)','fontsize', 18); +ylabel('Z (uSec)','fontsize', 18); +title(strcat('2015 S1a/S1b Mean vs. R^2 v Z.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'S1a/b Ratio','FontSize',16) +set(g,'FontSize',18) +hold on +axis([0 625 0 330]) +myfigview(16); +set(gca,'Ydir','reverse') + +%Field R2Z Map +color_range_max=max(max(field_map_2015)); +color_range_min=min(min(field_map_2015(field_map_2015>0))); +vc_step=(color_range_max-color_range_min)/50; +vc=color_range_min:vc_step:color_range_max; + +field_map_fig = figure; +contourf(s1ab_r2bins,s1ab_zbins,field_map_2015,vc,'LineColor','none'); +xlabel('R^2 (cm^2)','fontsize', 18); +ylabel('Z (uSec)','fontsize', 18); +title(strcat('2015 Field Value vs. R^2 v Z.'),'fontsize',16,'Interpreter','none'); +caxis([color_range_min color_range_max]) +g=colorbar; +ylabel(g,'Field (V/cm)','FontSize',16) +set(g,'FontSize',18) +hold on +axis([0 625 0 330]) +myfigview(16); +set(gca,'Ydir','reverse') + +%% Comparing S1a/S1b RvZ to Scott's field map +% figure +% errorbar(field_map_2015(:),s1ab_r2z_mean(:),s1ab_r2z_mean_err(:),'.k'); +% xlabel('Field (V/cm)'); ylabel('S1a/S1b Ratio'); myfigview(16); +% +% figure +% rkploterr(s1ab_r2z_mean(:),field_map_2015(:),s1ab_r2z_mean_err(:),field_map_error(:),[1 0 0],[],[],2); +% ylabel('Field (V/cm)'); xlabel('S1a/S1b Ratio'); myfigview(16); + +%% Fit a polynomial +% Call fminsearch with a random starting point. +cut= ~isnan(s1ab_r2z_mean) & ~isnan(field_map_2015) & s1ab_r2z_mean>0 & field_map_2015>0; +data.xdata=s1ab_r2z_mean(cut); +data.ydata=field_map_2015(cut); +data.xdataerr=s1ab_r2z_mean_err(cut); +data.ydataerr=field_map_error(cut); +[S1aS1b_fit_2015, S1aS1b_fit_2015_error]=polyfit(data.xdata,data.ydata,2); %given X +%example usage [a b]=polyval(S1aS1b_fit_2015,[2.2:0.01:3],S1aS1b_fit_2015_error); + +%This is used for fitting and taking x and y errors into account... but since errors are underestimated on some points I'm not going to factor them in +% +% inv_sigma2=@(theta,data) 1./(data.ydataerr.^2); +% % inv_sigma2 = @(theta,data) 1./( ( (2.*theta(1).*data.xdata+theta(2)).*data.xdataerr).^2 + data.ydataerr.^2); +% +% modelfun = @(x,theta) theta(1).*x.^2+theta(2).*x+theta(3); +% ssfun = @(theta,data) 0.5.*( sum( (data.ydata - modelfun(data.xdata,theta)).^2.*inv_sigma2(theta,data) - log(inv_sigma2(theta,data)) )); +% polyval(data.xdata,data.ydata,3) +% +% init=polyfit(data.xdata,data.ydata,2); +% [tmin,ssmin]=fminsearch(ssfun,[init(1);init(2);init(3)],[],data); %minimizing sum of squares + +%% Comparing S1a/S1b RvZ to Scott's field map +% figure +% errorbar(field_map_2014(:),s1ab_r2z_mean(:),s1ab_r2z_mean_err(:),'.k'); +% xlabel('Field (V/cm)'); ylabel('S1a/S1b Ratio'); myfigview(16); +% + figure + rkploterr(s1ab_r2z_mean(:),field_map_2015(:),s1ab_r2z_mean_err(:),field_map_error(:),[ ],[],[],2); + ylabel('Field (V/cm)'); xlabel('S1a/S1b Ratio'); myfigview(16); + x=[0:0.1:3]; + y=polyval(S1aS1b_fit_2015,x); + plot(x,y,'Color',[0.6 0.6 0.6]) + +%% saving + +save('C:\Program Files\MATLAB\R2012a\bin\LUXCode\Scratch\RichardKnoche\KrypCal\KrypCal_2p20_Code\2015_Field_to_S1aS1b','S1aS1b_fit_2015','S1aS1b_fit_2015_error'); diff --git a/CodeForLUX/Matlab/MyScripts/SimComparisons/CompareToSimsData.m b/CodeForLUX/Matlab/MyScripts/SimComparisons/CompareToSimsData.m new file mode 100644 index 0000000..d4e1104 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/SimComparisons/CompareToSimsData.m @@ -0,0 +1,156 @@ +%% Do for Gammas + +path='C:\Users\Richard\Desktop\SimData\luxsm_20160607T1618_cp22722\'; +% path='C:\Users\Richard\Desktop\SimData\luxsm_20160608T0358_cp22721\'; + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm','x_cm_tmplt','y_cm_tmplt'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin',... + 'hft_t50r_samples','hft_t50l_samples','z_corrected_pulse_area_all_phe','xyz_corrected_pulse_area_all_phe',... + 'z_corrected_pulse_area_bot_phe','xyz_corrected_pulse_area_bot_phe','x_corrected','y_corrected','mc_E_keV','mc_NEST_num_gammas','mc_NEST_num_electrons'}; + + % defining cuts + zcut_min = 30;%us + zcut_max = 300;%us + rcut_min = 0; + rcut_max = 25;%cm + s1area_bound_min = 0;%2 PMT hits + s1area_bound_max = 10^5;%include Kr 83 data and gammas + + s2area_bound_min = 100;%100 ~ 0.5 keVee + s2area_bound_max = 2*10^6;% %both PMT Arrays and Kr83 + + d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat((d.mc_E_keV==d.mc_E_keV(end)),[10,1]).*repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat((d.mc_E_keV==d.mc_E_keV(end)),[10,1]).*repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + + drift_time = d.z_drift_samples(s2_single_cut)/100; %units of us + + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_both_xyz=d.xyz_corrected_pulse_area_all_phe(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_both_xyz=d.xyz_corrected_pulse_area_all_phe(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + s2radius = (s2x.^2+s2y.^2).^(0.5); + s2x_c = d.x_corrected(s2_single_cut); + s2y_c = d.y_corrected(s2_single_cut); + s2radius_c = (s2x_c.^2+s2y_c.^2).^(0.5); + + timestamp_vec_1 = sort([d.livetime_latch_samples d.livetime_end_samples]); + livetime_sec = sum(timestamp_vec_1(2:2:end) - timestamp_vec_1(1:2:end)) / 1e8; + + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_number=d.event_number(evt_cut)'; + event_timestamp_samples=d.event_timestamp_samples(evt_cut)'; + + electron_s1_c=s1_phe_both_xyz; + electron_s2_c=s2_phe_both_xyz; + electron_energy=(1/73).*(s1_phe_both_xyz./0.1167 + s2_phe_both_xyz./12.05); + + clearvars -except gamma_s1_c gamma_s2_c gamma_energy electron_s1_c electron_s2_c electron_energy + + %% Do real data +load('C:\Program Files\MATLAB\R2012a\bin\SimComparisons\LUX_XeAct_Data') + +%fit gaussian to S1 spectra +s1_data_fit=fit([400:20:1400].',hist(s1_cor_area_fullspectrum(inrange(energy_fullspectrum,[150 180]) & inrange(s1_cor_area_fullspectrum,[400 1220])),[400:20:1400]).','gauss1'); +s2_data_fit=fit([1000:2000:100000].',hist(s2_cor_area_fullspectrum(inrange(energy_fullspectrum,[150 180]) & inrange(s2_cor_area_fullspectrum,[1000 100000])),[1000:2000:100000]).','gauss1'); +s1_sim_fit=fit([400:20:1400].',hist(electron_s1_c,[400:20:1400]).','gauss1'); +s2_sim_fit=fit([1000:2000:100000].',hist(electron_s2_c,[1000:2000:100000]).','gauss1'); + +s1_scale_factor=s1_data_fit.b1./s1_sim_fit.b1; +s2_scale_factor=s2_data_fit.b1./s2_sim_fit.b1; + + electron_s1_c=electron_s1_c.*s1_scale_factor; + electron_s2_c=electron_s2_c.*s2_scale_factor; + electron_energy=(1/73).*(electron_s1_c./0.1167 + electron_s2_c./12.05); + + +%Determine normalization factor +data_fit=fit([140:2:200].',hist(energy_fullspectrum(inrange(energy_fullspectrum,[150 180])),[140:2:200]).','gauss1'); +sim_fit=fit([140:2:200].',hist(electron_energy,[140:2:200]).','gauss1'); + +norm_factor=data_fit.a1/sim_fit.a1; + +%Get error bars +[data_e_hist data_e_hist_bins]=hist(energy_fullspectrum(inrange(energy_fullspectrum,[150 180])),[140:2:200]); +[sim_e_hist sim_e_hist_bins]=hist(electron_energy,[140:2:200]); + +[data_s1_hist data_s1_hist_bins]=hist(s1_cor_area_fullspectrum(inrange(energy_fullspectrum,[150 180])),[400:20:1400]); +[sim_s1_hist sim_s1_hist_bins]=hist(electron_s1_c,[400:20:1400]); + +[data_s2_hist data_s2_hist_bins]=hist(s2_cor_area_fullspectrum(inrange(energy_fullspectrum,[150 180])),[1000:2000:100000]); +[sim_s2_hist sim_s2_hist_bins]=hist(electron_s2_c,[1000:2000:100000]); + + +%Make S1 Plots +figure +step(s1_cor_area_fullspectrum(inrange(energy_fullspectrum,[150 180])),[400:20:1400],'-k') +hold on; +step(electron_s1_c,[400:20:1400],'-b',norm_factor); +rkploterr(data_s1_hist_bins,data_s1_hist,[],sqrt(data_s1_hist),[0 0 0],'.',1,2); +rkploterr(sim_s1_hist_bins,norm_factor.*sim_s1_hist,[],norm_factor.*sqrt(sim_s1_hist),[0 0 1],'.',1,2); +xlabel('S1 (phd)'); ylabel('Count'); myfigview(20); +legend('Data','Electron Sim') + +%Make S2 Plots +figure +step(s2_cor_area_fullspectrum(inrange(energy_fullspectrum,[150 180])),[1000:2000:100000],'-k') +hold on; +step(electron_s2_c,[1000:2000:100000],'-b',norm_factor); +rkploterr(data_s2_hist_bins,data_s2_hist,[],sqrt(data_s2_hist),[0 0 0],'.',1,2); +rkploterr(sim_s2_hist_bins,norm_factor.*sim_s2_hist,[],norm_factor.*sqrt(sim_s2_hist),[0 0 1],'.',1,2); +xlabel('S2 (phd)'); ylabel('Count'); myfigview(20); +legend('Data','Electron Sim') + +%Verified this is the same as Evan's result +% data_combined_energy=(1/73).*(s1_cor_area_fullspectrum./0.117+s2_cor_area_fullspectrum./12.1); + +%Make Energy Plots +figure +step(energy_fullspectrum(inrange(energy_fullspectrum,[150 180])),[140:2:200],'-k') +hold on; +step(electron_energy,[140:2:200],'-b',norm_factor); +rkploterr(data_e_hist_bins,data_e_hist,[],sqrt(data_e_hist),[0 0 0],'.',1,2); +rkploterr(sim_e_hist_bins,norm_factor.*sim_e_hist,[],norm_factor.*sqrt(sim_e_hist),[0 0 1],'.',1,2); +xlabel('Energy (keV)'); ylabel('Count'); myfigview(20); +legend('Data','Electron Sim') \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/SimComparisons/MakeWS_Spectrum.m b/CodeForLUX/Matlab/MyScripts/SimComparisons/MakeWS_Spectrum.m new file mode 100644 index 0000000..90ae29b --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/SimComparisons/MakeWS_Spectrum.m @@ -0,0 +1,43 @@ +load('C:\Program Files\MATLAB\R2012a\bin\SimComparisons\LUX_XeAct_Data') +figure +step(energy_fullspectrum,[0:2:700],'-b') +logy +hold on; +line([41.55 41.55],[0.01 1000000],'LineWidth',2,'Color',[1 0 0]) +line([163.9 163.9],[0.01 1000000],'LineWidth',2,'Color',[1 0 0]) +line([208.3 208.3],[0.01 1000000],'LineWidth',2,'Color',[1 0 0]) +line([236.1 236.1],[0.01 1000000],'LineWidth',2,'Color',[1 0 0]) +line([409 409],[0.01 1000000],'LineWidth',2,'Color',[1 0 0]) +line([609 609],[0.01 1000000],'LineWidth',2,'Color',[1 0 0]) +ylim([6 30000]) +xlabel('Energy (keV)'); ylabel('Count'); myfigview(20); + +ht=text(10,10,'^{83m}Kr (41.55 keV)'); +set(ht,'FontSize',18) +set(ht,'Rotation',90) +set(ht,'Color',[1 0 0]) + +ht=text(10,10,'^{131}Xe (163.9 keV)'); +set(ht,'FontSize',18) +set(ht,'Rotation',90) +set(ht,'Color',[1 0 0]) + +ht=text(10,10,'^{127}Xe (208.3 keV)'); +set(ht,'FontSize',18) +set(ht,'Rotation',90) +set(ht,'Color',[1 0 0]) + +ht=text(10,10,'^{129}Xe (236.1 keV)'); +set(ht,'FontSize',18) +set(ht,'Rotation',90) +set(ht,'Color',[1 0 0]) + +ht=text(10,10,'^{127}Xe (409 keV)'); +set(ht,'FontSize',18) +set(ht,'Rotation',90) +set(ht,'Color',[1 0 0]) + +ht=text(10,10,'^{609}Bi (214 keV)'); +set(ht,'FontSize',18) +set(ht,'Rotation',90) +set(ht,'Color',[1 0 0]) \ No newline at end of file diff --git a/CodeForLUX/Matlab/MyScripts/SimComparisons/Xe131Sims.m b/CodeForLUX/Matlab/MyScripts/SimComparisons/Xe131Sims.m new file mode 100644 index 0000000..5434100 --- /dev/null +++ b/CodeForLUX/Matlab/MyScripts/SimComparisons/Xe131Sims.m @@ -0,0 +1,88 @@ +path='C:\Users\Richard\Desktop\SimData\luxsm_20160518T1510_cp21855\'; %gamma +% path='C:\Users\Richard\Desktop\SimData\luxsm_20160518T1418_cp21856'; %electron + +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm','x_cm_tmplt','y_cm_tmplt'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin',... + 'hft_t50r_samples','hft_t50l_samples','z_corrected_pulse_area_all_phe','xyz_corrected_pulse_area_all_phe',... + 'z_corrected_pulse_area_bot_phe','xyz_corrected_pulse_area_bot_phe','x_corrected','y_corrected','mc_E_keV','mc_NEST_num_gammas','mc_NEST_num_electrons'}; + + % defining cuts + zcut_min = 30;%us + zcut_max = 300;%us + rcut_min = 0; + rcut_max = 25;%cm + s1area_bound_min = 0;%2 PMT hits + s1area_bound_max = 10^5;%include Kr 83 data and gammas + + s2area_bound_min = 100;%100 ~ 0.5 keVee + s2area_bound_max = 2*10^6;% %both PMT Arrays and Kr83 + + d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + + + d.z_drift_samples(isnan(d.z_drift_samples)) = 0.0; % get rid of NaN + + s1_area_cut= inrange(d.pulse_area_phe,[s1area_bound_min,s1area_bound_max]); + s2_area_cut= inrange(d.pulse_area_phe,[s2area_bound_min,s2area_bound_max]); + + s1_class=(d.pulse_classification==1 )& s1_area_cut ; %area cut for Kr events + s2_class=(d.pulse_classification==2) & s2_area_cut ; + s4_class=(d.pulse_classification==4) ; + + +events=sort(size(d.pulse_area_phe)); %The first element is the number of pulses. sometimes it's 5, sometimes it's 10 +cut_pulse_s1 = d.pulse_classification == 1; +cut_pulse_s2 = d.pulse_classification == 2; +cut_s2_with_threshold = d.pulse_area_phe.*cut_pulse_s2 > 100; % subset of cut_pulse_s2 +cut_legit_s2_in_legit_event = d.s1s2_pairing.*cut_s2_with_threshold; % this should be used as s2 classification cuts +cut_golden_event = sum(cut_legit_s2_in_legit_event) == 1; %defines golden events to be events which have one and only one paired S2 above the threshold of 100 phe - there can be multiple S1s still +cut_s2_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_legit_s2_in_legit_event); %Selects S2 that is in a golden event +cut_s1_in_golden_events = logical(repmat(cut_golden_event,[10,1]).*cut_pulse_s1.*d.s1s2_pairing); %Selects first S1 that is in a golden event +% select Kr83 events with cut on S2 +cut_s2_area = inrange(d.pulse_area_phe, [s2area_bound_min, s2area_bound_max]); +cut_s1_area = inrange(d.pulse_area_phe, [s1area_bound_min, s1area_bound_max]); +cut_s2_for = cut_s2_in_golden_events.*cut_s2_area; %Selects S2 that is in a golden event and in Kr area bounds +cut_s1_for = cut_s1_in_golden_events.*cut_s1_area; %Selects first S1 that is in a golden event and in Kr area bounds +cut_selected_events = sum(cut_s2_for) == 1 & sum(cut_s1_for) == 1 & sum(d.pulse_classification==1)==1; %Requires that "good" golden events have only one S1, that the S1 be within area bounds, and the S2 be within area bounds +%Note sum(cut_s1_for) == 1 above only requires that the first of the S1 in an event be within area bounds, since the S1S2pairing part of cut_s1_in_golden_events is 0 for all subsequent S1s in the events +s1_single_cut = logical(repmat((d.mc_E_keV==d.mc_E_keV(end)),[10,1]).*repmat(cut_selected_events,[10,1]).*cut_s1_in_golden_events); +s2_single_cut = logical(repmat((d.mc_E_keV==d.mc_E_keV(end)),[10,1]).*repmat(cut_selected_events,[10,1]).*cut_s2_in_golden_events); + + + drift_time = d.z_drift_samples(s2_single_cut)/100; %units of us + + + d.phe_bottom=d.pulse_area_phe./(1+d.top_bottom_ratio); %bottom PMT pulse area + + s1_phe_both = d.pulse_area_phe(s1_single_cut); + s1_phe_both_xyz=d.xyz_corrected_pulse_area_all_phe(s1_single_cut); + + s2_phe_both = d.pulse_area_phe(s2_single_cut); + s2_phe_both_xyz=d.xyz_corrected_pulse_area_all_phe(s2_single_cut); + + s2x = d.x_cm(s2_single_cut); + s2y = d.y_cm(s2_single_cut); + s2radius = (s2x.^2+s2y.^2).^(0.5); + s2x_c = d.x_corrected(s2_single_cut); + s2y_c = d.y_corrected(s2_single_cut); + s2radius_c = (s2x_c.^2+s2y_c.^2).^(0.5); + + timestamp_vec_1 = sort([d.livetime_latch_samples d.livetime_end_samples]); + livetime_sec = sum(timestamp_vec_1(2:2:end) - timestamp_vec_1(1:2:end)) / 1e8; + + evt_cut=logical(sum(s2_single_cut));%Cut for all the events passing the single S1 & S2 cut + event_number=d.event_number(evt_cut)'; + event_timestamp_samples=d.event_timestamp_samples(evt_cut)'; + + clean_cut=-(s1_phe_both+s2_phe_both)' + d.full_evt_area_phe(logical(squeeze(sum(s2_single_cut,1)))) < 100 ... + & drift_time' > 0;%more than 1/2 the area is S1+S2. And S1 before S2 + clean_cut=clean_cut'; + + + energy=(1/73).*(s1_phe_both_xyz./0.117 + s2_phe_both_xyz./12.1); \ No newline at end of file diff --git a/CodeForLUX/Matlab/Submit_KrypCal_to_LUG.m b/CodeForLUX/Matlab/Submit_KrypCal_to_LUG.m new file mode 100644 index 0000000..c8a640c --- /dev/null +++ b/CodeForLUX/Matlab/Submit_KrypCal_to_LUG.m @@ -0,0 +1,176 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% Purpose: +% This function runs KrypCal on all of the data in a given directory. +% Files are skipped if they already have IQs on the LUG. +% +% Inputs: +% - user_name - Username for the LUG entry +% - dp_version - KrypCal version number for LUG entry +% - algorithm_name - algorithm name for LUG entry +% - dir_path - Path to directory where data is stored +% - use_ccv_flag - Flag to require ccv_rqs_done.txt file exists before processing the data +% +% Outputs: +% - lug_val - Flag set to 1 if successful +% +% Author: +% - Richard Knoche, Attila Dobi +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function [lug_val] = Submit_KrypCal_to_LUG(user_name, dp_version, algorithm_name, dir_path, use_ccv_flag) + +%% Check function inputs + +if nargin==4 + use_ccv_flag=1; % by defult use the ccv_flag +end + +if nargin<4 + error('Invalid number of input, enter three strings \n'); +end + +if ~ischar(user_name) && ~ischar(dp_version) && ~ischar(dir_path) + error('Invalid input, enter three strings and ccv_flag (0 or 1) \n'); +end + +%% Find IQs that have already been submitted to LUG without a strike and ignore those files + +strg_start = 'select values_xml from control.lug_iqs where strikeme=0 AND algorithm_version = '; +strg_end = ' AND algorithm = "'; +group_end = ' group by filename_prefix' ; %add this to prevent duplication. +qry_strg = sprintf('%s%s%s%s"%s;',strg_start,dp_version,strg_end,algorithm_name, group_end); + +out = MySQLQuery_UMD(qry_strg); +LUG_file_name = {' '}; + +for j=1:size(out.values_xml,1); % + value1 = XMLParser(out.values_xml{j}); + LUG_file_name{j} = char(value1.iq.global.filename_prefix); % create an array of Char +end + +%Get all Kr data filename prefixes +out_Kr = MySQLQuery_UMD('select * from control.lug_acquisitions where source = "Kr-83" ;'); +Kr_file_name = {' '}; + +for j=1:length(out_Kr.filename_prefix) % + Kr_file_name{j} = char(out_Kr.filename_prefix(j)); +end + + + +%check that the folder contains data and that the IQ has not already been uploaded for that data set (given the IQ version number) +%Also check that it is an actual Kr data set +potential_folders_to_load = {' '}; +list = dir(dir_path); + +k=1; +for ii=1:length(list) + if length(list(ii).name) > 18 + if ( strcmp(list(ii).name(1:6),'lux10_') && sum( strcmp(list(ii).name(1:19),LUG_file_name))==0 ... + && sum( strcmp(list(ii).name(1:19),Kr_file_name))==1) % A LUX folder & No IQ on LUG & a Kr set + + folder_contents = dir(strcat(dir_path,'/',list(ii).name)); + dir_size = sum([folder_contents.bytes]); + + if dir_size > 10^9 % 1 GB limit + + potential_folders_to_load{k} = list(ii).name; + k=k+1; + + end + end + end + +end + +% Once we determined good folders to load, check their multiplicity +% Keep higher CP unless duplicated folder with a higher CP number contains no data +folder_names_char = char(potential_folders_to_load); +folder_name_no_cp = cellstr([folder_names_char(:,1:19)]); %#ok<*NBRAK> %convert the char back to a cell array of chars + +k=1; +good_index=1; +while good_index <= length(potential_folders_to_load) + + folder_multiplicity = sum(strcmp(potential_folders_to_load{good_index}(1:19),folder_name_no_cp )); + good_index = good_index+folder_multiplicity-1; + folders_to_load{k} = potential_folders_to_load{good_index}; + k=k+1; + good_index = good_index+1; + +end + +no_folders_to_load=0; + +if ( strcmp(folders_to_load{1},' ') && length(folders_to_load) < 2 ) + no_folders_to_load=1; +end + + +% Get all 100 V/cm filename prefixes +out_field = MySQLQuery_UMD('select * from control.lug_acquisitions where collection like "%100 V/cm%" ;'); +Field_100_names = {' '}; + +for j=1:length(out_field.filename_prefix) % + Field_100_names{j}=char(out_field.filename_prefix(j)); +end + +% Is this a 100 V/cm data set? +for ii=1:length(folders_to_load) + if ( sum( strcmp(folders_to_load{ii}(1:19),Field_100_names))==0 ) + Field_100_flag(ii)=0; + else + Field_100_flag(ii)=1; + end +end + +%% Run KrypCal on each folder one by one. + +% RQs needed in KrypCal +rqs_to_load = {'pulse_area_phe','event_timestamp_samples'... + ,'pulse_classification' ... + ,'z_drift_samples' , 's1s2_pairing'... + ,'top_bottom_ratio','x_cm','y_cm'... + ,'full_evt_area_phe',... + 'event_number','chi2','prompt_fraction','aft_t1_samples','pulse_start_samples',... + 'pulse_end_samples','top_bottom_asymmetry','aft_t0_samples','aft_t2_samples',... + 'full_evt_area_phe','admin','Kr83fit_s1a_area_phe','Kr83fit_s1b_area_phe',... + 'hft_t50r_samples','hft_t50l_samples','Kr83fit_dt_samples'}; + + +%Avoid doing too many in a row -- there is a memory leak in SQL script (matlab's fault, can't fix it) +if length(folders_to_load)>5 + for ii=1:5 % after 13 submitions Matlab will crash due to java memory leak + path=strcat(dir_path,'/',folders_to_load{ii}); + + files_available=dir(path); %only load if file complete flag is in the directory + if ( ismember({'ccv_rqs_done'},{files_available.name}) || use_ccv_flag==0 ) + d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + KrypCal(d,user_name,dp_version,algorithm_name,1); %rq,use pulse_class,submit IQ to LUG,delay time min + + end + clear files_available + end + +elseif no_folders_to_load == 0 + for ii=1:length(folders_to_load) % after 13 submitions Matlab will crash due to java memory leak + path=strcat(dir_path,'/',folders_to_load{ii}); + + files_available=dir(path); %only load if file complete flag is in the directory + if ( ismember({'ccv_rqs_done'},{files_available.name}) || use_ccv_flag==0 ) + d = LUXLoadMultipleRQMs_framework(path,rqs_to_load); + KrypCal(d,user_name,dp_version,algorithm_name,1); %rq,use pulse_class,submit IQ to LUG,delay time min + + end + clear files_available + end +end + +lug_val=1; + +fprintf('Finished \n'); + +exit; % quit matlab + diff --git a/CodeForLUX/Python/Run04_CH3T_G1G2/Feb2015_CH3T_G1G2_KrypCal2p22.ipynb b/CodeForLUX/Python/Run04_CH3T_G1G2/Feb2015_CH3T_G1G2_KrypCal2p22.ipynb new file mode 100644 index 0000000..2488204 --- /dev/null +++ b/CodeForLUX/Python/Run04_CH3T_G1G2/Feb2015_CH3T_G1G2_KrypCal2p22.ipynb @@ -0,0 +1,1329 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Setup

" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "//anaconda/lib/python2.7/site-packages/matplotlib/font_manager.py:273: UserWarning: Matplotlib is building the font cache using fc-list. This may take a moment.\n", + " warnings.warn('Matplotlib is building the font cache using fc-list. This may take a moment.')\n" + ] + } + ], + "source": [ + "from __future__ import division\n", + "import scipy \n", + "import scipy.interpolate as ip\n", + "from pylab import * # includes numpy\n", + "import matplotlib.pyplot as plt # plotting libraries from matlab\n", + "import sys\n", + "sys.path.insert(2, '//global/project/projectdirs/lux/data')\n", + "import aLib" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Populating the interactive namespace from numpy and matplotlib\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: pylab import has clobbered these variables: ['linalg', 'draw_if_interactive', 'random', 'power', 'info', 'fft']\n", + "`%matplotlib` prevents importing * from pylab and numpy\n" + ] + } + ], + "source": [ + "%pylab inline \n", + "#always do this for plotting... don't ask me why... Googled the fix for LINUX." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "pylab.rcParams['figure.figsize'] = (10.0, 8.0) # set size of figures displayed in this notebook" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Let's make a Tritium Beta Specturm ! :)

remember, Z'=Z+1 = 2 for Tritium Decay

http://www.hindawi.com/journals/ahep/2013/293986/
http://journals.aps.org/prl/abstract/10.1103/PhysRevLett.54.1891\n", + "
Note on DocBD: http://teacher.pas.rochester.edu:8080/wiki/pub/Lux/LuxDB00000402/TritiumBetaShape.pdf

" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Defining Constants

" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "c=1; # speed of light\n", + "C=1e-6; #constant infront of Fermi funciton. Arbitrary. Read Katrin paper if you care about super-allowed and allowed transitions... and nuclear matrix elements that don't matter\n", + "me = 511/c**2; # rest mass of our good friend the electron, in keV\n", + "Q=18.6 # endpoint of the tritium Beta decay keV. Maximum kinetic energy the electron.\n", + "mv=0 # neutrino mass=0. There may exist a 17 keV neutrino, maybe 7 keV!! Will we ever know??? Is it The Dark Matter?? Mystery...\n", + "step_T=0.1 #step energy by 0.1 keV\n", + "T=arange(0.01, 18.6,step_T) #sweep from 0.01 to the Q value in increments of step_T.\n", + "Z=1+1; #Tritium, after the beta decay Z'=1+1;\n", + "halflife = 12.32; # half life of the tritium beta decay in years\n", + "tau = 365*halflife/0.69; # Decay constant converted to days\n", + "n = 1e6; # Assume 1e6 atoms are decaying.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Simplifications

" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Fermi Function. Coulomb correction for the charge of the nucleas\n", + "G=(T+me*c**2)/(me*c**2); #Gamma, Total energy(E+M^2) over M^2\n", + "B=sqrt((G**2-1)/G**2); # v/c of electron. Ratio of velocity to speed of light in vacuum.\n", + "x=(2*pi*Z/137)/B; # note: fine structure constant = 137. \n", + "F = x*(1/(1-exp(-x)))*(1.002037-0.001427*(B)); # from http://journals.aps.org/prl/abstract/10.1103/PhysRevLett.54.1891. Measured to 1/1000\n", + "F_Kat=x*(1/(1-exp(-x))); # Katrin paper... http://www.hindawi.com/journals/ahep/2013/293986/ (really the same thing)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

more blah blah blah equations, they never seem to end!

" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "KE=T; #(G-1).*me*c^2; % The kinetic energy, is equal to T\n", + "E=KE+me*c**2; # the total energy. KE + rest mass\n", + "P=sqrt(E**2-me**2*c**4)/c; # momentum of the electron" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Let's calculate the number density of final states in two ways... makes no difference for LUX

" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "N=C*P*E*(Q+me-E)*sqrt((Q+me-E)**2-mv**2)*F # in terms of total energy. E=m0+KE. Or where Q means Q+m0\n", + "N_Kat=C*F_Kat*(KE+me)*sqrt((KE+me)**2-me**2)*(Q-KE)**2 # eqution 18 of Katrin paper. Set nutrino mass to zero... http://www.hindawi.com/journals/ahep/2013/293986/ (really the same thing)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Normalize the count to number of atoms

" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "s = sum(N[~isnan(N)])*step_T # Total Counts\n", + "s_Kat = sum(N_Kat[~isnan(N_Kat)])*step_T # Total Counts (for the Katrin paper case)\n", + "\n", + "N = N * (1/s * n/tau) # Decays/keV/day/1e6 atoms\n", + "N_Kat = N_Kat * (1/s * n/tau) # Decays/keV/day/1e6 atoms" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

create variable of kinetic energy T and N (count/dE)

" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "tritium_beta_spectrum=array([T,N])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Make Plots!!! Woooo Plots

" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\nERFJUf8P/gVG4rDYZGUAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "figure(0)\n", + "plt.plot(T,N,'r',linewidth=4)\n", + "plt.plot(T,N_Kat,'--b',linewidth=4)\n", + "plt.xlabel('Electron Kinetic Energy [keV] ',fontsize=18)\n", + "plt.ylabel('Count/keV/day/1e6 atoms',fontsize=18)\n", + "plt.legend(('Used for LUX','Katrin Paper with 0 nu Mass'))\n", + "\n", + "figure(1)\n", + "plt.plot(T,N,'r',linewidth=4)\n", + "plt.plot(T,N_Kat,'--b',linewidth=4)\n", + "plt.xlabel('Electron Kinetic Energy [keV] ',fontsize=18)\n", + "plt.ylabel('Count/keV/day/1e6 atoms',fontsize=18)\n", + "plt.yscale('log')\n", + "plt.legend(('Used for LUX','Katrin Paper with 0 nu Mass'))" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "cut=T<2" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.18770132835158548" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sum(N*cut)/sum(N)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Load in NEST yields and tritium data from December 2013

" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "#NEED TO GET NEW DATA FOR RUN04!!\n", + "#Load NEST LY,QY [2 3] -> Doke-Tritium LY,QY [4 5] -> and Tritium_Beta LY,QY [6 7]\n", + "tritium_beta=np.loadtxt('//global/homes/r/rknoche/Tritium_Spec_LYQY_paper.txt')\n", + "tritium_beta[:,0]=T\n", + "tritium_beta[:,1]=N\n", + "\n", + "#Load the Dec 2013 tritium data.VUV corrected, spike count for S1. XYZ corrected rq with 83Kr. Cut from 35-305us. <20cm radius.\n", + "#tritium_data=np.loadtxt('//global/homes/r/rknoche/Run04_Sep2014_Kr2p14_CH3TData_TwoLineFloat.txt')\n", + "tritium_data=np.loadtxt('//global/homes/r/rknoche/Run04_Feb2015_Kr2p22_CH3TData.txt')\n", + "S1=tritium_data[:,0]\n", + "S2=tritium_data[:,1]\n", + "dTus=tritium_data[:,2]\n" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "g1_Doke=0.098 #From KrypCal Chi2\n", + "Eeff_Doke=0.808 #From KrypCal Chi2\n", + "Eeff_Beta=0.808\n", + "SE_WS=26.28 #From LUG\n", + "sigma_SE=5.8402; #From LUG\n", + "g2_Doke= SE_WS*Eeff_Doke \n", + "\n", + "\n", + "g1_Beta=g1_Doke \n", + "g2_Beta=g2_Doke " + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "E_Doke=1/73*(tritium_data[:,0]/g1_Doke + tritium_data[:,1]/g2_Doke)\n", + "E_Beta=1/73*(tritium_data[:,0]/g1_Beta + tritium_data[:,1]/g2_Beta)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Adding Detector Resolution.

\n", + "

We define energy as some linear combination of number of photons and electrons that we collect, so sigma E is a function of sigma N_photons and sigma N_electrons

" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

\n", + "E/W= N_gamma + N_electron
\n", + "E/W= S1/g1 + S2/g2\n", + "

" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Generate Tritium spectrum with detector resolution and recombination variance.
\n", + "g1=0.117, Eeff=0.58, with inst. flucs, with singlePE resultion in S1. For MAX det res

" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185\n" + ] + } + ], + "source": [ + "# Setup constants...\n", + "ex_to_ion_alpha=0.20; #exciton to ion ratio ... alpha\n", + "\n", + "sigma_PE=0.50; # resolution of 1 photon. We are using spike count, so this should be 0\n", + "\n", + "inst_s1=6; #measured from Doke 6 ... seems to turn off below ~200 keV ?\n", + "inst_s2=8; #measured from Doke 8 ... seems turn off below ~200 keV ?\n", + "#using 0.85 as average extraction factor for a 1000 us electron lifetime\n", + "#and 320 us drift length.\n", + "\n", + "g1=g1_Doke #From Doke plot\n", + "Eeff=Eeff_Doke #From Doke plot #### Please NOTE: using 0.48 makes NO FREAKING DIFFERENCE!!! try for yourself :) \n", + "SE_size = SE_WS # For December tritium data.... use 24.66 in Aug 2013, same as W.S.\n", + "\n", + "#######################################################################################################\n", + "coeff_ng_sig_stat=sqrt((1-g1+sigma_PE**2)/g1);\n", + "coeff_ne_sig_stat=sqrt(((1-Eeff)*Eeff*SE_size**2+Eeff*sigma_SE**2)*0.85/(Eeff*SE_size)**2+0.155);\n", + "\n", + "trial_m=1000; # about 150k with trial_m = 100\n", + "trials=sum(ceil(tritium_beta[:,1]*trial_m)); #tritium dN/dE is fractional so multiply amplitute. \n", + "subtrials=np.ones((tritium_beta[:,1].size,1));\n", + "\n", + "gamma_T=np.ones((trials,1)); # Tritium gamma spectrum\n", + "e_T=np.ones((trials,1)); # Tritium electron spectrum.\n", + "\n", + "\n", + "kk=1; # kk will equal the total number of simulated tritium events\n", + "\n", + "for jj in range(0, tritium_beta[:,0].size): #% sweep through each energy bin\n", + " print(jj),\n", + " subtrials[jj]=ceil(tritium_beta[jj,1]*trial_m)\n", + " mean_gamma_T=tritium_beta[jj,2] # 2 for NESTv98 LY, 5 is with first fit to tritium.\n", + " mean_e_T=tritium_beta[jj,3] # 3 for NESTv98 QY, 6 is with first fit to tritium.\n", + "\n", + " n_ion_T=(mean_gamma_T+mean_e_T)/(1+ex_to_ion_alpha);\n", + " r_T=(mean_gamma_T/mean_e_T-ex_to_ion_alpha)/(mean_gamma_T/mean_e_T+1) #mean recombination fraction\n", + "\n", + " #Add functional form of recombination variance.%%%%%%%%%%%%%%%%%%% Cancels out in E space\n", + " Recomb_V_T=(0.07*n_ion_T)**2;\n", + " Fano_V=0; \n", + "\n", + " for ii in range(0, subtrials[jj]-1): #% one energy bin, test for recombination and stat\n", + " \n", + " recomb_fluc = np.random.normal(0,sqrt(Recomb_V_T),1) #mu, sigma , 1\n", + " Fano_fluc= 0; #normrnd(0,sqrt(Fano_V));\n", + " #Add functional form of S1 and S2 smearing%%%%%%%%%%%%%%%%\n", + " sigma_stat_gamma_R= sqrt(abs((coeff_ng_sig_stat*sqrt(abs(mean_gamma_T+recomb_fluc+r_T*Fano_fluc)))**2+(inst_s1/100*(mean_gamma_T+recomb_fluc+r_T*Fano_fluc) )**2 ));\n", + " sigma_stat_e_R= sqrt(abs((coeff_ne_sig_stat*sqrt(abs(mean_e_T-recomb_fluc+(1-r_T)*Fano_fluc)))**2 + (inst_s2/100*(mean_e_T-recomb_fluc+(1-r_T)*Fano_fluc) )**2 )); \n", + "\n", + " gamma_T[kk]=np.random.normal(mean_gamma_T+recomb_fluc+r_T*Fano_fluc,sigma_stat_gamma_R,1) #recomb + photons and - electrons\n", + " e_T[kk]= np.random.normal(mean_e_T-recomb_fluc+(1-r_T)*Fano_fluc,sigma_stat_e_R,1) #%recomb - photons and + electrons\n", + " kk=kk+1;\n", + "\n", + "#photon spectrum: gamma_T\n", + "#electron spectrum: e_T\n", + "# Energy...-> now smeared with detector resultion.\n", + "E_com_Tsim_NEST_MAX=1/73*(gamma_T+e_T); " + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false, + "scrolled": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(0, 0.11558801399012951)" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "binwidth=0.25 # keV\n", + "n_NEST_MAX, bin_edges_NEST_MAX, patches = plt.hist(E_com_Tsim_NEST_MAX, bins=np.arange(0.05, 25 + binwidth, binwidth), normed=1, facecolor='none',edgecolor='red',linewidth=2, histtype='step', alpha=0.9)\n", + "plt.xlabel('Energy KeVee',fontsize=18)\n", + "plt.ylabel('normalized count',fontsize=18)\n", + "plt.xlim([0,25])\n", + "left,right = bin_edges_NEST_MAX[:-1],bin_edges_NEST_MAX[1:]\n", + "bin_center_NEST_MAX=(right+left)/2\n", + "\n", + "s = ip.UnivariateSpline(bin_center_NEST_MAX,n_NEST_MAX)\n", + "s.set_smoothing_factor(1e-5)\n", + "plt.plot(bin_center_NEST_MAX,s(bin_center_NEST_MAX),'k',linewidth=2)\n", + "\n", + "scale_factor=sum(N)*0.1/(sum(n_NEST_MAX)*binwidth)\n", + "plt.plot(T,N/scale_factor,'m',linewidth=2)\n", + "\n", + "plt.xlim([0,22]);\n", + "plt.ylim([0, 1.1*max(n_NEST_MAX)]);\n", + "\n", + "#plt.yscale('log')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

The Feb 2015 the data

" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false, + "scrolled": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(0, 22)" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\nRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "binwidth=0.25 # keV\n", + "\n", + "n_data, bin_edges_data, patches = plt.hist(E_Doke, bins=np.arange(0.05, 25 + binwidth, binwidth), normed=1, facecolor='none',edgecolor='black',linewidth=2, histtype='step', alpha=0.9)\n", + "plt.xlabel('Energy KeVee',fontsize=18)\n", + "plt.ylabel('normalized count',fontsize=18)\n", + "\n", + "left,right = bin_edges_data[:-1],bin_edges_data[1:]\n", + "bin_center_data=(right+left)/2\n", + "\n", + "\n", + "data_scale_factor=sum(n_data[bin_center_data>3])/sum(n_NEST_MAX[bin_center_NEST_MAX>3])\n", + "\n", + "plt.step(bin_center_NEST_MAX,n_NEST_MAX*data_scale_factor,'b',linewidth=2)\n", + "#plt.plot(T,N/scale_factor*data_scale_factor,'m',linewidth=2)\n", + "\n", + "plt.legend(('Beta w sigE','Beta','Data','Data with Beta values'))\n", + "plt.xlim([0,22])\n", + "#plt.yscale('log')" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlkAAAHfCAYAAABj+c0fAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAHZ9JREFUeJzt3W+IZed9H/DvT1m0HseNUJNqFLRK4iCTyiFFTrH6wn2x\noUSRU7CMA6qaNNgxLgbVsSFQYvnNLiEtdiAugaI3thMUYyMrAVcyhFoS6lIciOXGUiNnFWehrCJv\nM2s3zT/jrpCiX1/M3ejundmduTP3mTt/Ph846N5nzjn3t1dHs189z3OeU90dAAAW67plFwAAcBgJ\nWQAAAwhZAAADCFkAAAMIWQAAAwhZAAADbDtkVdV1VfXVqnps8v7Gqnq8qr5eVV+sqhum9n2gqs5V\n1fNVddeIwgEA9rN5erI+lOTs1PsPJ3myu38kyVNJHkiSqnpzknuT3J7k7UkerKpaTLkAAAfDtkJW\nVZ1I8tNJPjnVfE+ShyavH0ryzsnrdyR5uLtf6e7zSc4luXMh1QIAHBDb7cn6T0n+fZLp5eFXu/ti\nknT3WpKbJu23JHlxar8LkzYAgCPj2FY7VNW/THKxu5+tqpPX2HWu5/NUlef5AAAHRnfPNf1py5CV\n5G1J3lFVP51kJck/qKpPJ1mrqtXuvlhVNyf55mT/C0lunTr+xKRt18WyO1V1urtPL7uOo8R3vvd8\n53vPd773fOd7byedQ1sOF3b3R7r7B7r7h5Pcl+Sp7v75JF9I8p7Jbu9O8ujk9WNJ7quq66vqjUlu\nS/L0vIUBABxk2+nJupqPJnmkqt6b5IWs31GY7j5bVY9k/U7El5Pc392GBgGAI6WWlX+qqg0X7q2q\nOtndZ5Zdx1HiO997vvO95zvfe77zvbeT3CJkAQBsYSe5xWN1AAAGELIAAAYQsgAABhCyAAAGELIA\nAAYQsgAABhCyAAAGELIAAAYQsgAABhCyAAAGELIAAAYQsmZUraxVVV+5rawtuy4A4GDxgOgZVdXJ\n7HdS2Y+1AgB7wwOiAQD2CSELAGAAIQsAYAAhCwBgACELAGAAIQsAYAAhCwBgACELAGAAIQsAYAAh\nCwBgACELAGAAIQsAYAAhCwBgACELAGAAIQsAYAAhCwBgACELAGAAIQsAYAAhCwBgACELAGAAIQsA\nYAAhCwBgACELAGAAIQsAYAAhCwBgACELAGAAIQsAYAAhCwBgACELAGAAIQsAYAAhCwBgACELAGAA\nIQsAYIAtQ1ZVHa+qL1fVM1X1XFWdmrSfqqpvVNVXJ9vdU8c8UFXnqur5qrpr5B9gP6taWauqvnJb\nWVt2XQDAeNXdW+9U9fru/k5VfVeS30/ywSRvT/K33f3xmX1vT/LZJG9NciLJk0ne1DMfVFXd3bWY\nP8biVFUns99JZSe1LvJcAMDy7CS3bGu4sLu/M3l5PMmxvJYcNvuwe5I83N2vdPf5JOeS3DlPUQAA\nB922QlZVXVdVzyRZS/JEd39l8qMPVNWzVfXJqrph0nZLkhenDr8waQMAODKObWen7n41yVuq6nuS\nfL6q3pzkwSS/0t1dVb+a5NeTvG+eD6+q01Nvz3T3mXmOBwAYoapOJjm5m3NsK2Rd1t1/U1Vnktw9\nMxfrE0m+MHl9IcmtUz87MWnb7Hyn5/l8AIC9MOn4OXP5/eUb/+axnbsLv+/yUGBVrST5ySR/UlU3\nT+32riRfm7x+LMl9VXV9Vb0xyW1Jnp63MACAg2w7PVnfn+Shqrou66Hsc939e1X121V1R5JXk5xP\n8v4k6e6zVfVIkrNJXk5y/+ydhQAAh922lnAY8sGWcAAADohhSzgAADAfIQsAYAAhCwBgACFrhzY+\nl3BxzyT0zEMAOPhMfJ+x3cnqG/fbzj6b77fTGgCAvWHiOwDAPiFkAQAMIGQBAAwgZAEADCBkAQAM\nIGQBAAwgZAEADCBkAQAMIGQBAAwgZAEADCBk7bnj8UxCADj8ji27gKPnpcw883B1WZUAAOPoyQIA\nGEDIAgAYQMgCABhAyAIAGEDIAgAYQMg6oKpW1q5cCsJyEACwn1jC4cC6tHrlUhCJ5SAAYP/QkwUA\nMMCRD1mzw26b7zW7SvvV9gMAWGe4cMOwW22yz+wq7VfbDwBg3ZHvyQIAGEHIAgAYQMgCABhAyAIA\nGMDE94VZvwNx2VUAAPuDnqyFuXwH4vS2HWOXh9i4MrxV4QFgL1T3cjpfqqq7e+nrIKyHmtklHDZb\nrmGrtvHHTX9fG+veuM/m+23cBwC4tp3kFj1ZAAADCFkAAAMIWQAAAwhZAAADWMLhwLBEBAAcJELW\ngTH7kGo3CALAfma4EABgACHryNm4+GnVyt9t0mbRUgDYBcOFR87ssGOS1HWbtK3uUUEAcCjpyQIA\nGEDIAgAYQMgCABhAyAIAGGDLkFVVx6vqy1X1TFU9V1WnJu03VtXjVfX1qvpiVd0wdcwDVXWuqp6v\nqrtG/gEAAPaj6t56EfGqen13f6eqvivJ7yf5YJKfSfIX3f1rVfXLSW7s7g9X1ZuTfCbJW5OcSPJk\nkjf1zAdVVXf30lfUXF9FfXaRzw132m2jbX8cN/ud7ubPtx/+/QDAfrCT3LKt4cLu/s7k5fGsL/vQ\nSe5J8tCk/aEk75y8fkeSh7v7le4+n+RckjvnKQoA4KDbVsiqquuq6pkka0me6O6vJFnt7otJ0t1r\nSW6a7H5LkhenDr8waQMAODK2tRhpd7+a5C1V9T1JPl9VP5qN40tzP7y4qk5PvT3T3WfmPQcAwKJV\n1ckkJ3dzjrlWfO/uv6mqM0nuTnKxqla7+2JV3Zzkm5PdLiS5deqwE5O2zc53eu6KAQAGm3T8nLn8\n/vKNf/PYzt2F33f5zsGqWknyk0meT/JYkvdMdnt3kkcnrx9Lcl9VXV9Vb0xyW5Kn5y0MAOAg205P\n1vcneaiqrst6KPtcd/9eVf1Bkkeq6r1JXkhyb5J099mqeiTJ2SQvJ7l/9s5CAIDDbltLOAz5YEs4\nDDnOEg4AsHjDlnAAAGA+c018Z787Pum5AgCWTcg6VF7K5kOBAMBeM1wIADCAkAUAMICQBQAwgJAF\nADCAkAUAMICQBQAwgJAFADCAkAUAMICQBQAwgJAFADDAkQpZVStrVdXT27JrAgAOpyP27MJLq57t\nBwDshSPVk8X+sLFHcWVt2TUBwKIdsZ4s9ofZHsVaXVopADCIniwAgAGELACAAYQsAIABhCwAgAGE\nLACAAYQsAIABhCwAgAGELACAAYQsAIABhCwAgAGELACAAYQsAIABhCwAgAGELACAAYQstqVqZa2q\n+sptZW3r/TbuAwBHwbFlF8B+dTxV1Ve2zbzN61Y37jO7X60uujIAOAiELK7ipcyEpW3sc7X9AODo\nMVwIADCAkAUAMICQBQAwgJDFPrA+yd5diQAcJia+sw9sOoHeXYkAHGh6sgAABhCyAAAGELIAAAY4\n1CFr9hEvy64HADg6DvnE90urW69aDgCweIe6JwsAYFmELACAAYQsAIABtgxZVXWiqp6qqj+uqueq\n6hcn7aeq6htV9dXJdvfUMQ9U1bmqer6q7hr5BwAA2I+2M/H9lSS/1N3PVtUbkvxhVT0x+dnHu/vj\n0ztX1e1J7k1ye5ITSZ6sqjd1t7v7AIAjY8uerO5e6+5nJ6+/neT5JLdMfrzZ7Xr3JHm4u1/p7vNJ\nziW5czHlAgAcDHPNyaqqH0pyR5IvT5o+UFXPVtUnq+qGSdstSV6cOuxCXgtlAABHwrbXyZoMFf5u\nkg9197er6sEkv9LdXVW/muTXk7xvng+vqtNTb89095l5jgcAGKGqTiY5uZtzbCtkVdWxrAesT3f3\no0nS3d+a2uUTSb4weX0hya1TPzsxadugu0/PWS8AwHCTjp8zl99X1al5z7Hd4cLfTHK2u39j6sNu\nnvr5u5J8bfL6sST3VdX1VfXGJLcleXrewjjqjmf6kUjr28rasqsCgO3asierqt6W5OeSPFdVz2T9\nOTUfSfKzVXVHkleTnE/y/iTp7rNV9UiSs0leTnK/OwuZ30u58pFISVKry6gEAHailpV/qqq7e+jD\nBNcfCj377MINf3Fn/n0cN89xs/+ed/bvZfNzAcBe2EluseI7AMAAQhYAwABCFgDAAEIWAMAAQhYA\nwABCFgDAAEIWAMAAQhYAwABCFgDAAEIWAMAAQhYAwABCFgDAAEIWAMAAQhYAwABCFgDAAEIWAMAA\nQhaDHU9V9fS2qDNXrazNnrtqZW1R5weA3Ti27AI47F5KMpurakHnvrS6yblXF3RyANgVPVkAAAMI\nWQAAAwhZAAADCFkAAAMIWQAAAwhZAAADCFkAAANYJ4sDZH1h02VXAQDbIWRxgMwubLqoRU0BYPEM\nFwIADCBkAQAMIGQBAAwgZAEADCBkAQAMIGQBAAwgZAEADCBkAQAMIGQBAAwgZAEADCBkAQAMIGQB\nAAwgZAEADCBkAQAMIGQBAAwgZAEADCBkAQAMIGQBAAwgZAEADLBlyKqqE1X1VFX9cVU9V1UfnLTf\nWFWPV9XXq+qLVXXD1DEPVNW5qnq+qu4a+QeArVStrFVVv7atrC27JgAOv+rua+9QdXOSm7v72ap6\nQ5I/THJPkl9I8hfd/WtV9ctJbuzuD1fVm5N8Jslbk5xI8mSSN/XMB1VVd3ct/o905Wck0x9bufL9\nZm3b2cdxiz1uked+XZKXstGVx42+9gA4XHaSW7bsyerute5+dvL620mez3p4uifJQ5PdHkryzsnr\ndyR5uLtf6e7zSc4luXOeomDnXsp6oJreAGDvzTUnq6p+KMkdSf4gyWp3X0zWg1iSmya73ZLkxanD\nLkzaAACOjG2HrMlQ4e8m+dCkR2u2i0CXAQDAxLHt7FRVx7IesD7d3Y9Omi9W1Wp3X5zM2/rmpP1C\nklunDj8xadvsvKen3p7p7jNz1A4AMERVnUxyclfn2Gri++SDfjvJ/+nuX5pq+1iS/9vdH7vKxPd/\nlvVhwidi4rvj9llNJr4DMI+d5JYte7Kq6m1Jfi7Jc1X1TNb/tvpIko8leaSq3pvkhST3Jkl3n62q\nR5KcTfJykvtnAxYAwGG3rZ6sIR+sJ8txS6xJTxYA8xiyhAMAAPMTsgAABhCyAAAGELIAAAYQsgAA\nBhCyAAAGELIAAAYQsgAABhCyOIKOp6r6ym1lbXavqpW1rfYBgKvZ1gOi4XB5KZusCr+6cb9LqzMr\nxW+yDwBsTk8WAMAAQhYAwABCFgDAAEIWAMAAQhYAwABCFgDAAEIWAMAAQhYAwABCFgDAAEIWAMAA\nQhYAwACeXQhJLj80etlVAHB4CFmQ5CoPjV5GIQAcEoYLAQAGELIAAAYQsgAABhCyAAAGELIAAAYQ\nsgAABhCyYMGqVtaqql/bVtaWXRMAe886WbBwl1avXHOrVpdWCgBLoycLAGAAIQt2YePQoEfzALDO\ncCHsyuzQYOJxPAAkerIAAIYQsgAABhCyAAAGELIAAAYQsmCf2uzORQubAhwc7i6EfWvTOxctbApw\nQOjJAgAYQMgCABhAyAIAGEDIAgAYwMR32Lbj8WxCALZLyIJteymeUwjAdhkuhOHWe8CsdwVwtGwZ\nsqrqU1V1sar+aKrtVFV9o6q+OtnunvrZA1V1rqqer6q7RhUOB8flHrDp7ZL1rgAOue30ZP1Wkp/a\npP3j3f3jk+2/JklV3Z7k3iS3J3l7kgeryngKAHDkbBmyuvtLSf5ykx9tFp7uSfJwd7/S3eeTnEty\n564qBAA4gHYzJ+sDVfVsVX2yqm6YtN2S5MWpfS5M2gAAjpSd3l34YJJf6e6uql9N8utJ3jfvSarq\n9NTbM919Zof1ZH0isXkuAMDuVdXJJCd3c44dhazu/tbU208k+cLk9YUkt0797MSk7WrnOb2Tz9/c\npg/TXdzpAYAjY9Lxc+by+6o6Ne85tjtcWJlKLFV189TP3pXka5PXjyW5r6qur6o3JrktydPzFgUA\ncNBt2ZNVVZ/NenfZ91bVnyU5leQnquqOJK8mOZ/k/UnS3Wer6pEkZ5O8nOT+7rZCNgBw5NSyMlBV\ndXcvbDxv/XEnmw0X9jXe73Qfxy32uP1Y0/jjtrr+r3ZNL/K/GwC2Zye5xYrvAAADCFkAAAMIWQAA\nAwhZAAADCFkAAAMIWQAAAwhZAAADCFkAAAMIWbBPVK2sVVVf3pZdDwC7s6MHRAMjzD7k3MLuAAeZ\nniwAgAGELACAAQwXwlIcj3lXAIebkAVL8VKunH+VmIMFcLgYLgQAGEDIAgAYQMgCABhAyAIAGEDI\nAgAYQMgCABhAyAIAGEDIAgAYQMgCABhAyAIAGEDIggNl/ZmHV24ra8uuCoCNPLsQDpRNn3m4uoxK\nALg2PVkAAAMIWQAAAwhZcMhUrayZtwWwfOZkwaFzadW8LYDl05MFADCAkAUAMICQBQAwgJAFADCA\nkAUAMICQBQAwgCUc4MBbf57hsqsA4EpCFhx4s88zrGUVAsAUw4UAAAMIWQAAAwhZAAADCFkAAAMI\nWQAAAwhZAAADCFkAAAMIWQAAAwhZAAADbBmyqupTVXWxqv5oqu3Gqnq8qr5eVV+sqhumfvZAVZ2r\nquer6q5RhQMA7Gfb6cn6rSQ/NdP24SRPdvePJHkqyQNJUlVvTnJvktuTvD3Jg1XlGR8AwJGzZcjq\n7i8l+cuZ5nuSPDR5/VCSd05evyPJw939SnefT3IuyZ2LKRUA4ODY6Zysm7r7YpJ091qSmybttyR5\ncWq/C5M2AIAj5diCztM7OaiqTk+9PdPdZxZSDQDALlTVySQnd3OOnYasi1W12t0Xq+rmJN+ctF9I\ncuvUficmbZvq7tM7/HwAgGEmHT9nLr+vqlPznmO7w4U12S57LMl7Jq/fneTRqfb7qur6qnpjktuS\nPD1vUQAAB92WPVlV9dmsd5d9b1X9WZJTST6a5Heq6r1JXsj6HYXp7rNV9UiSs0leTnJ/d+9oKBEA\n4CCrZWWgquruXtjyDlXVG6eGVa5sm32/030ct9jj9mNNh++4Rf73BnDU7CS3WPEdAGAAIQuOhOOp\nqn5tW1lbdkUAh52QBUfCS1kfQry8XVqd3aNqZe3KICaMAezGotbJAg68S6ubzOXaEMYA2B49WQAA\nA+jJgiPp+OSOXABGEbLgSLo8R2uaFR4AFslwIQDAAEIWAMAAQhawbZZ5ANg+c7KAOVjmAWC7hCzg\nGtyFCLBTQhZwDbN3IboDEWC7zMkCABhAyAIAGEDIAgAYQMgCABhAyAIAGEDIAgAYQMgCABhAyAIA\nGEDIAgAYQMgCABhAyAIAGEDIAgAYQMgCABhAyAIAGEDIAgAYQMgCABhAyAJ26Xiqqq/cVtaWXRXA\nsh1bdgHAQfdSkp5pq9VlVAKwn+jJAgaY7d3SswUcPXqygAFme7f0bAFHj54sAIABhCwAgAGELACA\nAYQsAIABhCwAgAGELACAAYQsAIABhCwAgAGELACAAYQsYA94iDRw9AhZwB64/Jid6e3ShkftVK2s\nCWLAYeHZhcA+cmnVMw+Bw0JPFnCgbOzt0uMF7E96soADZra3K9HjBexHuwpZVXU+yV8neTXJy919\nZ1XdmORzSX4wyfkk93b3X++yTgCAA2W3w4WvJjnZ3W/p7jsnbR9O8mR3/0iSp5I8sMvPAAA4cHYb\nsmqTc9yT5KHJ64eSvHOXnwEAcODsNmR1kieq6itV9b5J22p3X0yS7l5LctMuPwM4lDaunbXsigAW\nabcT39/W3X9eVf8oyeNV9fVsnJF61V+cVXV66u2Z7j6zy3qAA+Py2lnTahmFAGxQVSeTnNzVOboX\n8z+PVXUqybeTvC/r87QuVtXNSf5bd9++yf7d3Qv7jbr+f8Gb/cLua7zf6T6OW+xx+7Gmw37cfqxp\n8+Nmf09c7b/1Rf4+AZi1k9yy4+HCqnp9Vb1h8vq7k9yV5LkkjyV5z2S3dyd5dKefAQBwUO1muHA1\nyecn8yiOJflMdz9eVf8jySNV9d4kLyS5dwF1AgAcKAsbLpz7gw0XOm5f13TYj9uPNW1+nOFCYD/Y\n0+FCAACuTsgCABjAswuBfex4rJ8FHFRCFrCPWUsLOLgMFwKHwOzq8Stry64IQE8WcAjM9njV6rIq\nAbhMTxYAwABCFgDAAEIWAMAAQhYAwABCFgDAAEIWAMAAQhYAwABCFgDAAEIWAMAAQhYAwABCFgDA\nAEIWAMAAQhZwZFWtrFVVv7atrC27JuDwOLbsAgCW59Jq0lPva3VppQCHjp4sAIABDmTI2tjFX731\nUQAAe+eADhfOdvEnSS2lEgCAzRzIniyAazue2d7u7U1q3+lxABsd0J4sgGt5KZv0dm9jUvtOjwPY\nSE8WAMAAQhbANRlCBHbGcCFwRKyHpfmPM4QI7IyQBRwRm4alZRQCHBGGCwEABhCyAAAGELIAAAYQ\nsgAABhCyAOY2u6zDxiUdNj5j1bIPcNS4uxBgbrN3Km62pMPsM1Yt+wBHjZAFsGs7XYMLOMyELIBd\nswYXsJE5WQAAAwhZAAADCFkAAAMIWQCHgCUjYP8RsgD2xOzaWtsLQhvD09WOu7xkxOXtkiUjYMmE\nLIA9cfkOxCu21a0D1Gx4EqDgoLCEA8DSbLr0gwAFh4SQBbCvWNgUDgshC2Bf2fDInmUVAuySkAVw\n4OjtgoNg2MT3qrq7qv6kqv60qn551OcwjzPLLuAIOrPsAo6gM8suYA9sNol+1qZ3M/7dTu5w3EpV\nndztOZiP7/xgGBKyquq6JP85yU8l+dEk/7qq/vGIz2IeZ5ZdwBF0ZtkFHEFnll3APrFZELt03aA7\nFU8u4BzM5+SyC2Bro3qy7kxyrrtf6O6Xkzyc5J5BnwXAHptevyvJKYufwkaj5mTdkuTFqfffyHrw\nukJV/cckPzbV9Ffd/fMb91tZsy4MwAiz87te9+p6j9e0zdqS14YpTyf56OrGeWKvu9j9/25eYLFw\noCx74vsDsw1V9W+2d+hmd9xsp21R+zhuscftx5oO+3H7sabDftx+rGnWZmFqs7ZtnWuT4MWiVNWp\nZdfAtY0KWReS/MDU+xOTtr/X3e5LBgAOrVFzsr6S5Laq+sGquj7JfUkeG/RZAAD7zpCerO7+u6r6\nQJLHsx7kPtXdz4/4LACA/ai6DZcDACzasMVIr8VCpXuvqs5X1f+sqmeq6ull13MYVdWnqupiVf3R\nVNuNVfV4VX29qr5YVTcss8bD5irf+amq+kZVfXWy3b3MGg+bqjpRVU9V1R9X1XNV9cFJu2t9kE2+\n81+ctLvWB6mq41X15cnfmc9dvslg3ut8z3uyJguV/mmSf5Hkf2d9/tZ93f0ne1rIEVNV/yvJP+3u\nv1x2LYdVVf3zJN9O8tvd/U8mbR9L8hfd/WuT/6G4sbs/vMw6D5OrfOenkvxtd398qcUdUlV1c5Kb\nu/vZqnpDkj/M+jqIvxDX+hDX+M7/VVzrw1TV67v7O1X1XUl+P8kHk/xM5rjOl9GTZaHS5agsqefy\nqOjuLyWZDbH3JHlo8vqhJO/c06IOuat854mnKg/T3Wvd/ezk9beTPJ/1O8hd64Nc5Tu/ZfJj1/og\n3f2dycvjWZ/D3pnzOl/GX7qbLVR6y1X2ZXE6yRNV9ZWq+rfLLuYIuam7LybrvyiT3LTkeo6KD1TV\ns1X1ScNW41TVDyW5I8kfJFl1rY839Z1/edLkWh+kqq6rqmeSrCV5oru/kjmvcz0bR8fbuvvHk/x0\nkn83GWZh77nTZLwHk/xwd9+R9V+OhlIGmAxb/W6SD016V2avbdf6gm3ynbvWB+ruV7v7LVnvqb2z\nqn40c17nywhZWy5UyuJ1959P/vmtJJ/PJo85YoiLVbWa/P28im8uuZ5Dr7u/1a9NNv1Ekrcus57D\nqKqOZf0v+09396OTZtf6QJt95671vdHdf5P1J8/fnTmv82WELAuV7rGqev3k/4BSVd+d5K4kX1tu\nVYdW5co5Eo8lec/k9buTPDp7ALt2xXc++cV32bviWh/hN5Oc7e7fmGpzrY+14Tt3rY9TVd93efi1\nqlaS/GTW58LNdZ0vZZ2syW2mv5HXFir96J4XcYRU1Ruz3nvVWZ+89xnf+eJV1WeTnEzyvUkuJjmV\n5L8k+Z0ktyZ5Icm93f1Xy6rxsLnKd/4TWZ+z8mqS80nef3kOBbtXVW9L8t+TPJf13ymd5CNJnk7y\nSFzrC3eN7/xn41ofoqp+LOsT26+bbJ/r7v9QVf8wc1znFiMFABjAxHcAgAGELACAAYQsAIABhCwA\ngAGELACAAYQsAIABhCwAgAH+P/J5d/oqEvkjAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "num_data, num_data_bins, num_data_patches=plt.hist(E_Doke,bins=np.arange(0.05, 25 + binwidth, binwidth));" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAl0AAAHfCAYAAABqEm1lAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGvdJREFUeJzt3W+sZdd5F+DfOzWu3TaY0lBb2LHTxiGhFq0JwhgK0kCA\nOEZiKkBgt1JoPqD5UNcWlZCrSMj+ggRIFCUKKJi6VV21cqkFxEhWcVE0QrTCdZOYuskYO4pqbKce\nGqhbksaVY798OOfWd47vnXvun7POv+eRjnL3Pmufu+Zka+bntdd6V3V3AABYrFPL7gAAwDYQugAA\nBhC6AAAGELoAAAYQugAABhC6AAAGmCt0VdVtVfVMVT1bVffu8f57quqXq+rVqvqRXeevq6pPVdXn\nqurpqrr7JDsPALAu6qA6XVV1KsmzSd6f5EtJnkxyR3c/s6vN25PckOT7kvx2d//Y9Pw1Sa7p7qeq\n6luSfDrJmd3XAgBsg3lGum5J8lx3P9/dryV5OMmZ3Q26+8vd/ekkX585/3J3PzX9+StJzie59kR6\nDgCwRuYJXdcmeWHX8Ys5QnCqqncmuTnJE4e9FgBg3V024pdMHy0+kuSe6YjXXm3sRwQArI3ursO0\nnyd0vZTk+l3H103PzaWqLsskcP10d3/yUm0P23mOp6ru7+77l92PbeI7H893Pp7vfDzf+XhHGSya\n5/Hik0lurKobquryJHckefRS/Zg5/okkn+/ujx62cwAAm+LAka7ufr2q7kryeCYh7cHuPl9VZydv\n9wNVdXWSX03ytiRvVNU9Sb4ryfck+YEkT1fVZ5N0ko909y8s6M8DALCS5prTNQ1J75k59292/Xwh\nyTv2uPSXknzDcTrIQp1bdge20Llld2ALnVt2B7bQuWV3YAudW3YHONiBdbpGqao2pwsAWAdHyS22\nAQIAGEDoAgAYQOgCABhA6AIAGEDoAgAYQOgCABhA6AIAGEDoAgAYQOgCABhA6AIAGEDoAgAYQOgC\nABhA6AIAGEDoAgAYQOgCABhA6AIAGEDoAgAYQOgCABhA6AIAGEDoAgAYQOgCABhA6AIAGEDoAgAY\nQOgCABhA6AIAGEDoAgAYQOgCABhA6AIAGEDoAgAYQOgCABhA6AIAGEDoAgAYQOgCABhA6AIAGEDo\nAgAYQOgCABhA6AIAGEDoAgAYQOgCABhA6AIAGEDoAgAYQOgCABhA6AIAGEDoAgAYQOgCABhA6AIA\n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\nJLOh9kySn5r+/FNJvm9opzbcPt95cuQSNhyku1/u7qemP38lyflMVqm71xdkn+/82unb7vUF6e7f\nm/74jZnMh+8c4T5f9j+8+xVVZbE6yS9W1ZNV9Q+W3Zkt8u3TVb3p7peTfPuS+7Mt7pruCfvjHnMt\nTlW9M8nNSf57kqvd64u36zt/YnrKvb4gVXWqqj6b5OUkv9jdT+YI9/myQxfL8b3d/b4ktyf5oelj\nGcazimXx/nWS7+zumzP5y9KjlwWYPuZ6JMk909GX2XvbvX7C9vjO3esL1N1vdPefzmQk95aquilH\nuM+XHbrmKbzKCevu35z+728l+Q+55NZMnKAL0z1Jd+Zl/O8l92fjdfdv9ZsTV/9tkj+7zP5soqq6\nLJN//H+6uz85Pe1eX6C9vnP3+hjd/btJziW5LUe4z5cduhRPHayqvmn6X0ipqm9O8teT/Ppye7Wx\nKhfPsXg0yQ9Of/77ST45ewHHdtF3Pv2LcMffint9EX4iyee7+6O7zrnXF+st37l7fXGq6u07j2ur\n6sokfy2TuXSHvs+XXqdruqz1o3mzeOo/XWqHNlxVfUcmo1udyWTAn/Gdn7yq+tkkp5N8W5ILSe5L\n8h+T/HwmW2Y9n+Tvdvcry+rjptnnO//Lmcx5eSPJbyQ5uzMHg+Orqu9N8l+TPJ3J3ymd5CNJfiXJ\nv4t7/cRd4jv//rjXF6Kq/lQmE+VPTV8/193/pKr+aA55ny89dAEAbINlP14EANgKQhcAwABCFwDA\nAEIXAMAAQhcAwABCFwDAAEIXAMAA/x+qYUdSj82JJAAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "num_sim, num_sim_bins, num_sim_patches= plt.hist(E_com_Tsim_NEST_MAX, bins=np.arange(0.05, 25 + binwidth, binwidth),normed=1);" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:4: RuntimeWarning: divide by zero encountered in true_divide\n", + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:4: RuntimeWarning: invalid value encountered in true_divide\n" + ] + } + ], + "source": [ + "\n", + "\n", + "SimToData_scale_factor=sum(num_data[bin_center_data>3])/sum(num_sim[bin_center_NEST_MAX>3])\n", + "frac_res=(num_data-num_sim*SimToData_scale_factor)/sqrt(num_data)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nSUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from matplotlib import gridspec\n", + "\n", + "fig = plt.Figure(figsize=(8,6))\n", + "gs = gridspec.GridSpec(2, 1, height_ratios=[10,5])\n", + "ax1 = plt.subplot(gs[0])\n", + "ax2 = plt.subplot(gs[1])\n", + "\n", + "ax1.hist(E_Doke,bins=np.arange(0.05, 25 + binwidth, binwidth),facecolor='none',edgecolor='black',linewidth=2, histtype='step', alpha=0.9);\n", + "ax1.plot(bin_center_NEST_MAX,num_sim*SimToData_scale_factor,linewidth=2,color='blue')\n", + "ax1.set_xlim([0,22])\n", + "ax1.grid(True)\n", + "ax1.set_ylabel(r'Count',fontsize=20)\n", + "for tick in ax1.xaxis.get_major_ticks():\n", + " tick.label.set_fontsize(18) \n", + "for tick in ax1.yaxis.get_major_ticks():\n", + " tick.label.set_fontsize(18) \n", + "\n", + "\n", + "ax2.plot(bin_center_NEST_MAX,frac_res,'ko',linewidth=2)\n", + "ax2.plot([0,22],[0,0],'k')\n", + "ax2.grid(True)\n", + "ax2.set_xticks(np.arange(0,22,2))\n", + "ax2.set_xlim([0,22])\n", + "ax2.set_ylim([-4,4])\n", + "ax2.set_ylabel(r'Frac Res ($\\sigma$)',fontsize=20)\n", + "ax2.set_xlabel('Combined Energy (keV)',fontsize=20)\n", + "for tick in ax2.xaxis.get_major_ticks():\n", + " tick.label.set_fontsize(18) \n", + "for tick in ax2.yaxis.get_major_ticks():\n", + " tick.label.set_fontsize(18) " + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:1: RuntimeWarning: invalid value encountered in true_divide\n", + " if __name__ == '__main__':\n", + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:2: RuntimeWarning: invalid value encountered in true_divide\n", + " from IPython.kernel.zmq import kernelapp as app\n" + ] + } + ], + "source": [ + "thresh=num_data/(num_sim*SimToData_scale_factor)\n", + "thresh_err=sqrt( (sqrt(num_data)/(num_sim*SimToData_scale_factor))**2 + (num_data/(num_sim*(SimToData_scale_factor**2)))**2)\n", + "no_nan_cut=np.logical_not(numpy.isnan(thresh))*np.logical_not(numpy.isinf(thresh))\n", + "thresh_nonan=thresh[no_nan_cut]\n", + "xbin_nonan=bin_center_NEST_MAX[no_nan_cut]" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def func(x,mu,sig):\n", + " return (1/2)*scipy.special.erf((x-mu)/(sqrt(2)*sig))+(1/2)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 1.24541549, 0.30101627])" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "popt, pcov = scipy.optimize.curve_fit(func,xbin_nonan,thresh_nonan)\n", + "thresh_yval=(1/2)*scipy.special.erf((bin_center_NEST_MAX-popt[0])/(sqrt(2)*popt[1]))+(1/2)\n", + "\n", + "popt" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from scipy import optimize\n", + "\n", + "def line( x, p):\n", + " return p[0]*x + p[1] \n", + "\n", + "def linef( x, p0, p1):\n", + " return p0*x + p1\n", + "\n", + "def erfit( x, p0, p1):\n", + " return (1/2)*scipy.special.erf((x-p0)/(sqrt(2)*p1))+(1/2)\n", + " \n", + "\n", + "\n", + "def fit_function(p0, datax, datay, function, **kwargs):\n", + "\n", + " errfunc = lambda p, x, y: function(x,p) - y\n", + "\n", + " ##################################################\n", + " ## 1. COMPUTE THE FIT AND FIT ERRORS USING leastsq\n", + " ##################################################\n", + "\n", + " # If using optimize.leastsq, the covariance returned is the \n", + " # reduced covariance or fractional covariance, as explained\n", + " # here :\n", + " # http://stackoverflow.com/questions/14854339/in-scipy-how-and-why-does-curve-fit-calculate-the-covariance-of-the-parameter-es\n", + " # One can multiply it by the reduced chi squared, s_sq, as \n", + " # it is done in the more recenly implemented scipy.curve_fit\n", + " # The errors in the parameters are then the square root of the \n", + " # diagonal elements. \n", + "\n", + " pfit, pcov, infodict, errmsg, success = \\\n", + " optimize.leastsq( errfunc, p0, args=(datax, datay), \\\n", + " full_output=1)\n", + "\n", + " if (len(datay) > len(p0)) and pcov is not None:\n", + " s_sq = (errfunc(pfit, datax, datay)**2).sum()/(len(datay)-len(p0))\n", + " pcov = pcov * s_sq\n", + " else:\n", + " pcov = inf\n", + "\n", + " error = [] \n", + " for i in range(len(pfit)):\n", + " try:\n", + " error.append( numpy.absolute(pcov[i][i])**0.5)\n", + " except:\n", + " error.append( 0.00 )\n", + " pfit_leastsq = pfit\n", + " perr_leastsq = numpy.array(error) \n", + "\n", + " ###################################################\n", + " ## 2. COMPUTE THE FIT AND FIT ERRORS USING curvefit\n", + " ###################################################\n", + "\n", + " # When you have an error associated with each dataY point you can use \n", + " # scipy.curve_fit to give relative weights in the least-squares problem. \n", + " datayerrors = kwargs.get('datayerrors', None)\n", + " curve_fit_function = kwargs.get('curve_fit_function', function)\n", + " if datayerrors is None:\n", + " pfit, pcov = \\\n", + " optimize.curve_fit(curve_fit_function,datax,datay,p0=p0)\n", + " else:\n", + " pfit, pcov = \\\n", + " optimize.curve_fit(curve_fit_function,datax,datay,p0=p0,\\\n", + " sigma=datayerrors)\n", + " error = [] \n", + " for i in range(len(pfit)):\n", + " try:\n", + " error.append( numpy.absolute(pcov[i][i])**0.5)\n", + " except:\n", + " error.append( 0.00 )\n", + " pfit_curvefit = pfit\n", + " perr_curvefit = numpy.array(error) \n", + "\n", + "\n", + " ####################################################\n", + " ## 3. COMPUTE THE FIT AND FIT ERRORS USING bootstrap\n", + " #################################################### \n", + "\n", + " # An issue arises with scipy.curve_fit when errors in the y data points\n", + " # are given. Only the relative errors are used as weights, so the fit\n", + " # parameter errors, determined from the covariance do not depended on the\n", + " # magnitude of the errors in the individual data points. This is clearly wrong. \n", + " # \n", + " # To circumvent this problem I have implemented a simple bootstraping \n", + " # routine that uses some Monte-Carlo to determine the errors in the fit\n", + " # parameters. This routines generates random datay points starting from\n", + " # the given datay plus a random variation. \n", + " #\n", + " # The random variation is determined from average standard deviation of y\n", + " # points in the case where no errors in the y data points are avaiable.\n", + " #\n", + " # If errors in the y data points are available, then the random variation \n", + " # in each point is determined from its given error. \n", + " # \n", + " # A large number of random data sets are produced, each one of the is fitted\n", + " # an in the end the variance of the large number of fit results is used as \n", + " # the error for the fit parameters. \n", + "\n", + " # Estimate the confidence interval of the fitted parameter using\n", + " # the bootstrap Monte-Carlo method\n", + " # http://phe.rockefeller.edu/LogletLab/whitepaper/node17.html\n", + " residuals = errfunc( pfit, datax, datay)\n", + " s_res = numpy.std(residuals)\n", + " ps = []\n", + " # 100 random data sets are generated and fitted\n", + " for i in range(100):\n", + " if datayerrors is None:\n", + " randomDelta = numpy.random.normal(0., s_res, len(datay))\n", + " randomdataY = datay + randomDelta\n", + " else:\n", + " randomDelta = numpy.array( [ \\\n", + " numpy.random.normal(0., derr,1)[0] \\\n", + " for derr in datayerrors ] ) \n", + " randomdataY = datay + randomDelta\n", + " randomfit, randomcov = \\\n", + " optimize.leastsq( errfunc, p0, args=(datax, randomdataY),\\\n", + " full_output=0)\n", + " ps.append( randomfit ) \n", + "\n", + " ps = numpy.array(ps)\n", + " mean_pfit = numpy.mean(ps,0)\n", + " Nsigma = 1. # 1sigma gets approximately the same as methods above\n", + " # 1sigma corresponds to 68.3% confidence interval\n", + " # 2sigma corresponds to 95.44% confidence interval\n", + " err_pfit = Nsigma * numpy.std(ps,0) \n", + "\n", + " pfit_bootstrap = mean_pfit\n", + " perr_bootstrap = err_pfit\n", + "\n", + "\n", + " # Print results \n", + " print \"\\nlestsq method :\"\n", + " print \"pfit = \", pfit_leastsq\n", + " print \"perr = \", perr_leastsq\n", + " print \"\\ncurvefit method :\"\n", + " print \"pfit = \", pfit_curvefit\n", + " print \"perr = \", perr_curvefit\n", + " print \"\\nbootstrap method :\"\n", + " print \"pfit = \", pfit_bootstrap\n", + " print \"perr = \", perr_bootstrap" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 5.35971266e-02, 4.79372179e-07],\n", + " [ 4.79372179e-07, 1.07193510e-01]])" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pcov" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 0.23151053, 0.3274042 ])" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "popt_err=np.sqrt(np.diag(pcov))\n", + "popt_err" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:1: RuntimeWarning: invalid value encountered in true_divide\n", + " if __name__ == '__main__':\n", + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:2: RuntimeWarning: invalid value encountered in true_divide\n", + " from IPython.kernel.zmq import kernelapp as app\n", + "//anaconda/lib/python2.7/site-packages/matplotlib/axes/_axes.py:2790: MatplotlibDeprecationWarning: Use of None object as fmt keyword argument to suppress plotting of data values is deprecated since 1.4; use the string \"none\" instead.\n", + " warnings.warn(msg, mplDeprecation, stacklevel=1)\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "thresh=num_data/(num_sim*SimToData_scale_factor)\n", + "thresh_err=sqrt( (sqrt(num_data)/(num_sim*SimToData_scale_factor))**2 + (num_data/(num_sim*(SimToData_scale_factor**2)))**2)\n", + "plt.errorbar(bin_center_NEST_MAX,thresh,yerr=thresh_err,xerr=None,ecolor='black',elinewidth=2,capsize=0,fmt=None)\n", + "plt.xlim([0,20])\n", + "plt.ylim([0,1.4])\n", + "plt.scatter(bin_center_NEST_MAX,thresh,c='black',marker='o')\n", + "plt.plot(bin_center_NEST_MAX,thresh_yval,linewidth=2)\n", + "plt.xticks(np.arange(0,22,2))\n", + "plt.yticks(np.arange(0,1.4,0.1))\n", + "plt.ylabel('Data/Theory',fontsize=22)\n", + "plt.xlabel('Combined Energy (keV)',fontsize=22)\n", + "plt.legend((r'Fit=$\\frac{erf}{2}(\\frac{(x-\\mu)}{\\sqrt{2}\\sigma}) + \\frac{1}{2}$','Data'),loc='lower right')\n", + "\n", + "\n", + "ax=plt.gca()\n", + "ax.grid(True)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Minimize Chi^2 from 4 to 20 keVee to extract optimal g1 g2

" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "g2= \n", + "17.0 17.05 17.1 17.15 17.2 17.25 17.3 17.35 17.4 17.45 17.5 17.55 17.6 17.65 17.7 17.75 17.8 17.85 17.9 17.95 18.0 18.05 18.1 18.15 18.2 18.25 18.3 18.35 18.4 18.45 18.5 18.55 18.6 18.65 18.7 18.75 18.8 18.85 18.9 18.95 19.0 19.05 19.1 19.15 19.2 19.25 19.3 19.35 19.4 19.45 19.5 19.55 19.6 19.65 19.7 19.75 19.8 19.85 19.9 19.95 20.0 20.05 20.1 20.15 20.2 20.25 20.3 20.35 20.4 20.45 20.5 20.55 20.6 20.65 20.7 20.75 20.8 20.85 20.9 20.95 21.0 21.05 21.1 21.15 21.2 21.25 21.3 21.35 21.4 21.45 21.5 21.55 21.6 21.65 21.7 21.75 21.8 21.85 21.9 21.95 22.0 22.05 22.1 22.15 22.2 22.25 22.3 22.35 22.4 22.45 22.5 22.55 22.6 22.65 22.7 22.75 22.8 22.85 22.9 22.95\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:33: RuntimeWarning: divide by zero encountered in true_divide\n" + ] + } + ], + "source": [ + "Fit_min_keV=array([3,4,4]) # normalize the histograms above 4 keV\n", + "Fit_max_keV=array([16,18,20]) # fit histograms to max keV. Nominal is 20 keV\n", + "Chi_hist_min=1e6*ones(Fit_max_keV.size)\n", + "Chi_red_min=1e6*ones(Fit_max_keV.size)\n", + "g1_best=ones(Fit_max_keV.size)\n", + "g2_best=ones(Fit_max_keV.size)\n", + "\n", + "g1_range=np.arange(0.08,0.11,0.001) #scan g1 ... use 0.0002?\n", + "g2_range=np.arange(17.0,23.0,0.05) #scan g2\n", + "SE_size=SE_WS #measured in Dec trititum data\n", + "sigma_SE_size=sigma_SE #measured in Dec trititum data\n", + "\n", + "Chi_red=10*ones((g1_range.size,g2_range.size,Fit_max_keV.size))\n", + "Chi_hist=1000*ones((g1_range.size,g2_range.size,Fit_max_keV.size))\n", + "\n", + "E_step=0.25;\n", + "jj=0;\n", + "print 'g2= '\n", + "for g2_scan in g2_range:\n", + " ii=0;\n", + " print g2_scan,\n", + " for g1_scan in g1_range:\n", + " \n", + " E_com_test=1/73*(S1/g1_scan + S2/g2_scan)\n", + "\n", + " n, bins = histogram(E_com_test, bins=np.arange(0.05, 25 + E_step, E_step), normed=0)\n", + " bincenters = 0.5*(bins[1:]+bins[:-1])\n", + " nTs, binsTs = histogram(E_com_Tsim_NEST_MAX, bins=np.arange(0.05, 25 + E_step, E_step), normed=0)\n", + " bincentersTs = 0.5*(bins[1:]+bins[:-1])\n", + "\n", + " for kk, minE in enumerate(Fit_min_keV):\n", + " norm_real_s=sum(n[aLib.inrange(bincenters,[Fit_min_keV[kk], Fit_max_keV[kk]])]*E_step)/sum(nTs[aLib.inrange(bincentersTs,[Fit_min_keV[kk], Fit_max_keV[kk]])]*E_step) \n", + " diff_hist= (n[aLib.inrange(bincenters,[Fit_min_keV[kk], Fit_max_keV[kk]])]-nTs[aLib.inrange(bincentersTs,[Fit_min_keV[kk], Fit_max_keV[kk]])]*norm_real_s)**2/n[aLib.inrange(bincenters,[Fit_min_keV[kk], Fit_max_keV[kk]])] # (diff/sigma)^2 ... where sigma ~ sqrt(no)\n", + " Chi_red[ii,jj,kk]=sum(diff_hist)/(n[aLib.inrange(bincenters,[Fit_min_keV[kk],Fit_max_keV[kk]])].size) # devide by v to get red_X^2. The two hisotograms are nomalized above norm_keV\n", + " Chi_hist[ii,jj,kk]=sum(diff_hist) \n", + " \n", + " if Chi_hist[ii,jj,kk]< Chi_hist_min[kk] :\n", + " g1_best[kk]=g1_scan\n", + " g2_best[kk]=g2_scan\n", + " Chi_hist_min[kk]=Chi_hist[ii,jj,kk]\n", + " Chi_red_min[kk]=Chi_red[ii,jj,kk]\n", + " \n", + " ii=ii+1\n", + " \n", + " jj=jj+1\n" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 0.57830055, 0.56481009, 0.60058731])" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Chi_red_min" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[array([ 0.097, 0.1 , 0.095]),\n", + " array([ 22.2 , 21.15, 22.75]),\n", + " array([ 0.84474886, 0.80479452, 0.86567732])]" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[g1_best,g2_best,g2_best/SE_WS]" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "Chi_red[isinf(Chi_red)]=max(Chi_red[~isinf(Chi_red)]) # clean up inf\n", + "Chi_hist[isinf(Chi_hist)]=max(Chi_hist[~isinf(Chi_hist)]) # clean up inf\n", + "Chi_hist[isnan(Chi_hist)]=max(Chi_hist[~isnan(Chi_hist)]) ####\n", + "Chi_hist_diff=Chi_hist-Chi_hist.min()*ones(Chi_hist.shape) # Chi_diff to get 1,2,3 sigma intervals" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "savetxt('/global/homes/r/rknoche/iPyNb/Analysis_Code/Run04_CH3T_G1G2_Kr2p22/Feb2015_CH3T_Kr2p22_g1g2.txt',[g1_best,g2_best])\n", + "savetxt('/global/homes/r/rknoche/iPyNb/Analysis_Code/Run04_CH3T_G1G2_Kr2p22/Feb2015_CH3T_Kr2p22_Chi.txt',Chi_hist.flatten())" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "Chi_hist_diff=Chi_hist\n", + "for ii in [0,1,2]:\n", + " Chi_hist_diff[:,:,ii]=Chi_hist[:,:,ii]-Chi_hist[:,:,ii].min()*ones(Chi_hist[:,:,ii].shape)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# calculate the chi_diff to n_sigma\n", + "conf_to_chiDiff=array([linspace(0,40,10000), 1-scipy.stats.chisqprob(linspace(0,40,10000),2)]) #1-chisqrprob\n", + "sigma_to_conf=array([linspace(0,8,10000), scipy.special.erf(linspace(0,8,10000)/sqrt(2))])\n", + "chiDiff_to_sigma=array([conf_to_chiDiff[0,:], interp(conf_to_chiDiff[1,:],sigma_to_conf[1,:],sigma_to_conf[0,:])])" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "Sig_hist=interp(Chi_hist_diff, chiDiff_to_sigma[0,:], chiDiff_to_sigma[1,:]) # get the sigma contour from 2D X^2 diff" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "savetxt('/global/homes/r/rknoche/iPyNb/Analysis_Code/Run04_CH3T_G1G2_Kr2p22/Feb2015_CH3T_Kr2p22_g1g2.txt',[g1_best,g2_best])\n", + "savetxt('/global/homes/r/rknoche/iPyNb/Analysis_Code/Run04_CH3T_G1G2_Kr2p22/Feb2015_CH3T_Kr2p22_Chi.txt',Chi_hist.flatten())\n", + "savetxt('/global/homes/r/rknoche/iPyNb/Analysis_Code/Run04_CH3T_G1G2_Kr2p22/Feb2015_CH3T_Kr2p22_Chi_Diff.txt',Chi_hist_diff.flatten())\n", + "savetxt('/global/homes/r/rknoche/iPyNb/Analysis_Code/Run04_CH3T_G1G2_Kr2p22/Feb2015_CH3T_Kr2p22_Sig.txt',Sig_hist.flatten())" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:2: RuntimeWarning: divide by zero encountered in log10\n", + " from IPython.kernel.zmq import kernelapp as app\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "v=arange(0,3.05,0.05);\n", + "contourf(g2_range,g1_range,log10(Chi_hist_diff.min(2)),200,linecolor='none'); \n", + "cb=plt.colorbar()\n", + "plt.xlabel('g2')\n", + "plt.ylabel('g1')\n", + "cb.set_label('log10(Diff_Chi^2)')\n", + "plt.rcParams.update({'font.size': 18})" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[,\n", + " ,\n", + " ]" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\nEeB/AQoFi/q/gSK8AAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "v=arange(0.1,3.0,0.05);\n", + "contourf(g2_range,g1_range,Sig_hist.min(2),v,linecolor='none') \n", + "cb=colorbar()\n", + "cb.set_label('sigma')\n", + "plt.xlabel('g2',fontsize=18)\n", + "plt.ylabel('g1',fontsize=18)\n", + "plt.plot([g2_range.min(),g2_range.max()],[g1_best,g1_best],'--r')\n", + "plt.xlim([17,23])\n", + "plt.ylim([0.09,0.11])\n", + "plt.plot([g2_best,g2_best],[g1_range.min(),g1_range.max()],'--r')\n", + "#plt.text(g2_best*1.02,g1_best*1.02,'g1={:1.4g}\\ng2={:1.4g}'.format(g1_best,g2_best))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.11" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/CodeForLUX/Python/Run04_CH3T_G1G2/Feb2016_CH3T_G1G2_KrypCal2p22.ipynb b/CodeForLUX/Python/Run04_CH3T_G1G2/Feb2016_CH3T_G1G2_KrypCal2p22.ipynb new file mode 100644 index 0000000..fdaf582 --- /dev/null +++ b/CodeForLUX/Python/Run04_CH3T_G1G2/Feb2016_CH3T_G1G2_KrypCal2p22.ipynb @@ -0,0 +1,1421 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Setup

" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "//anaconda/lib/python2.7/site-packages/matplotlib/font_manager.py:273: UserWarning: Matplotlib is building the font cache using fc-list. This may take a moment.\n", + " warnings.warn('Matplotlib is building the font cache using fc-list. This may take a moment.')\n" + ] + } + ], + "source": [ + "from __future__ import division\n", + "import scipy \n", + "import scipy.interpolate as ip\n", + "from pylab import * # includes numpy\n", + "import matplotlib.pyplot as plt # plotting libraries from matlab\n", + "import sys\n", + "sys.path.insert(2, '//global/project/projectdirs/lux/data')\n", + "import aLib" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Populating the interactive namespace from numpy and matplotlib\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: pylab import has clobbered these variables: ['linalg', 'draw_if_interactive', 'random', 'power', 'info', 'fft']\n", + "`%matplotlib` prevents importing * from pylab and numpy\n" + ] + } + ], + "source": [ + "%pylab inline \n", + "#always do this for plotting... don't ask me why... Googled the fix for LINUX." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "pylab.rcParams['figure.figsize'] = (10.0, 8.0) # set size of figures displayed in this notebook" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Let's make a Tritium Beta Specturm ! :)

remember, Z'=Z+1 = 2 for Tritium Decay

http://www.hindawi.com/journals/ahep/2013/293986/
http://journals.aps.org/prl/abstract/10.1103/PhysRevLett.54.1891\n", + "
Note on DocBD: http://teacher.pas.rochester.edu:8080/wiki/pub/Lux/LuxDB00000402/TritiumBetaShape.pdf

" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Defining Constants

" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "c=1; # speed of light\n", + "C=1e-6; #constant infront of Fermi funciton. Arbitrary. Read Katrin paper if you care about super-allowed and allowed transitions... and nuclear matrix elements that don't matter\n", + "me = 511/c**2; # rest mass of our good friend the electron, in keV\n", + "Q=18.6 # endpoint of the tritium Beta decay keV. Maximum kinetic energy the electron.\n", + "mv=0 # neutrino mass=0. There may exist a 17 keV neutrino, maybe 7 keV!! Will we ever know??? Is it The Dark Matter?? Mystery...\n", + "step_T=0.1 #step energy by 0.1 keV\n", + "T=arange(0.01, 18.6,step_T) #sweep from 0.01 to the Q value in increments of step_T.\n", + "Z=1+1; #Tritium, after the beta decay Z'=1+1;\n", + "halflife = 12.32; # half life of the tritium beta decay in years\n", + "tau = 365*halflife/0.69; # Decay constant converted to days\n", + "n = 1e6; # Assume 1e6 atoms are decaying.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Simplifications

" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Fermi Function. Coulomb correction for the charge of the nucleas\n", + "G=(T+me*c**2)/(me*c**2); #Gamma, Total energy(E+M^2) over M^2\n", + "B=sqrt((G**2-1)/G**2); # v/c of electron. Ratio of velocity to speed of light in vacuum.\n", + "x=(2*pi*Z/137)/B; # note: fine structure constant = 137. \n", + "F = x*(1/(1-exp(-x)))*(1.002037-0.001427*(B)); # from http://journals.aps.org/prl/abstract/10.1103/PhysRevLett.54.1891. Measured to 1/1000\n", + "F_Kat=x*(1/(1-exp(-x))); # Katrin paper... http://www.hindawi.com/journals/ahep/2013/293986/ (really the same thing)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

more blah blah blah equations, they never seem to end!

" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "KE=T; #(G-1).*me*c^2; % The kinetic energy, is equal to T\n", + "E=KE+me*c**2; # the total energy. KE + rest mass\n", + "P=sqrt(E**2-me**2*c**4)/c; # momentum of the electron" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Let's calculate the number density of final states in two ways... makes no difference for LUX

" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "N=C*P*E*(Q+me-E)*sqrt((Q+me-E)**2-mv**2)*F # in terms of total energy. E=m0+KE. Or where Q means Q+m0\n", + "N_Kat=C*F_Kat*(KE+me)*sqrt((KE+me)**2-me**2)*(Q-KE)**2 # eqution 18 of Katrin paper. Set nutrino mass to zero... http://www.hindawi.com/journals/ahep/2013/293986/ (really the same thing)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Normalize the count to number of atoms

" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "s = sum(N[~isnan(N)])*step_T # Total Counts\n", + "s_Kat = sum(N_Kat[~isnan(N_Kat)])*step_T # Total Counts (for the Katrin paper case)\n", + "\n", + "N = N * (1/s * n/tau) # Decays/keV/day/1e6 atoms\n", + "N_Kat = N_Kat * (1/s * n/tau) # Decays/keV/day/1e6 atoms" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

create variable of kinetic energy T and N (count/dE)

" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "tritium_beta_spectrum=array([T,N])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Make Plots!!! Woooo Plots

" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\nERFJUf8P/gVG4rDYZGUAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "figure(0)\n", + "plt.plot(T,N,'r',linewidth=4)\n", + "plt.plot(T,N_Kat,'--b',linewidth=4)\n", + "plt.xlabel('Electron Kinetic Energy [keV] ',fontsize=18)\n", + "plt.ylabel('Count/keV/day/1e6 atoms',fontsize=18)\n", + "plt.legend(('Used for LUX','Katrin Paper with 0 nu Mass'))\n", + "\n", + "figure(1)\n", + "plt.plot(T,N,'r',linewidth=4)\n", + "plt.plot(T,N_Kat,'--b',linewidth=4)\n", + "plt.xlabel('Electron Kinetic Energy [keV] ',fontsize=18)\n", + "plt.ylabel('Count/keV/day/1e6 atoms',fontsize=18)\n", + "plt.yscale('log')\n", + "plt.legend(('Used for LUX','Katrin Paper with 0 nu Mass'))" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "cut=T<2" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.18770132835158548" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sum(N*cut)/sum(N)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Load in NEST yields and tritium data from December 2013

" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "#NEED TO GET NEW DATA FOR RUN04!!\n", + "#Load NEST LY,QY [2 3] -> Doke-Tritium LY,QY [4 5] -> and Tritium_Beta LY,QY [6 7]\n", + "tritium_beta=np.loadtxt('//global/homes/r/rknoche/Tritium_Spec_LYQY_paper.txt')\n", + "tritium_beta[:,0]=T\n", + "tritium_beta[:,1]=N\n", + "\n", + "#Load the Dec 2013 tritium data.VUV corrected, spike count for S1. XYZ corrected rq with 83Kr. Cut from 35-305us. <20cm radius.\n", + "#tritium_data=np.loadtxt('//global/homes/r/rknoche/Run04_Sep2014_Kr2p14_CH3TData_TwoLineFloat.txt')\n", + "tritium_data=np.loadtxt('//global/homes/r/rknoche/Run04_Feb2016_Kr2p22_CH3TData.txt')\n", + "S1=tritium_data[:,0]\n", + "S2=tritium_data[:,1]\n", + "dTus=tritium_data[:,2]" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "g1_Doke=0.098 \n", + "Eeff_Doke=0.808\n", + "Eeff_Beta=0.808\n", + "SE_WS=25.08\n", + "sigma_SE=5.48; #From LUG\n", + "g2_Doke= SE_WS*Eeff_Doke \n", + "\n", + "\n", + "g1_Beta=g1_Doke \n", + "g2_Beta=g2_Doke " + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "E_Doke=1/73*(tritium_data[:,0]/g1_Doke + tritium_data[:,1]/g2_Doke)\n", + "E_Beta=1/73*(tritium_data[:,0]/g1_Beta + tritium_data[:,1]/g2_Beta)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Adding Detector Resolution.

\n", + "

We define energy as some linear combination of number of photons and electrons that we collect, so sigma E is a function of sigma N_photons and sigma N_electrons

" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

\n", + "E/W= N_gamma + N_electron
\n", + "E/W= S1/g1 + S2/g2\n", + "

" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Generate Tritium spectrum with detector resolution and recombination variance.
\n", + "g1=0.117, Eeff=0.58, with inst. flucs, with singlePE resultion in S1. For MAX det res

" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185\n" + ] + } + ], + "source": [ + "# Setup constants...\n", + "ex_to_ion_alpha=0.20; #exciton to ion ratio ... alpha\n", + "\n", + "sigma_PE=0.50; # resolution of 1 photon. We are using spike count, so this should be 0\n", + "\n", + "inst_s1=6; #measured from Doke 6 ... seems to turn off below ~200 keV ?\n", + "inst_s2=8; #measured from Doke 8 ... seems turn off below ~200 keV ?\n", + "#using 0.85 as average extraction factor for a 1000 us electron lifetime\n", + "#and 320 us drift length.\n", + "\n", + "g1=g1_Doke #From Doke plot\n", + "Eeff=Eeff_Doke #From Doke plot #### Please NOTE: using 0.48 makes NO FREAKING DIFFERENCE!!! try for yourself :) \n", + "SE_size = SE_WS # For December tritium data.... use 24.66 in Aug 2013, same as W.S.\n", + "\n", + "#######################################################################################################\n", + "coeff_ng_sig_stat=sqrt((1-g1+sigma_PE**2)/g1);\n", + "coeff_ne_sig_stat=sqrt(((1-Eeff)*Eeff*SE_size**2+Eeff*sigma_SE**2)*0.85/(Eeff*SE_size)**2+0.155);\n", + "\n", + "trial_m=1000; # about 150k with trial_m = 100\n", + "trials=sum(ceil(tritium_beta[:,1]*trial_m)); #tritium dN/dE is fractional so multiply amplitute. \n", + "subtrials=np.ones((tritium_beta[:,1].size,1));\n", + "\n", + "gamma_T=np.ones((trials,1)); # Tritium gamma spectrum\n", + "e_T=np.ones((trials,1)); # Tritium electron spectrum.\n", + "\n", + "\n", + "kk=1; # kk will equal the total number of simulated tritium events\n", + "\n", + "for jj in range(0, tritium_beta[:,0].size): #% sweep through each energy bin\n", + " print(jj),\n", + " subtrials[jj]=ceil(tritium_beta[jj,1]*trial_m)\n", + " mean_gamma_T=tritium_beta[jj,2] # 2 for NESTv98 LY, 5 is with first fit to tritium.\n", + " mean_e_T=tritium_beta[jj,3] # 3 for NESTv98 QY, 6 is with first fit to tritium.\n", + "\n", + " n_ion_T=(mean_gamma_T+mean_e_T)/(1+ex_to_ion_alpha);\n", + " r_T=(mean_gamma_T/mean_e_T-ex_to_ion_alpha)/(mean_gamma_T/mean_e_T+1) #mean recombination fraction\n", + "\n", + " #Add functional form of recombination variance.%%%%%%%%%%%%%%%%%%% Cancels out in E space\n", + " Recomb_V_T=(0.07*n_ion_T)**2;\n", + " Fano_V=0; \n", + "\n", + " for ii in range(0, subtrials[jj]-1): #% one energy bin, test for recombination and stat\n", + " \n", + " recomb_fluc = np.random.normal(0,sqrt(Recomb_V_T),1) #mu, sigma , 1\n", + " Fano_fluc= 0; #normrnd(0,sqrt(Fano_V));\n", + " #Add functional form of S1 and S2 smearing%%%%%%%%%%%%%%%%\n", + " sigma_stat_gamma_R= sqrt(abs((coeff_ng_sig_stat*sqrt(abs(mean_gamma_T+recomb_fluc+r_T*Fano_fluc)))**2+(inst_s1/100*(mean_gamma_T+recomb_fluc+r_T*Fano_fluc) )**2 ));\n", + " sigma_stat_e_R= sqrt(abs((coeff_ne_sig_stat*sqrt(abs(mean_e_T-recomb_fluc+(1-r_T)*Fano_fluc)))**2 + (inst_s2/100*(mean_e_T-recomb_fluc+(1-r_T)*Fano_fluc) )**2 )); \n", + "\n", + " gamma_T[kk]=np.random.normal(mean_gamma_T+recomb_fluc+r_T*Fano_fluc,sigma_stat_gamma_R,1) #recomb + photons and - electrons\n", + " e_T[kk]= np.random.normal(mean_e_T-recomb_fluc+(1-r_T)*Fano_fluc,sigma_stat_e_R,1) #%recomb - photons and + electrons\n", + " kk=kk+1;\n", + "\n", + "#photon spectrum: gamma_T\n", + "#electron spectrum: e_T\n", + "# Energy...-> now smeared with detector resultion.\n", + "E_com_Tsim_NEST_MAX=1/73*(gamma_T+e_T); " + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false, + "scrolled": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(0, 0.1146606315778388)" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\niIikgf8HB0G7V7D6/0MAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "binwidth=0.25 # keV\n", + "n_NEST_MAX, bin_edges_NEST_MAX, patches = plt.hist(E_com_Tsim_NEST_MAX, bins=np.arange(0.05, 25 + binwidth, binwidth), normed=1, facecolor='none',edgecolor='red',linewidth=2, histtype='step', alpha=0.9)\n", + "plt.xlabel('Energy KeVee',fontsize=18)\n", + "plt.ylabel('normalized count',fontsize=18)\n", + "plt.xlim([0,25])\n", + "left,right = bin_edges_NEST_MAX[:-1],bin_edges_NEST_MAX[1:]\n", + "bin_center_NEST_MAX=(right+left)/2\n", + "\n", + "s = ip.UnivariateSpline(bin_center_NEST_MAX,n_NEST_MAX)\n", + "s.set_smoothing_factor(1e-5)\n", + "plt.plot(bin_center_NEST_MAX,s(bin_center_NEST_MAX),'k',linewidth=2)\n", + "\n", + "scale_factor=sum(N)*0.1/(sum(n_NEST_MAX)*binwidth)\n", + "plt.plot(T,N/scale_factor,'m',linewidth=2)\n", + "\n", + "plt.xlim([0,22]);\n", + "plt.ylim([0, 1.1*max(n_NEST_MAX)]);\n", + "\n", + "#plt.yscale('log')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

The Feb 2016 the data

" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false, + "scrolled": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(0, 22)" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAm0AAAH2CAYAAAAiQrujAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XmcZFV9///XGwUEZREju4ACihIRN8SVUQkgY4JJTMRo\nUGMMwaBEv8nDxBghmsVEYxRXENTgTyVGE8EwKooOaFB2cBsEVPbFBQFZwjaf3x91e6Zoqqq7emrp\nqn49H4/7qLrnnHvr0xQ985lz7jknVYUkSZIWt/XGHYAkSZLmZtImSZI0AUzaJEmSJoBJmyRJ0gQw\naZMkSZoAJm2SJEkTYOxJW5IDklyc5JIkb+pQ/5gkZyb5vyRv7FC/XpLzk5w8moglSZJGb6xJW5L1\ngPcD+wO7Ay9NstusZr8AXge8s8ttjgB+MLQgJUmSFoFx97TtBVxaVVdU1d3AicBB7Q2q6udVdR5w\nz+yLk2wPHAgcN4pgJUmSxmXcSdt2wFVt51c3ZfP1b8BfAm7rIEmSptoDxx3AQiVZDtxQVRcmWQak\nR1uTOkmSNDGq6n55zbiTtmuAHdrOt2/K5uOZwG8lORDYCNgkyQlVdUinxp1+eE23JEdV1VHjjkOj\n53e/dPndL13T9N1362wa9/DoOcAuSXZMsgFwMNBrFuiaxKuq3lxVO1TVo5rrvtYtYZMkSZp0Y+1p\nq6p7kxwOnEorgTy+qlYlObRVXccm2Qo4F9gEWJ3kCOBxVXXr+CKXJEkarVRN/+NeScrh0aUnybKq\nWjnuODR6fvdLl9/90jVN3323vMWkTZIkaRHplreMeyKCJEnqU5LLgR3HHYfW2RVVtdN8G9vTJknS\nhPHvtenQdRi0S/m4Z49KkiRpHkzaJEmSJoBJmyRJ0gQwaZMkSZoAJm2SJEldJPlVkp3GHQeYtEmS\npAFKcnmS25PckuQXSb6QZLt5XrtPkquGHWM/qmqTqrp8Pm2TrG6SvFvaXv9iULGYtEmSpEEqYHlV\nbQpsA/wUeN88r01z/aQqYI+q2rRJ9jatqncN6uYmbZIkadACUFV3AZ8FHremItkgybuSXJHkuiQf\nSrJhko2BFcC2bb1UWyd5apIzk/wyyTVJ3pek4+YAST6e5A3N+22bnq/DmvOdk/yiy3U7J1mZ5KYk\nP03y6ba61Uke1bzfouk5vDnJWUnenuQbs37uoa2fZ9ImSdIUSahBHeseSzYGXgJ8q634n4FdgD2a\n122Bt1bV7cALgGvbeqmuB+4F/hzYAng68DzgtV0+8nRgWfN+H+BHwHOa8+cAZ3S57u3Al6tqc2B7\n7tsz2P7f4YPAr4AtgVcCr2CEPYMmbZIkadA+n+RG4CZgX6B9iPA1wBuq6uaqug14B/DSbjeqqvOr\n6uxquRI4llZC1snpwLOa988B/gV4ZnO+T1Pfyd3Ajkm2q6q7qurMtroAJFkP+B1aCeadVbUK+PcO\n9zo/yY1Nz+CNSX6j28/WL5M2SZKmSBUZ1LEOYRxUVVsAGwKvA85IsmWShwMbA+c1Cc2NwBeBh3W7\nUZJdmyHJ65LcBPwD8Gudf/b6MXBbkicCzwb+B7g2yaPpnbT9Ja2c6Owk303yqg5tHg48ALi6razT\npIknVtUWVfXQ5vUr3X62fpm0SZKkQZt5pq2q6r9pDXE+C/g5cDuwe5PQbFFVm1fVZs11nYYaPwSs\nAnZuhi//ht7PjZ0OvBhYv6quozUk+gpgc+DCThdU1U+r6k+qajvgT4EPzjzH1uZnwD20hk9nPKLb\nzz4MJm2SJGlokhxEK2H6QVUV8BHgPU2vG0m2S7Jf0/wG4GFJNm27xSbALVV1e5LdgMPm+MgzgMNZ\n+/zayub8m83nd4rxxW3LktwErG6ONapqNfBfwFFJNmpiOWSOWAbKpE2SJA3aF5rZnzfTesj/kKq6\nuKl7E3AZ8O1muPNU4NEAVfVD4NPAj5vh062BvwBeluQW4BjgxDk++3TgIawdCv0msBHdh0YBngqc\n1XzG54HXt63N1p7ovY5WAnodrefZPgXc2VZfwEWz1ml79xzxzlu6JJ1TJUlV1dC6KyVJGiX/Xlsc\nkrwD2KqqOj0DN5/rO36P3crtaZMkSZqHJI9J8vjm/V7Aq2kNmY5Ex8XpJEmSdD+bAJ9Osg2t5+/e\nWVVfGNWHOzwqSdKE8e+16eDwqCRJ0hQyaZMkSZoAJm2SJEkTwKRNkiRpApi0SZIkTQCX/JAkacIl\nuXYUn1NV247ic9SZPW2SJGmgklye5PZmG6dfJPlC296eva7bJ8lVo4hxEtnTJknSlBhWT9gCevIK\nWF5VX0+yAfAh4H3A78z1Udx3r0+1sadNkiQNQwCq6i7gs8DjAJJskORdSa5Icl2SDyXZMMnGwApg\n27bN1rdO8tQkZyb5ZZJrkrwvyZLsdDJpkyRJQ9MkYy8BvtUU/TOwC7BH87ot8Naquh14AXBtVW1S\nVZtW1fXAvcCfA1sATweeB7x2tD/F4rAkM1VJkjR0n09yD/AQ4KfA/k35a4DHV9XNAEneAXwS+JtO\nN6mq89tOr0xyLLAPcPSwAl+sTNokSdIwHNQ80xbgRcAZSfYENgbOaxUDrVG/rvuoJtkVeDfwFGAj\nWrnLecMMfLFyeFSSJA3DzDNtVVX/TWuYc2/gdmD3qtqiOTavqs2aazpNQvgQsArYuao2p9Uj1zXJ\nm2b2tEmSNCVGtV5bv5IcBGwOfA/4CPCeJIdX1c+apUB2r6pTgRuAhyXZtKpuaS7fBLilqm5Pshtw\nGK3h1iXHnjZJkjQMX2hmgN4MvB04pKpWAX8FXAZ8O8lNwKnAowGq6ofAp4EfJ7kxydbAXwAvS3IL\ncAxw4hh+lkUhVdO/HEqSqqol2ZUqSZo+/r02Hbp9j93K7WmTJEmaACZtkiRJE8CkTZIkaQKYtEmS\nJE0AkzZJkqQJYNImSZI0AVxcV5KkyXNFkulfs2v6XdFPY9dpkyRJWkRcp02SJGmCmbRJkiRNAJ9p\nW6KS7A7s06PJXVV13KjikSRJvZm0LV1PBt7So/4WwKRNkqRFwqRNq4Cvt50/CPijMcUiSZK6MGnT\nuVX19zMnSTbDpE2SpEXHiQiSJEkTwKRNkiRpApi0SZIkTQCTNkmSpAkw9qQtyQFJLk5ySZI3dah/\nTJIzk/xfkje2lW+f5GtJvp/ku0leP9rIJUmSRmess0eTrAe8H3g+cC1wTpKTquritma/AF4HvGjW\n5fcAb6yqC5M8BDgvyamzrpUkSZoK4+5p2wu4tKquqKq7gROBg9obVNXPq+o8Wklae/n1VXVh8/5W\nWuuNbTeasCVJkkZr3EnbdsBVbedXs4DEK8lOwJ7AWQOJSpIkaZGZ+MV1m6HRzwJHND1u3dod1Xa6\nsqpWDjm0kUnya8DKOZr9UVWd3cdt108ye0h6xreq6oY+7iVJkrpIsgxYNle7cSdt1wA7tJ1v35TN\nS5IH0krYPlFVJ/VqW1VHLSTACRFgiznarN/nPTcCPtil7qWASZskSQPQdCStnDlPcmSnduNO2s4B\ndkmyI3AdcDCthKCbzDr/KPCDqnrvkOKbNDcC+8wq+xjwlD7ucQ/QLQF+BvDwBcQlSZLW0ViTtqq6\nN8nhwKm0nq87vqpWJTm0VV3HJtkKOBfYBFid5AjgccATgJcB301yAVDAm6vqS2P5YRaH1VX1i/aC\nJHf1c4Oqug04rFNdkhMxaZMkaSzG3dNGk2Q9ZlbZMW3vbwAe0eHS/wUeMNzoJEmSFodxzx6VJEnS\nPIy9p00j86QkG7Wd7za2SCRJUt9M2paOvx53AJIkaeFM2qbfBcAdPerd9kuSpAlg0rZIJJwCHNil\nekUVy7tfUzNF2yRrT1pmnXa5lyRJWtyciLB4dEvYetX1umYhnyNJkhYpe9oWmar7LiB8/56zTrIl\ncBHw86rao2ured1rXj6W5O4O5Z+rqjcP6DMkSVIbk7YJMcCEq9e95jt0+qDmmG2jDmWSJGkAUjWw\nXGDRSlJVNXsLrEVlJpHq0NPW61k3gBWQVzK/nra57tX1M6pYnmRjOif6vwv8A3A1cGGH+ruq6vAF\nfK4kSUtOt7zFnrZFbj49X8n8tpbqda85EroDW9fX7Z2vzczs1O2bY7Zes1clSdI8mLSN2Dr0dg1V\nt4RunsOyZwKHdijfEDh6XeKSJEktJm2jN8dQZ3dJtgUe1aFq83WKaB1V1ZXAlbPLm+FUkzZJkgbA\npG1MZj+7Nk8vAN4+6FgkSdLiZ9I2BCMYAr0euKxD+S3D+sAuw6Qu1CtJ0oiYtA3HXAlbz2HQeVhR\nVW9Zx3vM+7MY7OK+kiRpAUzahmiBQ6CLylwTFHqt+Qb83rDikiRpqXEbq3WQcEpCzT7GHdeIzNVb\naC+cJEkDZE/bulnwTNBJN8eab0slcZUkaWRM2gZgGoZBJUnS4ubwqCRJ0gSwp02jsFGSi7vU/WlV\nrRxlMJIkTSKTNo3Kpl3K1x9pFJIkTSiTNg3THcBju9QdAzxnhLFIkjTRTNo0RLW6Q+GKKpYnuas5\n/70kT+3Q7ntVdfIQg5MkaaKYtM3DCLalmjb97KLwwm43SfKeDsX3VNWjFxqYJEmTyqRtfpbsemwL\nMdcuCo3PAud0aPZiYNfm/YM61N+zbtFJkjSZTNr6MKr12JJsCWzQoWrzUXz+KHQb+kzyITpPTlgf\n6DYDVZKkqWfStjgdBzxl3EEMS5cdE1ZUsbyq7qFDb1oSe9gkSUuaSdvi9nPgzg7lN406kAHp51k3\nSZLUxqRtcXt1VXV67msizfNZN0mS1IHbWGnRSKguxynjjk2SpHEzadNiMNcMXIdOJUlLnsOjGrtu\nw6bQcej0gUmO7tL8+Kq6aHCRSZK0eJi0aRK9uEv5lwCTNknSVDJp06S4FziiS90fA48HnpFk4w71\nV1fVt4cWmSRJI2DSpolQVauB/+xUl+QAWknbH3W5/GTApE2SNNFM2hruLzrRvgXc3qH8EcBeI45F\nkqShMGlba66EzT1GF6mqOq5TeZLfwqRNkjQlTNpmGdX+oupPr62vRh6MJElj4DptWux69XA6nC1J\nWjLsadOi5tZXkiS12NOmiea2V5KkpcKkTZPKYVNJ0pLi8KgmksOmkqSlxp42SZKkCWDSJkmSNAEc\nHh2TJA8FjupS/agRhiJJkiaASdv4bAT83riDkCRJk8GkbfxuBo7sUveTUQYiSZIWL5O28bu9qj4z\n7iAkSdLi5kQESZKkCbDkkraEUzqtoj/uuDRYre+0ToLaBurQtd/1r76WZKe2I+OOVZKk+ViKw6O9\nVsvvtcq+JsMKen7HmzwXOLOtYLshxyNJ0kAsxaQNgCrsYZlC7TslJNkXeFtb7dObN5cDO40wLEmS\n1tmSTdo0/arqq8BXZ85nhsGr6hlJrh1bYJIkLcDYn2lLckCSi5NckuRNHeofk+TMJP+X5I39XCtJ\nkjQtxpq0JVkPeD+wP7A78NIku81q9gvgdcA7F3CtJEnSVBj38OhewKVVdQVAkhOBg4CLZxpU1c+B\nnyd5Yb/XSvPwjSSdZg//XTO8KknSojDupG074Kq286tpJWPDvlZLWLMcyMzpNq2XU++E/W9sa/bg\nEYclSVJP407aRibJUa13RwLLmkNLTI/lQPbbEHgOcBTwvJFFJEla8pIsYx6JybiTtmuAHdrOt2/K\nBn5tVR0FkHTd51NTrn05kHZts0ovS3LraKOSJC11VbUSWDlznqRjrjLu2aPnALsk2THJBsDBwMk9\n2revrdbvtZIkSRNrrD1tVXVvksOBU2klkMdX1aokh7aq69gkWwHnApsAq5McATyuqm7tdO2YfhRJ\nkqShStX0b7uZpKoqrfczQ2Hj3REhyba0ktHrqurJ44xlqZvH3rMrIIcx9/MGn6yqewcTlSRpqWrP\nW9qN+5k2aTGYY79SDqS1FuA75rjPpwGTNknSUJi0acmbtV/ph4HfAg6rqpM69MJdDXx9VtnLwb1s\nJUnDZdIm9ed7VXWfLdOSHAysP6Z4JElLxLhnj0qSJGkeTNqkzrZIsk37+dgikSQJkzapm38Azms7\nf+e4ApEkCXymTZrtl8D1beczvW3Xt9VLkjRyrtM2vphcp20CzOf/lyRX0JqIsGNV3T2q2CRJ06nb\nOm0Oj0rzkFAdjlPGHZckaekwaZN6W9GjrteCvJIkDZTPtEk9tC+8224eW19JkjRQ9rRJkiRNAJM2\nSZKkCWDSJkmSNAHmnbQl+WiSp/Wo3yvJRwcTliRJktr109P2SmDnHvWPBF6xTtGMQBUZ9xptmh6t\nCQm1A9Q2UHe5FIgkaVgGOTz6YMCFRbVUuBSIJGmkei75kWQHYKe2ot2SPKdD0y2Aw4DLBheatHi1\nLwXSviMC1F3ji0qSNM3mWqftVcCRQDXH3zTHbAFWN+0lSZI0YHMlbZ8HLqeVlH0UOBb41qw2BdwK\nnFNVVw06QEmSJM2RtFXVRcBFAEl2BD5XVd8bRWCSJElaa97bWFXV3w0zEEmSJHXX196jSQLsC+wK\nPAzut3RGVdXbBxSbJEmSGvNO2pLsSusZt924f7I2owCTNi15PTaUX9FtE3pJknrpp6ftfbQW130T\n8DXgF0OJSJpsK+i9TptruEmSFqSfpO3ZwHuq6l3DCmYaJXky8KwOVZuOOhYNX69etB69b5Ikzamf\npO1O4CfDCmSK7UWrd1KSJGnB+knavgw8EzhmSLFMuwuAb3Qov2XUgWho/jHJvR3K/7Oqzht5NJKk\nqdJP0vZG4Iwk/w94X5Xb9fTprKp6x7iD0FC9rEv5ec0hSdKC9ZO0/S+tTeH/BXhHkmuB2b0KVVU7\nDyo4aUK8BVivQ/nvA08ccSySpCnVT9J2JfggtTRbVX2iU3kzCcWkTZI0EP3siLBsiHFI0+wPkjx9\n5t88Sd7dlK+qqo+MLyxJ0iTpa0cESQvytOaYcXDzehpg0iZJmheTNml4Pg18q+38U62X2qY5f3nC\ny5v37pQgSeqpn22sVjP3M21VVSaCElBV36ItaWsStG47IrhTgiSpp34SrBO4f9L2QFpbWz0N+A5w\n4YDikqbOTE9akn1p/T6dVlV/6E4JkqT56Gciwiu71SV5BnAycNgAYpKWii2TvKBtgsIL2uq+UlX3\njCcsSdJiNJChzKo6M8nHgH8G9hnEPaUl4PHA8W3n7e93BUzaJElrdFoQdKEuBZ48wPtJ0+pnwJfa\njhlfAlaPJSJJ0qI3yEkDy4A7Bng/aSpV1UXAH82cJ7yqqXlVW7NbE8BZpZKkRj+zRw/pUrUFsC/w\nAu47vCNpflbgrFJJ0hz66Wn7OK0nptOh7h5aCdsbBhCTtKS096QluQzYGNgV6tbxRSVJWmz6Sdqe\n26GsgBuBn1TVbYMJSZIkSbP1s+TH6cMMRNJ9nDHzJsk5beV/X1UnjSEeSdKYLWgiQpKHAY9sTn9S\nVb8YXEiSgG3a3m/X9n7jUQciSVoc+lryI8kTkpwO/BQ4qzl+mmRlkj2GEaC0xOwD7NUcM/aitXi1\nJGkJ62f26K8D3wQeBJwEfL+p2h34TeAbSZ5RVd/vcgtJc6iqa2beN0t+UFVXJ7l9XDFJkhaHfoZH\n3wbcDTyzqr7TXtEkdGc0bX53cOFJau1NumZ70k8lfKp57xpukrSE9DM8+hzgA7MTNoCq+h7wQdzC\nShqkFXPUu4abJC0h/fS0PRi4vkf9dU0bSQMwa/22dwMHA+cBl0Md3pS/r2nyw6p6/8iDlCSNTD89\nbT8GXtij/oVNG0nD82Tu+wjC7zbHs8cTjiRpVPpJ2k4A9k/yqSS7J3lAc/x6kk8C+9HaNUHS4H0K\neH3bMeOD4wlHkjRq/QyPvgt4Eq0hmpcAq5vy9WhtbfUZ4F8HGp0kAKrqXODcmfOs3UzuDOC1YwhJ\nkjRi/eyIcC/wkiTHAS9i7eK6PwY+X1VfHUJ8kiRJYgE7IlTVV4CvDCEWSZIkdTHvZ9qSbNFr14Mk\neyR5aL8BJDkgycVJLknypi5tjk5yaZILk+zZVv6GJN9L8p0kn0yyQb+fL0mSNAn6mYjwL/SeaPAx\n4J/6+fAk6wHvB/antbPCS5PsNqvNC4Cdq2pX4FDgw035tsDrgCdV1R60eg0P7ufzpclXp0NtA/X7\nCdUcp4w7KknS4PWTtD0X+EKP+pOBffv8/L2AS6vqiqq6GzgROGhWm4NozVylqs4CNkuyVVP3AODB\nSR5IayPta/v8fGlS9Vp410V3JWkK9ZO0bQtc2aP+6qZNP7YDrpp1j+3maHMNsF1VXUtrtuqVTdlN\nTobQUlHF8ioC2QdyHeQzrXNJ0rTqZyLCbcCOPep3BO5ct3DmL8nmtHrhdgRuBj6b5A+q6lNd2h/V\ndrqyqlYOPUhJkqQ5JFkGLJurXT9J21nAK5K8s6p+NevDNgEOAc7u437Q6iHboe18+6ZsdptHdGiz\nL/DjqrqxieG/gGcAHZO2qjqqz9ikSbJFkufObCzfer/GN5vHDyRJi1DTkbRy5jzJkZ3a9TM8+i5a\nCdOZSV6cZJfmeDFwZlP3zj7jPAfYJcmOzczPg2k9G9fuZFoJIUn2pjUMegOtYdG9kzwoSYDnA6v6\n/HxpWuwOfLLt/JNth3sCS9IU6Gdx3a8neS3wXuA/ZlXfDRze7zNlVXVvksOBU2klkMdX1aokh7aq\n69iqWpHkwCSX0RqifVVz7dlJPgtc0Hz+BcCx/Xy+NAV+Sdu/zoCXNq8rgWexgLUYJUmLU6qqvwuS\n7YDfB3Zpii4BPltVs4c1F40kVVVjeUg7yWHA3wIfrqq3jSMGLR1Ja3y0iiRZBWwGPK6qbhpvZJKk\n+eqWtyxkR4RrgH8bSFSShqKVvK35B9kvW3uVnns1PLV9N5NPVNXXRx6cJGlBHDqRpssKuq7T9pTt\ngQPaCk4fQTySpAHpZyKCpEVuZv22Zg23/SAHto41Xo3JmiRNJHvapClVVWuGQpM1ZV9Mss+4YpIk\nLZw9bZIkSRPApE2SJGkCmLRJkiRNAJM2SZKkCdB1IkKS1bQt9DRPVVVObpAWqVnrt3084ePN+xVV\nLB9PVJKk+eiVYJ3A/ZO2JwO/DvyQtft8Pg54NPA94LxBByhpIHqs3wZz1EmSFoGuSVtVvbL9PMlv\nAC8GXlRVJ8+qexHwCeCNQ4hR0jpq70VL8g7gEOCvq+rfZ7a+kiQtbv080/Z24JjZCRtAVX2e1mbt\nfz+owCRJkrRWP0nbHsCPetRfBjx+3cKRJElSJ/0kbb8E9utRfwBw87qFI2mEHpRk05mTJJs2x4PH\nGZQkqbN+krZPAQclOT7JY5M8oDkem+SjwAuBTw4nTElDcCRwcdv5xc3xifGEI0nqpZ/lOd4C7AK8\nCnglsLopXw8I8IWmjaTF7U7gV23n27Reqnnlt9smJ7gUiCQtEvNO2qrqTuC3k+wHvAh4ZFP1Y+Ck\nqjp1CPFJGrCqOpJWLxsACafQfckPlwKRpEWi74Vwm+TMBE2aEjM9aUmeDnwO+HZV/Y5LgUjS4rKg\n3QuS7AJsBXyvqpx8IE2XJye5YGZt7db7NX6jqn4+nrAkaWnra+/RJC9M8iNaOyKcQWuHBJJsmeSy\nJC8eQoySRmt9Wv8om7FV2+F+xZI0JvP+AzjJMuC/gRuBv6M1+QCAqvoprTXcDh5wfJJG5zzgSW3H\njCfR+r2XJI1RP/9qfitwEfA04AMd6r/Fff+glzRBququqrp+5mgrvx64d4yhSZLoL2l7KvDJqlrd\npf5qYOt1D0mSJEmz9ZO0rUdrfadufg24a93CkSRJUif9JG2rgGf3qH8hreFTSVOktfRH7dFafLdu\nSKhmbTdJ0gj1k7QdD7w4yavbrqskGyc5Gng6cOygA5Q0Nit61LnoriSNWD87InwoyTOBjwD/SmsR\np08DDwMeAHysqtx7VJoS7dtXJbkIeDiwJ9QN44tKkpauvhbXraqXJ/kc8HJgN1rLfpwFnFBVnxtC\nfJIkSWJh21j9N6312iRJkjQi/Syue0iS/XvUPzLJIYMJS5IkSe36mYjwcWBFkn/tUv8M4GPrHJGk\nxezxM2+SPKnt2HKcQUnSUtDv8Oh3gDck2Rn4g6q6fQgxSVq8PrH2bZ3XXpE1G9uxon0SgyRpMPpN\n2t4JbAYcDXwjyQur6rrBhyVpkfkesHnr7ZkPhGc8vEfbA5PsCvztHPd8Y1X9fDDhSdL0W8hEhA8l\n+QlwInB2kt+sqgsHH5qkxaKqXtapPMnbgVcDb62q41oL8QKtf9ztO8dtNxxgiJI09fpO2gCq6ktJ\nng38D60et45/oEta8n4EvG1W2b8BW4whFkmaaAtK2gCq6rtJ9qKVuP0XcMbAopI0LW6qqq+0FyT5\nv3EFI0mTrJ/Zo/dTVTcAzwFOBpYNIiBJkiTdXz89bc+ltWn8fVTVHcDvJDkMcNq/tDQdmeQtrHmk\nDXdIkaQB62fv0dPnqP/QuocjaUI9oDlmrD+uQCRpWi34mTZJojXJ4O/bzmeeV3tk81pIkgaia9KW\nZDWwGti4qu5qzuf6A7iqykRQWiKq6u7285kFdqvqznHEI0nTrFeCdQKtJO3eWeeSNAgPTvKQDuV3\nzk4GJUk9kraqemWvc0laRyu7lP898MERxiFJE8GhTEmjdjtwW4fyDfHPJEnqyj8gJQ1c23ZW7VZU\nsbyqntP5mvwtcNhwI5OkydVrIsKPF3C/qqqd1yEeSZNtBXBgl7pu5ZKkeejV03YlTjyQ1Icqlncq\n79LzJknqQ6+JCMtGGIckSZJ6WKe9RyWpHwnV4Thl3HFJ0iQwaZM0Cit61PmsmyTNQ1+zR5PsDLwB\neBrwUO6f9DkRQdL9+KybJK27efe0JXk8cD7wx8AGwKNorbX0IGAnWjsnXDn4ECVJktTP8OjbgLuA\nJwDPb8qOqKptgUOBzYE/G2x4kiRJgv6StmcBx1bVD1m7FEgAquojwBeBdww2PEmSJEF/SdsmwI+a\n93c1rw9uq/9fWoldX5IckOTiJJckeVOXNkcnuTTJhUn2bCvfLMl/JlmV5PtJntbv50uSJE2CfpK2\nG4CtAarqV7SeZ3t0W/1DgQf08+FJ1gPeD+wP7A68NMlus9q8ANi5qnalNQz74bbq9wIrquqxtIZt\nV/Xz+ZKvcpvAAAAgAElEQVQkSZOin9mjFwJPaTs/HTgiydm0kr/DgYv6/Py9gEur6gqAJCcCBwEX\nt7U5CDgBoKrOanrXtgLuAJ5dVa9s6u4Bbunz8yVJkiZCPz1tnwJ+LclGzfnfApsBXwdOozUR4c19\nfv52wFVt51c3Zb3aXNOUPRL4eZKPJTk/ybFtsUmSJE2Vefe0VdV/AP/Rdn5Bkt2B36a13McXq2oh\nm8wv1AOBJwF/VlXnJnkP8FfAkZ0aJzmq7XRlVa0ceoSS5qW1XtuaJds+kPCB5v2Kbmu8SdK0SLIM\nWDZXu74W152tqq4Cjl6HW1wD7NB2vn1TNrvNI7q0uaqqzm3efxboOJGhifWodYhT0nCsoPeOCO6W\nIGnqNR1JK2fOk3TsgBr3NlbnALsk2THJBsDBwMmz2pwMHAKQZG/gpqq6oapuAK5KMjMZ4vnAD0YU\nt6QBqGJ5FakikLdCroP8WetcktSu322snkFrAd1dgYfB/f5g7Wsbq6q6N8nhwKm0Esjjq2pVkkOb\nex1bVSuSHJjkMlozVl/VdovXA59Msj7w41l1kiRJU2PeSVuS19BabuMu4IcMaMuqqvoS8JhZZcfM\nOj+8y7UXAU8dRBySFo3XJDlo5hm3JF9uyi/t9meBJC0F/fS0vZnWsh/7V9XPhxSPJG3VHDMe37y6\nubykJa2fZ9q2ojV8acImaRiOAw5oO2a8fjzhSNLi0k9P2ypaux5I0sBV1XXAdTPnWfvE7KXjiEeS\nFpt+etr+AXhtkm2HFYwk3V9dCLUN1P4J1RynjDsqSRq1fhbX/a8kGwM/SHIScDmtRXVnNau3DzA+\nSUtXrzXcXL9N0pLTz+zRRwNvAzYF/rBLswJM2iSts5mdEJI8Afgi8J2qOqC1e4IkLT39PNP2QWBL\n4AjgG8AvhxKRJEmS7qefpO3pwDur6n3DCkaSJEmd9TMR4WbgZ8MKRJIkSd31k7R9BvidYQUiSZKk\n7voZHj0G+PcknweOBn7C/WePUlUD2d5KkmbZsrUv8ZrtrQ5tq/t0Vd0ynrAkaTT6Sdq+T+tPy6cA\nv9mj3QPWKSJJ6mxr4Mi28/b3L0lyRYdr/quqvjDcsCRpNPpJ2t6Ge/9JGr2fAce2nTfJWm3TVta8\nP/VO2P/GtvILhxuaJI1OP4vrHjXEOCSpo6q6Fjhq5jzhqXRdXHe/DYE/An4XWuu8SdK0mNdEhCQP\nSfK1JK8edkCS1EsVy6vI7GNtfX0J+NEYQ5SkoZhX0lZVtwJPHXIskiRJ6qKfJT8uBB47rEAkSZLU\nXT9J25HAa5I8d1jBSJIkqbN+Zo++HLgS+GqSi4BLgNtntamq8rk3SZKkAesnaXtl2/s9m2O2Akza\nJEmSBqyfJT/6GUqVJEnSAJmISZoqCQX1T63Fd+s9CdUcp4w7NklaF/0MjwKQJMATgUc1RT8GLqiq\nJb1bQpLtgA06VD1s1LFIS9QKui66C3PUSdKi11fSluQA4IPAjrOqLk/y2qr68sAimzzHAU8YdxDS\nUlW1dgeEJH8FvB7456p6b6v3TZIm27yTtiTPBE4GbgPeS2sDeYDdaU1SODnJc6vqzEEHOWGuA+7s\nUH5jhzJJkqR56aen7a3A9cDTquq69ook7wTOatocMLjwJtKrq8pNqiVJ0kD1MxHhacCxsxM2gKbs\nI8DegwpMkiRJa/WTtG0A/KpH/S10fhBfkiRJ66if4dFVwMFJPlBV97RXJHkg8JKmjSQtSl0mJKyo\nYnmSo4Cte1x+SlV9YTiRSdLc+knaPgQcC5yW5F+AHzTluwN/SWv49E8GG54kDUSv5UBmyp8H7NLj\nHpcBJm2SxqafHRGOS7Ir8BfAszo0eWdVHT+wyCRpQNqXA2nXpeftbbRmgc94IXS+XpJGqa912qrq\nTUmOBw4CHtkU/xg4uaouGXRwkjQGp1XVpTMnSXbBpE3SItD3jghNcvbOIcQiSZKkLtx7VJIkaQL0\nu43V04HDgV1p7amZWU2qqnYeUGySNFBJ1gPWX1tSM+Ub4j9iJS1y/WxjdQjwMeBu4BLgymEFJUlD\n8hjgtA7lPxl1IJLUr3562v4G+CGwb1VdO6R4JGmQfj/JU9rOH9f2/q61b2ubtvJL0hpDWNFt1qkk\njUM/SduOwF+asEmaII9k7Uz3dquq6vkJpzD3+m2StCj0k7RdDWw4rEAkaYD+Ezi3R/2t0Pf6bZI0\nVv0kbR8GXpbk36rq3mEFJEnrqqp+BPxowLf94yQv7lB+ZVX9/oA/S5Lup5+k7Tzgd4Gzk3yA1oO7\n90vequqMAcUmSYvJps0x292jDkTS0tRP0tY+4+o4uN/wQZqyB6xrUJK0iBwHfLZD+Y7AiSOORdIS\n1k/S9qqhRSFJi1RV3QzcPLs8yfodmkvS0PSzYfy/DzMQSVpsekxIWAEc0bxfP8lOXdpdW1V3damT\npL70vfeoJC0BK+i95MeBrE3adgDO7NJuX+AHA4xL0hJm0iZJs/RaVLet9+0e4IouzbblPttlSdK6\nM2mTpAWoqsuBp3eqS3Ia8NiRBiRp6rlBsiRJ0gQwaZMkSZoAJm2SJEkTwKRNkiRpApi0SZIkTQCT\nNkmSpAlg0iZJC5BQHY5Txh2XpOll0iZJ/VnRo67XLgqStE7GnrQlOSDJxUkuSfKmLm2OTnJpkguT\n7Dmrbr0k5yc5eTQRS1rKqlheRWYf445L0vQb644ISdYD3g88H7gWOCfJSVV1cVubFwA7V9WuSZ4G\nfBjYu+02R9Da22/T0UUuSfPykiQ3dCg/v6q+PfJoJE20cW9jtRdwaVVdAZDkROAg4OK2NgcBJwBU\n1VlJNkuyVVXdkGR7WsMR/wC8cbShS9KcXtOl/H2ASZukvow7adsOuKrt/GpaiVyvNtc0ZTcA/wb8\nJbDZEGOUpH59BtiyQ/mTuf+fcZI0L+NO2hYsyXLghqq6MMky6P1MSZKj2k5XVtXK4UUnaSmrqmM6\nlSd5PSZtkmZp8phlc7Ubd9J2DbBD2/n2TdnsNo/o0ObFwG8lORDYCNgkyQlVdUinD6qqowYVtCR1\nk1AdildUsXzkwUiaCE1H0sqZ8yRHdmo37tmj5wC7JNkxyQbAwcDsWaAnA4cAJNkbuKmqbqiqN1fV\nDlX1qOa6r3VL2CRpBFwKRNJQjbWnraruTXI4cCqtBPL4qlqV5NBWdR1bVSuSHJjkMuA24FXjjFmS\nOunWk9al502S+jbu4VGq6kvAY2aVHTPr/PA57nE6cPrgo5MkSVocxj08KkmSpHkYe0+bJC1BD0/y\nuA7ld1fVpSOPRtJEMGmTpBFoPdu25vG2NzQHcOqdsP+NTfmV3HfHF0law+FRSRquXrNKgf02BH40\nkkgkTTSTNkkaom4bzM/aZP7lYwtQ0sRweFSSFo8NkzyxS90lVXXbSKORtKiYtEnS4rEVcEqXugOB\nC0cYi6RFxqRNksbvTronZI+htVWfpCXOpE2SxqyqrqfLVldJvgg8YbQRSVqMnIggSZI0AUzaJGnM\nEqrD0e3ZNklLlEmbJI1PrzXcOg6XSlq6fKZNksakiuWdylu7J0jSfdnTJkmSNAFM2iRJkiaASZsk\nSdIEMGmTJEmaACZtkiRJE8DZo5I0Gd6e5Fcdyk+pqk+OPBpJI2fSJkmLVGvpjzWrf7yw9XLqnbD/\njW3NLh5xWJLGxOFRSVp8eiy6u9+GwMuAT48qGEmLgz1tkrTIzLXoblV9Pcluo41K0rjZ0yZJkjQB\nTNokSZImgEmbJE2YZoLCB6G2gfq7hGqOU8Ydm6ThMWmTpMnRY4ICAAcmeVRz7DiSiCSNjEmbJE2I\nKpZXkSoCeS3kurXHGt9sjv8aU5iShsTZo5I0mW4CftJ2vk3zehXwiNGHI2nYTNokaQJV1adpW6tt\nZjkQ4LeBc8cSlKShcnhUkiRpApi0SZIkTQCTNkmaKnVNsxTIk1wKRJouJm2SNB16LQdy4MiikDQ0\nJm2SNAVmlgOBbNcsA3IBZM1ksyQPaDsyzlglLYxJmyRNp61pLf8x46q24yljiUjSOnHJD0maPqu7\nlPkPdWmC+QssSVOkqq6tqu1njrby7XH9NmmimbRJkiRNAIdHJWkJaO2YMLNpAmc3UxFWVLF8bEFJ\n6otJmyRNtxV0X/LjwCT/X9v5qVV1wghikrQAJm2SNMXae9KSnMyamaM1s8H889qaXz6quCT1z6RN\nkpaOvwM2b95/tXn9Q2B/4OVjiUjSvJm0SdISUVXnzbyfWV63qk5LstN4IpLUD2ePSpIkTQCTNkmS\npAlg0iZJS1izFMhxrYkJ9TcJ1RynjDs2Sfdl0iZJS9OKOeoPTHJBc5w2kogk9WTSJklLUBXLq0gV\ngfwx5Lq1xxpbNcfDxxSmpDbOHpUknQj8T9v59c3rvrSWBlkvyaZdrr2jqu4eZnCSWkzaJGmJq6rb\ngNtmzmeWA4H6fvNmG+Dm1ttT74T9b2y7/PeA/x16kJIcHpUk3U+P59322xC4Bbh3VMFIajFpkyTd\nR/vzbu3H2vraDThrjCFKS5JJmyRJ0gQwaZMkSZoAJm2SJEkTYOxJW5IDklyc5JIkb+rS5ugklya5\nMMmeTdn2Sb6W5PtJvpvk9aONXJIkaXTGuuRHkvWA9wPPB64FzklyUlVd3NbmBcDOVbVrkqcBHwb2\nBu4B3lhVFyZ5CHBeklPbr5UkDd1Tkmzcofzqqlo18mikKTbuddr2Ai6tqisAkpwIHAS0J14HAScA\nVNVZSTZLslVVXU+zAGRV3ZpkFbDdrGslSQPW7Fc6c/qe1sv91m/7BNBx9ETSwow7adsOuKrt/Gpa\niVyvNtc0ZTfMFCTZCdgTp6BL0jCtAA7sXLXfhsBXgEcAuwEPT/LkDg3vraoLhxWgNM3GnbSts2Zo\n9LPAEVV1a492R7WdrqyqlUMOTZKmShXLO5W3et6gql6R5BDgHcABzTHbLbSSOkmNJMuAZXO1G3fS\ndg2wQ9v59k3Z7DaP6NQmyQNpJWyfqKqTen1QVR21rsFKkub0c+D8DuUPBPYYcSzSRGg6klbOnCc5\nslO7cSdt5wC7JNkRuA44GHjprDYnA38G/EeSvYGbqmpmaPSjwA+q6r2jCliS1NmsZ93arYC8BHBi\ngrQOxrrkR1XdCxwOnAp8HzixqlYlOTTJnzRtVgA/SXIZcAxwGECSZwIvA56X5IIk5yfp1BUvSRqu\nHnuVAl2fg5PUj1R1/FfRVElSVZW5W67TZ3wReAJwoA/ZSlLLzPNukM1p9bTd0uxdKqmLbnnL2BfX\nlSRJ0txM2iRJkiaASZskSdIEMGmTJI1A3QS1DdRjEqo5Thl3VNIkMWmTJA1Tr5mlziqV+jDuddom\nSrOe3LfGHYckTYqZXRSSbEZr9uidwD9AfaQp/+O25l+qqqtHH6U0GUzaJEmjtCHwtrbz9ve3Jjm9\nwzV3VNVNww1LWvxM2hbmyqrae9xBSNIEuQs4vu38Lc3r8cCrm/fv7nLtfwBvGFJc0sQwaZMkDV1V\n3QH87cx5MpO01Vvu33rlLfDcHwEbA5uOJEBpAjgRQZI0Dj0mKCzbtKqeBBw1qmCkSWBPmyRp5GYm\nKMy2dtsrSbPZ0yZJkjQBTNokSZImgEmbJGnRaQ2T1qebXRT+3F0UJJM2SdLi0msHBXAXBS1hJm2S\npEWjiuVVpIpAXgq5DvIJyJNn2iR5UnPsOc5YpVFz9qgkabHbtzlm/E/zegew8+jDkcbDpE2StFj9\nArig7Xyb5vU7wB6jD0car1RN/5I4SaqqMoD7zGwY7zZWkjRic6zhtqLb2m/SpOmWt/hMmyRpUvSa\npOAEBU09h0clSRNhpictycbAZcDdwKuhvtKUtz/3dlFV/Wz0UUrDY9ImSZpU6wMntJ23v38F8JXR\nhiMNl8OjkqRJcy9wWtsx4zRakxekqeREhP7u40QESVpknKCgadMtb3F4VJI06VbQfSLCgUna666t\nqgtHEJM0cCZtkqSJ1t6TluQE1izEWzPruh3X1vxzwOtGFZs0SCZtkqRpch6tWaUAf9S8fhHYjtaC\nvOsneXBb+/WApwK39bjnpVV146ADlfrlM2393cdn2iRpQsw861ZFkrwYOHqBt/rjqpprI3tpYHym\nTZK0JLWSt04dFKfdDvteBwTYCDh7VoNHA5sPOz5pvkzaJEnTqtcEBeD5G1fVLt1qkxwPvGDwYUkL\n4zptkqSpVMXyKtLpmGmTUB2OU8YZt9SNSZskaSlyH1NNHIdHJUlLTrcFd+dYqFcaK3vaJEmSJoA9\nbZIkzTJrxukpCcAZN8E+q9qanVZVfzvy4LRk2dMmSdJaPZ51e87mwE5tx8NHEI+0hovr9ncfF9eV\npCUiyVbAxq2z+nHv1l+9A37jhraCR9VS+AtWQ+HiupIk9aGq1iRhyVxrvu27EbDh8KPSUubwqCRJ\nc2hf8w2yPmSjtccajxpbgFoS7GmTJKkPVXUPcM/MebKm/P+SdX4SR+rKnjZJkgagmXG6TXOsdncF\nDZpJmyRJ68bdFTQSJm2SJK2DWc+7Xdccu87Ud9nftJJbvp5k5+bYepw/gyaDSZskSYN3Bpx6Z+8m\nmy4DvtEc/zj8kDTpnIggSdLgtK3ntn+Ptd3qmc2bG4CtgEcm+dMujT9SVfcOJjxNMhfX7e8+Lq4r\nSVpnvTemP/VO2P/GtoIdq+ruoQelRaNb3uLwqCRJo9dj8sJ+GwLHQK/ETkuRPW393ceeNknS0PTu\ngfvfn8Gzzm9ONgD+Dfhqh4arq2qO5+m0mLmNlSRJi1+P7bKe+XBgj7aCY7rc4zTgDwcalRYFkzZJ\nkhaJKpbPvE+yBzCz38KFzes2na/86h3wGz8D1h9uhBonk7YOkmwFdFozp8sviyRJg1VV35l5P88N\n618NnDD0wDQ2PtPWuf3rgb/q0cRn2iRJi0Lv5+C6+eYv4NkzSeEjgM8AX+zQ8Kaq+t7Co9NC+Ezb\nwvwMuK5D+fWjDkSSpC7m6IXr5FkPA3ZrK3hVc9xPkn/tcpMPVNX/9fe5Whcmbb2dWFX/NO4gJEnq\nZuY5uCTbAM/q0XRn4BSYGXbt9nzct6+Hp7f33v2/Lvc7HjBpGyGTNkmSpkBVXQf851zt5n4+bu+t\nOy8Rt2oVPO544HBgQ+CJSX7VoeGVVfXTeQWtvox9cd0kByS5OMklSd7Upc3RSS5NcmGSPfu5VktX\nkmXjjkHj4Xe/dPndz619g/vZBz0X/X3sY6HeBbVTq5euvgZ1TofjhoRqjlMWEmOSTZJs2eN4aIdr\nli3ksybJWHvakqwHvB94PnAtcE6Sk6rq4rY2LwB2rqpdkzwN+DCw93yu1ZK3DFg55hg0Hsvwu1+q\nluF3v2DtS460a5KvPp+bA+DA/iZKXHUu7PB24G3Alr1adtir9aVJNgW+WlW3t7V7HvC0Hre6vqo+\nNv8Yx2fcw6N7AZdW1RUASU4EDgLaE6+DaKYwV9VZSTZrluR45DyuXaNZ72a+Oi33IUnSktQtmWuX\n5B3AIWtLvrxFsyVXHx7xFKiT5tl4VrujgKMObsXSXt4pZ7zv/q5JBrGDxPq0lgbr0Vu5bsadtG0H\nXNV2fjWtRG6uNtvN89p2X1p4mJIkaQ5fpjXy1di/vW594A7gc7OueSdwJ7Aazj0AnrzDcEOcsd+G\nsyZifHKANx/ABMbOq5SNO2lbiIXuIbqQhXH/Mck/LvDztAgkOXLcMWg8/O6XLr/7Re0D3aueMoDb\n/90A7rF4jTtpuwZoz6q3b8pmt3lEhzYbzONaAAaxWbwkSdI4jXv26DnALkl2TLIBcDBw8qw2J9OM\nkSfZm9bqzDfM81pJkqSpMNaetqq6N8nhwKm0Esjjq2pVkkNb1XVsVa1IcmCSy4DbaFZs7nbtmH4U\nSZKkoVoSe49KkiRNunEPjw6Vi+8uXUkuT3JRkguSnD3ueDQ8SY5PckOS77SVPTTJqUl+mOTLSTYb\nZ4waji7f/ZFJrk5yfnMcMM4YNXhJtk/ytSTfT/LdJK9vyqf+935qk7a2xXf3B3antejebr2v0hRZ\nDSyrqidWVa+lYDT5PsastQWAv6K1wOZjgK8Bfz3yqDQKnb57gHdX1ZOaw+Weps89wBuranfg6cCf\nNX+/T/3v/dQmbbQt3FtVdwMzi+9qaQjT/f+3GlX1TeCXs4oPAv69ef/vwItGGpRGost3DwtfGkoT\noKqur6oLm/e3AqtorSAx9b/30/yXWrdFebU0FPCVJOckec24g9HIbdnMMqeqrmeO7XA0dQ5v9qo+\nbhqHyLRWkp2APYFvA1tN++/9NCdtWtqeWVVPorVX3p8leda4A9JYOeNq6fgg8Kiq2hO4Hnj3mOPR\nkCR5CPBZ4Iimx2327/nU/d5Pc9I2n4V7NaWq6rrm9WfAf9N7izNNnxuaPYpJsjXw0zHHoxGpqp/V\n2mURPgI8dZzxaDiSPJBWwvaJqjV7lU797/00J20uvrtEJdm4+RcYSR4M7Ad8b7xRacjCfZ9jOhl4\nZfP+FdxvY2lNkft8981f1jN+B3/3p9VHgR9U1Xvbyqb+936q12lrpnq/l7WL775jzCFpBJI8klbv\nWtFaQPqTfvfTK8mngGXAw4AbgCOBzwP/SWsLvCuA36+qm8YVo4ajy3f/XFrPOK0GLgcOnXnOSdMh\nyTOBM4Dv0vpzvoA3A2cDn2GKf++nOmmTJEmaFtM8PCpJkjQ1TNokSZImgEmbJEnSBDBpkyRJmgAm\nbZIkSRPApE2SJGkCmLRJkiRNAJM2SeskyT5JVvc47hp3jKPW9t/kjV3qbk5yTZJf7/O+5yS5M8nD\nerR5cJJbk6xaSOySFq8HjjsASVPjU8CKDuWrRx3IYpXkhbRWbL8W2LeqLu/zFsfR2hD95bR2e+nk\nJcDGtLb5kTRFTNokDcr5VfWpcQfRLsmDgLur6t5FEMsfAB8HVgH7LXBrpU8D7wZeRfek7VXAPcAJ\nC7i/pEXM4VFJI5Nkx2bY8K1Jlic5O8kdSa5N8i9J7vdnUpJdknyiaXNnkp80bTee1e7jzb1/LclH\nk1wP3Aps19RvlOTdzX1uT3JmkufOXNd2n88nuS3JQzrE8tTmM97S5899GPAJ4Fxgn04JW5Ktk3wo\nyRXNz3lNkv+/vXuLtauo4zj+/bVWaA0SgkCBEAOxCAiS0iAPSHjQWKCWYhOUi0JoAUu1QC0iKAHE\ncInR8KIRCm0t4IOxpsJBUss1UC6JUS4qEYulglovpUCFWgrtn4f/7LA6rF32afY5cuzvk6zsnln/\nPWtmneRk+p9Zs26UtEcnJiLWA0uAwyQd0XavgKOBu+prSDpV0gpJ60v/HpX0uS7tnSxpuaSXy+/n\nCUnnDKbPZtZ/HrSZWb+Mk7R7y7FLS+wUYAE5nXoh8ARwEXBxM0jSJHKg80ngBmA2MACcDyyXNLoR\n3nlx9N3AeOAq4FJy4AY52LkAeASYB6wAlpIvF2++hPkmYGfg1JZ2zwQ2l7b3RNKlwA+Be8kp0Xe8\nwFrSfsBvgOnAT0o/bwFOAVZU93AhIDKjVptR+rJV+yRdV+p9CbgM+AawEfi5pHOr2PPI38vO5D2c\nCzwH3Cjp6l77bWZDICJ8+PDhY7sP4Fhy3drm8lkfdzRiP1zK/gPsV9XzO+BvVdmTwB+AcVX5tFLP\nGY2yRaVscUsbTyjnbqjKj+u0vVE2CvgL8FgVOxZ4GRgYxD15tnwuAcZsI/524B/A3lX5EcAbwOVV\n+UpgbbNOciD3ArAGGNUo/0RpwxUt1x0A1gFjy8/7koO5RS2xPwA21b83Hz58DN/hTJuZ9ct84NMt\nx7daYpdGxAtV2f3A+M60Z3my8jByHdfYZvaOzJa9BnymqiOA77Vc77Pl3PVbBUcsI9eYNcu2kNms\nIyV9rHHqZGAXBpFlIzN+AayKiDfaAiR9kMw83gFsqvr5PDnwq/u5ENgNOKlRNpkcdC0ufeg4nRy0\n3VpnQclB267AUSX288AYYFFL7J3kOuhPDaL/ZtZHfhDBzPplZUTc12Pscy1lL5bP3YENwMHl52+T\n03S1APZqa0dL2f68nfmqPQMcVJUtIKcRZwKdbTtmAv8iBzq9uo7Mul0kSRHx9ZaYj5LZvZnA2S3n\nA1hVlf2YvCczgJ+Vss7U6KIq9qBSf1vfO/Xv1YgV8EAPsWY2zDxoM7P/hW09zanq8/vAsi6xL9UF\nEbFxG3XHNs416/irpGXAFyVdTA76jgG+G4N7EnUDmeW7E5gnaVREzKtiOv28DVjcpZ7/Vu1bI+lX\nwGRJ+5TzU4FHIuKZlvrfBI6ne/9/34gN4DTg311iuw3+zGyIedBmZu9VnYzZ5kFk8LpZTWabJpCZ\ntaY6y9Yxn1wLdxIwiRzMDHrvs4h4XdJUct3a3JJxa266+2yp+/2D7OeC0r4zgfXATl3at5Kc0lwd\nEX9+lzo793xtH+65mfWZ17SZ2XtSRDxOZoBmSdq/Pi9ptKTdeqxugMwiza3qOIHug7Zfkov6ZwFn\nAA9HxJ96vN5WSvbvRGA5cKGk6xvn1pFPa06XdFTb9yV9qKV4gMyGnUVOjb5Kbtxbu5Xs+7VdtlTZ\ns/HjT8kHH66StFNL7K6SxrR20syGnDNtZtYvkySd3uXc0ojYsB11foncKuMpSQspT5ICHyG3x7iE\nHjaRjYi7ynTiOWXfs3uAA4BzySdUP97ynS3lmpeRmbBLtqP9zfpel3QimXG7QNLoiDi/nD4PeAh4\nUNItwOPkf6oPIJ+UXUy1ri8i3iyxnenWhRHxWst1H5P0ndKP30paQg5G9waOJB8W+UCJfV7SV4Ef\nAU9Luo18GGIP4HByCvZA8o0OZjbMPGgzs34Ick+xU7qcn8Dbi+k7+6m9e6URT0qaSO63NhX4Mrld\nyGpyKvDelnZ0Mx24mtx/7Thyi5HpZCZtQpfv3Ax8k8xiLemlzVVbtmpPRGySNA34BfCVMlU6p6yh\nm0TunzaNfOJzI7mFx+20Z9Agp0i/RvsDCM3rXiHp18AcMts4DvgnmcmcU8XeLOlpct+8WeTTpWuB\nP3Fr8H0AAADPSURBVJL3ottaNzMbYoro6W+nmdn/JUlPAe+LiENazo0nB043RcTsYW+cmVmD17SZ\n2Q5B+R7SumwKcCi51qzNbPLv5PwhbJqZWU+caTOzHYKka4CJ5Ca+r5R/n0W+5WBiRPy9EfsF8u0N\nVwL3R8SUYW+wmVnFgzYz2yFIOp5cM3YIuU5rHbkm7vKIWFXFbiH3PnsQmBERa4a5uWZm7+BBm5mZ\nmdkI4DVtZmZmZiOAB21mZmZmI4AHbWZmZmYjgAdtZmZmZiOAB21mZmZmI8Bb1NXMIKVQ18gAAAAA\nSUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "binwidth=0.25 # keV\n", + "\n", + "n_data, bin_edges_data, patches = plt.hist(E_Doke, bins=np.arange(0.05, 25 + binwidth, binwidth), normed=1, facecolor='none',edgecolor='black',linewidth=2, histtype='step', alpha=0.9)\n", + "plt.xlabel('Energy KeVee',fontsize=18)\n", + "plt.ylabel('normalized count',fontsize=18)\n", + "\n", + "left,right = bin_edges_data[:-1],bin_edges_data[1:]\n", + "bin_center_data=(right+left)/2\n", + "\n", + "\n", + "data_scale_factor=sum(n_data[bin_center_data>3])/sum(n_NEST_MAX[bin_center_NEST_MAX>3])\n", + "\n", + "plt.step(bin_center_NEST_MAX,n_NEST_MAX*data_scale_factor,'b',linewidth=2)\n", + "#plt.plot(T,N/scale_factor*data_scale_factor,'m',linewidth=2)\n", + "\n", + "plt.legend(('Beta w sigE','Beta','Data','Data with Beta values'))\n", + "plt.xlim([0,22])\n", + "#plt.yscale('log')" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmAAAAHfCAYAAAD3H2TtAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGexJREFUeJzt3W+spFd9H/Dvz7Wwl4Asl9bX0totVGBiUCvHURxV9MVG\nUQ1UFbao5NBUImmgQgICUt5gI1V2o1QKlYKgqswLIMFGINeJlBhUBAZZq4iqYBdwbLCDV6pMWJdd\naENorGSRjX99cZ/Fs7N3vXfvnzNzZz4faeSZc59n7pnx4/V3f+c851R3BwCAcS5adAcAANaNAAYA\nMJgABgAwmAAGADCYAAYAMJgABgAw2HkDWFVdVVUPVNW3qurRqvrNqf32qjpeVV+fHm+YOee2qjpW\nVY9X1Y0z7ddX1SNV9URVfWh/PhIAwHKr860DVlVXJrmyux+uqpck+VqSm5L8SpK/7u4Pzh1/bZJP\nJ/mFJFcl+VKSV3V3V9VXk7y7ux+qqs8l+XB3f2HPPxUAwBI7bwWsu09098PT86eTPJ7k8PTj2uKU\nm5Lc093PdveTSY4luWEKci/t7oem4+5OcvMu+w8AcOBc0Bywqnp5kuuSfHVqendVPVxVH6uqy6a2\nw0m+O3PaU1Pb4STHZ9qP5/kgBwCwNi7e7oHT8OMfJXlvdz9dVXcm+e1paPF3kvxekrfvRaeqyv5I\nAMCB0d1bjQqe07YCWFVdnM3w9cnuvm/6RT+YOeSjST47PX8qydUzP7tqajtX+5Yu9IOwO1V1R3ff\nseh+rBPf+Xi+8/F85+P5zsfbSeFou0OQv5/kse7+8Mwvu3Lm529O8s3p+WeSvKWqXlRVr0jyyiQP\ndveJJD+qqhuqqpK8Ncl9F9phAICD7rwVsKp6XZJ/k+TRqvpGkk7y/iS/WlXXJXkuyZNJ3pEk3f1Y\nVd2b5LEkzyR5Zz9/q+W7knwiyaVJPtfdn9/TTwMAcACcdxmKRaiqNgQ5VlUd6e6ji+7HOvGdj+c7\nH893Pp7vfLyd5BYBDABgF3aSW2xFBAAwmAAGADCYAAYAMJgABgAwmAAGADCYAAYAMJgABgAwmAAG\nADCYAAYAMJgABgAwmAAGADCYAAYAMJgABgAwmAAGADCYAAYAMJgABgAwmAAGADCYAAYAMJgABgAw\nmAAGADCYAAYAMJgABgAwmAAGADCYAAYAMJgABgAwmAAGADCYAAYAMJgABgAwmAAGADCYAAYAMJgA\nBgAwmAAGADCYAAYAMJgABgAwmAAGADCYAAYAMJgABgAwmAAGADCYAAYAMJgABgAwmAAGADCYAAYA\nMJgABgAwmAAGADCYAAYAMJgABgAwmAAGADCYAAYAMJgABgAwmAAGADCYAAYAMJgABgAwmAAGADCY\nAAYAMJgABgAwmAAGADCYAAYAMJgABgAwmAAGADCYAAYAMJgABgAwmAAGADCYAAYAMJgABgAwmAAG\nADCYAAYAMJgABgAwmAAGADCYAAYAMJgABgAwmAA2QNWhE1XVzz8OnVh0nwCAxanuXnQfzlJV3d21\n6H7slarqZPZ7rqzS5wOAdbaT3KICBgAwmAAGADCYAAYAMJgABgAwmAAGADCYAAYAMJgABgAw2HkD\nWFVdVVUPVNW3qurRqnrP1H55Vd1fVd+uqi9U1WUz59xWVceq6vGqunGm/fqqeqSqnqiqD+3PRwIA\nWG7bqYA9m+S3uvu1Sf5pkndV1c8muTXJl7r71UkeSHJbklTVa5LckuTaJG9McmdVnV6c7CNJ3tbd\n1yS5pqpev6efBgDgADhvAOvuE9398PT86SSPJ7kqyU1J7poOuyvJzdPzNyW5p7uf7e4nkxxLckNV\nXZnkpd390HTc3TPnHEhnbzG03W2GLsnOzgMAVsHFF3JwVb08yXVJvpJko7tPJpshraqumA47nOR/\nzJz21NT2bJLjM+3Hp/YD7NTGmVsMJUltnP+8H2dn5wEAq2Dbk/Cr6iVJ/ijJe6dK2HyCWL5NJQEA\nltC2KmBVdXE2w9cnu/u+qflkVW1098lpePH7U/tTSa6eOf2qqe1c7ef6nXfMvDza3Ue301cAgP1U\nVUeSHNnVe3Sfv3BVVXcn+T/d/VszbR9I8pfd/YGqel+Sy7v71mkS/qeS/GI2hxi/mORV3d1V9ZUk\n70nyUJL/luQ/d/fnt/h9F7yr+CJUVW8xlJj5vp99XGU75wEAy28nueW8AayqXpfkT5M8ms3U0Ene\nn+TBJPdms6r1nSS3dPdfTefcluRtSZ7J5pDl/VP7zyf5RJJLk3yuu9+7Vx9kEQQwAGBfAtgiHOwA\ndmk2J9nPE8AAYBXtJLdc0F2QbMeWdzguoiMAwJKyFREAwGACGADAYALY0rA6PgCsC3PAlobV8QFg\nXaiALbX5qpiKGACsAhWwpTZfFVMRA4BVoAIGADCYAHYBqg6dmB0SXHR/AICDyRDkBTm1cfaK9gAA\nF0YFDABgMAEMAGAwAQwAYDABDABgMAEMAGAwAQwAYDAB7ECxYTcArALrgB0oNuwGgFWgAgYAMJgA\nduAZlgSAg0YAO/BOD0ue8dgQyABgeZkDtpLm54qZJwYAy0QFDABgMAHsHKoOnZifW7XoPgEAq8EQ\n5Dmd2thiyYeF9AQAWC0qYAAAgwlgAACDCWAAAIMJYGvBYq0AsExMwl8L9pAEgGWiAra2VMUAYFFU\nwNaWqhgALIoKGADAYAIYAMBgAhgAwGACGADAYAIYAMBgAhgAwGACGADAYAIYAMBgAhgAwGAC2KTq\n0InZbXkW3R8AYHXZiuinTm2cuTVPLawnAMBqUwEDABhMAAMAGEwAAwAYTABjxiWZvRGh6tCJRfcI\nAFaRSfjM+HHmbkTYWFRPAGCVqYABAAwmgAEADCaAAQAMJoDxAuYn5ZuYDwB7wSR8XsD8pPzExHwA\n2D0VMACAwQQwAIDBBDAAgMEEMACAwQQwdq3q0Al3SgLA9rkLkj1wasMWRgCwfSpgAACDCWAAAIMJ\nYAAAg5kDxgXa3J5o0b0AgINMAOMCbbk90SI6AgAHliFIAIDBBDAAgMEEMACAwQQwAIDBBDAAgMEE\nMACAwQQwAIDBBDAAgMEEMACAwQQwAIDBBDAAgMEEMACAwQQwAIDBBDAAgMEEMACAwQQwAIDBBDAA\ngMHOG8Cq6uNVdbKqHplpu72qjlfV16fHG2Z+dltVHauqx6vqxpn266vqkap6oqo+tPcfBQDgYNhO\nBewPkrx+i/YPdvf10+PzSVJV1ya5Jcm1Sd6Y5M6qqun4jyR5W3dfk+SaqtrqPYeoOnSiqnr2sai+\nAADr57wBrLu/nOSHW/yotmi7Kck93f1sdz+Z5FiSG6rqyiQv7e6HpuPuTnLzzrq8F05tJJ0zHwAA\nY+xmDti7q+rhqvpYVV02tR1O8t2ZY56a2g4nOT7TfnxqYyVdkvkKY9WhE4vuFQAsi4t3eN6dSX67\nu7uqfifJ7yV5+951K6mqO2ZeHu3uo3v5/uynH+fsqmJtLKInALDXqupIkiO7eY8dBbDu/sHMy48m\n+ez0/KkkV8/87Kqp7VztL/Q77thJ3wAA9tNUFDp6+nVV3X6h77HdIcjKzJyvaU7XaW9O8s3p+WeS\nvKWqXlRVr0jyyiQPdveJJD+qqhumSflvTXLfhXaWg8ywJACcdt4KWFV9OptltpdV1V8kuT3JL1XV\ndUmeS/JkknckSXc/VlX3JnksyTNJ3tndp8ei3pXkE0kuTfK503dOsi4MSwLAafV8PloeVdXdvdVd\nlnv2/luEgZzZNv96p8c474Xa9vPfMwCMsJPcYiV8AIDBBDAAgMEEMBZofmK+SfkArIedrgMGe2B+\nYr5J+QCsBxUwAIDBBDAAgMEEMACAwQQwAIDBBDCWiO2KAFgP7oJkidiuCID1oAIGADCYAAYAMJgA\nBgAwmAAGADCYAMaSs18kAKvHXZAsOftFArB6VMAAAAYTwAAABhPAAAAGE8AAAAYTwAAABhPAAAAG\nE8AAAAYTwAAABhPAAAAGE8A4YOa3JrI9EQAHj62IOGDmtyZKbE8EwEGjAgYAMJgAxgowLAnAwWII\nkhVgWBKAg0UFDABgMAEMAGAwAQwAYDABDABgMAEMAGAwAQwAYDABDABgMAEMAGAwAQwAYDABDABg\nMAEMAGAwAYwVNb9Bt825AVgeNuNmRc1v0G1zbgCWhwoYAMBgAhgAwGACGGtifk6YeWEALI45YKyJ\n+TlhiXlhACyKChgAwGACGADAYAIYAMBgAhgAwGACGADAYAIYAMBgAhgAwGACGADAYAIYAMBgAhgA\nwGACGGvM/pAALIa9IFlj9ocEYDFUwOAFVB06oUoGwF5TAYMXdGpDlQyAvaYCBgAwmAAGADCYIUg4\nw+adkYvuBQCrTQCDM8zfGVmL6ggAK8wQJADAYAIYAMBgAhgAwGACGFwwWxgBsDsm4cMFs4URALuj\nAgYAMJgABgAwmAAGADCYAAYAMJgABgAwmAAGADCYAAYAMJgABgAwmAAGADCYAAYAMNh5A1hVfbyq\nTlbVIzNtl1fV/VX17ar6QlVdNvOz26rqWFU9XlU3zrRfX1WPVNUTVfWhvf8oAAAHw3YqYH+Q5PVz\nbbcm+VJ3vzrJA0luS5Kqek2SW5Jcm+SNSe6sqprO+UiSt3X3NUmuqar59wQAWAvnDWDd/eUkP5xr\nvinJXdPzu5LcPD1/U5J7uvvZ7n4yybEkN1TVlUle2t0PTcfdPXMOAMBa2ekcsCu6+2SSdPeJJFdM\n7YeTfHfmuKemtsNJjs+0H5/aAADWzsV79D69R+/zU1V1x8zLo919dK9/BwDAhaqqI0mO7OY9dhrA\nTlbVRnefnIYXvz+1P5Xk6pnjrpraztV+Tt19xw77BgCwb6ai0NHTr6vq9gt9j+0OQdb0OO0zSX59\n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\n7CeGLuFgOOABDGBdbGeNsbPWHIv5ZLCchgewqnpDVf15VT1RVe8b/fs5l6OL7sAaOrroDqyho4vu\nwAJsGdyGzSerqiOjfhebfOcHw9AAVlUXJfkvSV6f5LVJ/nVV/ezIPnAuRxfdgTV0dNEdWENHF92B\nJTF02Ysj+/jebO3IojvA+Y2ugN2Q5Fh3f6e7n0lyT5KbBvcBYM3NV8XOrohtdZPTfFDbzjHA1kYv\nQ3E4yXdnXh/PZig7S1V9dq7pju7+2n51DGB9bVbEzm6fb7p04+zjzn9M1aF/vzk/7afHPHfm6yS5\n9GT33155Yf2Gg2uZ1wH7l/Ovq2qLw7bTtp/nLWOfVv28ZezTqp+3jH1a9fNG92kre3XMfNiaf50k\np7YId+xUVd2+6D7wwkYHsKeS/IOZ11dNbWfo7u38Fw0AcCCNngP2UJJXVtU/rKoXJXlLks8M7gMA\nwEINrYB190+q6t1J7s9m+Pt4dz8+sg8AAItW3YbcAQBGWqqV8C3SOl5VPVlVf1ZV36iqBxfdn1VU\nVR+vqpNV9chM2+VVdX9VfbuqvlBVly2yj6vmHN/57VV1vKq+Pj3esMg+rpqquqqqHqiqb1XVo1X1\nnqndtb5PtvjOf3Nqd63vk6q6pKq+Ov0/89HTNzvs5DpfmgrYtEjrE0l+Ocn/zuZ8sbd0958vtGMr\nrqr+V5Kf7+4fLrovq6qq/lmSp5Pc3d3/ZGr7QJL/293/afrLxuXdfesi+7lKzvGd357kr7v7gwvt\n3IqqqiuTXNndD1fVS5J8LZvrPP7buNb3xQt8578S1/q+qaoXd/ffVNXfSfLfk7wnyb/KBV7ny1QB\ns0jrYlSW6zpYOd395STzAfemJHdNz+9KcvPQTq24c3znyfbWTGAHuvtEdz88PX86yePZvNPdtb5P\nzvGdH55+7FrfJ939N9PTS7I5l76zg+t8mf7Hu9UirYfPcSx7p5N8saoeqqp/t+jOrJEruvtksvmH\naJIrFtyfdfHuqnq4qj5mKGz/VNXLk1yX5CtJNlzr+2/mO//q1ORa3ydVdVFVfSPJiSRf7O6HsoPr\nfJkCGIvxuu6+Psm/SPKuaeiG8ZZjLsBquzPJP+ru67L5B6fhmX0wDYX9UZL3TlWZ+Wvbtb7HtvjO\nXev7qLuf6+6fy2aF94aqem12cJ0vUwDb1iKt7K3u/t70zx8k+eOcY2so9tzJqtpIfjqP4/sL7s/K\n6+4f9POTXj+a5BcW2Z9VVFUXZzMIfLK775uaXev7aKvv3LU+Rnf/vyRHk7whO7jOlymAWaR1sKp6\n8fQ3p1TVzyS5Mck3F9urlVU5c07GZ5L8+vT815LcN38Cu3bGdz79oXjam+Na3w+/n+Sx7v7wTJtr\nfX+d9Z271vdPVf2900O6VXUoyT/P5ty7C77Ol+YuyGRzGYokH87zi7T+7oK7tNKq6hXZrHp1NicS\nfsp3vveq6tNJjiR5WZKTSW5P8idJ/jDJ1Um+k+SW7v6rRfVx1ZzjO/+lbM6ReS7Jk0necXrOBrtX\nVa9L8qdJHs3mnymd5P1JHkxyb1zre+4FvvNfjWt9X1TVP87mJPuLpsd/7e7/WFV/Nxd4nS9VAAMA\nWAfLNAQJALAWBDAAgMEEMACAwQQwAIDBBDAAgMEEMACAwQQwAIDB/j9fVrWG9chI8wAAAABJRU5E\nrkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "num_data, num_data_bins, num_data_patches=plt.hist(E_Doke,bins=np.arange(0.05, 25 + binwidth, binwidth));" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAl0AAAHfCAYAAABqEm1lAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGxhJREFUeJzt3V2sZed5F/D/MzWO3Q9Moaot7Nht49BQi9YEYQIFaSBA\nHCMxFSCwWyk0F2gu6iaiEnIVCdk3SIBEUaIUBVOn4KqVSyMgvoiKi6IRohWuk8bUTcbYUVVjO/XQ\nQtOSNI4c++Fi71OfWT4zs8/HfvfX7ycd+ay137XPe7aXZv7zrHc9q7o7AAAs16lVTwAAYBcIXQAA\nAwhdAAADCF0AAAMIXQAAAwhdAAADLBS6qurOqnq6qp6pqvsOeP07q+qXqurlqvqRfftvqqpPVtVn\nq+qpqnrfSU4eAGBT1JX6dFXVqSTPJHlnki8keSLJ3d399L4x35LkliTfl+R3uvvH5vtvSHJDdz9Z\nVd+Y5NNJzuw/FgBgFyxS6bojybPd/Vx3v5LkkSRn9g/o7t/u7k8n+dpk/0vd/eT8+y8lOZ/kxhOZ\nOQDABlkkdN2Y5Pl92y/kCMGpqr4tye1JHj/ssQAAm+6qET9kfmnxY0neP694HTTG84gAgI3R3XWY\n8YuErheT3Lxv+6b5voVU1VWZBa6f6u6PX27sYSfP8VTVA939wKrnsUt85uP5zMfzmY/nMx/vKMWi\nRS4vPpHk1qq6paquTnJ3kkcvN4/J9keTfK67P3jYyQEAbIsrVrq6+9WqujfJY5mFtIe6+3xVnZ29\n3A9W1fVJPpXkm5K8VlXvT/JdSb4nyQ8keaqqPpOkk3ygu39+Sb8PAMBaWmhN1zwkfedk37/e9/2F\nJG8+4NBfTPJ1x5kgS3Vu1RPYQedWPYEddG7VE9hB51Y9gR10btUT4Mqu2KdrlKpqa7oAgE1wlNzi\nMUAAAAMIXQAAAwhdAAADCF0AAAMIXQAAAwhdAAADCF0AAAMIXQAAAwhdAAADCF0AAAMIXQAAAwhd\nAAADCF0AAAMIXQAAAwhdAAADCF0AAAMIXQAAAwhdAAADCF0AAAMIXQAAAwhdAAADCF0AAAMIXQAA\nAwhdAAADCF0AAAMIXQAAAwhdAAADCF0AAAMIXQAAAwhdAAADCF0AAAMIXQAAAwhdAAADCF0AAAMI\nXQAAAwhdAAADCF0AAAMIXQAAAwhdAAADCF0AAAMIXQAAAwhdAAADCF0AAAMIXQAAAwhdAAADCF0A\nAAMIXQAAAwhdAAADCF0AAAMIXQAAAwhdAAADCF0AAAMIXQAAAwhd+1Rd+1JV9cVf17502DEAAFPV\n3aueQ5Kkqrq7a9VzSKafR2X/vA4ec02Sr073Xej+yg3LmCcAsFpHyS1XLWsyu+WrOSCsXb+KmQAA\n68nlxaV5U1yCBAD2qHRd0ZvmlxQPa1r9UvkCgF2m0nVFe+Fp7+uoppUv1S8A2CU7G7oOugtxuT9x\nGt46ycuqXwCwI3b48uLL1x90pyIAwDLsbKULAGAkoQsAYICdCV3TNVyrns+MxfUAsCt2piP9GzvJ\nVw5e03Wlfcs/btWd+QGAyztKblmo0lVVd1bV01X1TFXdd8Dr31lVv1RVL1fVjxzmWKY0VQWAbXTF\nSldVnUryTJJ3JvlCkieS3N3dT+8b8y1JbknyfUl+p7t/bNFj973HiVW6ZkHloHYMm1Hpmh6n8gUA\n62VZla47kjzb3c919ytJHklyZv+A7v7t7v50kq8d9tjl2GsHcRJNTQEAjm+R0HVjkuf3bb8w37eI\n4xwLALA11qo5alU9sG/zXHefW9FUAAD+QFWdTnL6OO+xSOh6McnN+7Zvmu9bxKGO7e4HFnxfAIBh\n5oWgc3vbVXX/Yd9jkcuLTyS5tapuqaqrk9yd5NHLjN+/qOywxwIAbKUrVrq6+9WqujfJY5mFtIe6\n+3xVnZ293A9W1fVJPpXkm5K8VlXvT/Jd3f2lg45d2m8DALCmtrI56hsboSbr0PrhaMddk+SrkzHX\nXOj+yg0BAFZiac1R19n08T7r84ifk/LVvLH9xUE9yACAdbZWdy8ezV5Prv30EgUA1svGV7oAADaB\n0LWRps9n9IxGAFh3W3B5cRftrfPar6zzAoA1ptIFADCA0AUAMIDQtTWm67ys8QKAdWJN19aYrvOy\nxgsA1olKFwDAAEIXAMAAQhcAwAAbF7qmz1pc9XwAABaxgQvpp89a9JxFAGD9bVylCwBgEwldW8vz\nGQFgnWzg5UUW4/mMALBOVLoAAAYQunaKS44AsCouL+4UlxwBYFVUugAABhC6AAAGELoAAAYQugAA\nBhC6AAAGELoAAAYQugAABhC6AAAGWOvQVXXtS9MO6que0/aZdqnXoR4AlmHNO9K/fP0BHdRXMpPt\nNe1Sr0M9ACzDWle6AAC2hdAFADCA0AUAMIDQBQAwgNAFADCA0AUAMIDQxcS0b5feXQBwEta8Txfj\nTft2JXp3AcDxqXQBAAwgdAEADCB0AQAMIHSxAA/FBoDjspCeBXgoNgAcl0oXAMAAQhcAwABCFwDA\nAEIXAMAAQhcAwABCFwDAAEIXAMAAQhdHMG2WqmEqAFyJ5qgcwbRZaqJhKgBcnkoXAMAAQhcAwABr\ndXmx6rp/u+o5AAAsQ3VP1+asRlV18uNJar7nU0k+mgPWDk32TbcX3ee4ox938JjurgDADqiqPuzf\ne2sWul7L66HrkST3ZDNDybYfJ3QBsNuOErqs6eKEaCMBAJezVmu62GTaSADA5ah0AQAMIHQBAAwg\ndAEADCB0AQAMIHQBAAwgdAEADLBQ6KqqO6vq6ap6pqruu8SYD1XVs1X1ZFXdvm//P6yqX6uqX62q\nn66qq09q8gAAm+KKoauqTiX5cJJ3JbktyT1V9bbJmHcneUt3vzXJ2SQfme//40l+OMnbu/u7M+sL\ndveJ/gassWnDVM1SAdhdi1S67kjybHc/192vZPZ8njOTMWeSPJwk3f14kuuq/qAx5tcl+YaquirJ\n1yf5wonMnA2w1zB17+tlzVIB2FmLhK4bkzy/b/uF+b7LjXkxyY3d/YUk/yLJ/5rv+2J3/5ejTxcA\nYDMt9TFAVfVHMquC3ZLkd5N8rKq+v7t/5uAjHsjrD7x+bZlTAwBYWFWdTnL6OO+xSOh6McnN+7Zv\nmu+bjnnzAWP+apJf7+7/myRV9R+S/IUkC4SuRxaYGgDA8nX3uSTn9rar6v7DvscilxefSHJrVd0y\nv/Pw7iSPTsY8muQ980m8I7PLiBcyu6z4jqq6pqoqyTuTnD/sJAEANt0VK13d/WpV3ZvkscxC2kPd\nfb6qzs5e7ge7+xNVdVdVfT7Jl5O8d37sL1fVx5J8Jskr8/8+uKxfBgBgXVV3r3oOSZKq6tk6rv2X\nF+/J7K63i0ZO9k23F93nuKMfd/T37u4KAGy4qurD/p2mIz0AwABCFwDAAEIXA0071OtSD8DuWGqf\nLrjYXof6/UqXegB2gkoXAMAAQhcAwABCFwDAAEIXAMAAQhcr5o5GAHaDuxdZMXc0ArAbVLoAAAYQ\nugAABhC6AAAGELoAAAYQugAABhC6AAAGELoAAAYQulhD04apmqUCsPk0R2UNTRumapYKwOZT6QIA\nGEDoAgAYQOgCABhA6AIAGEDoAgAYQOgCABhA6AIAGEDoYgNMm6VqmArA5tEclQ0wbZaaaJgKwKZR\n6QIAGEDoAgAYQOgCABhA6AIAGEDoAgAYQOgCABhA6GJD6d0FwGbRp4sNpXcXAJtFpQsAYAChCwBg\nAKELAGAAoQsAYAChCwBgAKELAGAAoYstMu3dpW8XAOtDny62yLR3l75dAKwPlS4AgAGELgCAAYQu\nAIABhC4AgAGELgCAAYQutti0hYQ2EgCsjpYRbLFpC4lEGwkAVkWlCwBgAKELAGAAoQsAYAChCwBg\nAKELAGAAoQsAYAChCwBgAKELAGAAoYsdo0s9AKuhIz07Rpd6AFZDpQsAYAChCwBgAKELAGAAoQsA\nYICFQldV3VlVT1fVM1V13yXGfKiqnq2qJ6vq9n37r6uqn6uq81X12ar6cyc1eQCATXHF0FVVp5J8\nOMm7ktyW5J6qettkzLuTvKW735rkbJKP7Hv5g0k+0d1/Msn3JDl/QnMHANgYi1S67kjybHc/192v\nJHkkyZnJmDNJHk6S7n48yXVVdX1V/eEkf6m7f3L+2te6+/dObvpwEqa9u/TtAuDkLRK6bkzy/L7t\nF+b7Ljfmxfm+b0/y21X1k1X1K1X1YFVde5wJw8nb69219/Wyvl0AnLhlL6S/Ksnbk/x4d789ye8n\n+dEl/0wAgLWzSEf6F5PcvG/7pvm+6Zg3X2LM8939qfn3H0ty4EL8mQeS1Pz71xaYGgDA8lXV6SSn\nj/Mei4SuJ5LcWlW3JPnNJHcnuWcy5tEkP5TkZ6vqHUm+2N0X5pN8vqr+RHc/k+SdST536R/1QF4P\nXY8s/lsAACxRd59Lcm5vu6ruP+x7XDF0dferVXVvkscyuxz5UHefr6qzs5f7we7+RFXdVVWfT/Ll\nJO/d9xbvS/LTVfWHkvz65DUAgJ1Q3dOH/65GVfXskuL+Stc9OeDhxJN90+1F9znu6Met45xO9rju\nrgDAJVRVH/bvCh3pAQAGELoAAAYQugAABhC6AAAGELoAAAYQuuANps9i9DxGAI5vkeaosGP2nsW4\nX3keIwDHotIFADCA0AUAMIDQBQAwgNAFC7G4HoDjsZAeFmJxPQDHo9IFADCA0AUAMIDQBQAwgNAF\nADCA0AUAMIDQBQAwgNAFADCA0AUAMIDQBQAwgNAFRzZ9NJDHAgFwaR4DBEc2fTSQxwIBcGkqXQAA\nAwhdAAADCF0AAAMIXQAAAwhdAAADCF0AAAMIXXBipn279O4C4HX6dMGJmfbtSvTuAmCPShcAwABC\nFwDAAEIXAMAAQhcAwABCFwDAAEIXAMAAQhcAwABCFyyVhqkAzGiOCkulYSoAMypdAAADCF0AAAMI\nXQAAAwhdAAADCF0AAAMIXQAAAwhdAAADCF0w3LRhqmapALtAc1QYbtowVbNUgF2g0gUAMIDQBQAw\ngNAFADCA0AUAMIDQBQAwgNAFADCA0AUrN+3bpXcXwDbSpwtWbtq3K9G7C2D7qHQBAAwgdAEADCB0\nAQAMIHQBAAwgdAEADCB0AQAMIHTBWpr27tK3C2DT6dMFa2nau0vfLoBNp9IFADDAQqGrqu6sqqer\n6pmquu8SYz5UVc9W1ZNVdfvktVNV9StV9ehJTBoAYNNcMXRV1akkH07yriS3Jbmnqt42GfPuJG/p\n7rcmOZvkI5O3eX+Sz53IjAEANtAila47kjzb3c919ytJHklyZjLmTJKHk6S7H09yXdVsDUpV3ZTk\nriQ/cWKzBgDYMIuErhuTPL9v+4X5vsuNeXHfmH+Z5B/ljU/0BQDYGUu9e7Gq/kaSC939ZFWdTlKX\nP+KBfUNeW+bUAAAWNs8xp4/zHouErheT3Lxv+6b5vumYNx8w5u8k+ZtVdVeSa5N8U1U93N3vOfhH\nPZDXQ9cjC0wNdsWsb9fF+6650P2VG1YzH4Dd0t3nkpzb266q+w/7HotcXnwiya1VdUtVXZ3k7iTT\nuxAfTfKe+STekeSL3X2huz/Q3Td393fMj/vkpQMXcGl7fbv2f72sdxfABrlipau7X62qe5M8lllI\ne6i7z1fV2dnL/WB3f6Kq7qqqzyf5cpL3LnfaAACbpbrXY3377NLJa7n48uI9eeP6+5rsm24vus9x\nRz9uHee07ccdPKa7r7BOEoBlqKo+7J/BOtIDAAwgdAEADCB0AQAMIHQBAAwgdAEADCB0AQAMIHTB\nxpp1qb/469qXVj0rAA621GcvAsu016V+v9KlHmBNqXQBAAwgdAEADCB0AQAMIHQBAAwgdAEADCB0\nwVaZtpHQQgJgXWgZAVtl2kZCCwmAdaHSBQAwgNAFADCA0AUAMIDQBQAwgNAFW81DsQHWhbsXYat5\nKDbAulDpAgAYQOgCABhA6AIAGEDoAgAYQOgCABhA6AIAGEDoAgAYQOiCnaNhKsAqaI4KO0fDVIBV\nUOkCABhA6AIAGEDoAgAYQOgCABhA6AIAGEDoAgAYQOgCABhA6ALyxoapmqUCnDTNUYG8sWGqZqkA\nJ02lCwBgAKELAGAAoQsAYAChCwBgAKELOMD0bkZ3NAIcl7sXgQNM72ZM3NEIcDwqXQAAAwhdAAAD\nCF0AAAMIXQAAAwhdwILc0QhwHO5eBBbkjkaA41DpAgAYQOgCABhA6AIAGEDoAgAYQOgCABhA6AIA\nGEDoAo5h2rtL3y6AS9GnCziGae8ufbsALkWlCwBgAKELAGAAoQsAYAChCwBgAKELAGAAoQs4QdMW\nEtpIAOxZKHRV1Z1V9XRVPVNV911izIeq6tmqerKqbp/vu6mqPllVn62qp6rqfSc5eWDd7LWQ2P/1\nsjYSAFkgdFXVqSQfTvKuJLcluaeq3jYZ8+4kb+nutyY5m+Qj85e+luRHuvu2JH8+yQ9NjwUA2AWL\nVLruSPJsdz/X3a8keSTJmcmYM0keTpLufjzJdVV1fXe/1N1Pzvd/Kcn5JDee2OwBADbEIqHrxiTP\n79t+IW8MTtMxL07HVNW3Jbk9yeOHnSQAwKYb8higqvrGJB9L8v55xesSHkhS8+9fW/q8gBFmi+sv\n3nfNhe6v3LCa+QAcXlWdTnL6OO+xSOh6McnN+7Zvmu+bjnnzQWOq6qrMAtdPdffHL/+jHsjroeuR\nBaYGrL/p8xkTz2gENk13n0tybm+7qu4/7HsscnnxiSS3VtUtVXV1kruTPDoZ82iS98wn8Y4kX+zu\nC/PXPprkc939wcNODgBgW1yx0tXdr1bVvUkeyyykPdTd56vq7OzlfrC7P1FVd1XV55N8OckPJklV\nfW+SH0jyVFV9JrN/7n6gu39+Sb8PAMBaqu5p2X81Zms+XsvFlxfvyQGXJSb7ptuL7nPc0Y9bxzlt\n+3HrOKfjHdfdFYANVVV92D/HdKQHABhA6AIAGEDoAlZg+oxGz2cEtt+QPl0AF5u2kdBCAth+Kl0A\nAAMIXQAAAwhdAAADCF3AGpgurLe4Htg+FtIDa8DzGYHtp9IFADCA0AUAMIDQBQAwgNAFADCA0AWs\nKXc0AtvF3YvAmnJHI7BdVLoAAAYQugAABhC6AAAGELqADTJdXG9hPbA5LKQHNsh0cb2F9cDmUOkC\nABhA6AIAGEDoAgAYQOgCABhA6AI2mEcFAZvD3YvABvOoIGBzqHQBAAwgdAEADCB0AVvGOi9gPVnT\nBWwZ67yA9aTSBQAwgNAFADCA0AUAMIDQBeyA6eJ6C+uB8SykB3bAdHG9hfXAeCpdAAADCF0AAAMI\nXQAAAwhdwA7StR4Yz0J6YAfpWg+Mp9IFADCA0AWQRC8vYNlcXgRIopcXsGwqXQAAAwhdAAADCF0A\nB9JWAjhZ1nQBHEhbCeBkqXQBLEz1Czg6lS6Ahal+AUen0gUAMIDQBQAwgNAFADCA0AVwLB4fBCzG\nQnqAY/H4IGAxKl0AJ0pbCeBgKl0AJ0pbCeBgKl0AS6f6Bah0AQyg+gWodAGsiLseYdeodAGshLse\nYdeodAEADCB0AawFi+1h27m8CLAWLLaHbafSBbC2Dqx+vaoaBptJpQtgbR1Y/TplAT5sJpUugI1m\nLRhsioVCV1XdWVVPV9UzVXXfJcZ8qKqeraonq+r2wxzLqpxb9QR20LlVT2AHnVv1BJZsrxp20df1\nqwxiVXV61M9ixme+Ga4YuqrqVJIPJ3lXktuS3FNVb5uMeXeSt3T3W5OcTfKRRY9llc6tegI76Nyq\nJ7CDzq16AiuwSBCbrg070WB2+oTeh8WdXvUEuLJFKl13JHm2u5/r7leSPJLkzGTMmSQPJ0l3P57k\nuqq6fsFjAVi6aRB7+dSCFTIL9+GELLKQ/sYkz+/bfiGzMHWlMTcueOw+f+V3k5p//9LVSa5dYH4A\nnIhFFu5fc31VTQZd89osxO07qq79xxfve+OY5JoL3V+54djThg2xrLsX68pDDnLuusXearpvkTGO\nO9nj1nFO237cOs5p249bxzmtw3FT0zB10L4DxxwQ4Diqqrp/1XPg8hYJXS8muXnf9k3zfdMxbz5g\nzNULHJsk6e4jBjUAgPW3yJquJ5LcWlW3VNXVSe5O8uhkzKNJ3pMkVfWOJF/s7gsLHgsAsPWuWOnq\n7ler6t4kj2UW0h7q7vNVdXb2cj/Y3Z+oqruq6vNJvpzkvZc7dmm/DQDAmqpul9MBAJZt5R3pNU8d\nr6p+o6r+R1V9pqp+edXz2UZV9VBVXaiqX92375ur6rGq+p9V9Z+r6oAbRziqS3zm91fVC1X1K/Ov\nO1c5x21TVTdV1Ser6rNV9VRVvW++37m+JAd85j883+9cX5KqelNVPT7/O/OpvRsWjnKer7TSNW+e\n+kySdyb5QmZrwO7u7qdXNqkdUFW/nuTPdPfvrHou26qq/mKSLyV5uLu/e77vnyX5P939z+f/wPjm\n7v7RVc5zm1ziM78/yf/r7h9b6eS2VFXdkOSG7n6yqr4xyacz68X43jjXl+Iyn/nfi3N9aarq67v7\n96vq65L8YpL3JfnbOeR5vupKl+apq1FZ/f/7rdbd/y3JNNSeSfLv5t//uyTfN3RSW+4Sn3ly5BY2\nXEl3v9TdT86//1KS85ndpe5cX5JLfOY3zl92ri9Jd//+/Ns3ZbYevnOE83zVf/Feqqkqy9VJfqGq\nnqiqf7DqyeyQb53f1ZvufinJt654Prvi3vkzYX/CZa7lqapvS3J7kv+e5Hrn+vLt+8wfn+9yri9J\nVZ2qqs8keSnJL3T3EznCeb7q0MVqfG93vz3JXUl+aH5ZhvHcxbJ8/yrJd3T37Zn9YenSyxLML3N9\nLMn759WX6bntXD9hB3zmzvUl6u7XuvtPZ1bJvaOqbssRzvNVh65FGq9ywrr7N+f//a0k/zGXfTQT\nJ+jC/Jmke+sy/veK57P1uvu3+vWFq/8myZ9d5Xy2UVVdldlf/j/V3R+f73auL9FBn7lzfYzu/r0k\n55LcmSOc56sOXZqnDlZVXz//F1Kq6huS/PUkv7baWW2tysVrLB5N8oPz7/9+ko9PD+DYLvrM538Q\n7vlbca4vw0eTfK67P7hvn3N9ud7wmTvXl6eqvmXvcm1VXZvkr2W2lu7Q5/nK+3TNb2v9YF5vnvpP\nVzqhLVdV355ZdaszWwz40z7zk1dVP5PkdJI/luRCkvuT/KckP5fZI7OeS/J3u/uLq5rjtrnEZ/6X\nM1vz8lqS30hydm8NBsdXVd+b5L8meSqzP1M6yQeS/HKSfx/n+om7zGf+/XGuL0VV/anMFsqfmn/9\nbHf/k6r6oznkeb7y0AUAsAtWfXkRAGAnCF0AAAMIXQAAAwhdAAADCF0AAAMIXQAAAwhdAAAD/H/Q\nol8Il1E5egAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "num_sim, num_sim_bins, num_sim_patches= plt.hist(E_com_Tsim_NEST_MAX, bins=np.arange(0.05, 25 + binwidth, binwidth),normed=1);" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:4: RuntimeWarning: divide by zero encountered in true_divide\n", + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:4: RuntimeWarning: invalid value encountered in true_divide\n" + ] + } + ], + "source": [ + "\n", + "\n", + "SimToData_scale_factor=sum(num_data[bin_center_data>3])/sum(num_sim[bin_center_NEST_MAX>3])\n", + "frac_res=(num_data-num_sim*SimToData_scale_factor)/sqrt(num_data)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAoYAAAIDCAYAAACZ998SAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xe4HGXZx/HvL71CgNB7C0V6BwUCgiIK0lWkSItKxxdU\nQEmkCC+gQCgqNSBI9430ngABQg+EmlASIEAghCSkl3O/f8ys2ezZ03L2nC3z+1zXXJuZeXb2Xm5O\ncp9nnnkeRQRmZmZmZh3KHYCZmZmZVQYXhmZmZmYGuDA0MzMzs5QLQzMzMzMDXBiamZmZWcqFoZmZ\nmZkBLgzNzMzMLFURhaGkdSWdLek5SV9ImibpVUlnSOpR0HagpLoi2wJJvylybUk6RdLbkmZJ+kjS\nxYXXzWvfT9JQSZMlTZf0lKRd2uq7m5mZmVWKTuUOIHUkcCxwD3AzMA/YBTgXOFDSdhExJ699ACcD\nXxVc5+Ui174UOAG4G7gY2AA4EdgM2C2/oaS1gOeAucAFwDTgGOBhSXtExBOt+I5mZmZmFU2VsPKJ\npC2AsRHxTcHxc4AzgBMi4qr02EDgLGDNiPioietuCIwG7o6Ig/KOHw8MBg6OiNvyjt8B7AtsERGj\n02M9gTeBWRGxQau/rJmZmVmFqohbyRHxSmFRmLodELBRkXOS1FtSx0YufXD6emnB8WuAmcAheRfr\nAewFDMsVhWlsM4BrgX6Stmryy5iZmZlVqYooDBuxavo6seC4gNeBqcBsSc9I2qPI+7cC6oAX8w+m\nt6VHAVvnHd4E6AqMLHKdkelnbl3knJmZmVlNqNjCUFIH4I8k4w3/lXdqCvAP4Hhgb+D3wGrA/ZIO\nK7jMSsCkiJhX5CMmAH0ldcprmzterC3Ayi39HmZmZmbVolIePinmMmBb4PSIGJs7GBGXFbS7T9L1\nJOMAL5F0V0TMTM/1AOZQ3Oy8NtPSVxpon9/WzMzMrCZVZGGYPnRyHPD3iLiwqfYR8bWkvwMDgR2A\nx9JTM4FlG3hbt7w2+a9dm9G2MN7yP8FjZmZm1kwRoWLHK64wlDQIOBO4LiKObcFbx6WvffOOfQps\nIKlzkdvJK5PcZp6f1zZ3vFDuWLHbzEDD/4GttkkaFBGDyh2HtT/nPruc+2yqpbw31qFVUWMM06Lw\nLOCGiDimhW/vl77mP6jyIsl33Kbgc7qSzGOY/1DKaJLbyNsXufb2JHMnvtTCmKz2rVHuAKxs1ih3\nAFY2a5Q7ACuLNcodQHuomMJQ0lkkReGNEXFUA206SlqiyPFVgV8Dk4Bn807dnr6eXPCWAUB34Jbc\ngXRamnuB/pI2zrt2L+BoYExEvIiZmZlZjaqIW8mSjgMGAeOBJyT9vKDJxIh4DOgFfChpKPA28DWw\nPnAU0BP4af4KKRHxhqQrgeMk3Q08AGxIshLK8Ii4teBzTgd2BR6VdAnJQykDgBWBPUv4la12DCl3\nAFY2Q8odgJXNkHIHYGUxpNwBtIdKWfnkBqBwqpl8T0bErpK6AFeQPK28CkmhOAkYAVwYEfWWxJMk\nkh7DASTdwJOA24CBeU8v57dfj2Q5vJ2BLiTL7A2KiGGNxB8eY2hmZmbVoLG6pSIKw2rnwjC7JPWP\niOHljsPan3OfXc59NtVS3hurWypmjKGZmZmZlZd7DEvAPYZmZmZWLdxjaGZmZmZNcmFo1gqS+pc7\nBisP5z67nPtsykreXRiamZmZGeAxhiXhMYZmZmZWLTzG0MzMzMya5MLQrBWyMubE6nPus8u5z6as\n5N2FoZmZmZkBHmNYEh5jaGZmZtXCYwzNzMzMrEkuDM1aIStjTqw+5z67nPtsykreXRiamZmZGeAx\nhiXhMYZmZmZWLTzG0MzMzMya5MLQrBWyMubE6nPus8u5z6as5N2FoZmZmZkBHmNYEh5jaGZmZtXC\nYwzNzMzMrEkuDM1aIStjTqw+5z67nPtsykreXRiamZmZGeAxhiXhMYZmZmZWLTzG0MzMzMya5MLQ\nrBWyMubE6nPus8u5z6as5N2FoZmZmZkBHmNYEh5jaGZmZtXCYwzNzMzMrEkuDM1aIStjTqw+5z67\nnPtsykreXRiamZmZGeAxhiXhMYZmZmZWLTzG0MzMzMya5MLQrBWyMubE6nPus8u5z6as5N2FoZmZ\nmZkBHmNYEh5jaGZmZtXCYwzNzMzMrEkuDM1aIStjTqw+5z67nPtsykreXRiamZmZGeAxhiXhMYZm\nZmZWLRqrWzq1dzCWHZJuBzZtpMmNEXF+e8VjZmZmjfOtZGtLPYElGtm6lS+00sjKmBOrz7nPLuc+\nm7KS94ooDCWtK+lsSc9J+kLSNEmvSjpDUo8i7ftJGippsqTpkp6StEsD15akUyS9LWmWpI8kXVzs\nui29tjXbz4AN8rb/LW84ZmZmVkxFFIbAkcBJwHvAn4BTgXeAc4FnJHXNNZS0FvAcsC1wQdq2J/Cw\npF2LXPtS4C/AG8DxwB3AicA9hQ0X49rWPNMjYmpuA2aVO6BSiYjh5Y7BysO5zy7nPpuykvdKGWN4\nJ/DniPgm79jVkt4DzgCOAq5Kj19Achtyi4gYDSDpn8CbwJUkPVKkxzckKQbvioiD8o6PAwZL+mlE\n3Jb3mc2+tpmZmVmtqYgew4h4paAozLkdELARQHr7dy9gWK5wS98/A7gW6Cdpq7z3H5y+Xlpw3WuA\nmcAhuQOLcW2zzIw5sfqc++xy7rMpK3mvlB7Dhqyavn6evm4CdAVGFmk7kqSI3Bp4KT22FVAHvJjf\nMCLmSBqVts1p6bUzRdI6NN5jOisiHmv5ZVX0l5OIqGvhtczMzKyVKrYwTAuGPwLzgFvTwyulrxOK\nvCV3bOW8YysBkyJiXgPtt5fUKSLmL8a1s+b7wJmNnJ8AtLQwPDrdCk0ENm/htcoiK2NOrD7nPruc\n+2zKSt4rtjAELiN5COT0iBibHss9STynSPvZBW1yfy7WtrD9tMW4dlZ9ALyVt98DWJwHc4rNrO5J\nws3MzMqoIsYYFpJ0DnAc8I+IuDDv1Mz0tWv9d/13TryZecdmNtC2WPuWXjurHoqIAbkN+H1LLxAR\nV0fEyoUbVdJLmC8rY06sPuc+u5z7bMpK3iuux1DSIJJbltdFxLEFpz9NX4vd0s0dy78V/CmwgaTO\nRW4nr0xym3n+Yl67MO4hwLh0dwowKtftnPufqcr31837roucB7oAK0j6Y7q/Rvq6Svq6paTeTX0e\n8Hb62ktS/wr7/t73/iL7OZUSj/fbdX8zoJLi8b73G91P9Wfhv88Nqqi1kpUUhWcBN0TEUUXO9wQm\nASMiYveCc38EBgHbRcSL6bFzSKa72Skinslr2xX4ChgeET9anGsXnI+o4rWSJbYDlgaGRRSfY1DS\ncSQF+1UQfyZ5EKUb3NoH/vQvmB3JHffZAd9E8szPf+0VES83HYeWB14FJkZE1fUempmZVYPG6paK\n6TGUdBZJUXhjsaIQICJmSLoX2FfSxrFwrsFeJA8xjCko3G4nKQxPBp7JOz4A6A7c0oprVz2JbwEX\nAT9ID82QeAD4N3B/BHlTCK3eDbbvBsfvS3Kbf4Xk+M/SLd/cOTBhPIz5AEZ+CPNaegu+g6TeDZyb\nFQt7ec3MzKyEKqLHMO2NuhwYT1IcFk5VMjHSqVAkrQ08D8wHLiF5cGQA8C1gzyiYMkXSYJJCZijw\nALAhcALwdER8t6Bti66d976q6jGUWIFkhZmjScaZTiNZdWaLvGZzgEdIpufpDwt2ho75Y1I/Ab4k\nGZPZlWQcZu61V5GPfY/kv+0YkgdY3k9fv4hIHkTJ6zFszH4RUWxKobJQ3i1vyxbnPruc+2yqpbxX\nQ4/hVkAAqwFDipx/knQqlIh4X9K3SVYp+R3J+LaXge9HxLAi7z0J+JCkwNuT5HbxZcDAwoaLce2q\nItET+A3Jd+sJLCBZ0eVPEXwpsRqwH7A/8G2SCb/3St8dMHIuvD8cfn4q8EauoCvyOcsD2wHbp69b\nA+ukW6HpEh8AD8OQO+EX0xsIP1ds/ltSscLwoYi4urHvb2ZmZo2riB7DalfJPYYSywDfBXYnKfKW\nT0/dA/w2gncbeN+KwD4kvaXPwPqrwLunAFdFxLktjKETsDGwJbA2sFb6ujbQJ69pAA+SFKsPR7Bg\n4TX0fyTTFzVkSESc0ZK4zMzMsqgaegytRCS6kPT27Q58j+T2cH7yXwH+JyJ5oq7++/U36vfsrQf0\nXdyYIphPcou43m1iiaVIVp05EvgJSa/unsCHEn8DbopgIvAHknWsC/2A4pNkm5mZWQu5MKwBEkuQ\nFEg/Bn7IogXUXGAE8Gi6vdLQLeDU2iS9hO0igq9Jhgo8KfE/JAXir4E1gQuBCyU+hniVpKjNFZif\nRBCS1m+vWIuppTEn1jLOfXY599mUlby7MKxS6Ti+/UiKwV2Bznmn3wIeIikEn4pYrIm5jwPGFjk+\naTGu1SwRTCIpBP8C7AEcSzLv0qrptnde888lTk+enfGyymZmZqXgMYYl0J5jDCVEcuv0ryx8IKOO\nZDqeocB/Inh/8a+vR4CNSB64Gd3KcFtNoiPJ5NpbkKyMktuWTlq88xLsuApMusFjDM3MzJrmMYY1\nQmJl4FqS3jRIegRvBe6L4MuyBdaG0gdQ3km3f8F/i+NDgStg/a1gdB0MWjedpLzINWJGuwVsZmZW\nxSpyrWRblIQkDgHeICkKvyaZVfr7EdxQq0VhQyKICG4CNoFPxsIKHeDvB8DfJkL3sSS3wHPbC20Z\nS+HyaJYdzn12OffZlJW8uzCscBLLAXcD/ySZ2uV+4FsR3NbEQyQ1L4JxsO45cM5kmAf8qieMWiYZ\ndtk5t7RfB0nLN7B1KV/0ZmZmlcdjDEugrcYYSmxJMq/fssA3JJN1D2nLgrDSxhg2V/rf6haSqXWA\nuq/h5q5w52x4eE5SOBZVbA3nhyPiijYJ1MzMrMw8xrAKSaxP8mRxX2AYcEQE40tzbXUmecq3mK6l\n+Iz2FsHLEluQrOxyMHTYAA4DDusBUxfAw1Phjilw7zcwd7m8t25Z5HJFJ/02MzOrde4xLIFS9xhK\nrErylPGqJD2G+0Qwt3TX15rp9RtTVT2GhSS+BRyYbhvmnZoMnz8Ojw2Hk16GyQvyzuWmyPlXRJza\nvM/JxrxWVp9zn13OfTbVUt7dY1hFJPoCj5AUhc8CB5SyKCwwH/i4gXNt9ZntIoI3gTeBQRIbkhSI\nBwEbwgoHwiEHwiFfkozfvBV4GrRe+SI2MzMrP/cYlkCpegwlegNPAFsBo4Gd05VBSiqvx3BcROxQ\n6utXMomNSJbe+wnJ/Ig5/webPgyvDwRuA04r9v6IWFDsuJmZWbVorG5xYVgCpSgMJboCD5CsYvIh\n8O0IPitFfPU/K7uFYU46F+KmJAXiscASMHMKHFgHD8xp4G3TI6JfuwVpZmbWBhqrWzxdTQVIV/f4\nF0lROBHYva2KQkukcyGOiuB0kgLxGejRB+5fGi7vDV3rSFaUyV9vr5ekWwq2R9PXzcryRaxssjKn\nmdXn3GdTVvLuwrAy/JVk3eOpwPdas6SdtVwyHyL9gT8CC+D4XjD7K4jvR8Qq/HcKHAB2Kdg2T1+X\nbtegzczM2oBvJZdAa24lS+wD/B/JRHu7RjCipMEV/UzfSm6IxLYk8yGuDcwGroPZT8MBC+D+yUXe\n8ltgE+CQiHiiHUM1MzNbLL6VXKHSaWmuT3d/1x5FoTUugudJegGvB7oBx0G32+C+OyGuhjgUYk2I\nsWkh+FVZAzYzMyshF4ZlItGJpGdqKZKHTi4tb0SWE8E3ERwFbA8MBB4FZpD0Iv4CuBYYK7E/sFxD\n17HalpXxRlafc59NWcm75zEsnz8AOwKfAb/I+rrHlSiCkcBI+G8hvylJzvYAvg/cCYeNgZvKF6SZ\nmVkJeYxhCbR0jKHEziTzFQrYLYI2GZsmqaGY1gRG4DGGiyWd6uYM4NzkyMXT4fc/jpjvMYZmZlbx\nPI9hG2tJYSixDPAasDJwXgR/aMO4TqGBiZpTLgxbQeJIWHAtdBS89xCss3cE88odl5mZWWP88EmF\nSHuabiApCp8FBpU1IGuVCK6HPV6DWQHr7AEMlehZ7risfWRlvJHV59xnU1by7sKwfR0P7AVMAQ6O\nYH47fe6lEbFSkc29ha322CTY/SuYOw3YE3hCYsVyR2VmZrY4XBi2E4llgQvT3aMjGF/OeKxkvoBn\n5sHWn8KEOcA2MPUj6bixUofnJP2x3AFa24iI4eWOwcrDuc+mrOTdhWH7GUAyL979Edxd7mCs1F5f\nEraZAo/OgSU7wZXrwH2bwXqrlTsyMzOz5nJh2A4kOgPHpruer7C23AXskGyfbgd7rQ9v/hbmzIY9\nu8FLh0gcnI4vtRqSlfFGVp9zn01ZybvnMWwf+wMrAW8Bj5c5FiutryNiXMGxi6TvT4ffXgLf7Qbc\nAk8Mlo4eCx/OTdvMi4jd2jdUMzOzxrnHsH2clL4O9kTWtaXhMSePfAW7T4bjpsI3AbsuA+9sB3ds\nDd/eEFinPeO00svKeCOrz7nPpqzk3YVhG5PYBtiO5Enkm8scjrWfhyD6w1XbwJ93gckPQ+c6OLA7\njOgLr6wocahE13IHamZmluPCsO2dmL5eE8GMskZiJdfQmJOImBYRY5Lt/Ccjlt4DtDbM/QtMDti8\nC8laeh9J/EGik6QVJa3TyLZ8u345a1RWxhtZfc59NmUl7x5j2IbS+ewOAuqAK8scjpVZBOOkrmdC\nz5/D4Z3hyk9I1l8+B9gRlp8EE3dp5BJDWfgQk5mZWcm5x7Bt/QroDAz1vIW1afHGnMwIuGo6sDnw\nPeDL5PXFPWGdjsBE4P287YtSxWulk5XxRlafc59NWcm7C8M2ko4d+1W6O7icsVhFEmgV0Dtw2T4w\ndwys2gee6wtn3xgRO+Y24E/lDtbMzLLBhWHb+QmwHPAa8FSZY7E20ooxJ52B55Pt5Ltg+SXgiTnQ\ntwOceaHEz0sXpbWFrIw3svqc+2zKSt49xrANpJMZ5x468RQ1li+AT+ofngLs8TFctzocuhxws0Q/\n3FtoZmbtyIVh29gB2BKYBPyrzLFYG2rpmJOImAts01gbiRNIVsg5C9gNTvy3RyNUnqyMN7L6nPts\nykrefSu5beR6C6+OYHZZI7GqE8HlwI9IHjrZAS69CK5bElbznIdmZtamXBiWmMSqJEvgLQCuKnM4\n1sbaasxJBA8C/YBLIOrgyB7w1s8ljpXc018JsjLeyOpz7rMpK3l3YVh6RwIdgbsimFDuYKx6RTA1\ngt/A0afA8DnQsyvJfJgvSWxf7vjMzKz2uDAsvQuAw4H/LXcg1vbaZ8zJDZ/ArpPhNw8B40kmxX5a\n4neSf4bLJSvjjaw+5z6bspL3ivhHRdLpku6Q9L6kOkkfNNJ2YNqmcFsg6TdF2kvSKZLeljRL0keS\nLpbUo4Hr95M0VNJkSdMlPSWpsdUoFhHBnAhuiuDV5r7HrGkBXPIhsCFwMUmv9AXAvRJ9yxmZmZnV\njoooDIHzgF2A94Cvm9E+gJOAQ/K2Q4H7i7S9FPgL8AZwPHAHycMh9xQ2lLQW8BywLck/uqcCPYGH\nJe3aom9kmdDeY04imBnBacBewGRgT+BViW+3ZxyWnfFGVp9zn01ZyXulDGJfKyLGAUgaTVKMNeU/\nEfFRYw0kbUhSDN4VEQflHR8HDJb004i4Le8tFwBLAFtExOi07T+BN0nGdm3Q7G9k1oYiuE9ic+A2\nYHvgSYnTgb9EUFfe6MzMrFpVRI9hrihsIUnqLaljI20OTl8vLTh+DTCTpKcxd7EeJL0ww3JFYRrb\nDOBaoJ+krRYjTqth5RxzEsFHwM4svLV8IfAfid7liilLsjLeyOpz7rMpK3mvlB7DlhLwOtAbWCDp\nBeCciHiooN1WQB3wYv7BiJgjaRSwdd7hTYCuwMginzcy/cytgZdK8g1KSNLOULQYWK+9Y7H2FcE8\n4DSJp4AbSeY/fEpizwg+K290ZmZWbaqxMJwC/AN4lmQ84nrAycD9ko6IiJvy2q4ETIqIeUWuMwHY\nXlKniJifts0dL9YWYOVSfIE2MAgXgWUhqX87/hbZV1LRaWoi4l6JrYEHgc2A5yR+EMHb7RRb5rRz\n7q2COPfZlJW8V11hGBGXFRy6T9L1JOMAL5F0V0TMTM/1AOY0cKnZeW2mpa800D6/bSV7muS7FBrT\n3oFYm/hOuhUKYOUI3k8fQrmX5AGqZyT2jmBEewZpZmbVq+oKw2Ii4mtJfwcGkqxT/Fh6aiawbANv\n65bXJv+12LJjhW0r1cCIeKfcQWRJO/32OIniQxxEUgDmxcOXErsCtwJ7A49J/DyCu9s+zGzJQs+B\nFefcZ1NW8t6iwlDSasCUiCjWK5Vr0xtYqqknhtvAuPQ1f063T4ENJHUucjt5ZZLbzPPz2uaOF8od\na3AlE0lD8mKYAozK/U+Ue8S9rfaBPkCXvFja9PO83777JA+WDC48DzwFfAJ0lfQ5C3u7uybPlV0z\nHY7sBcPulF67IuLkEyvh+3jf+973vvfbdz/VH1iDJigimmqzsLG0ABgUEec00uZM4OyI6NjsCy/6\n/tFAz4hYq4XvOxc4HdgtIoalx84BzgB2iohn8tp2Bb4ChkfEj9JjPUl6ZkZExO4F1/4jyTi+7SJi\nkQdZ0vMREWpJvKUkaRjJGMNdwz2G7Uoq35gTSR1ICsOGWgCPPwK7HJ4eeBAYGEG9/4et5cqZeysv\n5z6bainvjdUtLZ2uRulWFpI6SlqiyPFVgV+TFHbP5p26PX09ueAtA4DuwC25A5FMS3Mv0F/SxnnX\n7gUcDYwpVhSalVEAqzewPZCc3vVuksnfZwA/AF6QuE9iy/KEbGZmlawtxhiuQPKPULNJOoTkHzOR\njAnsnPY8AoyPiJvTP/cCPpQ0FHib5Knk9YGjSCbF/mlE5G6nERFvSLoSOE7S3cADJEuKnUDSW3hr\nQSinA7sCj0q6hORBjgHAiiQrTJgtopy/PUbS3V/siXsk5Sa5HgyaB8t/DmcsDUf1gZ4/BH4ocS8w\nKIJX2ivmWlIrPQfWcs59NmUl703eSpZ0WN7uEGBouhXqCKxG0jv3VkQ0e4mu9FboTg2cfjIidk3b\ndQGuIBlwvwpJoTgJGAFcGBEvF7m20pgGkNxbn0SyWsTAWPj0cn779UhWQNmZZNzeyyS3z4c1Er9v\nJVtFkXQ1yZyGBZbvAKf3gl91ha65Xwz/Cfw6omW/0JmZWXVqrG5pTmFYR3JPqsnPSV9nAvtFxCMt\nirKKuTDMrkodcyKpO8XvCOwBXAZrPwHvfQ4cSzKs4g1gvwjGtmOYVa1Sc29tz7nPplrKe2N1S3Nu\nJR+Ruw5wPUlv4X+KtFtA8kDHcxExZXECNbPSiIhZxY5LSo+/3wv0HzhlFJxzHvTcCOa/Kt1+Dhxy\nYbTkqTQzM6sZLX0qeRhwQyy6ukjmucfQqoWkHwFXL3p0ScHNfeBH6XydC86DjgMjWNDuAZqZWZtr\nbY/hf0XELqUJyczKJDcmN89Ukrmw/7AHDOwNHc8Etkwnxp7c/iGamVm51MTKJ2blUm1jTiJiJHBQ\nsXOSPoGX5sL9gPYAXpLYJ4LX2zXIKlFtubfSce6zKSt5b+k8hkjaWdJ9kr6QNE/SgiLb/KavZGaV\n58G5sOlweO8rYE2Y/bJ04jBJN0raodzRmZlZ22rpGMMfkjx80hH4CPgYKFoEZum2s8cYWi1Iegxz\nvyx2B4b0gYO6J/vnT4dBv4iY4zWXzcyqXKumqym40IvAt4B9sjQdTVNcGFotkPS9RY90BB47AHY8\nJvnzB8/DWrtFML0c8ZmZWWmUckm8jYDbXRSaJQoWKK9qEfHIotv8RyL6D4Bj74OpAWttCzwn0aJ1\nzGtVLeXeWsa5z6as5L2lheF08FOKZtly9Ueww5cwdQLJL4cvSuxR7qjMzKz0WloYPg5s3xaBmFWj\nLDyhlnhrAWz/e5L1xpcGHpS4TKJ7mQMrm+zk3go599mUlby3tDD8HbC2pD+kaxCbWWa83Rf6nAlv\nXAoxHzgRZr4u/dO9h2ZmNaKlD59cD6wB7AyMB0YBxZa/i4g4qhQBVgM/fJJdWZjXStKVwL6LHt22\nM9y8FKzTEebVQedTgcsiqCtHjOWQhdxbcc59NtVS3ku28gnwi7w/r5FuxQSQmcLQrMZ9DIxe9NDz\nwBZ94NKN4MgewF9h+n7SuafC/36R13B8RGSmWDQzq3Yt7TFcvbltI2L8YkVUhdxjaFmUTm8zBA7o\nBn9fEpbpAFMCTp0K189Kfj9krYiYXd5IzcwsXynXSs5MsWdmTZoJjIO7gBc6wz/XgZ36wLV94IDu\ncMwU+KTMIZqZWUu0eEk8M1soK/NaFRMRIyJih2QbvzXstDRwBDAV9ugKo5eDaYdI1OSDalnOfdY5\n99mUlby3qMdQ0mrNbRsRH7U8HDOrVhEEMETiUXhsLOzWHbgG2FdiQAQTyhyimZk1oaVjDOtIBw41\nISKipQ+2VC2PMTRblNThQziqD1wNqA8wFTgNuC5LTy6bmVWiUj6VfBPFC8M+wGbA6sBwkqlszCyz\nArh2Fhz1bdhuMPAjkirxkLT38N3yxmdmZsW0qMew0QtJHYA/Ar8CtomIj0ty4SrgHsPsqqV5rUpJ\n0odAV2AtiDnAQcDlwLLAHOAc4KII5pYvytZx7rPLuc+mWsp7Y3VLyR4+iYi6iPgTMA64oFTXNbOq\n9mPQPqC5sNX/wFtPkBSM5wIvSWxT5vjMzCxPyXoM/3tB6S/AYRGxbEkvXMHcY2i2qLwewyJ+0AVu\nmw9LLE9yz/kPwPnpwytmZtbGSjnGsDmWBnq2wXXNrHrcA3QucnwLeHA12PB38MnGwKnAecAaEsdG\nML9dozQzs0WUtMdQ0m4k/yC8ERGZuUXkHsPsqqUxJ+1B0iXAT4AFQB38pDsM6QvdBI/Php/8O2LS\nz8scZrM499nl3GdTLeW9ZD2Gkp5o4FQnYFUgN8/h2S25rpllTsdku30+TPgKhi4N3+0GL/xAYqUI\nPi13gGZmWbQ48xgWE8DXwAvAxRHRUAFZk9xjaNY8kjpDsZVQDj8YzroW1uoIfAz8III32zk8M7NM\nKOVayV47EzL9AAAgAElEQVRCz8wWW0TMK3Zc0nh4YBI82RE2WBV4RuLACB5t5xDNzDLNhZ5ZK2Rl\n7cz28WUdbPsE8G9gSeARiesklilzYEU599nl3GdTVvLeqsJQUm9Jq0paolQBmVmWfbOAZDLsgcBc\n4EjgHYnDpGK3oM3MrJRaXBhK6iTp95LeA6aQTGj9taT30uOZWSPZrFaeUKskESyI4GxgE5IlNvsC\nNwKPS6xXztjyOffZ5dxnU1by3qLCUFIX4BHSecdIBom/kL6ukR5/LG1nZtZSm0m6VdKtoEHQ4XM4\nfSRMnQPsArwuMVDyMBgzs7bQ0t693wD9gfuA/4mIsbkTktYG/gLslbbzsnhW82ppXqsK0QfYeeFu\nkPxVcu3X8NGj0P1QYBCwlNTxM6j7cSPXejkiTmirQJ377HLusykreW9pYXgw8AawT0QsMnVNRLwv\naT9gFPBzXBiaWfO9RvL3SzHXw6Ru0ON4iFuBocBJ8I8n4Zg1GrnmhFIHaWZW61paGK4DXF5YFOZE\nRJ2kB4E2+y3drJJk4bfH9hARk0nGE9YjaR7QDVgTNAZGngrbXAZH7wzPT4FrzyYpFnO2Ai5rh5iL\nxmu1z7nPpqzkvaWF4VygVxNtegJF5yozM2uFB5OX7YBTv4GLloCr+sAaK0ac+WGukaSVyxSfmVnV\na+kA7teBAyQtW+ykpL7AASS3hcxqXlbmtSqzccAHi24Xj4Z/fAKdgd+dILF1ewfl3GeXc59NWcl7\nS3sMrwBuA16QdC4wDPgMWIHkoZQ/AMsCJ5YwRjPLsIj4frHj6byGQ6DTYcD9Et+OYGxek2Ul7d3A\nZR+OiDklDtXMrOq1aK1kAEl/Bn5P8rhgvdPAhRHx+xLEVjW8VrJZeUh0Bu4Fvg98COwJ6gvc0cRb\nN46Ir9o6PjOzSlSytZIBIuIMSfcARwGbkyxdNRV4Fbg+Ip5rTbBmZs0VwTyJA4AngK2Bt2HaC3D+\n23DFh+lKKvn2ILn/bGZmRbS4x9Dqc49hdmVlXqtKJ9GXZIqsnwE90sOTgZuAayJ4K2mnN4ClKUGP\noXOfXc59NtVS3hurW5p8+ERSF0kvSHpMUoO/aaftnpA0srF2ZmalFsGkCI4GVgR+TXIHY2ngZOBN\niX9L/y0YzcysAc15KvkQYEuSsYMNTkMTEXOBi4BtSCa4bjZJp0u6Q9L7kuokfdBE+36ShkqaLGm6\npKck7dJAW0k6RdLbkmZJ+kjSxZKK/iPRkmub1cpvj7UigmkR/D2CLUjmM/wHMB3YF3gI+pRsKT3n\nPruc+2zKSt6bvJUs6T5gnYhYv1kXlN4F3ouIHzY7CKkO+Ap4heQv86kRsVYDbdcCXiSZU/ESYBpw\nDLAxsEdEPFHQ/jKSCbfvBh4CNiB5avqpiNitNdfOe59vJZtVKIn1gceAleH1WfDdqTBpIz98YmZZ\n1dqHTzYH7m/B5z0F7NmC9gBrRcQ4AEmjSSbJbsgFwBLAFhExOn3PP4E3gStJCj/S4xsCxwN3RcRB\necfHAYMl/TQibluca5tBbY05qVURvCOxI/AYbLIWPNUZnlye5JfRxebcZ5dzn01ZyXtzbqv0BSa2\n4JoTgWVaEkSuKGxKevt3L2BYrnBL3z8DuBboJ2mrvLfk1l69tOBS1wAzSW6TL+61zaxKRPAhsCOM\nnQMbdIKj75NYvdxxmZlVmuYUhrOA3i24Zi9g9uKF06RNgK7AyCLnRpLMo5i/AsJWQB3J7eH/Sie2\nHVXQtqXXNsvMmJNaEMGnsOOH8No86LQmMEKi3+Jfz7nPKuc+m7KS9+YUhh+TFFjNtRXw0eKF06SV\n0tcJRc7ljuWvk7oSMKmBh2YmAH0ldcpr25Jrm1nVmbgA+n8Fc58HVgGelvhuuaMyM6sUzSkMhwPb\nN+c2qqQtgR1IlsprC7kniYstZTW7oE3uzw0te1XYvqXXNsvM2pm1ZUrALw8EHgGWAx6V+F+JLi25\ninOfXc59NmUl7815+OQKknnB7pS0Z0S8XayRpPWBO4EFwFWlC3ERM9PXrkXOdStok/vzsg1cq7B9\nS6+9CElDgHHp7hRgVK7bOfc/U1vtA31g4T9qbf153vd+Ne8DXWDIHXDLRLjsHei3PnT8Law0QPrz\nb+HGsc25Xk65v4/3y7K/GUmnSaXE433vN7qf6g+sQROatfKJpLOAQSTTuNxFsvzUJ+nplYHvAvuT\nFFVnRcS5TV604c8aDfSMItPVSNoOeBY4NyLOKji3G0kPwHER8bf02ENpbD2i4HaypBHAuhGx/OJc\nu+B8hKerMat4WrjySZ6dO8NNS8FqHWHeHOh8LHBDRNH14M3Mql5jdUuz1kqOiLMlzQcGkjzp+7PC\nzwDmAWdGxPmtCbYJo0lu9W5f5Nz2QAAv5R17EdidZNLtZ3IHJXUl7ze+xby2mVWfw6m3VvKTwLbH\nwxX7wf7dgeuAPSR+GcHX7R+imVn5NHsVgIj4M9APOIdkDOE76TYMOBvo18ZFIZFMHXMv0F/Sxrnj\nknoBRwNjIiL/CeTb09eTCy41AOgO3NKKa5vVu61olS0iXo6IkYUbfD4eDpwC11xLslLKgcArEts0\ndC3nPruc+2zKSt6b1WOYExHjSXoNS0rSIcDqJD2PywKdJZ2Znh4fETfnNT8d2BV4VFJudZIBJGuk\nLjKxdkS8IelK4DhJdwMPABuSrIQyPCJuLQil2dc2s1oTwIBn4ZgLgNtIZlgYIXEaMNi3ls0sC5o1\nxrDNg0jGyO3UwOknI2LXgvbrkaxSsjPJQxcvA4Miot7T0JJE0mM4gGTQ5SSSv/QHRkS9h0lacu28\n93iMoVkVk3QecATJcJgbJLoCF5IsnwkwFDjSt5bNrBY0VrdURGFY7VwYmlW3vMLwBpI11VN37Az7\n/h469SSZdeCgCDykxMyqWmN1S7PHGJpZfVkZc5IhR5CMTU63g46Fb82AUfOANWDe89JZY6UOwyWN\nkjRcUkNTYlmN8s99NmUl7y0aY2hmVqPeB0YUOb4tjAG2mwSDl4ABPeHsdWDtleDoWTB/OaBj+4Zq\nZtZ2fCu5BHwr2aw2SeoBrLrwyLM/hG3/DB26wgszYe9vYOJmEfF52YI0M2uhVs9jaGaWRekDau/m\nHXpX4mlgKGyzErzQFUatD7gwNLOa4DGGZq2QlTEntlD68MnWcO3sZLWUH90nsXe547L245/7bMpK\n3l0Ympm1UASfwvET4K5Z0KEnMFTidMl/p5pZdfMYwxJojzGGkroDGzVw+gqScVAeY2jWTiS9Cloe\nJtwAK56RHh4OHB3B+2UMzcysUR5jWBtWA/5T7iDMLF8AK10OMZJkjeX+wGiJM0lWS1lQzujMzFrK\ntz2qzxzgpQa2WWWMK5OyMubEiuqV+0ME95Ist3kLyTrsfyVZTm+DMsVmbcg/99mUlby7x7D6jI8I\nD3Q3qzARTAIOkbgN+AewHTBK4mzgwmQpeJZq4jKTI2J+20ZqZtYwjzEsgXYaY7geMAwYExH92/Kz\nzKxpyRhDlge2KJzHUKIPcBFwdHroFTj/QjjjkiYuu11EfFT6aM3MFvKSeGZm7SiCKREcA+xGssby\nFvC7m+GcXtB5PvBlwVZXtmDNzPK4MDRrhayMObGiejXVIILHgU2Av0GHTvCH3jB6SYhDI2LT3AZM\naPNorWT8c59NWcm7xxiamZWQpPVJZhHINxROnQsnHA/rLQG8JHEOcEEE89o/SjOz4jzGsAQ8xtAs\ne/LGGN4MTM879auG39VbcO0cOGj19MDLwKGgISRzkXqMoZm1Oc9jaGbWdg5p5Nyji+5+A/zkfTjo\naeB6YEvgFThjIpxPMi+imVn5uDA0awVJ/SNieLnjsLJ4EPi4kfPPRsRrDZ2U2BS4FDgCzlsddpkD\nRzwuaW6R5pdExLWtjNdKxD/32ZSVvLswNDNbPI+05h+JCKYBR0rcB1Nuh926wqi14LipcPvsgubd\nWhWpmVkz+alks1bIwm+PVlypch/Bv+H+jWHOE7BMB7htKZg+DA7dmuR2M8DKkrYssnlllTLwz302\nZSXvfvikBPzwiZm1loSA40gmxu4GPA/rPw7vHtHI296MiN3bJUAzqxme4NqsjWRlXiurr9S5jyAi\nuALYGhgPbAvPHw2bvwO8UrC9U8rPtpbxz302ZSXvHmNoZlZBInhDYnvgPlhyC3ilI7BXBM/l2kja\nCHikbEGaWc1yj6FZK2RlzInV15a5j+AzYGfgAWAZ4AmJfdvq86xl/HOfTVnJuwtDM7MKFMF04MfA\nNSRjDu+WOLG8UZlZrXNhaNYKWRlzYvW1R+4jmA/8EjgTEHCZxE3wk6Xa+rOtYf65z6as5N2FoZlZ\nBUsfSvkzcCgwJ3m9+T44tof/CjezUvN0NSXg6WrMrD1I9AOuBHZLjjw/D379Jbw6r0jzXSLiw3YM\nz8yqhKerMTOrARGMAb4HT54GE+tg287wwkpwWV/o3RXokre16S+rZlabXBiatUJWxpxYfeXKfQQB\n/f8Kz68Ac6+CjgEn9oSpC2D6QOg4rhxxZYl/7rMpK3l3YWhmVmUioi5i7y8juhwH2gZ4CbQy9Lwa\n3toUfti13DGaWXXyGMMS8BhDMysniQ7Az4A/A6slR795GnqfEMFrZQzNzCqQxxiamdWwCOoiuAVY\nD84fD1MDeu8IdaOkR9+RVrlB0j/S7UfljtfMKpcLQ7NWyMqYE6uvEnMfwWw4YwKsMxH+NgPmA7uv\nB88cCtvsB+wF9CtzmFWvEnNvbS8refdayWZmteUsmNQTjgVGrAiDT4XV14ERS8FvpsOVm0g6uMj7\npkXEfe0drJlVFo8xLAGPMTSzSiXRDbgE+FVy5LZZcPRUmFH4l7//bjHLCI8xNDPLqAhmR/BruPMi\nmDsfftod3u0EOz4E3Ao8UO4YzaxyuDA0a4WsjDmx+qot9xEH/ha6bA6MgZX7wlMHQDwHXFTu2KpN\nteXeSiMreXdhaGaWERG8AWwN3An0Tl4/PiNZKMXMzIWhWatExPByx2DlUa25j2Aa8BPgJGAerHIY\njOgL/TwpdjNVa+6tdbKSdxeGZmYZE0FEMBjYCeZ+Blt3hue3ktij3LGZWXlVZWEoqa6BbVqRtv0k\nDZU0WdJ0SU9J2qWB60rSKZLeljRL0keSLpbUo+2/lVWjrIw5sfpqIfcRjIQj94XH50CfThAPSK/f\nIPX+jqQd8jb/HZinFnJvLZeVvFfzPIZPAVcXHJuXvyNpLeA5YC5wATANOAZ4WNIeEfFEwfsvBU4A\n7gYuBjYATgQ2A3Yr9RcwMyu/W6bArZNhUC84ozds8gt49GA44xsYNjdttCvwThmDNLN2UpXzGEqq\nA4ZExJFNtLsD2BfYIiJGp8d6Am8CsyJig7y2GwKjgbsj4qC848cDg4GDI+K2Bj7H8xiaWVWStBrJ\nPIfAQcvCP7aBPul4wxGzYOBMeOI7EeHC0KxG1Ow8hpI6p4VesXM9SJZ/GpYrCgEiYgZwLdBP0lZ5\nb8mtBHBpwaWuAWYCh5QscDOzChERH0XE/sl2+07QZwXgT8BU+E53eHwZmDpEYqdyx2pmba+aC8MD\nSAq2byRNlDRY0hJ55zcBugIji7x3JCCSaRtytgLqgBfzG0bEHGBUQVszIDtjTqy+Ws19BFMiGASs\nAYPHwdSAJbYFnpR4QmLLsgZYAWo199a4rOS9WgvD54GBwP7AYcDjwPHAU3mDpFdKXycUeX/u2Mp5\nx1YCJkXEvAba95VUzWMyzcyaLYIpcNI4WHMiXDgJptUBu0DdS9Itk6UV35F0QrnjNLPSqsrCMCK2\nj4hLIuKeiLg5Ig4GziTpJTwpbZYrEOcUucTsgja5Pxdr21B7s8zMa2X1ZSf3Xwf8bh6s8QVcPgMW\nAD9fCt7pB0N2l+hc7gjbW3Zyb/mykvda6gG7iKQX8YfA+SS3mSG5nVyoW/o6M+/YTGDZBq5drP0i\nJA0BxqW7U4BRuf+Jct3PrdxfNe+zSnE973vf+95van8fyI0t/PqZZJKGB34C+54BA1aBw/eCB8dK\nj10e8Ze/VEC83ve+94vsp/oDa9CEqnwquSGSPgDmRsT6krYDngXOjYizCtrtBjwCHBcRf0uPPQR8\nF+gRBbeTJY0A1o2I5Rv43Ag/lZxJkvrnfgAtW7Kce6njKbDPH+CagKWXSQ/fBZwYwWfljK09ZDn3\nWVZLeW+sbqnKW8nFSOoKrAJMTA+NJrk1vH2R5tsDAbyUd+xFkv8e2xS57mYUPJRiZpZddcC/58Bq\nd8Lz/4D5s4ADYN4Y6bGLpR7bljtCM1s8VVcYSlq6gVPnAh2BewAimZbmXqC/pI3z3t8LOJqk5y2/\n2Ls9fT254LoDgO7ALa2P3mpNrfz2aC3n3APM+DFstzes+w08PAc694Ld/geeeVRiw3JH11ac+2zK\nSt6r7laypL8C25HcVv0I6AXsCexCssrJrpFMMYOktUmeYJ5PMoHrNJJC71vAnhHxWMG1BwPHAUOB\nB4ANSVZCeToivttITL6VbGaZIWl/4KCCo8Cxa8NZm8NyHUhWojofOD/ivw/wmVkFaKxuqcbCcG/g\n18BGwDIkj8iNJenxuyQi5ha0X49kObydgS7Ay8CgiBhW5Noi6TEcQDJAcxJwGzAwIhp78MSFYUbV\n0pgTaxnnvj5Ja8LSz8IVneFn6djDmePhX/8Lx7ySNnsjvaNTtZz7bKqlvDdWt1TdU8kRcQ/p7eJm\ntn+XZFm85rQNkp7FSxYvOjOzrJsccPBcuPYr+PuSsO7qcPRV0H0WnDINvtydZAy4mVWgqusxrETu\nMTQzA0krAVctPNKjA1y0LhzTDzp3gK/q4J2z4Nt/jsD/+JiVSU3dSq5ELgzNzBom0Q9efA62zj08\nOBz4VQTvljEss8zKxHQ1ZuVQMHmoZYhz33wRjIFtX4ajp8DM6UB/qHtDGvOkNPD3UqcfS/pWueNs\nLuc+m7KSdxeGZmbWDgK4bhasPh1umgl0gn47wZ/Oh9fvgqvOl+hd7ijNss63kkvAt5LNzBon6Uzy\nlvaEzXvDqRvADzaCpdL1lmfNh4c+hLPfhlG5J5cnRcSJ7R2vWS3zGMM25sLQzGzxSEudBHsPgl/1\ngO27JEdnBZz7DVw4A+ZPiIityxqkWY3xGEOzNpKVMSdWn3NfKlOGwk37wQ57wGlHwfjHobvgvCXg\npb6wQ49yR1jIuc+mrOS96uYxNDOz2hER44Hx6e4w4HqJH8D8a2DTleHJDSUuAP4UwazyRWqWDb6V\nXAK+lWxmVlrSPv1gj1dgQM/k5taMCfCvwfDrF5MFrwB4OSKmlTFMs6rkMYZtzIWhmVlpSVoFeAG+\n0xmu7gMbpHe4PlgAN86E62bChMOBV4q8fVZETG/HcM2qiscYmrWRrIw5sfqc+zY3BxgOIx6FLe+G\ny0fBV7NgrY7wp94wbnm4fyjs9w50eg3I305ry8Cc+2zKSt49xtDMzCpORHwJHJx/TKIj8H0Y8XfY\ndlXYs1uyTZwPl34Bf50FcyvuYRWzauIeQ7NWiIjh5Y7BysO5b38RLIjggYjvrAadVwR+B4yF5TvB\n+SvBF33gqO7QuU2H9jj32ZSVvLswNDOzqhPB5xFcCKwH7Au8DUsuA9f2gfG/lNhbok0LRLNa5MLQ\nrBWyMubE6nPuK0MEEcFQYGO4egh8vABWXA74D/CMxG6lLhCd+2zKSt49xrDCSFoVWKXIqdXaOxYz\ns2oRwQLpl89B1+/DZa/BL7cEtgceBV5K50IcGrFwrhszq8/T1ZRAKaerkXQacEojTTxdjZlZEZIG\nAIOAubDkLPjt0vDLZWCZjkmL9+bDNwPh4P/AO/MK3v5JRMxs34jNyqOxusU9hpVrAvBxkePFjpmZ\n2UJdYGoXOHMBnPsF/LIHnNIL1ukEnAdPnAODp8MVM2F6rndkP2BkGWM2qwjuMSyBNuoxvDgi/lqK\na1rbkdQ/K0+q2aKc+8ojqRtQbLqavtDpThjQBU5eFdbtmRz+eh5c8g1cOhe+2TcimlUYOvfZVEt5\nd4+hmZnVvIiYDcwucmoysClA+iDKnsBZsNQ2cPbScFIdjDtU4s0IvmnHkM0qjp9KNmuFWvnt0VrO\nua9O6VPM9wPbAT+AtybDMh1gy2OBDyXOkFim8Ws491mUlby7MDQzs8xJC8SHYKOn4EeTYdJbwDLA\neRATpBm3Si99T1quZ7ljNWtPLgzNWiEr81pZfc59rQjg/jmw3FKw51fw2ByIrtDzp7DVw/DKBxK/\nlOide4dzn01ZybsLQzMzy7JpwNcQX8ODE2H392HDsTB4CnxVB6ssB/wdmCBxhUS/Msdr1qb8VHIJ\n+KlkM7PaIukI6HoenPQe/G5JWHqThWcnPgcP3Q6HD47A/4ha1WmsbnGPoZmZWVFzgAvXgWWWhS2+\nhJtmJg89L789HH4p8EZ6m7nYFDlmVcmFoVkrZGXMidXn3Ne8T4ERC7dXh8Ph98O6D8DhM2HifGBD\nktvMn0hcKLF6GeO1NpaVn3nPY2hmZlYgIh4GHi48LmlpuGkM3DoVDu4GJ/SCLZcCToMFp0kPzIaP\nToPjrvRtZqtGHmNYAh5jaGaWDUlhyBuLHv12ZzipJ+zTHTqnxz6cAjeOhVsnwpjZJHfoOgAdAeXt\ndwBmR8SP2+s7mHnlEzMzs9L4Glhl0UPPpNs698BRO8NRPWDNPjBoaxgEjF8Az82FZ+bCk3PhzflQ\nl3+B6e0Uu1mTPMbQrBWyMubE6nPusymS22w7RURd4QbvnQ2n7w+b7AVDL4CJL8L8mbB6R/hpd7h8\nSXh9WZjdAz55Fa67KOlAtGqQlZ959xiamZmVQES8kLf7AIBER2Bj4DvptiN0XglW3hOO3BP2rIP/\n6yaxGfCaxyVauXmMYQl4jKGZmTWHhIB1gJ/BgsOg49oLz376JTz1Lrw6EZ79Ep77GhbcGBHvlite\nq02N1S0uDEvAhaGZmbWUtExv2PADOKwH7N8dli74d2RWwPhpMHUMjPkMrhkNT3+dnnwrIh5s96Ct\nJrgwbGMuDLNLUv+IGF7uOKz9OffZVarcS+oMHJLsLdkRTt8YdugHq6wCXTeElYo8B/DU3GSi7X//\nK2Lyca2NwZqvln7m/VSymZlZhYmIecANxc5J2h/W2QB2WwG2WAG2XAs23hh26pJslx8t0TV9/7Me\nm2il4h7DEnCPoZmZtTWJPnDnhbDmL2CrznmnpgCvA6OA19LXtyKYXYYwrQq4x9DMzKzKRTBFOugx\n4EewxUQ4Yx7sugEs1QfYKd1SC0L6bBK8MQGe/xTumwCvXRYx980yhW9VwoWhWSvU0pgTaxnnPrsq\nI/evLA8HAPoGVp4BW3SGzTrDpp1ho06wdidYZdlk22MzGAh8foT03Ifw8mfw2lfwwtfw5nRY8EpE\n3Fje71P5KiPvbc+FoZmZWfV4CTht4W4An6TbPXnNVuoCP18D+q8H/9/emYfbUVR7+/2FMWEeZeYA\nBgQFFSdQgTBcUfxEuYJXAQGZFFCE63AFERBwRhFwQEEICpdBEGQSEZMIIihcQAZRmcIUIAwJYwLk\nnPX9UbVhZ6f3eHp39e6z3ufpZ++uqu5eq7u6e3XVqlXjPgLvXBRWWRhWmQibT3yt3IsGj8+SntsJ\nXrgXZv4DfncLfOUxADOb0X+VnDLhPoYNSBJwCLA/MAQ8AZwPHGlmLzbZxn0MHcdxnFIi6b2wyOrw\nidVghzfAhuvBSqvDkmvBUhOyt5oxAje9DA/eDtc+AX94CmbNqyvwUzO7sRAFnNxxH8Pu+CHwOeBC\n4HhgQ+Bg4C3AdnkdRNKSZE9JuFhex3Acx3EcM/tzVrqk98OK34ZNFoeNFoM3LA5vXiIsq42DHRcH\n3gGfJczt/OAw3DUP7noFVnla4hXgnz7IpVp4i2EdkjYCbgcuNLOP1aV/FjgJ2NXMzs3YrusWQ0nX\nAeu0KOIthgPAWPE5cRbEr/3YperXXvr1OLh6X3jfBrDhG2DVDWCZIRjXZGLnOcPw4rywvDAMz8+D\n50dg5stw/1y47yW4fSV46mdwz3PByHyVpYCrgH9k7PhlM3s2b/16pUrX3VsMO2fX+PvDhvRTgW8T\nApEuYBiOkheB4Yz0l3I+jtMf3gJMSy2EkwS/9mOXSl97s11GYJef16dJLApMhC+dCCu8C964MLxh\nYVhnYRi/UFhWaNfj9VV43uCRYZg1EheDWYfA0yNhmTES8h8ahseuAvbom6LdU+nrXsMNw/l5O+FT\nZj6/CTN7SdKtwDv6cMz3mdl9fdivUwzLphbASYZf+7HLmLv2ZrwM3CkdfzCwPGHUywiMH4E3Lw7r\nj4d1JsAq42HFCbD8eFjpdbDc6vDoFrDm4rDcCrDkYrBBh7bHyCelpz4GT86F5+bB3OG4jMD2V8Ai\nLwLPA7Nh7nMw7xmYNwteng0vPANPPwe3PAffmQv3WAwo/iqS1iLbpavGU2b2XN36mLjubhjOz2rA\nk42VJ/IIsLmkhc1sXmOmpMWARbs4VqvK6DiO4zilw8yyunzbsAYAEiIYlasDy8Vl+bgsB6wIrAqz\n3gAvrwcrjQutkJktkfvNv7p4RpF1gLcBnwJeMOmpOTB3Hrw0DPOG4fql4RXgZYOXgVcszE891+Al\ngzlIZ9wbjNFXRmDLVaVv7wizVoK3/Q7mjYT9zBuBqbvB4g+H/68YzLPQzjTP4KWlYc0/wLbXwMg8\nsBEYHgm/I3H7kWHm62M3AwEagRGL5Ybh5WEYjsbxy/Ne22acQWNP/0IWlqz/zXHDcH4m0LwLd25d\nmSyfhy8CPm/l2GMotQBOMoZSC+AkYyi1AINInLbvqbg0RVp+GWA9eN3C8MHlYdOVYfklYMJicMGR\nMEEwPi5LCpYZB8uOg2Vr/wlzTy8hWGJcMBqXFuH93S2bvPb3ZuArq8WVBsN0bwjGbTNeDxzQw/H7\nxOeb5vjgkzok3QasZGarZuSdR4gmulhji6EkP4mO4ziO4wwMPvikM2YAG0paJKM7eXVCN/MC3ch5\nxTV5SXcAACAASURBVDB0HMdxHMdJifu5zc+NhHPyzvrE6D/4FhoGpTiO4ziO41QJNwzn57z4e0hD\n+v7AeODsYsVxHMdxHMcpDvcxbEDSSYRBJBcDVwAbEWZCudbMtk0pm+M4juM4Tj9xw7CBjLmSnyQE\ntT6q2VzJjuM4juM4VcC7khuwwAlmtqGZjTezNc3sS41GoQKHSrpL0hxJD0o6XlIvw+GdAULSSJOl\nNFM3Ob0j6TBJ50u6N17XlgHoJa0v6WJJT0t6XtI1krYuSl4nP7q59pKOavIcGJb030XK7YwOSRMl\nHSPpekkzJT0r6RZJh2e906t+z/uo5N75IaGL+ULgeGBD4GDCIJXtEsrlFMM1wM8b0rICozuDxzcI\ncdZups1MB5LWBa4nRMf9NiHG6X7A7yW938ym9FlWJ186vvYRI/QwNcbl+7+c5XL6y97AgcAlwFmE\nZ/nWwHHALpI2M7OXYGzc896V3AOSNgJuBy40s4/VpX8WOAnY1czynlPZKQmSRoDJZrZ3almc/JE0\nZGbT4//bgSXMbN0mZc8HdgI2NbPbY9oSwJ3AHDPbsBipnTzo8tofBRwJrGNmDxYnpZM3kjYF7m6Y\n/g5JxwKHA58zs5/EtMrf896V3Bu7xt8fNqSfCrwI7F6sOE4KJC0SHwhOhagZBu2IXUwfAqbWXhBx\n+xeA04D1Jb29L0I6faHTa9+AJC0lqXE+MmdAMLObG43CyHmEeeneBGPnnnfDsDfeTpifcL64hrGp\n+VbgHSmEcgplZ8JHwHOSHpd0kqSlUwvlFMomwGLADRl5NxBeKP4sqDYCbgOeAeZKuk7S+xPL5OTH\nmvH3sfg7Ju559zHsjdUIs6Bk+ZQ9AmwuaeGsWVKcSvBX4HzgXmBpYAfgs8CWkt7to9fHDLU5Ux/J\nyKulrV6QLE7xzAZ+BvwFmAVsQPA3vFzSp8zslymFc0aHpHHA1wj+hufE5DFxz7th2BsTgJea5M2t\nK+OjVCuImW3ekHRW9Ef6BmFm8m8VL5WTgNpoxaxnwdyGMk7FMLMTG5Iuk3Q6wdfsBEkX+EfiQHMi\n8C7gMDO7O6aNiXveu5J740VCc3IWi9eVccYO3yOMUvtgakGcwqjd41nPAn8OjEHMbBZwCmFE87sT\ni+P0SBx0chDwMzP7bl3WmLjn3TDsjRnAipIWychbndDN7N3IY4h4vWcAK6aWxSmMGfE3q+uolpbV\n5eRUm+nx158FA4iko4GvAr8wswMbssfEPe+GYW/cSDh376xPlLQYIY7hjVkbOdUlXvs1gMdTy+IU\nxu2ELqVG1wJimgE3FSqRUwbWj7/+LBgwolF4JHCGme2XUWRM3PNuGPbGefH3kIb0/YHxwNnFiuMU\nhaTlm2QdByxECJDqjAFiiIpLgUmSNq6lS1oS2Bf4t5n5R2IFkbRQVhQCSWsCBxCmUv1L4YI5PSPp\nSIJReKaZ7ZNVZqzc8x7gukcknUTwQbgYuALYiDATyrVmtm1K2Zz+IekHwGbAVOBBYEnCqOStCdHw\nt6lFyHcGE0m7A2sTQk98FlgE+EHMfsDMzqorux5hlPo84ATCgLP9gTcCO5jZ1QWK7oySTq+9pGWA\n+wnP/7sIo5LfAOwDLAF83Mx+U6z0Tq9IOgg4GXiAYByONBR5vHYvj4V73g3DHpEkQovh/sAQ4Qvx\nXOAoH4lWXSTtSGgReBOwAjAM3E1oRT7BzF5OKJ6TA5KmAls2yf6TmW3TUH4DwtRYWwGLEqZDO9rM\npvZVUCd3Or32khYFfkQYtboG4QPxSeDPwHfNzKfEGyAknQHs0aLIfPd91e95Nwwdx3Ecx3EcwH0M\nHcdxHMdxnIgbho7jOI7jOA7ghqHjOI7jOI4TccPQcRzHcRzHAdwwdBzHcRzHcSJuGDqO4ziO4ziA\nG4aO4ziO4zhOxA1Dx3Ecx3EcB3DD0HEcx3Ecx4m4Yeg4juM4juMAbhg6juM4juM4ETcMHcdxHMdx\nHMANQ8dxHMdxHCfihmEbJI2XdJ+kEUknpZbHcRzHcRynX7hh2J5jgRUASy2I4ziO4zhOP3HDsAWS\nNgU+DxwFKLE4juM4juM4fcUNwyZIGgecClwBXJRYHMdxHMdxnL6zcGoBSsx/A+sDH8ENaMdxHMdx\nxgBu8GQgaR3gaODrZvZQYnEcx3Ecx3EKwQ3DbE4B7gFOSC2I4ziO4zhOUXhXcgOSdge2BbYws+HU\n8jiO4ziO4xSFG4Z1SFoU+D5hwMlMSevFrDXi7zIx7Ukze6ZuOw9l4ziO4zjOwGBmmdFWZOY2TQ1J\nywCzCDELG09YLc2AL5nZD+q2s2YneNCQdLSZHZ1ajjyoii5V0QNcl7JSFV2qoge4LmWkKnpAa7vF\nWwzn5wVg54z0lYCfAr8DTgNuL1KoghlKLUCODKUWICeGUguQI0OpBciRodQC5MhQagFyYii1ADky\nlFqAHBlKLUBODKUWoAjcMKzDzOYBv2lMl7R2/HuvmXlMQ8dxHMdxKomPSu4cY2xMizc5tQA5Mjm1\nADkxObUAOTI5tQA5Mjm1ADkyObUAOTE5tQA5Mjm1ADkyObUAOTE5tQBF4D6GOVAlH0PHcRzHcapN\nK7vFWwyd+ZA0KbUMeVEVXaqiB7guZaUqulRFD3BdykhV9GiHG4aO4ziO4zgO4F3JueBdyY7jOI7j\nDAreldwhktaXdJakf0iaLekFSXdJ+r6kVVLL5ziO4ziO00/cMJyfNYBVCCFrvgJ8HrgK2B+4SdKK\nCWUrhCr5UFRFl6roAa5LWamKLlXRA1yXMlIVPdqRLI6hpP8A/gPYElgLWBGYA8wEbgWmAJeY2SNF\nyWRmU+JxG2W9Fjgf2As4vih5HMdxHMdxiqRQH0NJE4CDgU8TjMFa//Zc4GlgPLBsXfo84FLgeDO7\nvjBBG5D0TuAG4Ftm9tWMfPcxdBzHcRxnICiFj6GkvYG7gW8SWga/TmgxXNbMJpjZGma2AqEVcyNg\nb+BC4APAnyWdJ2mtgmRdTNIKklaX9D7gFEJw6yuKOL7jOI7jOE4KivQxPA34K/AuM9vIzI4xsz+a\n2bP1hSzwTzObbGafIPj8HQK8l9CVWwT7Ak8ADwFXAssAu5vZdQUdPxlV8qGoii5V0QNcl7JSFV2q\noge4LmWkKnq0o0gfw7eb2c3dbhQNx5MlnUpxE1hfBNwFLAm8FdiR4APpOI7jOI5TWZLHMZS0I3C5\nmQ0nFaQFkjYGbgSOMrPvZOQbcCYwPSbNBm41s2kxfxKAr/u6r/u6r/u6r/t60euRSbzWwLanNfEx\nLINhOAxMMrNrkwrSBknXA6uZ2doZedbsBDuO4ziO45SJVnZLGeIYClgktRAdMB5YPrUQ/abh62Kg\nqYouVdEDXJeyUhVdqqIHuC5lpCp6tKMMhiHAzpKmKMw4cqWk/SUtWrQQkl7XJH1r4E1AspA5g4yk\nIYUZZabE36HUMjmO4ziOsyBl6EoeAV4CziUEt14f2AaYAexkZv8sUJbfAKsSglw/ACwOvA34OPA8\nocv79oztvCu5CdEIvBpYry75XmA7M5ueQCTHcRzHGdO0slvKYhj+j5l9ry5tAnBgXN5lZk8UJMvO\nwB7Am4GVACMYiFcRgmw/3GQ7NwybIOksYLeMrLPNbPei5XEcx3GcsU7ZfQyfIwS+fhUze9HMjgc+\nBRxVlCBmdoGZ7Whma1sIur2EhZiLhzQzCqtGH3woVusyPTeq4g9SFT3AdSkrVdGlKnqA61JGqqJH\nO8pgGE4lzICyAGb2JxLO5+zkwowu0x3HcRzHSUQZupI3JsxD/HkzOy0j/2Qz+1zxknWOdyU3x30M\nHcdxHKdclNrHEEDSDsB5wB3AZEIw6eeBbYEtLUyNV1rcMGxNNA6PI3QfzwCOcKPQcRzHcdJQdh9D\nzOwKYFPgEeBkgmF4F7ArcHBRckiaKOkYSddLminpWUm3SDo8DoipPP3woTCz6Wa2u5ltE3+n532M\nLKriD1IVPcB1KStV0aUqeoDrUkaqokc7SuO/Z2Z3E+IZLgNsAMyKaUWyN2Ek9CXAWcArwNaE1q5d\nJG1mZi8VLJPjOI7jOE4hlKIruSxI2hS428yea0g/Fjgc+JyZ/SRjO+9KdhzHcRxnIChFV7Kk8WXY\nRyvM7OZGozByHmHqvjf18/iO4ziO4zgpKdLH8H5Jn5e0WLcbSnqzpN8CX+yDXJ2wZvx9PNHxC6NK\nPhRV0aUqeoDrUlaqoktV9ADXpYxURY92FGkY/h74AfCopJ9K2rpVC6CkdSUdIOl64GbCbCRTC5K1\nXo5xwNcI/ob/W/TxHcdxHMdxiqJQH0NJ7wC+QQhDAzBMGH38KDCLMDfxCoTBJysSum9nAj8ETkgx\n8EPSyYQBKYeZ2XeblHEfQ8dxHMcZ4wxKeLbSxTGUNBHYh2AgvgVYqKHIE8A1wIXAhWb2SrESBuKg\nk68Cp5jZgS3KGXAmMD0mzQZuNbNpMX8SgK/7uq/7uq/7uq9Xc13BKLyO+ad8nQF8wczOTSlfZBIw\nFP/vaWUyDOcTIMQHXJ3QUjgHmGlmjyYVCpB0NHAk8Asz269NWWt2ggcNSZNqFWrQqYouVdED+qeL\nEnylF31d+qljVepYVfQA16WMtNND0lnAbhlZZ5vZ7n0TrAda2S3J4xia2YvA3XEpBXVG4RntjELH\ncdKi7GkXN5NUmWkXx4KOjlMBVusyvZQkbzEsG5KOBI4GzjSzT3W4TWVaDB1n0Bikr/ReGQs6Os6g\nM0j3aalbDMuEpIMIRuEDwBRJjRf4cTO7unDBHMdpRSW+0tswFnR0nEHnCGAz5m/ZvzemDwylmCu5\nRLwdMGAtYDLwy4bl8GSSFUSDo+pAUxVdqqIH9E2XGV2m50LB16WvOlaljlVFD3Bdykg7PaJbx3bA\n2YTwemcDA+fu4S2GdcSu4466j518SDFowKkclfhKb8NY0NFxBp74/ipVt3G3uI9hDriPYW80cai/\nlwH8wnLSMhY+MMaCjmMBv45OGWhlt7hhmANuGPbGIDnqOo7jjBb/GC4nY9FYb2W3uI+hMx8F+4L0\n1aF+rPi1DBKuy6vbDkk6S9KU+DuUm2C9yTMp5fHzYgD0OI75jULi+nGNBQdAl44psy51xvpuwNbx\n9+qse7LMeuRJ6XwMJa0AbAm8CFxtZsMFH/8w4K3A24B1gOlmtm6RMowhkgwacJyUeEzCMY2PLi8f\nrYz1MdlzlawrWdIBwF7AB8zs6Zj2NuBKYPlY7CZgGzN7oUC5RoCngJsJo5SfaWcYeldyb3i3ijMW\ncReKsYtf++ak6s6VNIXQUtjIVDPbpt/HT0VZ4xj+F2A1ozDyPWA54AzgdcAHgc8A3y9QrnVrlVHS\n7cASBR57TGFm0yVtxxjz7WjHWPR3GWN4q9HYxUeXZ5C4Fd17rhpI6WM4EbittiJpRWArwtzE+5rZ\nh4AbgV2LFGqsv4A78aHI0z/KzKab2e5mtk38nd7rvjLknJTXvoqiib/Ldal90PJiEK9JM0ahS+le\nRFW5LmXXo5s4d2XXpRtqurR4d3Tse9kHjiAY5/VkGutVuiatSNliuAIws279PfH3orq0awndzU5J\ncP+ovpP1gFyNMezvUkGStxpltEpfVtSxxzpViHPXC63eHSRsRfeeqwVJaRg+DaxYt74VMAL8pS7N\ngMWLFGqsY2bT2hQZGEfdDnQpI5XuZiz6mvSzW75XXVK/iFq8oG8Y9JfhgN7zmVRNl+hf2ezdkbQV\nvVNjvUrXpBUpDcO7gA9J+iowDHwcuNHMnq0rMwQ8lkA2pzmVNlxKQOm6GQeVMrduJ241GpiPO6dS\ntHp37E1JfS/Hos93SsPwROBi4GFgHjAB+HJDmc2AvxUsV09ImgxMj6uzgVtrXxc1v4RBWK/3oWhS\nvpmB8mpYoZzkWQX4f4SbcZjge3puN/tr1KkM57eD9SMIvoX1D9EnqevqK5m8edev3NaBfck2gE6V\n9I0c9j+I9QtgI7JZrQzyDUr9KqD+DmT9arL+Flq/O4YIvpfHEernU8B+sXU9mfzRKLyO+Z/HW0v6\nQrfvo9TrkUmEc90aM0u2APsTQtLcBBzakDcJmAXsn1C+24H7OihnKc9jzjpPapM/BNwDWN1yDzCU\nowxNjxGXs4Ap8bfpcTvUpaN9jWabHvWvP8bHU9eLoupXzsea0lCHasuUsupSUP06q8l5OSt1/Sjj\nNRnruuRRJ3nNIOnru6MPulf5XrFmeT4lXgsUw9WYxzGcD/W5aV3NY31dDGxMDnEP1SaGYpaOsYzH\nXRwQWtSjUsaMa1cnB+04zuCTd13p97sjb1ThGIet7JZSGIaSlgDWB5Y0s2tTy1PDDcM0tLgZHyfE\nt2yk6xd9K6OBYARmPQxvBz6Sx/Gd/jNoBlCvhmwvL9tBe0E7aRi0j6u8qbL+reyWpHMlS1pD0oWE\nLuObCHGdannvlfSPhv7xImTaXdJXJR0BrAQsE9e/KmmgK0InFH2+m9DtQItMp+Y2urRyhG7mnL95\nl/vKhZJck1woUhfrImZcL/RBl64HdtUZv23nea3HGuKH0onfUQnRgnHxPp5aprwoyX2fy2DDkujS\nCx3HOKwSyQafSFoV+CuhBegSYGXmf/H+Nab9FzCtQNH2IczVXM8x8fdPBJ8Dp780i/PWrMWulxG7\nrUb/dmvo+YjhkmKDFTOulxHpY3aEcZMW4a1VgbA7JWJMR0mwBUNLDRMHxSQVrM+knCv5FIIR9j4z\nmyrpKOBIM1uorsxFwHpmtkkSITvEu5Lzp98+fq26GeNx++rj6DiN9NL1XWUfqHZUuZuvLAyaO4bT\nOa3slpThanYALjGzqS3KPAhsUZA8Tolo1tKjnAIDZ3wJvrqv6EaQ1WJ5aPzvvllO7rSqky02G8st\nOh5Ttc/0WCedASelYfg64O42ZV4BlihAFiciaZKVOLp7q67BjFbGy8zs3GaO9s321cHDsNDWiLJf\nk25wXVrTQ9d3LtPrDeh16ckoHpSBN2W5Jnm4Y5RFl9FSFT3akXpKvDXblFkfn/lkYEj5wG3hb/Qw\nMJkuZ78YMN80Z4wyxlt0soziereTBWjynCjFbDhVIusjPaU8Tnek9DG8ANgemGhmjzX6GEqaCNxJ\nCCS5d4FyCTiEEHx7CHgCOD/K9mKTbca8j2FqX5QW/kb3A+tkpLsfkuMMON1+jBbll1jWVski5Er9\nLnA6o6w+ht8DPgz8SdIhhCnxajENtwROAEaA7xcs1w+BzwEXAscDGwIHE6b02a5gWQaJ1KMjm/kV\nLdtlecdxBoQeWvb77pdY1lbJAuVK/S5wRkmyOIZm9lfg04RWucuAL8asZ+P6OsA+ZnZnUTJJ2gj4\nLHCBme1iZr8wsy8C/w1sU6UYWc0YRbyp1I7gzfyKZndZPncyYq0Ndbn9pL4IlgDXpZzUdBltXc1B\njn7fK0UM1mllGHVMH+pXLnJ1QOp3Qd9IEFc5yf2YssUQMztd0rXAgQRfkRWAZ4AbgB+Z2b8KFmnX\n+PvDhvRTgW8TvnbOLVSiwSH16Mhm/kZ7sKCPYWEBSsvaeuB0T9X9plLX1YKOn8tgnTb0ZBg1q185\ndv8WZbDl+i4oa7d8v0l6PzabRHksLsCVhJHQi2Tk/Rl4vMl2llr21AslmCCdJpO9N0svSKbKTsI+\nlpYy1O8eZe643qeuq0Udv9/Pg170aFG/3ptXvSv4/OYlc2nvuzzrUda++n29aGG3JD2xHQq/UoHH\nug14tEneeYSo5wt3c4LH0tLvB+4gLvFcZN3cU1LL5te+K/0GysDv5YWauq62Ov4g1a8ez32z+nVf\nXvWuSCMrr+tV1vsuz3PZYl9/6ef9SAu7Jelcya2QtIykb7LgPIX9ZALwUpO8uXVlKstofCisYf5V\nS9zcXxIfsFF3q5REj6Z0M19v2XVpwaD5TXXlTxavS2p3kGbHeYYBql/W2xzdfR8816NcPdH4LqD3\nubhLdd/V1a88/TWb7WuVJuX7fj8mCVcjaW3gbYRu27+Z2eN1eYsTZpj4IrAc8KKZLVmQXLcRWihX\nzcg7D9gZWMzM5jXkFX8SHcdxHMdxesSahdlL0AR7EjCP0C07DMwBDox5k4AH6tJPAFYuUDb3MfSl\n64U23QoMUDdYj/pXvru83TUu20KPXXCp62rW8cd4/crNx3AQl7Led73eX93uq5/3Yyu7peiTuSch\nNuE84I64zIvLnoTu2leAnwCrJbjYxxKM0vc0pC8GPE+YYq2rE+xL9Zc8HxJlWLp9GFVN/7zOSwlk\nLd0LtUddxnT96qXeDVJd7Ycu/dY/z/sr1b1aJsNwajT+Nq9L25Lg1zcPmA5snLACvikahr9uSP9c\nTP9Etyd40BZgUmoZBk0X+tyiUeQ16eUh1c02Xr8Kla/jl2M7XfJ8OXe7L69fPV33Un0UlP0Z1ose\nvdwTbWQu1JBvZbcUHcdwE+AiM7u+lmBm10i6mOC/t7eZ3V6wTK9iZndI+jFwkKQLgSuAjQiG4TQz\nOyeVbE6pSe20nyddz1pgY3u+3tJiOc333Us8tRbb7EWXc5d7/eqanmYe6SVeYEljDBYy80pe91fe\n+8qFoqz4aKHOA47NSD+O0CI3vkh5msgowuCXuwh+jg8Rpu+b0Ivl7Uv1F0r4hT4KXSrvz+VL13Wi\nl7h8fQ+/4kvTc9/1PdzLM6ysz71W+lOhLvYczpM1yys6XM04gg9hI68AmNmcYsVZEAucYGYbmtl4\nM1vTzL5kZi+mlq1IUk+NNUhYgWEgeqHLa1lY66fXsYGhl5AhPnd5Onq5h3sJv1LUFHvdMuqwR/1i\nUJ55KeIYWoJjOh0iaVI3cenKTJExzayPMRxHo0cP1/IIFowdmtuUYfVz8nYpV+koQ8y8vGijSy+G\nRpK5y8fQNWlFL/dwnsb/AukFX5dm+sMoDdmCn8XJSGEYHi1puH4BjgRoTI/LvDb7c/KnrF+CTvc0\nvZZZX6/tWj9z/OJNWscG5cu9JPRiaDTbZo8e9uV0QY89GHka/0l9q5vpDyzTZJOiWqsH5r1aaIBr\nSSO9bGdmpZ2hBUKAa2sWKHIAkTSF8EXTyFQz26ZoeZzeaXEt/wK8jvkfVPfS4gXSZEBBy216kKvv\ndSxPPcYKeQ5MKOmAhTFNL/fEoN1Hks4itNI1craF2Vn6ffxSvVdb2S2FjkoeAAPv08AWhFlZJhIM\n54XSSpWEUn4JOj3R7JqtCqzTkNZu5F6eo/1S1rFCRi1WCWsxarKZoddsm1b7GjSqYuRaDyO/e9km\nMUcAm7GgIVtUa/XgvFdTj4wp0wLcT3BQnQY8CAx3uJ2llj3HczCJko4260WX1DK0kW+IDkbIjUaP\nFtey6wnayWHEck2XlHUsDz0GoX4VoUvZnhU53Ct9ia9YtC5lW8qiS7fXOE89SnivWLO8ouMYlp2t\nzOxBAEmXAqsnlicJNnhfggNHL7HheqHZtYzrm2dsUohPUeI6Njhf7uWntK2v3bTm9Xg/llZ3JxtL\n2Fo9SO/VQn0MB4loGO5gHXQlV83H0Ok/JfB3GaIAn6I8u9ry2teg+UaVmbL5TdXo9hr3cj+WVXfH\n6YTS+Bg6jvMqvYSHyI1evl673abXVtEsAzBm5dLCOkhf7gNAWVtfu23Na3k/NqmTZdXdcUaFG4bO\nfEiaZGbTUsuRByXXpeOXSr/06KVbpcttuu5qa2ZMArd3u69W5NGlVPL61RWj0CW1Q/981OnR7YdX\n0/uxRZ3ciz7q7vWrfFRFj3ZUzjCUtAxhSrtO+8hPNLNmQVcdp1/k+kIt6ejIXlpFmxmTS/awL6fP\nlLj1tdvWvFb3Y7M6+RlCfLyy6e44o6JyhiFhyqUj6dww/BXNo/F3jKTJwPS4Ohu4tfZlUYuWPgjr\nZjatTPJUeZ3XXiobAU8B+8UX7Xzla9u02N/Hge8zv5G0taT3ZO2vQP2avYSHW+jTzNBbtEn6jLJc\nz0Ffr9Ht9oTRlqfV5ysESy9cn7rn12U0MfR6uB83IpvVYv5pRek3yOs1yiLPWHs/RiYR7teW+OCT\nJsgHnzgDghIPZGmGehus0kyXi4GNu9lXr6icra9Ol+R1Hct6fznOaGhlt5Q64LRTPI1fd4NMVXTp\nQI+kA1maYdlTU7V7OTebSu3QjH31yyjsaD7TTuqXBmTqvSreK5bf/OV9nT+8GVW5JlAdXaqiRzuS\ndSVL2gU4ANjdzLIc7lcHfgn82Mx+U7R8jjNAlHZ0pDUM8mj3YLX2Pmv9bqHJLTZdkxbT3GNVOv2l\ngzrpOJUiWVeypN8DK5nZpi3K3ATMNLMdCpLp/wFvjqu7A+sT/BUBZpvZj5ts513JTjJ66bJ1slGO\nsem8C9JxnLLSym5JOfhkY4KDcCtuBD5UgCw1Pgrs0ZB2TPx9AMg0DB0nJd6ikSt5tr6WsovfcRyn\nFSl9DJcHZrYp8xSwYgGyAGBmnzKzhZos6xYlR0qq5ENRFV060SNHf6q+MgDXpGN/sg50KW0XfyMD\ncF06oip6gPuwlpGq6NGOlC2GTwIT25SZSA6hZBzHcToh59bXUgV/dqqF+7A6/SKlj+F5wI7AW83s\nnxn5GwK3AJea2S5Fy9cN7mPoOE4WHvrG6Rfuw+qMhlZ2S0rD8B3AX4BnCH58VwKPAKsDHwC+BiwD\nvNfM/ppEyA5xw9ApCjc0HMeBfAdKOWOPUsYxNLMbgQOBpYETgLuAZ+PvD2L6AUUZhZJWk3SYpGmS\nZkh6XtIdkr4rafkiZCgDVfKhqIouNT26ibFXVqpyTcB1KSNV0QPch7WMVEWPdiQNcG1mpxLCw/wE\n+D+C/83/EUb/vtnMTitQnA8RQtM8CXwX+DxwHXAIcIuklQuUxXGyaBVjz3GcsUWSwNtO9fEp8SLR\np/EpM5vZkL4PcCpwvJl9ucm23pXs9B3vOnIcpx53LXF6paxxDEuFmd3VJOs8gmH4pgLFcZwsBqbr\nyHGc/tM4s5Dj5EFyw1DSqsC2hEEni2UUMTM7tlip5mPN+PtYQhkKQ9IkM5uWWo48qIoudXoMliv6\nqAAAHXdJREFUfPiTqlwTcF3KSFX0ANeljFRFj3YkNQwlfR34SoMcAqzhf0rD8OtRhjMTyuA4PsOJ\n4ziO03dShqvZDfgVMIUw2ORCYDJwFTAJ2Af4NfAzM/tTF/tdBjiU14zLdpxoZplBtCV9AfgecIqZ\nHdjimO5j6DiO4zjOQFDWOIZ/BtYC1jWzeZJGgKPN7JiYvz1wObCTmV3axX7XBu6nc8Nwopndl7Gf\nfYGfEeZz/k8zG25xzFqL4vSYNBu4tdbkXBvi7uu+7uu+7uu+7uu+XvR6ZBIwFP/vaSU0DJ8BzjGz\nz8T1EeBYMzuqrszlwFJmtmXBsu1NGHByJfARM3ulTXlrdoIHDak6PhRV0aUqeoDrUlaqoktV9ADX\npYxURQ9obbekjGO4CPBU3focwkwn9dxBiHNYGHVG4VWE1sqWRqHjOI7jOE5VSNlieC/wJzPbO67f\nBTxqdfHYJP0K2MHMVihIpr2A04A/Ajua2UsdbleZFkPHcRzHcapNK7sl5ajkW5g/NuAUYH9JnwR+\nQ+gL35kw+0jfkbQjwSh8hjDoZWdpvnP2vJn9tghZHMdxHMdxUpCyK/ky4E2S1onr3yYYZZMJcyZf\nAojiYrS9NR5vWcKgk182LCcUJEdSGhxVB5qq6FIVPcB1KStV0aUqeoDrUkaqokc7khmGZjbZzCaY\n2f1x/SHgHcBPCf59PwfeYWY3FCTP181soRbLukXI4TiO4zhOayQNSTpL0pT4O5RapqqQ0sdwS+BZ\nM7s1iQA54j6GjuM4jlMM0Qi8mgVngdrOPOB/R5R1VPJUYP+Ex3ccx3EcZ/A4jvmNQuL6cQlkqRwp\nDcMnCSFqnBJRJR+KquhSFT3AdSkrVdGlKnqA69KG1bpMz4UqXZNWpDQMpwHvTnj8+ZC0kqQzJP1d\n0lOS5ki6W9Jpkhq/TBzHcRzHScOMLtOdLkjpYzgR+CthnuRjUgeSlrQ+8AvgeuABQmvmRMKczYsB\n7zKzfzbZdmB9DKOvxnGEL60ZwBHuo+E4juOUFfcxHD2t7JaUhuHpwOuB9wCPA38HHoMF5jg2M9un\nYPFeRdLbgb8BPzGzzzYpM5CGod9cjjN6/OPKcYrH77vRUVbDcKTDomZmC/VVmBZIWplgsJ5jZrs1\nKTOohuFZQJZOZ5vZ7kXLkzdVmdeyKnpA9XQBplOBj6uqXJeq6AGuSxmpih5Q3plP1mlfpHgkLUyY\ns3kRQlfy0YRWzMsTitUvkjjwOk6FaDU6cuA/rhzHGXskazEsK5I+CFxal/QY8F0z+2GLbbzF0HHG\nIJKmAFtnZE2tn/fdcRynTJSmxVDSHsCtZnZbH4+xDHAoC/oqNuNEM5tdt349sB0wHtgI+DiwnKSF\nzGw4V2HTcwSwGQt2gxU1DaHjDDo+OtJxnEpRaIth9Cs82syOqUvbE9gzr69rSWsD99O5YTjRzO5r\nsb9VgduAC8zsgCZlDDiT4G8EMJtgAE+L+ZMAyrgeHXhPBVYA/kGYw/qxssg3mvU6HUshzyjWD2FA\n6lO79cZrk1qe0axHpgPXMb/7xQzgC2Z2bpnkbbP+llqvSEnk8frVoFNqebx+DXb9ikwChuL/Pa0M\ng0+UbRgeBRxpCQeYtEPSOcBHgSUsI6yOBrQrOQupUs61ldClKnpANXVRBUZHVuW6VEUPcF3KSFX0\ngNZ2ixuGHSDpYuBDwMpm9lRGfmUMQ8dxHMdxqk0ruyXlzCelQiEsTVb6RsC2wD1ZRqHjOI7jOE5V\ncMPwNQ6TdIek70g6QNKBkn5CmJ1lYeCgxPIVQoM/wkBTFV2qoge4LmWlKrpURQ9wXcpIVfRoR4o4\nhmWNj3MpsDqwC7AysBDwCHAe8H0zuyuhbI7jOI7jOH0nhY9htwc0M0sZiLst7mPoOI7jOM6g0Mpu\nSWFwdWtAucHlOI7jOI5TAIX6GJrZuF6WImUc61TJh6IqulRFD3BdykpVdKmKHuC6lJGq6NEON7oc\nx3Ecx3EcoGAfw0FCkoC/AO8CLjOzHVuUdR9Dx3Ecx3EGAo9j2BsHAW+kvKOoHcdxHMdxcsUNwwwk\nrQF8AziSMTb4pUo+FFXRpSp6gOtSVqqiS1X0ANeljFRFj3a4YZjNj4F7gBNTC5KAt6QWIEeqoktV\n9ADXpaxURZeq6AGuSxmpih4tKXV8wBRI2hn4ILC5mVlwNRxTLJtagBypii5V0QNcl7JSFV2qoge4\nLmWkKnq0xFsM65C0NKGV8BQzuzG1PI7jOI7jOEVSuRZDScsAh9L5oJETzWx2/P89gk/h4f2QbUAY\nSi1AjgylFiAnhlILkCNDqQXIkaHUAuTIUGoBcmIotQA5MpRagBwZSi1ATgylFqAIKheuRtLawP10\nbhhONLP7JG0BTAN2M7Nz6/Y3QgfhakYhsuM4juM4TqGUaUq8vmJmD9BbF/mPgFuBGyWtF9NqJ21C\nTJttZk9lHHPMOSI6juM4jlM9Ktdi2CuSZgFLs2B4GotpBvzYzA4uWjbHcRzHcZwiqFyL4Sj4JLBo\nRvoFwE3At4B7C5XIcRzHcRynQLzFsA2d+Bg6juM4juNUAQ9X0x7Dp8VzHMdxHGcM4IZhG8xsITP7\ncGO6AodKukvSHEkPSjpe0oQUcvaKpImSjpF0vaSZkp6VdIukwwdNl0YkjZd0n6QRSSellqdbJC0X\n69TdsY7NlDRF0ntSy9YNkpaI9em2WL+ekHSdpD1Ty5aFpMMknS/p3lh37mtTfn1JF0t6WtLzkq6R\ntHVR8raiG10k7S7pnFjfXpD0gKTfSnpnkTI3o9vr0rDtAXGbYUnL91PODuXpWhdJH5T0h1jPXpD0\nL0knFyFvC5m6vVc2l3SJpIckvSjpHkk/l7ROUTI3kaur92CZ7/k88K7kHpF0IvA54ELgSmBD4GDg\nGjPbLqVs3SDpW8CBwCXADcArwNbAfwF/BzYzs5fSSdg7ko4H9gOWZMAGDklaC/gTMAH4BfBvYBlg\nE+D3ZnZ+QvE6RmHqoGuAzYDJwF8JOn0CeBfwHTM7LJmAGUT3kaeAm4G3A8+Y2bpNyq4L3Ai8DJwA\nPEuocxsD7zezKYUI3YROdZG0GDAHuAW4nBDya1XgM8DqwCfN7H+LkjuLbq5Lw3arAncRBhEuCaxk\nZk/3U9YOZOpKF0lHAUcR3jVXAC8CawGbmNl/9l/ipnJ1c6+8H7iMMN3s6cCTwBuBTwNzgY3N7NEi\n5M6QreP3YNnv+VwwM1+6XICNgGHg/Ib0zwIjwMdTy9iFLpsCS2WkHxt1PDC1jKPQ6xXgkHhNTkot\nU5fyXws8AKycWpZR6rFZPP/HN6QvTBjM9XRqGTNkHqr7fztwX4uy58d6tnFd2hLAdOCuQdEFWAjY\nIiN9ZeAJ4NFB0SVju4sIAwh/GZ9pyw+SLsB28R46PLXco9Tj9wQDcLmG9H3idTk4oR4dvwfLfs/n\nsXhXcm/sGn9/2JB+KuFLbvdixekdM7vZzJ7LyDqP8IX9poJFGjWSxhGuxRWEl8JAIWlL4D2E1rSZ\nkhaWND61XD2ydPydryXAzOYRWgxeKFyiNpjZ9E7KxS6mDwFTzez2uu1fAE4D1pf09r4I2SGd6mJm\nw2Z2bUb6TELL9cqSVs5ZvK7oVJd6JO0E/D9Cy+dw3jL1Spe6HA48DnwbXnXNKEXs3C71WIpgGM5u\nSH+U8K5J9izo9D04CPd8Hrhh2BtvJ3zBzTefsoWm5luBd6QQKmfWjL+PJ5WiN/4bWJ/QgjuIfIAw\n4OlhSZcSuvhqPkW7pRWta/5GeBF8WdLOktaUtEHsutmU0D02qGwCLEboemrkBsILpQrPgjUI3WaN\nL/RSI2kp4GTgFDO7KbU8vRANkS0ILhj7SnoYeA54PvqDJjXWu+T3BOPwl5I2kbSapO2B44E7gXNb\nbp2G2nvwsfg7Ju55j2PYG6sBT5rZKxl5jwCbS1o4tooMHLHF7WuE5vKkfkXdEp2YjwaONrOHFKZI\nHDQ2IDxgTiX4Fn6S8DD6AvCrWLfOTChfx5jZbEkfIvhJ1vtFPgt81MwuSSNZLqwWfx/JyKulrV6Q\nLH1B0g7AO4Ezzezl1PJ0yXcJ99HhqQUZBa8ndPNvDryPEE/3NoKxeAiwsaS3m9ncdCJ2zDcJrgl7\nA/UfuJcDn4itbqWh4T14Tkyu/D0Pbhj2ygSg2YCMuXVlni1GnNw5kTAw4DAzuzu1MF1yCsG5+YTU\ngoyCpeLvs8DWtQ8MSb8F7iM8YAfCMIy8ANwB/Bb4C7A8cBBwjqQdzeyPKYUbBbXRilnPgrkNZQYO\nSROBXwEPAV9MLE5XKIzc359gcGR1EQ4KtWfBisC+ZnZGXP+tpOeAI4E9gZ+lEK5LRgjG0x+A3wCz\nCC4zBwPnxWdBabr7yX4PVvqer+Fdyb3xIqEFJ4vF68oMHJKOJby0f2Zm300tTzdI2h3YFjigZA+Y\nbplD6Eo+p77V2cxmE0bNrSJpg1TCdYOkjQnG4O/N7H/M7Lfx5bYFoXvm1LL4S/VA7R7PehYM+nNg\nHeCPwDzgA5YxR3xZkbQIwVC6ygZk9H4L5sTfEeCshrwzCS2ik4oUaBScSWgt3MXMJsdnwZeBzxPc\nZ0oTvqrFe7Cy93w9bhj2xgxgxfgAamR1QjfzwHUjSzoa+CrwCzM7MLE4XSFpUeD7hAEnMyWtJ2k9\nYCgWWSamLZNKxi54OP4+lpFXG8SxXEGyjJZDCQ/RC+oTzWwOoQtpbV67RoPGjPib1XVUS8vqcio1\nkoaAqYSWj/8ws38kFah7Pktwxzih9hyQ9Hpea31bN3XcvC6oPQtmZbguDcyzQNKahEGbl9mC4c9+\nHX+3KlaqbNq8Byt5zzfihmFv3Eg4d/MFfo2xwN5Cw6CUQSDeDEcCZ5jZfonF6YXxwErAB4G765ap\nhNa3TxL89fZJJWAX/I3QErBGRl7NGXpmceKMippPzkIZeQs3/A4atxO6lDbPyNucUO8GatBDNAqn\nEeL9bWdmt6WUp0fWIjyfr+S158C/gVq8v78RYtOVnjgq/EFgeUmLN2TXng+D8CyoGU1Z93ppngMd\nvAcrd89n4YZhb5wXfw9pSN+fYKCcXaw4o0PSkYSb4UwzGwTDKYsXgJ2BXeJvbTmAYGT9Lq4PwmCH\niwkjD3evj7ofA/V+GPiXmXU860Ni/kE4/3vVJ0paFvgIwc/onuLFGj3RWf5SYFLsMgdA0pLAvsC/\nzWxgPhLjQK2phBBD7zOzWxOL1Cuns+BzYGeCwQuhLg5MSDGCn6cIgaDrOZBgiFxeuETd8y9CuKCP\nZPTafCr+/q1Ykeank/dg1e75ZvjMJz2iMMXaQYSX+BWEoNefA641s21TytYNkg4ihHR4gHBTjDQU\nedzMri5csJyIL7v7gR/ZYM18sh9hIM0/CC+6xQix2FYBPjgoAzbiDC43A8sSRrhfB6xAeIiuTQgc\nWyrH+eirujbhZfxZYBHgBzH7ATM7q67seoRQIvN4bRaE/QkzOuyQ+t7pVJf4Yrstlj2Z7F6Pq8zs\nib4L3YRurkuT7c8A9qAcM590U8eWItSxiYRIBX8n+OjuClwNbG+JXuRd6vE9QiixBwh6PA28l6DH\nPcDbzOz54qR/jW7eg2W/53MhdYTtQV0IN8KhhKmW5hBG7n0PmJBati71OIPwJddsmZJaxlHqt3bU\n48TUsvQg+0cIAzeeA54htHpullquHvRYJ9azBwndMLMJrTcfTi1bE3mndnM/EPzZLiK86J4nBITe\nOrUe3ehSd5+0WrYcBF1abH8G4WVehplPuq1jywM/JvgcziUYUscAiw6YHvsA1xOMqZcIURZOAlZI\nrEdX78Ey3/N5LN5i6DiO4ziO4wDuY+g4juM4juNE3DB0HMdxHMdxADcMHcdxHMdxnIgbho7jOI7j\nOA7ghqHjOI7jOI4TccPQcRzHcRzHAdwwdBzHcRzHcSJuGDqO4ziO4ziAG4aO4yRE0laSRuI8pZ1u\nc3TcZst+ytYtkiZHudZKLUvVkbS+pJckfbEhfZqkxunMkiJp01gv9k4ti+N0ghuGjlMxJG0g6WRJ\nt0uaHV+gj0i6TNLekhZNLeMosbiUja7kknRGNBhaLaf3Ud5B5gfAk8CPGtL7UjckbRevxw0dlN01\nlr0IwMxuBi4GjpU0IW/ZHCdvFk4tgOM4+RFb3o4kzOV9PfBHwlzLrwO2JExe/xngnalkzIGTgXMI\ncy8POgb8Fri1SX6z9DGLpHcDOwCHmdncIo5pZldLuh94h6Q3mtmdLYrvR7iuP6tL+xbwV+Bg4Nv9\nk9RxRo8bho5TESQdDhwNPADsYmY3ZZR5H/DlgkXLFTN7mjB5fVW42Mx+mVqIAeIgYBj4VcHHPQ34\nBsHwOySrgKT1CB9gD5nZlbV0M7tR0j+BT+OGoVNyvCvZcSqApLWBo4CXgR2yjEIAM7sK+EDG9h+T\ndE3sen5R0m2SvpLV7SxpuqT7JC0h6QRJD8ZtbpH04VhmIUlflfRvSXMk3SPpoDY6bCbp6ijDs5Ku\nlPS2jHKZPoYxbYqkFST9XNIMSXMl3SFprxbH3V7SFZKeiOXvkfRdScs0Kb+dpGslPS/pKUkXSdqg\nlW55IGntWvdy/H9ulHmOpBslfbDFtp+QNFXSrFj+H/H6ZF3f2nl8naTTJD0saZ6kPerKTJR0oaSn\n43m4TtIOkvaM2+8Ry42T9FC8ppndqNHtYUTSf3ZwDpYCPgr8xcxmdHLe4nbbSHom6rJJQ967JF0g\n6VEFt4sHJZ0iadWG3ZwOzAN2zzpvkf3i72kZeecCa0n6j07ldpwUuGHoONVgb2AR4AIzu6tVQTN7\npX5d0jcJL60NgLMJXbUA3wSulNTYs2DxWH8A3k/wn/olsC5wgaRtgPMJrSNTCd3XSwAnSdqliVib\nAdOAOQS/sSuAbYBrJb0n4/jN/MiWBa4D3gX8GpgMrAqcLumTjYUlHQX8DngHcBlwInA38EXgz5KW\nbCi/M3AlsClwHnAKsDyh236dJjLlzRDwN2Atwnk/F3gjcLGkrRoLK/gpnk28PoTz+xRwLPA7SVnv\ngeWBGwguBxcS6sTjcX9vIHSLfgS4FvghoZX6NzHt1WtjZiPAz4GlgE9kyLY4sBswg9Cl3o4tgUWB\nP3dQtnaM3Qj16SFgMzO7rS5v77iv7YEpwAnAjcA+wE2S1qjT5XFCHVmOYJw2HmchYA9Ca+YZGaJc\nR3DxcMPQKTdm5osvvgz4AlxNeCHt3eV2mwEjwP3ASnXp44BL4j6/0rDN/TH9YmCRuvT3xn09RTAc\nlqrLWwd4Cfi/hn1tFbcZBg5oyPtQzPtXQ/pRsfyWDem1/fwMUF36hsArwB0N5beO21xbL2vM2yPm\nfb8ubYmo20vAWxvKf7/u+Gt1eO7PiOUvijplLevXlV+77hhHNOzrfTHvsob0vWL6r4FFG/KOjPv6\nXJPzeAYwLkPuP8b8/RvSt6/bdo+69FUILdl/y9hXTb5jOjxn34r736lJ/lRguG79f2L5acCyDWUn\nxmv5L2CVjLoxD7iwIf39Ud4pGcfeKeb9tolsS8f8G3q5x33xpagluQC++OLL6BfgzvgCfF+X250a\nt9snI29ifDne05BeMwyHMra5N+ZtlZE3Jb6I6422mmH4rybyTY3726IurZVh+BywZMZ+psVtJtSl\nXRTTNmxy7JuBx+rWd43HOD2j7NLALLo3DGuGVLNlx7ryNcPwvvpzWJc/HZjZkHZLPOdLZ5QfBzzR\naKjEY8wBVszYZo021+sqGgzDmH5+TG80qK8nGO2dnrOz4342a1NfRGgZHYnHXjSj7Amx7Aea7Os3\nBIN2ibo01dX/9RrKXx7TP9hC/heBGZ3o6osvqRYffOI4Y5u3xt+pjRlmdrekh4F1JC1lZs/VZc82\ns+kZ+5tB6Oq8OSPvEcKAt1WARxvyrm0i3zRC9+FbW5Sp524zez4j/aH4uxzh5QyhtfQV4GOSsva1\nKLCSpOXMbBah+9iAaxoLmtmzkm6NsnaDAXuZWTcDKW41s6yu9IcIOgEgaTywCcH4OzRDRxGMxg0z\n9jXdzJ7MSH9L/L2+iWx/BrbNSP8JsDPBveAzUb43Ebr8LzezTkeYrxB/Z7UpdyGhW/tEMzu0SZna\nuZokKWuU/srAQsD6BAMbMzNJvwCOAfYFDou6rE5oMZ1B6LZuxtNxv45TWtwwdJxq8CjwBmD1Lrer\nDbBoNNTq97smwXev3jB8pkn5eQANRuR8eQT/xEYeb7K/xwgGTOZAkAxmt5KL8KKvsUJcbxVc24Al\nCYZITYZWsvZCplXaglY61vsLLhf3vRLtdWykmS7tzkFmuplNk3QX8AlJXzCzFwhGYmNYl3bMib+L\ntym3BcHov6xFmZqR+cUWZWrXv57TCa3We0o6wsyGCT6J44BfNDHaa4znNR0cp5T44BPHqQZ/JhgB\nWa01ragZeKs0yV+1oVy/eF2T9FUIL+d+HP8ZYJaZLdRiWdjMHqor307WMlGT95Z2OmZs28y4eTb+\nNjsHzdIhDNRZCtitbtDJI4Qu2E6ZGX9XaFkq+AjOBi6VtMAo/Ejt/Czd5vrP11JtYTT0FQRdP6TQ\nFLs3oRv5F80EiuWWrdPBcUqJG4aOUw3OILSQfDSOGm1KQ6iNW+LvpIxy6xF8yu43s2cb83PmvU3S\nt46/tzTJHw03AMtJyupKzeJmgvGdNfJ3aV7rZi0FsVXuTuCNkpbNabe1gNubN8nfosW2ZxK68fcH\n/otgJJ3WpoWtkdsI16BlHTezOwjX6WngIsUwSg3UZjHpZWrFn0c59iWMMl4L+H3dR0QWG8RtPGi5\nU2rcMHScCmBmDxCCWy8GXJEV/w8gtp5cWZd0OuFldYSkFevKjSOMtBXZMdnyZqIa4hzGl/mWBL/B\nTvwLu+UEgn6nZsSsQ9IESe+qS/otoUt514zz+3U67+4ukh8Q6sQZWXEZJS0r6a0LbpZNNHymAa+X\n9JmGfb2fFi3W8ePifwm+mscRur67rVvT4u9mrQrF4/2TUH8eA36dESrpR1GGEyRNbNxe0iKSmn2w\n/A54mOBXeCShhfXUNiLVZJ7STnbHSYn7GDpORTCzb8VYakcBN0r6C3AT8DyvTYk3kRADr7bN9ZK+\nC3wJuEPSBcALhCDYbyQM+Di+APGvBI6Phuvfo5w7Efyx9u7HAc1siqT/IYRAuVvSFYQRp0sSRgBv\nRdB/h1j+BUn7E+IGXivpPIIP5nsJ5+oaWreYZSFgJ0nNYiBON7Mzu9znq5jZGZI2BQ4E7pX0e8JU\ngssTQghtSfg4OLCL3R5EiMn3E0k7EFrx1gX+kxDC6MOE0cBZ/ITQyrYacIl1EaQ66nOnpH8B20pS\nu9ZGM7tP0hYEY+x/JS1eG+hjZv+KcQx/Adwp6Urg3wQf2LUI13ImsFHGfmvzWB8JvJtQDy5tI/72\nBEP0ks41dpwEpB4W7YsvvuS7ELqsTiS8sGcDc3nNl2sv6mIP1m3zMYJh8wyhu+924Ctkh/m4H7i3\nybGnAvOa5J1BeDGuVZe2FcE362uEEapXRZmfIbTKbJqxn2bhaoaBP3Z67Lq8dxOMvYfjuXqc0G38\nvSbH3zaeq+cJcQ1/Qxi52vQYLWRqFapmmLp4eQRjdZgwwKHbc78DwSB5LOo4g9CV+nXqYiW2O491\nZdYnBMt+mjAo6TrCx8QXaAizk7HtzbHM+3us3wfH7bfv9BwQfGX/QXC32Kch740E4/h+wofIk/He\n+SkwqYUca8T9DQPHtpF56XhfXdhOP198Sb3IrBv3DsdxHMfJRtLZwMeBN5jZ3Rn5SxKM0qfMrKeZ\nYuK0ePcC15nZTqORtygkfY4wQ8x7zaxZqB/HKQXuY+g4juN0jAILjD6WtC2h5fnOLKMwciChq/7H\nvR7fQiiko4Adu/GPTEUcgf0VwnSVbhQ6pcd9DB3HcZxuWBR4SNJU4J+E7vM3EkbnvkTwQXyVOGL7\nQEKMzX0Jbg0/HaUMPyMM9ilbiKAshgjyTk4rhuN0hnclO47jOB0TR6yfAGxD8LObQPDL+xPwHTP7\ne0P5tQn+e3MJg6EONjMP2eI4JcUNQ8dxHMdxHAdwH0PHcRzHcRwn4oah4ziO4ziOA7hh6DiO4ziO\n40TcMHQcx3Ecx3EANwwdx3Ecx3GcyP8Hw7zm8z2Yn8cAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from matplotlib import gridspec\n", + "\n", + "fig = plt.Figure(figsize=(8,6))\n", + "gs = gridspec.GridSpec(2, 1, height_ratios=[10,5])\n", + "ax1 = plt.subplot(gs[0])\n", + "ax2 = plt.subplot(gs[1])\n", + "\n", + "ax1.hist(E_Doke,bins=np.arange(0.05, 25 + binwidth, binwidth),facecolor='none',edgecolor='black',linewidth=2, histtype='step', alpha=0.9);\n", + "ax1.plot(bin_center_NEST_MAX,num_sim*SimToData_scale_factor,linewidth=2,color='blue')\n", + "ax1.set_xlim([0,22])\n", + "ax1.grid(True)\n", + "ax1.set_ylabel(r'Count',fontsize=20)\n", + "for tick in ax1.xaxis.get_major_ticks():\n", + " tick.label.set_fontsize(18) \n", + "for tick in ax1.yaxis.get_major_ticks():\n", + " tick.label.set_fontsize(18) \n", + "\n", + "\n", + "ax2.plot(bin_center_NEST_MAX,frac_res,'ko',linewidth=2)\n", + "ax2.plot([0,22],[0,0],'k')\n", + "ax2.grid(True)\n", + "ax2.set_xticks(np.arange(0,22,2))\n", + "ax2.set_xlim([0,22])\n", + "ax2.set_ylim([-4,4])\n", + "ax2.set_ylabel(r'Frac Res ($\\sigma$)',fontsize=20)\n", + "ax2.set_xlabel('Combined Energy (keV)',fontsize=20)\n", + "for tick in ax2.xaxis.get_major_ticks():\n", + " tick.label.set_fontsize(18) \n", + "for tick in ax2.yaxis.get_major_ticks():\n", + " tick.label.set_fontsize(18) " + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:1: RuntimeWarning: invalid value encountered in true_divide\n", + " if __name__ == '__main__':\n", + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:2: RuntimeWarning: invalid value encountered in true_divide\n", + " from IPython.kernel.zmq import kernelapp as app\n" + ] + } + ], + "source": [ + "thresh=num_data/(num_sim*SimToData_scale_factor)\n", + "thresh_err=sqrt( (sqrt(num_data)/(num_sim*SimToData_scale_factor))**2 + (num_data/(num_sim*(SimToData_scale_factor**2)))**2)\n", + "no_nan_cut=np.logical_not(numpy.isnan(thresh))*np.logical_not(numpy.isinf(thresh))\n", + "thresh_nonan=thresh[no_nan_cut]\n", + "xbin_nonan=bin_center_NEST_MAX[no_nan_cut]" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def func(x,mu,sig):\n", + " return (1/2)*scipy.special.erf((x-mu)/(sqrt(2)*sig))+(1/2)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 1.21435683, 0.29387623])" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "popt, pcov = scipy.optimize.curve_fit(func,xbin_nonan,thresh_nonan)\n", + "thresh_yval=(1/2)*scipy.special.erf((bin_center_NEST_MAX-popt[0])/(sqrt(2)*popt[1]))+(1/2)\n", + "\n", + "popt" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from scipy import optimize\n", + "\n", + "def line( x, p):\n", + " return p[0]*x + p[1] \n", + "\n", + "def linef( x, p0, p1):\n", + " return p0*x + p1\n", + "\n", + "def erfit( x, p0, p1):\n", + " return (1/2)*scipy.special.erf((x-p0)/(sqrt(2)*p1))+(1/2)\n", + " \n", + "\n", + "\n", + "def fit_function(p0, datax, datay, function, **kwargs):\n", + "\n", + " errfunc = lambda p, x, y: function(x,p) - y\n", + "\n", + " ##################################################\n", + " ## 1. COMPUTE THE FIT AND FIT ERRORS USING leastsq\n", + " ##################################################\n", + "\n", + " # If using optimize.leastsq, the covariance returned is the \n", + " # reduced covariance or fractional covariance, as explained\n", + " # here :\n", + " # http://stackoverflow.com/questions/14854339/in-scipy-how-and-why-does-curve-fit-calculate-the-covariance-of-the-parameter-es\n", + " # One can multiply it by the reduced chi squared, s_sq, as \n", + " # it is done in the more recenly implemented scipy.curve_fit\n", + " # The errors in the parameters are then the square root of the \n", + " # diagonal elements. \n", + "\n", + " pfit, pcov, infodict, errmsg, success = \\\n", + " optimize.leastsq( errfunc, p0, args=(datax, datay), \\\n", + " full_output=1)\n", + "\n", + " if (len(datay) > len(p0)) and pcov is not None:\n", + " s_sq = (errfunc(pfit, datax, datay)**2).sum()/(len(datay)-len(p0))\n", + " pcov = pcov * s_sq\n", + " else:\n", + " pcov = inf\n", + "\n", + " error = [] \n", + " for i in range(len(pfit)):\n", + " try:\n", + " error.append( numpy.absolute(pcov[i][i])**0.5)\n", + " except:\n", + " error.append( 0.00 )\n", + " pfit_leastsq = pfit\n", + " perr_leastsq = numpy.array(error) \n", + "\n", + " ###################################################\n", + " ## 2. COMPUTE THE FIT AND FIT ERRORS USING curvefit\n", + " ###################################################\n", + "\n", + " # When you have an error associated with each dataY point you can use \n", + " # scipy.curve_fit to give relative weights in the least-squares problem. \n", + " datayerrors = kwargs.get('datayerrors', None)\n", + " curve_fit_function = kwargs.get('curve_fit_function', function)\n", + " if datayerrors is None:\n", + " pfit, pcov = \\\n", + " optimize.curve_fit(curve_fit_function,datax,datay,p0=p0)\n", + " else:\n", + " pfit, pcov = \\\n", + " optimize.curve_fit(curve_fit_function,datax,datay,p0=p0,\\\n", + " sigma=datayerrors)\n", + " error = [] \n", + " for i in range(len(pfit)):\n", + " try:\n", + " error.append( numpy.absolute(pcov[i][i])**0.5)\n", + " except:\n", + " error.append( 0.00 )\n", + " pfit_curvefit = pfit\n", + " perr_curvefit = numpy.array(error) \n", + "\n", + "\n", + " ####################################################\n", + " ## 3. COMPUTE THE FIT AND FIT ERRORS USING bootstrap\n", + " #################################################### \n", + "\n", + " # An issue arises with scipy.curve_fit when errors in the y data points\n", + " # are given. Only the relative errors are used as weights, so the fit\n", + " # parameter errors, determined from the covariance do not depended on the\n", + " # magnitude of the errors in the individual data points. This is clearly wrong. \n", + " # \n", + " # To circumvent this problem I have implemented a simple bootstraping \n", + " # routine that uses some Monte-Carlo to determine the errors in the fit\n", + " # parameters. This routines generates random datay points starting from\n", + " # the given datay plus a random variation. \n", + " #\n", + " # The random variation is determined from average standard deviation of y\n", + " # points in the case where no errors in the y data points are avaiable.\n", + " #\n", + " # If errors in the y data points are available, then the random variation \n", + " # in each point is determined from its given error. \n", + " # \n", + " # A large number of random data sets are produced, each one of the is fitted\n", + " # an in the end the variance of the large number of fit results is used as \n", + " # the error for the fit parameters. \n", + "\n", + " # Estimate the confidence interval of the fitted parameter using\n", + " # the bootstrap Monte-Carlo method\n", + " # http://phe.rockefeller.edu/LogletLab/whitepaper/node17.html\n", + " residuals = errfunc( pfit, datax, datay)\n", + " s_res = numpy.std(residuals)\n", + " ps = []\n", + " # 100 random data sets are generated and fitted\n", + " for i in range(100):\n", + " if datayerrors is None:\n", + " randomDelta = numpy.random.normal(0., s_res, len(datay))\n", + " randomdataY = datay + randomDelta\n", + " else:\n", + " randomDelta = numpy.array( [ \\\n", + " numpy.random.normal(0., derr,1)[0] \\\n", + " for derr in datayerrors ] ) \n", + " randomdataY = datay + randomDelta\n", + " randomfit, randomcov = \\\n", + " optimize.leastsq( errfunc, p0, args=(datax, randomdataY),\\\n", + " full_output=0)\n", + " ps.append( randomfit ) \n", + "\n", + " ps = numpy.array(ps)\n", + " mean_pfit = numpy.mean(ps,0)\n", + " Nsigma = 1. # 1sigma gets approximately the same as methods above\n", + " # 1sigma corresponds to 68.3% confidence interval\n", + " # 2sigma corresponds to 95.44% confidence interval\n", + " err_pfit = Nsigma * numpy.std(ps,0) \n", + "\n", + " pfit_bootstrap = mean_pfit\n", + " perr_bootstrap = err_pfit\n", + "\n", + "\n", + " # Print results \n", + " print \"\\nlestsq method :\"\n", + " print \"pfit = \", pfit_leastsq\n", + " print \"perr = \", perr_leastsq\n", + " print \"\\ncurvefit method :\"\n", + " print \"pfit = \", pfit_curvefit\n", + " print \"perr = \", perr_curvefit\n", + " print \"\\nbootstrap method :\"\n", + " print \"pfit = \", pfit_bootstrap\n", + " print \"perr = \", perr_bootstrap" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 2.75614733e-01, 3.95160400e-06],\n", + " [ 3.95160400e-06, 5.51248629e-01]])" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pcov" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 0.52499022, 0.7424612 ])" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "popt_err=np.sqrt(np.diag(pcov))\n", + "popt_err" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:1: RuntimeWarning: invalid value encountered in true_divide\n", + " if __name__ == '__main__':\n", + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:2: RuntimeWarning: invalid value encountered in true_divide\n", + " from IPython.kernel.zmq import kernelapp as app\n", + "//anaconda/lib/python2.7/site-packages/matplotlib/axes/_axes.py:2790: MatplotlibDeprecationWarning: Use of None object as fmt keyword argument to suppress plotting of data values is deprecated since 1.4; use the string \"none\" instead.\n", + " warnings.warn(msg, mplDeprecation, stacklevel=1)\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "thresh=num_data/(num_sim*SimToData_scale_factor)\n", + "thresh_err=sqrt( (sqrt(num_data)/(num_sim*SimToData_scale_factor))**2 + (num_data/(num_sim*(SimToData_scale_factor**2)))**2)\n", + "plt.errorbar(bin_center_NEST_MAX,thresh,yerr=thresh_err,xerr=None,ecolor='black',elinewidth=2,capsize=0,fmt=None)\n", + "plt.xlim([0,20])\n", + "plt.ylim([0,1.4])\n", + "plt.scatter(bin_center_NEST_MAX,thresh,c='black',marker='o')\n", + "plt.plot(bin_center_NEST_MAX,thresh_yval,linewidth=2)\n", + "plt.xticks(np.arange(0,22,2))\n", + "plt.yticks(np.arange(0,1.4,0.1))\n", + "plt.ylabel('Data/Theory',fontsize=22)\n", + "plt.xlabel('Combined Energy (keV)',fontsize=22)\n", + "plt.legend((r'Fit=$\\frac{erf}{2}(\\frac{(x-\\mu)}{\\sqrt{2}\\sigma}) + \\frac{1}{2}$','Data'),loc='lower right')\n", + "\n", + "\n", + "ax=plt.gca()\n", + "ax.grid(True)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Minimize Chi^2 from 4 to 20 keVee to extract optimal g1 g2

" + ] + }, + { + "cell_type": "code", + "execution_count": 186, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "g2= \n", + "17.0 17.05 17.1 17.15 17.2 17.25 17.3 17.35 17.4 17.45 17.5 17.55 17.6 17.65 17.7 17.75 17.8 17.85 17.9 17.95 18.0 18.05 18.1 18.15 18.2 18.25 18.3 18.35 18.4 18.45 18.5 18.55 18.6 18.65 18.7 18.75 18.8 18.85 18.9 18.95 19.0 19.05 19.1 19.15 19.2 19.25 19.3 19.35 19.4 19.45 19.5 19.55 19.6 19.65 19.7 19.75 19.8 19.85 19.9 19.95 20.0 20.05 20.1 20.15 20.2 20.25 20.3 20.35 20.4 20.45 20.5 20.55 20.6 20.65 20.7 20.75 20.8 20.85 20.9 20.95 21.0 21.05 21.1 21.15 21.2 21.25 21.3 21.35 21.4 21.45 21.5 21.55 21.6 21.65 21.7 21.75 21.8 21.85 21.9 21.95 22.0 22.05 22.1 22.15 22.2 22.25 22.3 22.35 22.4 22.45 22.5 22.55 22.6 22.65 22.7 22.75 22.8 22.85 22.9 22.95\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:33: RuntimeWarning: divide by zero encountered in true_divide\n" + ] + } + ], + "source": [ + "Fit_min_keV=array([2,4,4]) # normalize the histograms above 4 keV\n", + "Fit_max_keV=array([16,18,20]) # fit histograms to max keV. Nominal is 20 keV\n", + "Chi_hist_min=1e6*ones(Fit_max_keV.size)\n", + "Chi_red_min=1e6*ones(Fit_max_keV.size)\n", + "g1_best=ones(Fit_max_keV.size)\n", + "g2_best=ones(Fit_max_keV.size)\n", + "\n", + "g1_range=np.arange(0.08,0.11,0.001) #scan g1 ... use 0.0002?\n", + "g2_range=np.arange(17.0,23.0,0.05) #scan g2\n", + "SE_size=SE_WS #measured in Dec trititum data\n", + "sigma_SE_size=sigma_SE #measured in Dec trititum data\n", + "\n", + "Chi_red=10*ones((g1_range.size,g2_range.size,Fit_max_keV.size))\n", + "Chi_hist=1000*ones((g1_range.size,g2_range.size,Fit_max_keV.size))\n", + "\n", + "E_step=0.25;\n", + "jj=0;\n", + "print 'g2= '\n", + "for g2_scan in g2_range:\n", + " ii=0;\n", + " print g2_scan,\n", + " for g1_scan in g1_range:\n", + " \n", + " E_com_test=1/73*(S1/g1_scan + S2/g2_scan)\n", + "\n", + " n, bins = histogram(E_com_test, bins=np.arange(0.05, 25 + E_step, E_step), normed=0)\n", + " bincenters = 0.5*(bins[1:]+bins[:-1])\n", + " nTs, binsTs = histogram(E_com_Tsim_NEST_MAX, bins=np.arange(0.05, 25 + E_step, E_step), normed=0)\n", + " bincentersTs = 0.5*(bins[1:]+bins[:-1])\n", + "\n", + " for kk, minE in enumerate(Fit_min_keV):\n", + " norm_real_s=sum(n[aLib.inrange(bincenters,[Fit_min_keV[kk], Fit_max_keV[kk]])]*E_step)/sum(nTs[aLib.inrange(bincentersTs,[Fit_min_keV[kk], Fit_max_keV[kk]])]*E_step) \n", + " diff_hist= (n[aLib.inrange(bincenters,[Fit_min_keV[kk], Fit_max_keV[kk]])]-nTs[aLib.inrange(bincentersTs,[Fit_min_keV[kk], Fit_max_keV[kk]])]*norm_real_s)**2/n[aLib.inrange(bincenters,[Fit_min_keV[kk], Fit_max_keV[kk]])] # (diff/sigma)^2 ... where sigma ~ sqrt(no)\n", + " Chi_red[ii,jj,kk]=sum(diff_hist)/(n[aLib.inrange(bincenters,[Fit_min_keV[kk],Fit_max_keV[kk]])].size) # devide by v to get red_X^2. The two hisotograms are nomalized above norm_keV\n", + " Chi_hist[ii,jj,kk]=sum(diff_hist) \n", + " \n", + " if Chi_hist[ii,jj,kk]< Chi_hist_min[kk] :\n", + " g1_best[kk]=g1_scan\n", + " g2_best[kk]=g2_scan\n", + " Chi_hist_min[kk]=Chi_hist[ii,jj,kk]\n", + " Chi_red_min[kk]=Chi_red[ii,jj,kk]\n", + " \n", + " ii=ii+1\n", + " \n", + " jj=jj+1\n" + ] + }, + { + "cell_type": "code", + "execution_count": 187, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 0.95393484, 0.76229903, 0.82744607])" + ] + }, + "execution_count": 187, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Chi_red_min" + ] + }, + { + "cell_type": "code", + "execution_count": 188, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[array([ 0.097, 0.098, 0.098]),\n", + " array([ 20.4, 20.3, 20.3]),\n", + " array([ 0.81339713, 0.80940989, 0.80940989])]" + ] + }, + "execution_count": 188, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[g1_best,g2_best,g2_best/SE_WS]" + ] + }, + { + "cell_type": "code", + "execution_count": 189, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "Chi_red[isinf(Chi_red)]=max(Chi_red[~isinf(Chi_red)]) # clean up inf\n", + "Chi_hist[isinf(Chi_hist)]=max(Chi_hist[~isinf(Chi_hist)]) # clean up inf\n", + "Chi_hist[isnan(Chi_hist)]=max(Chi_hist[~isnan(Chi_hist)]) ####\n", + "Chi_hist_diff=Chi_hist-Chi_hist.min()*ones(Chi_hist.shape) # Chi_diff to get 1,2,3 sigma intervals" + ] + }, + { + "cell_type": "code", + "execution_count": 190, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "savetxt('/global/homes/r/rknoche/iPyNb/Analysis_Code/Run04_CH3T_G1G2_Kr2p22/Feb2016_CH3T_Kr2p22_g1g2.txt',[g1_best,g2_best])\n", + "savetxt('/global/homes/r/rknoche/iPyNb/Analysis_Code/Run04_CH3T_G1G2_Kr2p22/Feb2016_CH3T_Kr2p22_Chi.txt',Chi_hist.flatten())" + ] + }, + { + "cell_type": "code", + "execution_count": 191, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "Chi_hist_diff=Chi_hist\n", + "for ii in [0,1,2]:\n", + " Chi_hist_diff[:,:,ii]=Chi_hist[:,:,ii]-Chi_hist[:,:,ii].min()*ones(Chi_hist[:,:,ii].shape)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 192, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# calculate the chi_diff to n_sigma\n", + "conf_to_chiDiff=array([linspace(0,40,10000), 1-scipy.stats.chisqprob(linspace(0,40,10000),2)]) #1-chisqrprob\n", + "sigma_to_conf=array([linspace(0,8,10000), scipy.special.erf(linspace(0,8,10000)/sqrt(2))])\n", + "chiDiff_to_sigma=array([conf_to_chiDiff[0,:], interp(conf_to_chiDiff[1,:],sigma_to_conf[1,:],sigma_to_conf[0,:])])" + ] + }, + { + "cell_type": "code", + "execution_count": 193, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "Sig_hist=interp(Chi_hist_diff, chiDiff_to_sigma[0,:], chiDiff_to_sigma[1,:]) # get the sigma contour from 2D X^2 diff" + ] + }, + { + "cell_type": "code", + "execution_count": 194, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "savetxt('/global/homes/r/rknoche/iPyNb/Analysis_Code/Run04_CH3T_G1G2_Kr2p22/Feb2016_CH3T_Kr2p22_g1g2.txt',[g1_best,g2_best])\n", + "savetxt('/global/homes/r/rknoche/iPyNb/Analysis_Code/Run04_CH3T_G1G2_Kr2p22/Feb2016_CH3T_Kr2p22_Chi.txt',Chi_hist.flatten())\n", + "savetxt('/global/homes/r/rknoche/iPyNb/Analysis_Code/Run04_CH3T_G1G2_Kr2p22/Feb2016_CH3T_Kr2p22_Chi_Diff.txt',Chi_hist_diff.flatten())\n", + "savetxt('/global/homes/r/rknoche/iPyNb/Analysis_Code/Run04_CH3T_G1G2_Kr2p22/Feb2016_CH3T_Kr2p22_Sig.txt',Sig_hist.flatten())" + ] + }, + { + "cell_type": "code", + "execution_count": 195, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:2: RuntimeWarning: divide by zero encountered in log10\n", + " from IPython.kernel.zmq import kernelapp as app\n" + ] + }, + { + "data": { + "image/png": "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\n0vPs4n76wi8AAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "v=arange(0,3.05,0.05);\n", + "contourf(g2_range,g1_range,log10(Chi_hist_diff.min(2)),200,linecolor='none'); \n", + "cb=plt.colorbar()\n", + "plt.xlabel('g2')\n", + "plt.ylabel('g1')\n", + "cb.set_label('log10(Diff_Chi^2)')\n", + "plt.rcParams.update({'font.size': 18})" + ] + }, + { + "cell_type": "code", + "execution_count": 196, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[,\n", + " ,\n", + " ]" + ] + }, + "execution_count": 196, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "v=arange(0.1,3.0,0.05);\n", + "contourf(g2_range,g1_range,Sig_hist.min(2),v,linecolor='none') \n", + "cb=colorbar()\n", + "cb.set_label('sigma')\n", + "plt.xlabel('g2',fontsize=18)\n", + "plt.ylabel('g1',fontsize=18)\n", + "plt.plot([g2_range.min(),g2_range.max()],[g1_best,g1_best],'--r')\n", + "plt.xlim([17,23])\n", + "plt.ylim([0.09,0.11])\n", + "plt.plot([g2_best,g2_best],[g1_range.min(),g1_range.max()],'--r')\n", + "#plt.text(g2_best*1.02,g1_best*1.02,'g1={:1.4g}\\ng2={:1.4g}'.format(g1_best,g2_best))" + ] + }, + { + "cell_type": "code", + "execution_count": 197, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.762299028428 66 18\n" + ] + } + ], + "source": [ + "min_a=100000\n", + "from operator import itemgetter\n", + "\n", + "for i in range(0,len(Chi_red[1,:,1])):\n", + " b,a=min(enumerate(Chi_red[:,i,1]), key=itemgetter(1))\n", + " if a < min_a:\n", + " min_a=a\n", + " min_b=b\n", + " min_i=i\n", + "\n", + "print min_a,min_i,min_b" + ] + }, + { + "cell_type": "code", + "execution_count": 198, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "3.2170352865864795" + ] + }, + "execution_count": 198, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Sig_hist[18,68,2]" + ] + }, + { + "cell_type": "code", + "execution_count": 199, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "g1_range=np.arange(0.08,0.11,0.001)\n", + "g2_range=np.arange(17.0,23.0,0.05) \n", + "\n", + "g2_sig=Sig_hist[min_b,:,2]\n", + "g1_sig=Sig_hist[:,min_i,2]\n", + "\n", + "interp(0.0982, g1_range, g1_sig) \n" + ] + }, + { + "cell_type": "code", + "execution_count": 200, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "interp(20.327, g2_range, g2_sig) " + ] + }, + { + "cell_type": "code", + "execution_count": 210, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.6798723357293516" + ] + }, + "execution_count": 210, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "interp(1.4, chiDiff_to_sigma[0,:], chiDiff_to_sigma[1,:])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.11" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/CodeForLUX/Python/Run04_CH3T_G1G2/Nov2014_CH3T_G1G2_KrypCal2p22.ipynb b/CodeForLUX/Python/Run04_CH3T_G1G2/Nov2014_CH3T_G1G2_KrypCal2p22.ipynb new file mode 100644 index 0000000..4837ce3 --- /dev/null +++ b/CodeForLUX/Python/Run04_CH3T_G1G2/Nov2014_CH3T_G1G2_KrypCal2p22.ipynb @@ -0,0 +1,1345 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Setup

" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "//anaconda/lib/python2.7/site-packages/matplotlib/font_manager.py:273: UserWarning: Matplotlib is building the font cache using fc-list. This may take a moment.\n", + " warnings.warn('Matplotlib is building the font cache using fc-list. This may take a moment.')\n" + ] + } + ], + "source": [ + "from __future__ import division\n", + "import scipy \n", + "import scipy.interpolate as ip\n", + "from pylab import * # includes numpy\n", + "import matplotlib.pyplot as plt # plotting libraries from matlab\n", + "import sys\n", + "sys.path.insert(2, '//global/project/projectdirs/lux/data')\n", + "import aLib" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Populating the interactive namespace from numpy and matplotlib\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: pylab import has clobbered these variables: ['linalg', 'draw_if_interactive', 'random', 'power', 'info', 'fft']\n", + "`%matplotlib` prevents importing * from pylab and numpy\n" + ] + } + ], + "source": [ + "%pylab inline \n", + "#always do this for plotting... don't ask me why... Googled the fix for LINUX." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "pylab.rcParams['figure.figsize'] = (10.0, 8.0) # set size of figures displayed in this notebook" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Let's make a Tritium Beta Specturm ! :)

remember, Z'=Z+1 = 2 for Tritium Decay

http://www.hindawi.com/journals/ahep/2013/293986/
http://journals.aps.org/prl/abstract/10.1103/PhysRevLett.54.1891\n", + "
Note on DocBD: http://teacher.pas.rochester.edu:8080/wiki/pub/Lux/LuxDB00000402/TritiumBetaShape.pdf

" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Defining Constants

" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "c=1; # speed of light\n", + "C=1e-6; #constant infront of Fermi funciton. Arbitrary. Read Katrin paper if you care about super-allowed and allowed transitions... and nuclear matrix elements that don't matter\n", + "me = 511/c**2; # rest mass of our good friend the electron, in keV\n", + "Q=18.6 # endpoint of the tritium Beta decay keV. Maximum kinetic energy the electron.\n", + "mv=0 # neutrino mass=0. There may exist a 17 keV neutrino, maybe 7 keV!! Will we ever know??? Is it The Dark Matter?? Mystery...\n", + "step_T=0.1 #step energy by 0.1 keV\n", + "T=arange(0.01, 18.6,step_T) #sweep from 0.01 to the Q value in increments of step_T.\n", + "Z=1+1; #Tritium, after the beta decay Z'=1+1;\n", + "halflife = 12.32; # half life of the tritium beta decay in years\n", + "tau = 365*halflife/0.69; # Decay constant converted to days\n", + "n = 1e6; # Assume 1e6 atoms are decaying.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Simplifications

" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Fermi Function. Coulomb correction for the charge of the nucleas\n", + "G=(T+me*c**2)/(me*c**2); #Gamma, Total energy(E+M^2) over M^2\n", + "B=sqrt((G**2-1)/G**2); # v/c of electron. Ratio of velocity to speed of light in vacuum.\n", + "x=(2*pi*Z/137)/B; # note: fine structure constant = 137. \n", + "F = x*(1/(1-exp(-x)))*(1.002037-0.001427*(B)); # from http://journals.aps.org/prl/abstract/10.1103/PhysRevLett.54.1891. Measured to 1/1000\n", + "F_Kat=x*(1/(1-exp(-x))); # Katrin paper... http://www.hindawi.com/journals/ahep/2013/293986/ (really the same thing)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

more blah blah blah equations, they never seem to end!

" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "KE=T; #(G-1).*me*c^2; % The kinetic energy, is equal to T\n", + "E=KE+me*c**2; # the total energy. KE + rest mass\n", + "P=sqrt(E**2-me**2*c**4)/c; # momentum of the electron" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Let's calculate the number density of final states in two ways... makes no difference for LUX

" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "N=C*P*E*(Q+me-E)*sqrt((Q+me-E)**2-mv**2)*F # in terms of total energy. E=m0+KE. Or where Q means Q+m0\n", + "N_Kat=C*F_Kat*(KE+me)*sqrt((KE+me)**2-me**2)*(Q-KE)**2 # eqution 18 of Katrin paper. Set nutrino mass to zero... http://www.hindawi.com/journals/ahep/2013/293986/ (really the same thing)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Normalize the count to number of atoms

" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "s = sum(N[~isnan(N)])*step_T # Total Counts\n", + "s_Kat = sum(N_Kat[~isnan(N_Kat)])*step_T # Total Counts (for the Katrin paper case)\n", + "\n", + "N = N * (1/s * n/tau) # Decays/keV/day/1e6 atoms\n", + "N_Kat = N_Kat * (1/s * n/tau) # Decays/keV/day/1e6 atoms" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

create variable of kinetic energy T and N (count/dE)

" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "tritium_beta_spectrum=array([T,N])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Make Plots!!! Woooo Plots

" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\nERFJUf8P/gVG4rDYZGUAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "figure(0)\n", + "plt.plot(T,N,'r',linewidth=4)\n", + "plt.plot(T,N_Kat,'--b',linewidth=4)\n", + "plt.xlabel('Electron Kinetic Energy [keV] ',fontsize=18)\n", + "plt.ylabel('Count/keV/day/1e6 atoms',fontsize=18)\n", + "plt.legend(('Used for LUX','Katrin Paper with 0 nu Mass'))\n", + "\n", + "figure(1)\n", + "plt.plot(T,N,'r',linewidth=4)\n", + "plt.plot(T,N_Kat,'--b',linewidth=4)\n", + "plt.xlabel('Electron Kinetic Energy [keV] ',fontsize=18)\n", + "plt.ylabel('Count/keV/day/1e6 atoms',fontsize=18)\n", + "plt.yscale('log')\n", + "plt.legend(('Used for LUX','Katrin Paper with 0 nu Mass'))" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "cut=T<2" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.18770132835158548" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sum(N*cut)/sum(N)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Load in NEST yields and tritium data from December 2013

" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "#NEED TO GET NEW DATA FOR RUN04!!\n", + "#Load NEST LY,QY [2 3] -> Doke-Tritium LY,QY [4 5] -> and Tritium_Beta LY,QY [6 7]\n", + "tritium_beta=np.loadtxt('//global/homes/r/rknoche/Tritium_Spec_LYQY_paper.txt')\n", + "tritium_beta[:,0]=T\n", + "tritium_beta[:,1]=N\n", + "\n", + "#Load the Dec 2013 tritium data.VUV corrected, spike count for S1. XYZ corrected rq with 83Kr. Cut from 35-305us. <20cm radius.\n", + "#tritium_data=np.loadtxt('//global/homes/r/rknoche/Run04_Sep2014_Kr2p14_CH3TData_TwoLineFloat.txt')\n", + "tritium_data=np.loadtxt('//global/homes/r/rknoche/Run04_Nov2014_Kr2p22_CH3TData.txt')\n", + "S1=tritium_data[:,0]\n", + "S2=tritium_data[:,1]\n", + "dTus=tritium_data[:,2]" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "g1_Doke=0.098 \n", + "Eeff_Doke=0.808\n", + "Eeff_Beta=0.808\n", + "SE_WS=26.43\n", + "sigma_SE=4.57; #From LUG\n", + "g2_Doke= SE_WS*Eeff_Doke \n", + "\n", + "\n", + "g1_Beta=g1_Doke \n", + "g2_Beta=g2_Doke " + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "E_Doke=1/73*(tritium_data[:,0]/g1_Doke + tritium_data[:,1]/g2_Doke)\n", + "E_Beta=1/73*(tritium_data[:,0]/g1_Beta + tritium_data[:,1]/g2_Beta)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Adding Detector Resolution.

\n", + "

We define energy as some linear combination of number of photons and electrons that we collect, so sigma E is a function of sigma N_photons and sigma N_electrons

" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

\n", + "E/W= N_gamma + N_electron
\n", + "E/W= S1/g1 + S2/g2\n", + "

" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Generate Tritium spectrum with detector resolution and recombination variance.
\n", + "g1=0.117, Eeff=0.58, with inst. flucs, with singlePE resultion in S1. For MAX det res

" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185\n" + ] + } + ], + "source": [ + "# Setup constants...\n", + "ex_to_ion_alpha=0.20; #exciton to ion ratio ... alpha\n", + "\n", + "sigma_PE=0.50; # resolution of 1 photon. We are using spike count, so this should be 0\n", + "\n", + "inst_s1=6; #measured from Doke 6 ... seems to turn off below ~200 keV ?\n", + "inst_s2=8; #measured from Doke 8 ... seems turn off below ~200 keV ?\n", + "#using 0.85 as average extraction factor for a 1000 us electron lifetime\n", + "#and 320 us drift length.\n", + "\n", + "g1=g1_Doke #From Doke plot\n", + "Eeff=Eeff_Doke #From Doke plot #### Please NOTE: using 0.48 makes NO FREAKING DIFFERENCE!!! try for yourself :) \n", + "SE_size = SE_WS # For December tritium data.... use 24.66 in Aug 2013, same as W.S.\n", + "\n", + "#######################################################################################################\n", + "coeff_ng_sig_stat=sqrt((1-g1+sigma_PE**2)/g1);\n", + "coeff_ne_sig_stat=sqrt(((1-Eeff)*Eeff*SE_size**2+Eeff*sigma_SE**2)*0.85/(Eeff*SE_size)**2+0.155);\n", + "\n", + "trial_m=1000; # about 150k with trial_m = 100\n", + "trials=sum(ceil(tritium_beta[:,1]*trial_m)); #tritium dN/dE is fractional so multiply amplitute. \n", + "subtrials=np.ones((tritium_beta[:,1].size,1));\n", + "\n", + "gamma_T=np.ones((trials,1)); # Tritium gamma spectrum\n", + "e_T=np.ones((trials,1)); # Tritium electron spectrum.\n", + "\n", + "\n", + "kk=1; # kk will equal the total number of simulated tritium events\n", + "\n", + "for jj in range(0, tritium_beta[:,0].size): #% sweep through each energy bin\n", + " print(jj),\n", + " subtrials[jj]=ceil(tritium_beta[jj,1]*trial_m)\n", + " mean_gamma_T=tritium_beta[jj,2] # 2 for NESTv98 LY, 5 is with first fit to tritium.\n", + " mean_e_T=tritium_beta[jj,3] # 3 for NESTv98 QY, 6 is with first fit to tritium.\n", + "\n", + " n_ion_T=(mean_gamma_T+mean_e_T)/(1+ex_to_ion_alpha);\n", + " r_T=(mean_gamma_T/mean_e_T-ex_to_ion_alpha)/(mean_gamma_T/mean_e_T+1) #mean recombination fraction\n", + "\n", + " #Add functional form of recombination variance.%%%%%%%%%%%%%%%%%%% Cancels out in E space\n", + " Recomb_V_T=(0.07*n_ion_T)**2;\n", + " Fano_V=0; \n", + "\n", + " for ii in range(0, subtrials[jj]-1): #% one energy bin, test for recombination and stat\n", + " \n", + " recomb_fluc = np.random.normal(0,sqrt(Recomb_V_T),1) #mu, sigma , 1\n", + " Fano_fluc= 0; #normrnd(0,sqrt(Fano_V));\n", + " #Add functional form of S1 and S2 smearing%%%%%%%%%%%%%%%%\n", + " sigma_stat_gamma_R= sqrt(abs((coeff_ng_sig_stat*sqrt(abs(mean_gamma_T+recomb_fluc+r_T*Fano_fluc)))**2+(inst_s1/100*(mean_gamma_T+recomb_fluc+r_T*Fano_fluc) )**2 ));\n", + " sigma_stat_e_R= sqrt(abs((coeff_ne_sig_stat*sqrt(abs(mean_e_T-recomb_fluc+(1-r_T)*Fano_fluc)))**2 + (inst_s2/100*(mean_e_T-recomb_fluc+(1-r_T)*Fano_fluc) )**2 )); \n", + "\n", + " gamma_T[kk]=np.random.normal(mean_gamma_T+recomb_fluc+r_T*Fano_fluc,sigma_stat_gamma_R,1) #recomb + photons and - electrons\n", + " e_T[kk]= np.random.normal(mean_e_T-recomb_fluc+(1-r_T)*Fano_fluc,sigma_stat_e_R,1) #%recomb - photons and + electrons\n", + " kk=kk+1;\n", + "\n", + "#photon spectrum: gamma_T\n", + "#electron spectrum: e_T\n", + "# Energy...-> now smeared with detector resultion.\n", + "E_com_Tsim_NEST_MAX=1/73*(gamma_T+e_T); " + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false, + "scrolled": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(0, 0.11514936878178637)" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "binwidth=0.25 # keV\n", + "n_NEST_MAX, bin_edges_NEST_MAX, patches = plt.hist(E_com_Tsim_NEST_MAX, bins=np.arange(0.05, 25 + binwidth, binwidth), normed=1, facecolor='none',edgecolor='red',linewidth=2, histtype='step', alpha=0.9)\n", + "plt.xlabel('Energy KeVee',fontsize=18)\n", + "plt.ylabel('normalized count',fontsize=18)\n", + "plt.xlim([0,25])\n", + "left,right = bin_edges_NEST_MAX[:-1],bin_edges_NEST_MAX[1:]\n", + "bin_center_NEST_MAX=(right+left)/2\n", + "\n", + "s = ip.UnivariateSpline(bin_center_NEST_MAX,n_NEST_MAX)\n", + "s.set_smoothing_factor(1e-5)\n", + "plt.plot(bin_center_NEST_MAX,s(bin_center_NEST_MAX),'k',linewidth=2)\n", + "\n", + "scale_factor=sum(N)*0.1/(sum(n_NEST_MAX)*binwidth)\n", + "plt.plot(T,N/scale_factor,'m',linewidth=2)\n", + "\n", + "plt.xlim([0,22]);\n", + "plt.ylim([0, 1.1*max(n_NEST_MAX)]);\n", + "\n", + "#plt.yscale('log')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

The Nov 2014 the data

" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false, + "scrolled": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(0, 22)" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "binwidth=0.25 # keV\n", + "\n", + "n_data, bin_edges_data, patches = plt.hist(E_Doke, bins=np.arange(0.05, 25 + binwidth, binwidth), normed=1, facecolor='none',edgecolor='black',linewidth=2, histtype='step', alpha=0.9)\n", + "plt.xlabel('Energy KeVee',fontsize=18)\n", + "plt.ylabel('normalized count',fontsize=18)\n", + "\n", + "left,right = bin_edges_data[:-1],bin_edges_data[1:]\n", + "bin_center_data=(right+left)/2\n", + "\n", + "\n", + "data_scale_factor=sum(n_data[bin_center_data>3])/sum(n_NEST_MAX[bin_center_NEST_MAX>3])\n", + "\n", + "plt.step(bin_center_NEST_MAX,n_NEST_MAX*data_scale_factor,'b',linewidth=2)\n", + "#plt.plot(T,N/scale_factor*data_scale_factor,'m',linewidth=2)\n", + "\n", + "plt.legend(('Beta w sigE','Beta','Data','Data with Beta values'))\n", + "plt.xlim([0,22])\n", + "#plt.yscale('log')" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmAAAAHfCAYAAAD3H2TtAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAG4tJREFUeJzt3WGspNdZH/D/47he30BwXSpfq7YBozTBiUrToJq2aaVt\naU2SVrbVSq4pKglBqJIDQa2EsNMP9pdKgNSWSK2RKCEYFOo6IGojRcSxrG2VSsFpSZrAmsQSsmMv\nvRtaaNoU1rLD0w8zN547e9e7O/feMzN3fj9p5Jlz33fmueN3vX+fc95zqrsDAMA4Vyy7AACATSOA\nAQAMJoABAAwmgAEADCaAAQAMJoABAAx20QBWVR+sqrNV9dmZtp+sqqer6jNV9StV9Q0zP7uvqp6Z\n/vy2mfa3VtVnq+oLVfVTh/+rAACsh0vpAftQku+ea3s8yZu7+y1JnklyX5JU1ZuS3JXkliTvSPJg\nVdX0nJ9O8gPd/YYkb6iq+fcEANgIFw1g3f2JJH841/ZEd//J9OUnk9w4fX57koe7++XufjaTcHZr\nVV2f5HXd/anpcb+Q5M5DqB8AYO0cxhyw9yT56PT5DUmen/nZmWnbDUlemGl/YdoGALBxrjzIyVX1\nz5O81N3//pDq2X1f+yMBAGuju+viR71i4QBWVe9O8s4kf2um+UySm2Ze3zhtu1D7BV3uL8LBVNUD\n3f3AsuvYJL7z8Xzn4/nOx/Odj7dIx9GlDkHW9LH7QW9P8qNJbu/uF2eOeyzJ3VV1VVXdnOT1SZ7q\n7p0kX66qW6eT8r8vyaOXWywAwHFw0R6wqvqlJCeTfGNVfTHJ/Unen+SqJB+f3uT4ye6+p7tPV9Uj\nSU4neSnJPd29mwrfm+Tnk1yd5KPd/euH/LsAAKyFeiUfrY6qakOQY1XVye4+tew6NonvfDzf+Xi+\n8/F85+MtklsEMACAA1gkt9iKCABgMAEMAGAwAQwAYDABDABgMAEMAGAwAQwAYDABDABgMAEMAGAw\nAQwAYDABDABgMAEMAGAwAQwAYDABDABgMAEMAGAwAQwAYDABDABgMAEMAGAwAQwAYDABDABgMAEM\nAGAwAQwAYDABDABgMAEMAGAwAQwAYDABDABgMAEMAGAwAQwAYDABDABgMAEMAGAwAQwAYDABDABg\nMAEMAGAwAQwAYDABDABgMAEMAGAwAQwAYDABDABgMAEMAGAwAQwAYDABDABgMAEMAGAwAQwAYDAB\n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\nF5J8V5Lfy2S+2N3d/TtLLeyYq6rfTfId3f2Hy67luKqqv57kK0l+obu/fdr2E0n+V3f/5PR/Nq7t\n7nuXWedxcoHv/P4k/7e7/9VSizumqur6JNd392eq6uuT/LdM1nn8/rjWj8SrfOf/MK71I1NVr+3u\nP6qq1yT5L0nel+Qf5DKv81XqAbNI63JUVus6OHa6+xNJ5gPuHUkemj5/KMmdQ4s65i7wnSeXtoYC\nC+june7+zPT5V5I8ncmd7q71I3KB73x3bU3X+hHp7j+aPj2RyVz6zgLX+Sr9xXvJi7RyqDrJx6vq\nU1X1g8suZoNc191nk8l/RJNct+R6NsUPVdVnqupnDYUdnar6liRvSfLJJNuu9aM3853/xrTJtX5E\nquqKqvp0kp0kH+/uT2WB63yVAhjL8bbufmuSdyZ573TohvFWYy7A8fZgkm/t7rdk8h9OwzNHYDoU\n9stJfmTaKzN/bbvWD9k+37lr/Qh1959091/KpIf31qp6cxa4zlcpgF3SIq0cru7+H9N//n6SX81k\nKJijd7aqtpOvzeP40pLrOfa6+/f7lUmv/y7JX15mPcdRVV2ZSRD4xe5+dNrsWj9C+33nrvUxuvv/\nJDmV5O1Z4DpfpQBmkdbBquq10/9zSlV9XZLbkvzWcqs6tip752Q8luTd0+fvSvLo/Akc2J7vfPof\nxV1/P671o/BzSU539wdm2lzrR+u879y1fnSq6s/uDulW1VaSv5PJ3LvLvs5X5i7IZLIMRZIP5JVF\nWn98ySUda1V1cya9Xp3JRMIP+84PX1X9UpKTSb4xydlMdif+j0k+kuSmJM8luau7//eyajxuLvCd\n/81M5sj8SZJnk/yT3TkbHFxVvS3Jf07yubyy6/b7kzyV5JG41g/dq3zn/yiu9SNRVX8hk0n2V0wf\n/6G7/0VV/Zlc5nW+UgEMAGATrNIQJADARhDAAAAGE8AAAAYTwAAABhPAAAAGE8AAAAYTwAAABvv/\nj2sIkU695ncAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "num_data, num_data_bins, num_data_patches=plt.hist(E_Doke,bins=np.arange(0.05, 25 + binwidth, binwidth));" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAl0AAAHfCAYAAABqEm1lAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGsdJREFUeJzt3W2sZdd5F/D/MzGO3RdMoepY2LHbxiGhFq0JwgQK0kAo\ncYzEVIDAbqXQfEDzoW6iVkKuIiH7CxIgUZQooGDqVnXVyqUREAtFxUXRCNEK10lj6iZj7KiqsZ16\naKFpSVpXjv3w4ZxbX2/fmTn35azz9vtJV7l7nbXPXfdka+7fa6/9rOruAACwXKdWPQAAgF0gdAEA\nDCB0AQAMIHQBAAwgdAEADCB0AQAMsFDoqqo7quqpqnq6qu494PW3V9UvVtVLVfVD+9pvrKpPVdXn\nqurJqvrASQ4eAGBT1JXqdFXVqSRPJ3l3ki8meTzJXd391L4+35jk5iTfneS3u/tH5u3XJ7m+u5+o\nqq9L8pkkZ/efCwCwCxaZ6bo9yTPd/Wx3v5zk4SRn93fo7t/q7s8k+eqk/cXufmL+/ZeTXEhyw4mM\nHABggywSum5I8ty+4+dzhOBUVd+c5LYkjx32XACATXfViB8yv7X48SQfnM94HdTHfkQAwMbo7jpM\n/0VC1wtJbtp3fOO8bSFVdVVmgesnu/sTl+t72MFzPFV1f3ffv+px7BKf+Xg+8/F85uP5zMc7ymTR\nIrcXH09yS1XdXFVXJ7krySOXG8fk+MeSfL67P3zYwQEAbIsrznR19ytVdU+SRzMLaQ9294WqOjd7\nuR+oqtNJPp3k65O8WlUfTPJtSb4jyfcmebKqPpukk3you39uSb8PAMBaWmhN1zwkvX3S9m/2fX8x\nyVsOOPUXkrzpOANkqc6vegA76PyqB7CDzq96ADvo/KoHsIPOr3oAXNkV63SNUlVtTRcAsAmOklts\nAwQAMIDQBQAwgNAFADCA0AUAMIDQBQAwgNAFADCA0AUAMIDQBQAwgNAFADCA0AUAMIDQBQAwgNAF\nADCA0AUAMIDQBQAwgNAFADCA0AUAMIDQBQAwgNAFADCA0AUAMIDQBQAwgNAFADCA0AUAMIDQBQAw\ngNAFADCA0AUAMIDQBQAwgNAFADCA0AUAMIDQBQAwgNAFADCA0AUAMIDQBQAwgNAFADCA0AUAMIDQ\nBQAwgNAFADCA0AUAMIDQBQAwgNAFADCA0AUAMIDQBQAwgNAFADCA0AUAMIDQBQAwgNAFADCA0AUA\n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\nMH/Ztb4k3f1782/fnNl6+M4RrvNV/+G9VFFVlquT/HxVPV5V/3DVg9kh3zR/qjfd/WKSb1rxeHbF\nPfM9YX/Uba7lqapvTnJbkv+e5LRrffn2feaPzZtc60tSVaeq6rNJXkzy8939eI5wna86dLEa39nd\n70xyZ5Lvn9+WYTxPsSzfv07yrd19W2b/WLr1sgTz21wfT/LB+ezL9Np2rZ+wAz5z1/oSdfer3f1n\nM5vJvb2qbs0RrvNVh65FCq9ywrr7N+b/+5tJ/kMuuzUTJ+jifE/SvXUZ/3vF49l63f2b/drC1X+b\n5M+vcjzbqKquyuyP/0929yfmza71JTroM3etj9Hdv5vkfJI7coTrfNWhS/HUwarqa+b/hZSq+tok\nfyPJr652VFur8vo1Fo8k+b759/8gySemJ3Bsr/vM5/8Q7vnbca0vw48l+Xx3f3hfm2t9ud7wmbvW\nl6eqvnHvdm1VXZvkuzJbS3fo63zldbrmj7V+OK8VT/2nKx3Qlquqb8lsdqszWwz4Uz7zk1dVP53k\nTJI/keRikvuS/MckP5vZllnPJvl73f2lVY1x21ziM/+rma15eTXJryc5t7cGg+Orqu9M8l+TPJnZ\nvymd5ENJfinJv4tr/cRd5jP/nrjWl6Kq/kxmC+VPzb9+prv/SVX98RzyOl956AIA2AWrvr0IALAT\nhC4AgAGELgCAAYQuAIABhC4AgAGELgCAAYQuAIAB/j/TOB91X7WW7AAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "num_sim, num_sim_bins, num_sim_patches= plt.hist(E_com_Tsim_NEST_MAX, bins=np.arange(0.05, 25 + binwidth, binwidth),normed=1);" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:4: RuntimeWarning: divide by zero encountered in true_divide\n", + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:4: RuntimeWarning: invalid value encountered in true_divide\n" + ] + } + ], + "source": [ + "\n", + "\n", + "SimToData_scale_factor=sum(num_data[bin_center_data>3])/sum(num_sim[bin_center_NEST_MAX>3])\n", + "frac_res=(num_data-num_sim*SimToData_scale_factor)/sqrt(num_data)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from matplotlib import gridspec\n", + "\n", + "fig = plt.Figure(figsize=(8,6))\n", + "gs = gridspec.GridSpec(2, 1, height_ratios=[10,5])\n", + "ax1 = plt.subplot(gs[0])\n", + "ax2 = plt.subplot(gs[1])\n", + "\n", + "ax1.hist(E_Doke,bins=np.arange(0.05, 25 + binwidth, binwidth),facecolor='none',edgecolor='black',linewidth=2, histtype='step', alpha=0.9);\n", + "ax1.plot(bin_center_NEST_MAX,num_sim*SimToData_scale_factor,linewidth=2,color='blue')\n", + "ax1.set_xlim([0,22])\n", + "ax1.grid(True)\n", + "ax1.set_ylabel(r'Count',fontsize=20)\n", + "for tick in ax1.xaxis.get_major_ticks():\n", + " tick.label.set_fontsize(18) \n", + "for tick in ax1.yaxis.get_major_ticks():\n", + " tick.label.set_fontsize(18) \n", + "\n", + "\n", + "ax2.plot(bin_center_NEST_MAX,frac_res,'ko',linewidth=2)\n", + "ax2.plot([0,22],[0,0],'k')\n", + "ax2.grid(True)\n", + "ax2.set_xticks(np.arange(0,22,2))\n", + "ax2.set_xlim([0,22])\n", + "ax2.set_ylim([-4,4])\n", + "ax2.set_ylabel(r'Frac Res ($\\sigma$)',fontsize=20)\n", + "ax2.set_xlabel('Combined Energy (keV)',fontsize=20)\n", + "for tick in ax2.xaxis.get_major_ticks():\n", + " tick.label.set_fontsize(18) \n", + "for tick in ax2.yaxis.get_major_ticks():\n", + " tick.label.set_fontsize(18) " + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:1: RuntimeWarning: invalid value encountered in true_divide\n", + " if __name__ == '__main__':\n", + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:2: RuntimeWarning: invalid value encountered in true_divide\n", + " from IPython.kernel.zmq import kernelapp as app\n" + ] + } + ], + "source": [ + "thresh=num_data/(num_sim*SimToData_scale_factor)\n", + "thresh_err=sqrt( (sqrt(num_data)/(num_sim*SimToData_scale_factor))**2 + (num_data/(num_sim*(SimToData_scale_factor**2)))**2)\n", + "no_nan_cut=np.logical_not(numpy.isnan(thresh))*np.logical_not(numpy.isinf(thresh))\n", + "thresh_nonan=thresh[no_nan_cut]\n", + "xbin_nonan=bin_center_NEST_MAX[no_nan_cut]" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def func(x,mu,sig):\n", + " return (1/2)*scipy.special.erf((x-mu)/(sqrt(2)*sig))+(1/2)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 1.17257228, 0.28633245])" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "popt, pcov = scipy.optimize.curve_fit(func,xbin_nonan,thresh_nonan)\n", + "thresh_yval=(1/2)*scipy.special.erf((bin_center_NEST_MAX-popt[0])/(sqrt(2)*popt[1]))+(1/2)\n", + "\n", + "popt" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from scipy import optimize\n", + "\n", + "def line( x, p):\n", + " return p[0]*x + p[1] \n", + "\n", + "def linef( x, p0, p1):\n", + " return p0*x + p1\n", + "\n", + "def erfit( x, p0, p1):\n", + " return (1/2)*scipy.special.erf((x-p0)/(sqrt(2)*p1))+(1/2)\n", + " \n", + "\n", + "\n", + "def fit_function(p0, datax, datay, function, **kwargs):\n", + "\n", + " errfunc = lambda p, x, y: function(x,p) - y\n", + "\n", + " ##################################################\n", + " ## 1. COMPUTE THE FIT AND FIT ERRORS USING leastsq\n", + " ##################################################\n", + "\n", + " # If using optimize.leastsq, the covariance returned is the \n", + " # reduced covariance or fractional covariance, as explained\n", + " # here :\n", + " # http://stackoverflow.com/questions/14854339/in-scipy-how-and-why-does-curve-fit-calculate-the-covariance-of-the-parameter-es\n", + " # One can multiply it by the reduced chi squared, s_sq, as \n", + " # it is done in the more recenly implemented scipy.curve_fit\n", + " # The errors in the parameters are then the square root of the \n", + " # diagonal elements. \n", + "\n", + " pfit, pcov, infodict, errmsg, success = \\\n", + " optimize.leastsq( errfunc, p0, args=(datax, datay), \\\n", + " full_output=1)\n", + "\n", + " if (len(datay) > len(p0)) and pcov is not None:\n", + " s_sq = (errfunc(pfit, datax, datay)**2).sum()/(len(datay)-len(p0))\n", + " pcov = pcov * s_sq\n", + " else:\n", + " pcov = inf\n", + "\n", + " error = [] \n", + " for i in range(len(pfit)):\n", + " try:\n", + " error.append( numpy.absolute(pcov[i][i])**0.5)\n", + " except:\n", + " error.append( 0.00 )\n", + " pfit_leastsq = pfit\n", + " perr_leastsq = numpy.array(error) \n", + "\n", + " ###################################################\n", + " ## 2. COMPUTE THE FIT AND FIT ERRORS USING curvefit\n", + " ###################################################\n", + "\n", + " # When you have an error associated with each dataY point you can use \n", + " # scipy.curve_fit to give relative weights in the least-squares problem. \n", + " datayerrors = kwargs.get('datayerrors', None)\n", + " curve_fit_function = kwargs.get('curve_fit_function', function)\n", + " if datayerrors is None:\n", + " pfit, pcov = \\\n", + " optimize.curve_fit(curve_fit_function,datax,datay,p0=p0)\n", + " else:\n", + " pfit, pcov = \\\n", + " optimize.curve_fit(curve_fit_function,datax,datay,p0=p0,\\\n", + " sigma=datayerrors)\n", + " error = [] \n", + " for i in range(len(pfit)):\n", + " try:\n", + " error.append( numpy.absolute(pcov[i][i])**0.5)\n", + " except:\n", + " error.append( 0.00 )\n", + " pfit_curvefit = pfit\n", + " perr_curvefit = numpy.array(error) \n", + "\n", + "\n", + " ####################################################\n", + " ## 3. COMPUTE THE FIT AND FIT ERRORS USING bootstrap\n", + " #################################################### \n", + "\n", + " # An issue arises with scipy.curve_fit when errors in the y data points\n", + " # are given. Only the relative errors are used as weights, so the fit\n", + " # parameter errors, determined from the covariance do not depended on the\n", + " # magnitude of the errors in the individual data points. This is clearly wrong. \n", + " # \n", + " # To circumvent this problem I have implemented a simple bootstraping \n", + " # routine that uses some Monte-Carlo to determine the errors in the fit\n", + " # parameters. This routines generates random datay points starting from\n", + " # the given datay plus a random variation. \n", + " #\n", + " # The random variation is determined from average standard deviation of y\n", + " # points in the case where no errors in the y data points are avaiable.\n", + " #\n", + " # If errors in the y data points are available, then the random variation \n", + " # in each point is determined from its given error. \n", + " # \n", + " # A large number of random data sets are produced, each one of the is fitted\n", + " # an in the end the variance of the large number of fit results is used as \n", + " # the error for the fit parameters. \n", + "\n", + " # Estimate the confidence interval of the fitted parameter using\n", + " # the bootstrap Monte-Carlo method\n", + " # http://phe.rockefeller.edu/LogletLab/whitepaper/node17.html\n", + " residuals = errfunc( pfit, datax, datay)\n", + " s_res = numpy.std(residuals)\n", + " ps = []\n", + " # 100 random data sets are generated and fitted\n", + " for i in range(100):\n", + " if datayerrors is None:\n", + " randomDelta = numpy.random.normal(0., s_res, len(datay))\n", + " randomdataY = datay + randomDelta\n", + " else:\n", + " randomDelta = numpy.array( [ \\\n", + " numpy.random.normal(0., derr,1)[0] \\\n", + " for derr in datayerrors ] ) \n", + " randomdataY = datay + randomDelta\n", + " randomfit, randomcov = \\\n", + " optimize.leastsq( errfunc, p0, args=(datax, randomdataY),\\\n", + " full_output=0)\n", + " ps.append( randomfit ) \n", + "\n", + " ps = numpy.array(ps)\n", + " mean_pfit = numpy.mean(ps,0)\n", + " Nsigma = 1. # 1sigma gets approximately the same as methods above\n", + " # 1sigma corresponds to 68.3% confidence interval\n", + " # 2sigma corresponds to 95.44% confidence interval\n", + " err_pfit = Nsigma * numpy.std(ps,0) \n", + "\n", + " pfit_bootstrap = mean_pfit\n", + " perr_bootstrap = err_pfit\n", + "\n", + "\n", + " # Print results \n", + " print \"\\nlestsq method :\"\n", + " print \"pfit = \", pfit_leastsq\n", + " print \"perr = \", perr_leastsq\n", + " print \"\\ncurvefit method :\"\n", + " print \"pfit = \", pfit_curvefit\n", + " print \"perr = \", perr_curvefit\n", + " print \"\\nbootstrap method :\"\n", + " print \"pfit = \", pfit_bootstrap\n", + " print \"perr = \", perr_bootstrap" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 1.45176696e-01, -3.09917086e-07],\n", + " [ -3.09917086e-07, 2.90389201e-01]])" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pcov" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 0.3810206 , 0.53887772])" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "popt_err=np.sqrt(np.diag(pcov))\n", + "popt_err" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:1: RuntimeWarning: invalid value encountered in true_divide\n", + " if __name__ == '__main__':\n", + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:2: RuntimeWarning: invalid value encountered in true_divide\n", + " from IPython.kernel.zmq import kernelapp as app\n", + "//anaconda/lib/python2.7/site-packages/matplotlib/axes/_axes.py:2790: MatplotlibDeprecationWarning: Use of None object as fmt keyword argument to suppress plotting of data values is deprecated since 1.4; use the string \"none\" instead.\n", + " warnings.warn(msg, mplDeprecation, stacklevel=1)\n" + ] + }, + { + "data": { + "image/png": "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\nTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "thresh=num_data/(num_sim*SimToData_scale_factor)\n", + "thresh_err=sqrt( (sqrt(num_data)/(num_sim*SimToData_scale_factor))**2 + (num_data/(num_sim*(SimToData_scale_factor**2)))**2)\n", + "plt.errorbar(bin_center_NEST_MAX,thresh,yerr=thresh_err,xerr=None,ecolor='black',elinewidth=2,capsize=0,fmt=None)\n", + "plt.xlim([0,20])\n", + "plt.ylim([0,1.4])\n", + "plt.scatter(bin_center_NEST_MAX,thresh,c='black',marker='o')\n", + "plt.plot(bin_center_NEST_MAX,thresh_yval,linewidth=2)\n", + "plt.xticks(np.arange(0,22,2))\n", + "plt.yticks(np.arange(0,1.4,0.1))\n", + "plt.ylabel('Data/Theory',fontsize=22)\n", + "plt.xlabel('Combined Energy (keV)',fontsize=22)\n", + "plt.legend((r'Fit=$\\frac{erf}{2}(\\frac{(x-\\mu)}{\\sqrt{2}\\sigma}) + \\frac{1}{2}$','Data'),loc='lower right')\n", + "\n", + "\n", + "ax=plt.gca()\n", + "ax.grid(True)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

BELOW THIS POINT IS NOT UPDATED WITH THE COMBINED G1/G2, LIKE THE ABOVE THRESHOLD AND SPECTRAL PLOTS ARE. DO NOT RUN THE CODE OR IT WILL UPDATE IT

" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Minimize Chi^2 from 4 to 20 keVee to extract optimal g1 g2

" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "g2= \n", + "17.0 17.05 17.1 17.15 17.2 17.25 17.3 17.35 17.4 17.45 17.5 17.55 17.6 17.65 17.7 17.75 17.8 17.85 17.9 17.95 18.0 18.05 18.1 18.15 18.2 18.25 18.3 18.35 18.4 18.45 18.5 18.55 18.6 18.65 18.7 18.75 18.8 18.85 18.9 18.95 19.0 19.05 19.1 19.15 19.2 19.25 19.3 19.35 19.4 19.45 19.5 19.55 19.6 19.65 19.7 19.75 19.8 19.85 19.9 19.95 20.0 20.05 20.1 20.15 20.2 20.25 20.3 20.35 20.4 20.45 20.5 20.55 20.6 20.65 20.7 20.75 20.8 20.85 20.9 20.95 21.0 21.05 21.1 21.15 21.2 21.25 21.3 21.35 21.4 21.45 21.5 21.55 21.6 21.65 21.7 21.75 21.8 21.85 21.9 21.95 22.0 22.05 22.1 22.15 22.2 22.25 22.3 22.35 22.4 22.45 22.5 22.55 22.6 22.65 22.7 22.75 22.8 22.85 22.9 22.95\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:33: RuntimeWarning: divide by zero encountered in true_divide\n" + ] + } + ], + "source": [ + "Fit_min_keV=array([3,4,4]) # normalize the histograms above 4 keV\n", + "Fit_max_keV=array([16,18,20]) # fit histograms to max keV. Nominal is 20 keV\n", + "Chi_hist_min=1e6*ones(Fit_max_keV.size)\n", + "Chi_red_min=1e6*ones(Fit_max_keV.size)\n", + "g1_best=ones(Fit_max_keV.size)\n", + "g2_best=ones(Fit_max_keV.size)\n", + "\n", + "g1_range=np.arange(0.08,0.11,0.001) #scan g1 ... use 0.0002?\n", + "g2_range=np.arange(17.0,23.0,0.05) #scan g2\n", + "SE_size=SE_WS #measured in Dec trititum data\n", + "sigma_SE_size=sigma_SE #measured in Dec trititum data\n", + "\n", + "Chi_red=10*ones((g1_range.size,g2_range.size,Fit_max_keV.size))\n", + "Chi_hist=1000*ones((g1_range.size,g2_range.size,Fit_max_keV.size))\n", + "\n", + "E_step=0.25;\n", + "jj=0;\n", + "print 'g2= '\n", + "for g2_scan in g2_range:\n", + " ii=0;\n", + " print g2_scan,\n", + " for g1_scan in g1_range:\n", + " \n", + " E_com_test=1/73*(S1/g1_scan + S2/g2_scan)\n", + "\n", + " n, bins = histogram(E_com_test, bins=np.arange(0.05, 25 + E_step, E_step), normed=0)\n", + " bincenters = 0.5*(bins[1:]+bins[:-1])\n", + " nTs, binsTs = histogram(E_com_Tsim_NEST_MAX, bins=np.arange(0.05, 25 + E_step, E_step), normed=0)\n", + " bincentersTs = 0.5*(bins[1:]+bins[:-1])\n", + "\n", + " for kk, minE in enumerate(Fit_min_keV):\n", + " norm_real_s=sum(n[aLib.inrange(bincenters,[Fit_min_keV[kk], Fit_max_keV[kk]])]*E_step)/sum(nTs[aLib.inrange(bincentersTs,[Fit_min_keV[kk], Fit_max_keV[kk]])]*E_step) \n", + " diff_hist= (n[aLib.inrange(bincenters,[Fit_min_keV[kk], Fit_max_keV[kk]])]-nTs[aLib.inrange(bincentersTs,[Fit_min_keV[kk], Fit_max_keV[kk]])]*norm_real_s)**2/n[aLib.inrange(bincenters,[Fit_min_keV[kk], Fit_max_keV[kk]])] # (diff/sigma)^2 ... where sigma ~ sqrt(no)\n", + " Chi_red[ii,jj,kk]=sum(diff_hist)/(n[aLib.inrange(bincenters,[Fit_min_keV[kk],Fit_max_keV[kk]])].size) # devide by v to get red_X^2. The two hisotograms are nomalized above norm_keV\n", + " Chi_hist[ii,jj,kk]=sum(diff_hist) \n", + " \n", + " if Chi_hist[ii,jj,kk]< Chi_hist_min[kk] :\n", + " g1_best[kk]=g1_scan\n", + " g2_best[kk]=g2_scan\n", + " Chi_hist_min[kk]=Chi_hist[ii,jj,kk]\n", + " Chi_red_min[kk]=Chi_red[ii,jj,kk]\n", + " \n", + " ii=ii+1\n", + " \n", + " jj=jj+1\n" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 0.74783539, 0.79681403, 0.81924202])" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Chi_red_min" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[array([ 0.099, 0.1 , 0.1 ]),\n", + " array([ 20.6, 21.4, 21.4]),\n", + " array([ 0.77941733, 0.80968596, 0.80968596])]" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[g1_best,g2_best,g2_best/SE_WS]" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "Chi_red[isinf(Chi_red)]=max(Chi_red[~isinf(Chi_red)]) # clean up inf\n", + "Chi_hist[isinf(Chi_hist)]=max(Chi_hist[~isinf(Chi_hist)]) # clean up inf\n", + "Chi_hist[isnan(Chi_hist)]=max(Chi_hist[~isnan(Chi_hist)]) ####\n", + "Chi_hist_diff=Chi_hist-Chi_hist.min()*ones(Chi_hist.shape) # Chi_diff to get 1,2,3 sigma intervals" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "savetxt('/global/homes/r/rknoche/iPyNb/Analysis_Code/Run04_CH3T_G1G2_Kr2p22/Nov2014_CH3T_Kr2p22_g1g2.txt',[g1_best,g2_best])\n", + "savetxt('/global/homes/r/rknoche/iPyNb/Analysis_Code/Run04_CH3T_G1G2_Kr2p22/Nov2014_CH3T_Kr2p22_Chi.txt',Chi_hist.flatten())" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "Chi_hist_diff=Chi_hist\n", + "for ii in [0,1,2]:\n", + " Chi_hist_diff[:,:,ii]=Chi_hist[:,:,ii]-Chi_hist[:,:,ii].min()*ones(Chi_hist[:,:,ii].shape)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# calculate the chi_diff to n_sigma\n", + "conf_to_chiDiff=array([linspace(0,40,10000), 1-scipy.stats.chisqprob(linspace(0,40,10000),2)]) #1-chisqrprob\n", + "sigma_to_conf=array([linspace(0,8,10000), scipy.special.erf(linspace(0,8,10000)/sqrt(2))])\n", + "chiDiff_to_sigma=array([conf_to_chiDiff[0,:], interp(conf_to_chiDiff[1,:],sigma_to_conf[1,:],sigma_to_conf[0,:])])" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "Sig_hist=interp(Chi_hist_diff, chiDiff_to_sigma[0,:], chiDiff_to_sigma[1,:]) # get the sigma contour from 2D X^2 diff" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "savetxt('/global/homes/r/rknoche/iPyNb/Analysis_Code/Run04_CH3T_G1G2_Kr2p22/Nov2014_CH3T_Kr2p22_g1g2.txt',[g1_best,g2_best])\n", + "savetxt('/global/homes/r/rknoche/iPyNb/Analysis_Code/Run04_CH3T_G1G2_Kr2p22/Nov2014_CH3T_Kr2p22_Chi.txt',Chi_hist.flatten())\n", + "savetxt('/global/homes/r/rknoche/iPyNb/Analysis_Code/Run04_CH3T_G1G2_Kr2p22/Nov2014_CH3T_Kr2p22_Chi_Diff.txt',Chi_hist_diff.flatten())\n", + "savetxt('/global/homes/r/rknoche/iPyNb/Analysis_Code/Run04_CH3T_G1G2_Kr2p22/Nov2014_CH3T_Kr2p22_Sig.txt',Sig_hist.flatten())" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:2: RuntimeWarning: divide by zero encountered in log10\n", + " from IPython.kernel.zmq import kernelapp as app\n" + ] + }, + { + "data": { + "image/png": "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\nRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "v=arange(0,3.05,0.05);\n", + "contourf(g2_range,g1_range,log10(Chi_hist_diff.min(2)),200,linecolor='none'); \n", + "cb=plt.colorbar()\n", + "plt.xlabel('g2')\n", + "plt.ylabel('g1')\n", + "cb.set_label('log10(Diff_Chi^2)')\n", + "plt.rcParams.update({'font.size': 18})" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[,\n", + " ,\n", + " ]" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\ngg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "v=arange(0.1,3.0,0.05);\n", + "contourf(g2_range,g1_range,Sig_hist.min(2),v,linecolor='none') \n", + "cb=colorbar()\n", + "cb.set_label('sigma')\n", + "plt.xlabel('g2',fontsize=18)\n", + "plt.ylabel('g1',fontsize=18)\n", + "plt.plot([g2_range.min(),g2_range.max()],[g1_best,g1_best],'--r')\n", + "plt.xlim([17,23])\n", + "plt.ylim([0.09,0.11])\n", + "plt.plot([g2_best,g2_best],[g1_range.min(),g1_range.max()],'--r')\n", + "#plt.text(g2_best*1.02,g1_best*1.02,'g1={:1.4g}\\ng2={:1.4g}'.format(g1_best,g2_best))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.11" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/CodeForLUX/Python/Run04_CH3T_G1G2/Sep2014_CH3T_G1G2_KrypCal2p22.ipynb b/CodeForLUX/Python/Run04_CH3T_G1G2/Sep2014_CH3T_G1G2_KrypCal2p22.ipynb new file mode 100644 index 0000000..5ed570b --- /dev/null +++ b/CodeForLUX/Python/Run04_CH3T_G1G2/Sep2014_CH3T_G1G2_KrypCal2p22.ipynb @@ -0,0 +1,1331 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Setup

" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "//anaconda/lib/python2.7/site-packages/matplotlib/font_manager.py:273: UserWarning: Matplotlib is building the font cache using fc-list. This may take a moment.\n", + " warnings.warn('Matplotlib is building the font cache using fc-list. This may take a moment.')\n" + ] + } + ], + "source": [ + "from __future__ import division\n", + "import scipy \n", + "import scipy.interpolate as ip\n", + "from pylab import * # includes numpy\n", + "import matplotlib.pyplot as plt # plotting libraries from matlab\n", + "import sys\n", + "sys.path.insert(2, '//global/project/projectdirs/lux/data')\n", + "import aLib" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Populating the interactive namespace from numpy and matplotlib\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: pylab import has clobbered these variables: ['linalg', 'draw_if_interactive', 'random', 'power', 'info', 'fft']\n", + "`%matplotlib` prevents importing * from pylab and numpy\n" + ] + } + ], + "source": [ + "%pylab inline \n", + "#always do this for plotting... don't ask me why... Googled the fix for LINUX." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "pylab.rcParams['figure.figsize'] = (10.0, 8.0) # set size of figures displayed in this notebook" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Let's make a Tritium Beta Specturm ! :)

remember, Z'=Z+1 = 2 for Tritium Decay

http://www.hindawi.com/journals/ahep/2013/293986/
http://journals.aps.org/prl/abstract/10.1103/PhysRevLett.54.1891\n", + "
Note on DocBD: http://teacher.pas.rochester.edu:8080/wiki/pub/Lux/LuxDB00000402/TritiumBetaShape.pdf

" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Defining Constants

" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "c=1; # speed of light\n", + "C=1e-6; #constant infront of Fermi funciton. Arbitrary. Read Katrin paper if you care about super-allowed and allowed transitions... and nuclear matrix elements that don't matter\n", + "me = 511/c**2; # rest mass of our good friend the electron, in keV\n", + "Q=18.6 # endpoint of the tritium Beta decay keV. Maximum kinetic energy the electron.\n", + "mv=0 # neutrino mass=0. There may exist a 17 keV neutrino, maybe 7 keV!! Will we ever know??? Is it The Dark Matter?? Mystery...\n", + "step_T=0.1 #step energy by 0.1 keV\n", + "T=arange(0.01, 18.6,step_T) #sweep from 0.01 to the Q value in increments of step_T.\n", + "Z=1+1; #Tritium, after the beta decay Z'=1+1;\n", + "halflife = 12.32; # half life of the tritium beta decay in years\n", + "tau = 365*halflife/0.69; # Decay constant converted to days\n", + "n = 1e6; # Assume 1e6 atoms are decaying.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Simplifications

" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Fermi Function. Coulomb correction for the charge of the nucleas\n", + "G=(T+me*c**2)/(me*c**2); #Gamma, Total energy(E+M^2) over M^2\n", + "B=sqrt((G**2-1)/G**2); # v/c of electron. Ratio of velocity to speed of light in vacuum.\n", + "x=(2*pi*Z/137)/B; # note: fine structure constant = 137. \n", + "F = x*(1/(1-exp(-x)))*(1.002037-0.001427*(B)); # from http://journals.aps.org/prl/abstract/10.1103/PhysRevLett.54.1891. Measured to 1/1000\n", + "F_Kat=x*(1/(1-exp(-x))); # Katrin paper... http://www.hindawi.com/journals/ahep/2013/293986/ (really the same thing)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

more blah blah blah equations, they never seem to end!

" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "KE=T; #(G-1).*me*c^2; % The kinetic energy, is equal to T\n", + "E=KE+me*c**2; # the total energy. KE + rest mass\n", + "P=sqrt(E**2-me**2*c**4)/c; # momentum of the electron" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Let's calculate the number density of final states in two ways... makes no difference for LUX

" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "N=C*P*E*(Q+me-E)*sqrt((Q+me-E)**2-mv**2)*F # in terms of total energy. E=m0+KE. Or where Q means Q+m0\n", + "N_Kat=C*F_Kat*(KE+me)*sqrt((KE+me)**2-me**2)*(Q-KE)**2 # eqution 18 of Katrin paper. Set nutrino mass to zero... http://www.hindawi.com/journals/ahep/2013/293986/ (really the same thing)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Normalize the count to number of atoms

" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "s = sum(N[~isnan(N)])*step_T # Total Counts\n", + "s_Kat = sum(N_Kat[~isnan(N_Kat)])*step_T # Total Counts (for the Katrin paper case)\n", + "\n", + "N = N * (1/s * n/tau) # Decays/keV/day/1e6 atoms\n", + "N_Kat = N_Kat * (1/s * n/tau) # Decays/keV/day/1e6 atoms" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

create variable of kinetic energy T and N (count/dE)

" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "tritium_beta_spectrum=array([T,N])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Make Plots!!! Woooo Plots

" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\nERFJUf8P/gVG4rDYZGUAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "figure(0)\n", + "plt.plot(T,N,'r',linewidth=4)\n", + "plt.plot(T,N_Kat,'--b',linewidth=4)\n", + "plt.xlabel('Electron Kinetic Energy [keV] ',fontsize=18)\n", + "plt.ylabel('Count/keV/day/1e6 atoms',fontsize=18)\n", + "plt.legend(('Used for LUX','Katrin Paper with 0 nu Mass'))\n", + "\n", + "figure(1)\n", + "plt.plot(T,N,'r',linewidth=4)\n", + "plt.plot(T,N_Kat,'--b',linewidth=4)\n", + "plt.xlabel('Electron Kinetic Energy [keV] ',fontsize=18)\n", + "plt.ylabel('Count/keV/day/1e6 atoms',fontsize=18)\n", + "plt.yscale('log')\n", + "plt.legend(('Used for LUX','Katrin Paper with 0 nu Mass'))" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "cut=T<2" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.18770132835158548" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sum(N*cut)/sum(N)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Load in NEST yields and tritium data from December 2013

" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "#NEED TO GET NEW DATA FOR RUN04!!\n", + "#Load NEST LY,QY [2 3] -> Doke-Tritium LY,QY [4 5] -> and Tritium_Beta LY,QY [6 7]\n", + "tritium_beta=np.loadtxt('//global/homes/r/rknoche/Tritium_Spec_LYQY_paper.txt')\n", + "tritium_beta[:,0]=T\n", + "tritium_beta[:,1]=N\n", + "\n", + "#Load the Dec 2013 tritium data.VUV corrected, spike count for S1. XYZ corrected rq with 83Kr. Cut from 35-305us. <20cm radius.\n", + "#tritium_data=np.loadtxt('//global/homes/r/rknoche/Run04_Sep2014_Kr2p14_CH3TData_TwoLineFloat.txt')\n", + "tritium_data=np.loadtxt('//global/homes/r/rknoche/Run04_Sep2014_Kr2p22_CH3TData.txt')\n", + "S1=tritium_data[:,0]\n", + "S2=tritium_data[:,1]\n", + "dTus=tritium_data[:,2]" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "g1_Doke=0.098 \n", + "Eeff_Doke=0.808\n", + "Eeff_Beta=0.808\n", + "SE_WS=27.23\n", + "sigma_SE=5.96; #From LUG\n", + "\n", + "g2_Doke= SE_WS*Eeff_Doke \n", + "\n", + "\n", + "g1_Beta=g1_Doke \n", + "g2_Beta=g2_Doke " + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "E_Doke=1/73*(tritium_data[:,0]/g1_Doke + tritium_data[:,1]/g2_Doke)\n", + "E_Beta=1/73*(tritium_data[:,0]/g1_Beta + tritium_data[:,1]/g2_Beta)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Adding Detector Resolution.

\n", + "

We define energy as some linear combination of number of photons and electrons that we collect, so sigma E is a function of sigma N_photons and sigma N_electrons

" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

\n", + "E/W= N_gamma + N_electron
\n", + "E/W= S1/g1 + S2/g2\n", + "

" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Generate Tritium spectrum with detector resolution and recombination variance.
\n", + "g1=0.117, Eeff=0.58, with inst. flucs, with singlePE resultion in S1. For MAX det res

" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185\n" + ] + } + ], + "source": [ + "# Setup constants...\n", + "ex_to_ion_alpha=0.20; #exciton to ion ratio ... alpha\n", + "\n", + "sigma_PE=0.50; # resolution of 1 photon. We are using spike count, so this should be 0\n", + "\n", + "inst_s1=6; #measured from Doke 6 ... seems to turn off below ~200 keV ?\n", + "inst_s2=8; #measured from Doke 8 ... seems turn off below ~200 keV ?\n", + "#using 0.85 as average extraction factor for a 1000 us electron lifetime\n", + "#and 320 us drift length.\n", + "\n", + "g1=g1_Doke #From Doke plot\n", + "Eeff=Eeff_Doke #From Doke plot #### Please NOTE: using 0.48 makes NO FREAKING DIFFERENCE!!! try for yourself :) \n", + "SE_size = SE_WS # For December tritium data.... use 24.66 in Aug 2013, same as W.S.\n", + "\n", + "#######################################################################################################\n", + "coeff_ng_sig_stat=sqrt((1-g1+sigma_PE**2)/g1);\n", + "coeff_ne_sig_stat=sqrt(((1-Eeff)*Eeff*SE_size**2+Eeff*sigma_SE**2)*0.85/(Eeff*SE_size)**2+0.155);\n", + "\n", + "trial_m=1000; # about 150k with trial_m = 100\n", + "trials=sum(ceil(tritium_beta[:,1]*trial_m)); #tritium dN/dE is fractional so multiply amplitute. \n", + "subtrials=np.ones((tritium_beta[:,1].size,1));\n", + "\n", + "gamma_T=np.ones((trials,1)); # Tritium gamma spectrum\n", + "e_T=np.ones((trials,1)); # Tritium electron spectrum.\n", + "\n", + "\n", + "kk=1; # kk will equal the total number of simulated tritium events\n", + "\n", + "for jj in range(0, tritium_beta[:,0].size): #% sweep through each energy bin\n", + " print(jj),\n", + " subtrials[jj]=ceil(tritium_beta[jj,1]*trial_m)\n", + " mean_gamma_T=tritium_beta[jj,2] # 2 for NESTv98 LY, 5 is with first fit to tritium.\n", + " mean_e_T=tritium_beta[jj,3] # 3 for NESTv98 QY, 6 is with first fit to tritium.\n", + "\n", + " n_ion_T=(mean_gamma_T+mean_e_T)/(1+ex_to_ion_alpha);\n", + " r_T=(mean_gamma_T/mean_e_T-ex_to_ion_alpha)/(mean_gamma_T/mean_e_T+1) #mean recombination fraction\n", + "\n", + " #Add functional form of recombination variance.%%%%%%%%%%%%%%%%%%% Cancels out in E space\n", + " Recomb_V_T=(0.07*n_ion_T)**2;\n", + " Fano_V=0; \n", + "\n", + " for ii in range(0, subtrials[jj]-1): #% one energy bin, test for recombination and stat\n", + " \n", + " recomb_fluc = np.random.normal(0,sqrt(Recomb_V_T),1) #mu, sigma , 1\n", + " Fano_fluc= 0; #normrnd(0,sqrt(Fano_V));\n", + " #Add functional form of S1 and S2 smearing%%%%%%%%%%%%%%%%\n", + " sigma_stat_gamma_R= sqrt(abs((coeff_ng_sig_stat*sqrt(abs(mean_gamma_T+recomb_fluc+r_T*Fano_fluc)))**2+(inst_s1/100*(mean_gamma_T+recomb_fluc+r_T*Fano_fluc) )**2 ));\n", + " sigma_stat_e_R= sqrt(abs((coeff_ne_sig_stat*sqrt(abs(mean_e_T-recomb_fluc+(1-r_T)*Fano_fluc)))**2 + (inst_s2/100*(mean_e_T-recomb_fluc+(1-r_T)*Fano_fluc) )**2 )); \n", + "\n", + " gamma_T[kk]=np.random.normal(mean_gamma_T+recomb_fluc+r_T*Fano_fluc,sigma_stat_gamma_R,1) #recomb + photons and - electrons\n", + " e_T[kk]= np.random.normal(mean_e_T-recomb_fluc+(1-r_T)*Fano_fluc,sigma_stat_e_R,1) #%recomb - photons and + electrons\n", + " kk=kk+1;\n", + "\n", + "#photon spectrum: gamma_T\n", + "#electron spectrum: e_T\n", + "# Energy...-> now smeared with detector resultion.\n", + "E_com_Tsim_NEST_MAX=1/73*(gamma_T+e_T); " + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false, + "scrolled": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(0, 0.11512492586465999)" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "binwidth=0.25 # keV\n", + "n_NEST_MAX, bin_edges_NEST_MAX, patches = plt.hist(E_com_Tsim_NEST_MAX, bins=np.arange(0.05, 25 + binwidth, binwidth), normed=1, facecolor='none',edgecolor='red',linewidth=2, histtype='step', alpha=0.9)\n", + "plt.xlabel('Energy KeVee',fontsize=18)\n", + "plt.ylabel('normalized count',fontsize=18)\n", + "plt.xlim([0,25])\n", + "left,right = bin_edges_NEST_MAX[:-1],bin_edges_NEST_MAX[1:]\n", + "bin_center_NEST_MAX=(right+left)/2\n", + "\n", + "s = ip.UnivariateSpline(bin_center_NEST_MAX,n_NEST_MAX)\n", + "s.set_smoothing_factor(1e-5)\n", + "plt.plot(bin_center_NEST_MAX,s(bin_center_NEST_MAX),'k',linewidth=2)\n", + "\n", + "scale_factor=sum(N)*0.1/(sum(n_NEST_MAX)*binwidth)\n", + "plt.plot(T,N/scale_factor,'m',linewidth=2)\n", + "\n", + "plt.xlim([0,22]);\n", + "plt.ylim([0, 1.1*max(n_NEST_MAX)]);\n", + "\n", + "#plt.yscale('log')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

The Sep 2014 the data

" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false, + "scrolled": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(0, 22)" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "binwidth=0.25 # keV\n", + "\n", + "n_data, bin_edges_data, patches = plt.hist(E_Doke, bins=np.arange(0.05, 25 + binwidth, binwidth), normed=1, facecolor='none',edgecolor='black',linewidth=2, histtype='step', alpha=0.9)\n", + "plt.xlabel('Energy KeVee',fontsize=18)\n", + "plt.ylabel('normalized count',fontsize=18)\n", + "\n", + "left,right = bin_edges_data[:-1],bin_edges_data[1:]\n", + "bin_center_data=(right+left)/2\n", + "\n", + "\n", + "data_scale_factor=sum(n_data[bin_center_data>3])/sum(n_NEST_MAX[bin_center_NEST_MAX>3])\n", + "\n", + "plt.step(bin_center_NEST_MAX,n_NEST_MAX*data_scale_factor,'b',linewidth=2)\n", + "#plt.plot(T,N/scale_factor*data_scale_factor,'m',linewidth=2)\n", + "\n", + "plt.legend(('Beta w sigE','Beta','Data','Data with Beta values'))\n", + "plt.xlim([0,22])\n", + "#plt.yscale('log')" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "num_data, num_data_bins, num_data_patches=plt.hist(E_Doke,bins=np.arange(0.05, 25 + binwidth, binwidth));" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAl0AAAHfCAYAAABqEm1lAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGwRJREFUeJzt3W+sZdd5F+DfOzGO3T+YQtWxsGO3jUNDLVoThAkUpIEA\ncYzEVIDAbqXQfEDzoW4iKiFXkZAtpEqARFGigIKpW9VVK5dEQPwhKi6KRohWuE4aEzcZY0dRje3U\nQwtNS9KkcuyXD+cMvrPnztwz996zzr/nka5y9z5rnVn3ZOven9de+13V3QEAYLlOrHoAAAC7QOgC\nABhA6AIAGEDoAgAYQOgCABhA6AIAGGCh0FVVd1XVM1X1bFXdv8/r31VVv1JVX6uqH91z/uaq+kRV\nfbaqnq6q9x7n4AEANkUdVKerqk4keTbJO5J8McmTSe7p7mf2tPnWJLcm+f4kv9PdPzE/f2OSG7v7\nqar6piSfSnJ6b18AgF2wyEzXnUme6+7nu/uVJI8mOb23QXf/dnd/KsnXJ+df7u6n5t9/Ocm5JDcd\ny8gBADbIIqHrpiQv7Dl+MYcITlX17UnuSPLE1fYFANh014z4R+a3Fj+a5H3zGa/92tiPCADYGN1d\nV9N+kdD1UpJb9hzfPD+3kKq6JrPA9bPd/bErtb3awXM0VfVgdz+46nHsEp/5eD7z8Xzm4/nMxzvM\nZNEitxefTHJbVd1aVdcmuSfJY1cax+T4p5J8rrs/cLWDAwDYFgfOdHX3q1V1X5LHMwtpD3f3uao6\nM3u5H6qqk0k+meSbk7xWVe9L8t1JvjfJDyZ5uqo+naSTvL+7f3FJPw8AwFpaaE3XPCR91+Tcv9nz\n/fkkb9qn6y8necNRBshSnV31AHbQ2VUPYAedXfUAdtDZVQ9gB51d9QA42IF1ukapqramCwDYBIfJ\nLbYBAgAYQOgCABhA6AIAGEDoAgAYQOgCABhA6AIAGEDoAgAYQOgCABhA6AIAGEDoAgAYQOgCABhA\n6AIAGEDoAgAYQOgCABhA6AIAGEDoAgAYQOgCABhA6AIAGEDoAgAYQOgCABhA6AIAGEDoAgAYQOgC\nABhA6AIAGEDoAgAYQOgCABhA6AIAGEDoAgAYQOgCABhA6AIAGEDoAgAYQOgCABhA6AIAGEDoAgAY\nQOgCABhA6AIAGEDoAgAYQOgCABhA6AIAGEDoAgAYQOgCABhA6AIAGEDoAgAYQOgCABhA6AIAGEDo\n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\nnroaldX/f7/Vuvu/JpmG2tNJfmb+/c8k+f6hg9pyl/nMk0OXsOEg3f1ydz81//7LSc5l9pS6a31J\nLvOZ3zR/2bW+JN39+/Nv35jZevjOIa7zVf/hvVxRVZark/xSVT1ZVf9g1YPZId82f6o33f1ykm9b\n8Xh2xX3zPWF/0m2u5amqb09yR5L/luSka3359nzmT8xPudaXpKpOVNWnk7yc5Je6+8kc4jpfdehi\nNb6vu9+W5O4kPzy/LcN4nmJZvn+d5Du7+47Mflm69bIE89tcH03yvvnsy/Tadq0fs30+c9f6EnX3\na939pzObyb2zqm7PIa7zVYeuRQqvcsy6+zfn//tbSf5Drrg1E8fo/HxP0gvrMv7Xisez9br7t/r1\nhav/NsmfXeV4tlFVXZPZH/+f7e6PzU+71pdov8/ctT5Gd/9ekrNJ7sohrvNVhy7FUwerqm+Y/xdS\nquobk/z1JL++2lFtrcrFayweS/JD8+//fpKPTTtwZBd95vNfhBf8rbjWl+Gnknyuuz+w55xrfbku\n+cxd68tTVd964XZtVV2f5K9ltpbuqq/zldfpmj/W+oG8Xjz1n650QFuuqr4js9mtzmwx4M/5zI9f\nVf18klNJ/liS80keSPIfk3wksy2znk/yd7v7S6sa47a5zGf+lzNb8/Jakt9IcubCGgyOrqq+L8l/\nSfJ0Zr9TOsn7k/xqkn8X1/qxu8Jn/gNxrS9FVf2pzBbKn5h//UJ3/3hV/dFc5XW+8tAFALALVn17\nEQBgJwhdAAADCF0AAAMIXQAAAwhdAAADCF0AAAMIXQAAA/w/MQF56T2JDiYAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "num_sim, num_sim_bins, num_sim_patches= plt.hist(E_com_Tsim_NEST_MAX, bins=np.arange(0.05, 25 + binwidth, binwidth),normed=1);" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:4: RuntimeWarning: divide by zero encountered in true_divide\n", + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:4: RuntimeWarning: invalid value encountered in true_divide\n" + ] + } + ], + "source": [ + "\n", + "\n", + "SimToData_scale_factor=sum(num_data[bin_center_data>3])/sum(num_sim[bin_center_NEST_MAX>3])\n", + "frac_res=(num_data-num_sim*SimToData_scale_factor)/sqrt(num_data)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from matplotlib import gridspec\n", + "\n", + "fig = plt.Figure(figsize=(8,6))\n", + "gs = gridspec.GridSpec(2, 1, height_ratios=[10,5])\n", + "ax1 = plt.subplot(gs[0])\n", + "ax2 = plt.subplot(gs[1])\n", + "\n", + "ax1.hist(E_Doke,bins=np.arange(0.05, 25 + binwidth, binwidth),facecolor='none',edgecolor='black',linewidth=2, histtype='step', alpha=0.9);\n", + "ax1.plot(bin_center_NEST_MAX,num_sim*SimToData_scale_factor,linewidth=2,color='blue')\n", + "ax1.set_xlim([0,22])\n", + "ax1.grid(True)\n", + "ax1.set_ylabel(r'Count',fontsize=20)\n", + "for tick in ax1.xaxis.get_major_ticks():\n", + " tick.label.set_fontsize(18) \n", + "for tick in ax1.yaxis.get_major_ticks():\n", + " tick.label.set_fontsize(18) \n", + "\n", + "\n", + "ax2.plot(bin_center_NEST_MAX,frac_res,'ko',linewidth=2)\n", + "ax2.plot([0,22],[0,0],'k')\n", + "ax2.grid(True)\n", + "ax2.set_xticks(np.arange(0,22,2))\n", + "ax2.set_xlim([0,22])\n", + "ax2.set_ylim([-4,4])\n", + "ax2.set_ylabel(r'Frac Res ($\\sigma$)',fontsize=20)\n", + "ax2.set_xlabel('Combined Energy (keV)',fontsize=20)\n", + "for tick in ax2.xaxis.get_major_ticks():\n", + " tick.label.set_fontsize(18) \n", + "for tick in ax2.yaxis.get_major_ticks():\n", + " tick.label.set_fontsize(18) " + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:1: RuntimeWarning: divide by zero encountered in true_divide\n", + " if __name__ == '__main__':\n", + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:1: RuntimeWarning: invalid value encountered in true_divide\n", + " if __name__ == '__main__':\n", + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:2: RuntimeWarning: divide by zero encountered in true_divide\n", + " from IPython.kernel.zmq import kernelapp as app\n", + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:2: RuntimeWarning: invalid value encountered in true_divide\n", + " from IPython.kernel.zmq import kernelapp as app\n" + ] + } + ], + "source": [ + "thresh=num_data/(num_sim*SimToData_scale_factor)\n", + "thresh_err=sqrt( (sqrt(num_data)/(num_sim*SimToData_scale_factor))**2 + (num_data/(num_sim*(SimToData_scale_factor**2)))**2)\n", + "no_nan_cut=np.logical_not(numpy.isnan(thresh))*np.logical_not(numpy.isinf(thresh))\n", + "thresh_nonan=thresh[no_nan_cut]\n", + "xbin_nonan=bin_center_NEST_MAX[no_nan_cut]" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def func(x,mu,sig):\n", + " return (1/2)*scipy.special.erf((x-mu)/(sqrt(2)*sig))+(1/2)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 1.11334686, 0.24151376])" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "popt, pcov = scipy.optimize.curve_fit(func,xbin_nonan,thresh_nonan)\n", + "thresh_yval=(1/2)*scipy.special.erf((bin_center_NEST_MAX-popt[0])/(sqrt(2)*popt[1]))+(1/2)\n", + "\n", + "popt" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from scipy import optimize\n", + "\n", + "def line( x, p):\n", + " return p[0]*x + p[1] \n", + "\n", + "def linef( x, p0, p1):\n", + " return p0*x + p1\n", + "\n", + "def erfit( x, p0, p1):\n", + " return (1/2)*scipy.special.erf((x-p0)/(sqrt(2)*p1))+(1/2)\n", + " \n", + "\n", + "\n", + "def fit_function(p0, datax, datay, function, **kwargs):\n", + "\n", + " errfunc = lambda p, x, y: function(x,p) - y\n", + "\n", + " ##################################################\n", + " ## 1. COMPUTE THE FIT AND FIT ERRORS USING leastsq\n", + " ##################################################\n", + "\n", + " # If using optimize.leastsq, the covariance returned is the \n", + " # reduced covariance or fractional covariance, as explained\n", + " # here :\n", + " # http://stackoverflow.com/questions/14854339/in-scipy-how-and-why-does-curve-fit-calculate-the-covariance-of-the-parameter-es\n", + " # One can multiply it by the reduced chi squared, s_sq, as \n", + " # it is done in the more recenly implemented scipy.curve_fit\n", + " # The errors in the parameters are then the square root of the \n", + " # diagonal elements. \n", + "\n", + " pfit, pcov, infodict, errmsg, success = \\\n", + " optimize.leastsq( errfunc, p0, args=(datax, datay), \\\n", + " full_output=1)\n", + "\n", + " if (len(datay) > len(p0)) and pcov is not None:\n", + " s_sq = (errfunc(pfit, datax, datay)**2).sum()/(len(datay)-len(p0))\n", + " pcov = pcov * s_sq\n", + " else:\n", + " pcov = inf\n", + "\n", + " error = [] \n", + " for i in range(len(pfit)):\n", + " try:\n", + " error.append( numpy.absolute(pcov[i][i])**0.5)\n", + " except:\n", + " error.append( 0.00 )\n", + " pfit_leastsq = pfit\n", + " perr_leastsq = numpy.array(error) \n", + "\n", + " ###################################################\n", + " ## 2. COMPUTE THE FIT AND FIT ERRORS USING curvefit\n", + " ###################################################\n", + "\n", + " # When you have an error associated with each dataY point you can use \n", + " # scipy.curve_fit to give relative weights in the least-squares problem. \n", + " datayerrors = kwargs.get('datayerrors', None)\n", + " curve_fit_function = kwargs.get('curve_fit_function', function)\n", + " if datayerrors is None:\n", + " pfit, pcov = \\\n", + " optimize.curve_fit(curve_fit_function,datax,datay,p0=p0)\n", + " else:\n", + " pfit, pcov = \\\n", + " optimize.curve_fit(curve_fit_function,datax,datay,p0=p0,\\\n", + " sigma=datayerrors)\n", + " error = [] \n", + " for i in range(len(pfit)):\n", + " try:\n", + " error.append( numpy.absolute(pcov[i][i])**0.5)\n", + " except:\n", + " error.append( 0.00 )\n", + " pfit_curvefit = pfit\n", + " perr_curvefit = numpy.array(error) \n", + "\n", + "\n", + " ####################################################\n", + " ## 3. COMPUTE THE FIT AND FIT ERRORS USING bootstrap\n", + " #################################################### \n", + "\n", + " # An issue arises with scipy.curve_fit when errors in the y data points\n", + " # are given. Only the relative errors are used as weights, so the fit\n", + " # parameter errors, determined from the covariance do not depended on the\n", + " # magnitude of the errors in the individual data points. This is clearly wrong. \n", + " # \n", + " # To circumvent this problem I have implemented a simple bootstraping \n", + " # routine that uses some Monte-Carlo to determine the errors in the fit\n", + " # parameters. This routines generates random datay points starting from\n", + " # the given datay plus a random variation. \n", + " #\n", + " # The random variation is determined from average standard deviation of y\n", + " # points in the case where no errors in the y data points are avaiable.\n", + " #\n", + " # If errors in the y data points are available, then the random variation \n", + " # in each point is determined from its given error. \n", + " # \n", + " # A large number of random data sets are produced, each one of the is fitted\n", + " # an in the end the variance of the large number of fit results is used as \n", + " # the error for the fit parameters. \n", + "\n", + " # Estimate the confidence interval of the fitted parameter using\n", + " # the bootstrap Monte-Carlo method\n", + " # http://phe.rockefeller.edu/LogletLab/whitepaper/node17.html\n", + " residuals = errfunc( pfit, datax, datay)\n", + " s_res = numpy.std(residuals)\n", + " ps = []\n", + " # 100 random data sets are generated and fitted\n", + " for i in range(100):\n", + " if datayerrors is None:\n", + " randomDelta = numpy.random.normal(0., s_res, len(datay))\n", + " randomdataY = datay + randomDelta\n", + " else:\n", + " randomDelta = numpy.array( [ \\\n", + " numpy.random.normal(0., derr,1)[0] \\\n", + " for derr in datayerrors ] ) \n", + " randomdataY = datay + randomDelta\n", + " randomfit, randomcov = \\\n", + " optimize.leastsq( errfunc, p0, args=(datax, randomdataY),\\\n", + " full_output=0)\n", + " ps.append( randomfit ) \n", + "\n", + " ps = numpy.array(ps)\n", + " mean_pfit = numpy.mean(ps,0)\n", + " Nsigma = 1. # 1sigma gets approximately the same as methods above\n", + " # 1sigma corresponds to 68.3% confidence interval\n", + " # 2sigma corresponds to 95.44% confidence interval\n", + " err_pfit = Nsigma * numpy.std(ps,0) \n", + "\n", + " pfit_bootstrap = mean_pfit\n", + " perr_bootstrap = err_pfit\n", + "\n", + "\n", + " # Print results \n", + " print \"\\nlestsq method :\"\n", + " print \"pfit = \", pfit_leastsq\n", + " print \"perr = \", perr_leastsq\n", + " print \"\\ncurvefit method :\"\n", + " print \"pfit = \", pfit_curvefit\n", + " print \"perr = \", perr_curvefit\n", + " print \"\\nbootstrap method :\"\n", + " print \"pfit = \", pfit_bootstrap\n", + " print \"perr = \", perr_bootstrap" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 1.16011486e+00, -1.34783261e-03],\n", + " [ -1.34783261e-03, 2.32038256e+00]])" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pcov" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 1.07708628, 1.5232802 ])" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "popt_err=np.sqrt(np.diag(pcov))\n", + "popt_err" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:1: RuntimeWarning: divide by zero encountered in true_divide\n", + " if __name__ == '__main__':\n", + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:1: RuntimeWarning: invalid value encountered in true_divide\n", + " if __name__ == '__main__':\n", + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:2: RuntimeWarning: divide by zero encountered in true_divide\n", + " from IPython.kernel.zmq import kernelapp as app\n", + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:2: RuntimeWarning: invalid value encountered in true_divide\n", + " from IPython.kernel.zmq import kernelapp as app\n", + "//anaconda/lib/python2.7/site-packages/matplotlib/axes/_axes.py:2790: MatplotlibDeprecationWarning: Use of None object as fmt keyword argument to suppress plotting of data values is deprecated since 1.4; use the string \"none\" instead.\n", + " warnings.warn(msg, mplDeprecation, stacklevel=1)\n", + "//anaconda/lib/python2.7/site-packages/matplotlib/axes/_axes.py:2968: RuntimeWarning: invalid value encountered in double_scalars\n", + " in cbook.safezip(y, yerr)]\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "thresh=num_data/(num_sim*SimToData_scale_factor)\n", + "thresh_err=sqrt( (sqrt(num_data)/(num_sim*SimToData_scale_factor))**2 + (num_data/(num_sim*(SimToData_scale_factor**2)))**2)\n", + "plt.errorbar(bin_center_NEST_MAX,thresh,yerr=thresh_err,xerr=None,ecolor='black',elinewidth=2,capsize=0,fmt=None)\n", + "plt.xlim([0,20])\n", + "plt.ylim([0,1.4])\n", + "plt.scatter(bin_center_NEST_MAX,thresh,c='black',marker='o')\n", + "plt.plot(bin_center_NEST_MAX,thresh_yval,linewidth=2)\n", + "plt.xticks(np.arange(0,22,2))\n", + "plt.yticks(np.arange(0,1.4,0.1))\n", + "plt.ylabel('Data/Theory',fontsize=22)\n", + "plt.xlabel('Combined Energy (keV)',fontsize=22)\n", + "plt.legend((r'Fit=$\\frac{erf}{2}(\\frac{(x-\\mu)}{\\sqrt{2}\\sigma}) + \\frac{1}{2}$','Data'),loc='lower right')\n", + "\n", + "\n", + "ax=plt.gca()\n", + "ax.grid(True)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Minimize Chi^2 from 4 to 20 keVee to extract optimal g1 g2

" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " g2= \n", + "17.0 17.05 17.1 17.15 17.2 17.25 17.3 17.35 17.4 17.45 17.5 17.55 17.6 17.65 17.7 17.75 17.8 17.85 17.9 17.95 18.0 18.05 18.1 18.15 18.2 18.25 18.3 18.35 18.4 18.45 18.5 18.55 18.6 18.65 18.7 18.75 18.8 18.85 18.9 18.95 19.0 19.05 19.1 19.15 19.2 19.25 19.3 19.35 19.4 19.45 19.5 19.55 19.6 19.65 19.7 19.75 19.8 19.85 19.9 19.95 20.0 20.05 20.1 20.15 20.2 20.25 20.3 20.35 20.4 20.45 20.5 20.55 20.6 20.65 20.7 20.75 20.8 20.85 20.9 20.95 21.0 21.05 21.1 21.15 21.2 21.25 21.3 21.35 21.4 21.45 21.5 21.55 21.6 21.65 21.7 21.75 21.8 21.85 21.9 21.95 22.0 22.05 22.1 22.15 22.2 22.25 22.3 22.35 22.4 22.45 22.5 22.55 22.6 22.65 22.7 22.75 22.8 22.85 22.9 22.95\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:33: RuntimeWarning: divide by zero encountered in true_divide\n" + ] + } + ], + "source": [ + "Fit_min_keV=array([3,4,4]) # normalize the histograms above 4 keV\n", + "Fit_max_keV=array([16,18,20]) # fit histograms to max keV. Nominal is 20 keV\n", + "Chi_hist_min=1e6*ones(Fit_max_keV.size)\n", + "Chi_red_min=1e6*ones(Fit_max_keV.size)\n", + "g1_best=ones(Fit_max_keV.size)\n", + "g2_best=ones(Fit_max_keV.size)\n", + "\n", + "g1_range=np.arange(0.08,0.11,0.001) #scan g1 ... use 0.0002?\n", + "g2_range=np.arange(17.0,23.0,0.05) #scan g2\n", + "SE_size=SE_WS #measured in Dec trititum data\n", + "sigma_SE_size=sigma_SE #measured in Dec trititum data\n", + "\n", + "Chi_red=10*ones((g1_range.size,g2_range.size,Fit_max_keV.size))\n", + "Chi_hist=1000*ones((g1_range.size,g2_range.size,Fit_max_keV.size))\n", + "\n", + "E_step=0.25;\n", + "jj=0;\n", + "print 'g2= '\n", + "for g2_scan in g2_range:\n", + " ii=0;\n", + " print g2_scan,\n", + " for g1_scan in g1_range:\n", + " \n", + " E_com_test=1/73*(S1/g1_scan + S2/g2_scan)\n", + "\n", + " n, bins = histogram(E_com_test, bins=np.arange(0.05, 25 + E_step, E_step), normed=0)\n", + " bincenters = 0.5*(bins[1:]+bins[:-1])\n", + " nTs, binsTs = histogram(E_com_Tsim_NEST_MAX, bins=np.arange(0.05, 25 + E_step, E_step), normed=0)\n", + " bincentersTs = 0.5*(bins[1:]+bins[:-1])\n", + "\n", + " for kk, minE in enumerate(Fit_min_keV):\n", + " norm_real_s=sum(n[aLib.inrange(bincenters,[Fit_min_keV[kk], Fit_max_keV[kk]])]*E_step)/sum(nTs[aLib.inrange(bincentersTs,[Fit_min_keV[kk], Fit_max_keV[kk]])]*E_step) \n", + " diff_hist= (n[aLib.inrange(bincenters,[Fit_min_keV[kk], Fit_max_keV[kk]])]-nTs[aLib.inrange(bincentersTs,[Fit_min_keV[kk], Fit_max_keV[kk]])]*norm_real_s)**2/n[aLib.inrange(bincenters,[Fit_min_keV[kk], Fit_max_keV[kk]])] # (diff/sigma)^2 ... where sigma ~ sqrt(no)\n", + " Chi_red[ii,jj,kk]=sum(diff_hist)/(n[aLib.inrange(bincenters,[Fit_min_keV[kk],Fit_max_keV[kk]])].size) # devide by v to get red_X^2. The two hisotograms are nomalized above norm_keV\n", + " Chi_hist[ii,jj,kk]=sum(diff_hist) \n", + " \n", + " if Chi_hist[ii,jj,kk]< Chi_hist_min[kk] :\n", + " g1_best[kk]=g1_scan\n", + " g2_best[kk]=g2_scan\n", + " Chi_hist_min[kk]=Chi_hist[ii,jj,kk]\n", + " Chi_red_min[kk]=Chi_red[ii,jj,kk]\n", + " \n", + " ii=ii+1\n", + " \n", + " jj=jj+1\n" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 0.81515976, 0.83435785, 0.84130767])" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Chi_red_min" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[array([ 0.099, 0.1 , 0.099]),\n", + " array([ 22.7, 22. , 22.6]),\n", + " array([ 0.83363937, 0.80793243, 0.82996695])]" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[g1_best,g2_best,g2_best/SE_WS]" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "Chi_red[isinf(Chi_red)]=max(Chi_red[~isinf(Chi_red)]) # clean up inf\n", + "Chi_hist[isinf(Chi_hist)]=max(Chi_hist[~isinf(Chi_hist)]) # clean up inf\n", + "Chi_hist[isnan(Chi_hist)]=max(Chi_hist[~isnan(Chi_hist)]) ####\n", + "Chi_hist_diff=Chi_hist-Chi_hist.min()*ones(Chi_hist.shape) # Chi_diff to get 1,2,3 sigma intervals" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "savetxt('/global/homes/r/rknoche/iPyNb/Analysis_Code/Run04_CH3T_G1G2_Kr2p22/Sep2014_CH3T_Kr2p22_g1g2.txt',[g1_best,g2_best])\n", + "savetxt('/global/homes/r/rknoche/iPyNb/Analysis_Code/Run04_CH3T_G1G2_Kr2p22/Sep2014_CH3T_Kr2p22_Chi.txt',Chi_hist.flatten())" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "Chi_hist_diff=Chi_hist\n", + "for ii in [0,1,2]:\n", + " Chi_hist_diff[:,:,ii]=Chi_hist[:,:,ii]-Chi_hist[:,:,ii].min()*ones(Chi_hist[:,:,ii].shape)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# calculate the chi_diff to n_sigma\n", + "conf_to_chiDiff=array([linspace(0,40,10000), 1-scipy.stats.chisqprob(linspace(0,40,10000),2)]) #1-chisqrprob\n", + "sigma_to_conf=array([linspace(0,8,10000), scipy.special.erf(linspace(0,8,10000)/sqrt(2))])\n", + "chiDiff_to_sigma=array([conf_to_chiDiff[0,:], interp(conf_to_chiDiff[1,:],sigma_to_conf[1,:],sigma_to_conf[0,:])])" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "Sig_hist=interp(Chi_hist_diff, chiDiff_to_sigma[0,:], chiDiff_to_sigma[1,:]) # get the sigma contour from 2D X^2 diff" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "savetxt('/global/homes/r/rknoche/iPyNb/Analysis_Code/Run04_CH3T_G1G2_Kr2p22/Sep2014_CH3T_Kr2p22_g1g2.txt',[g1_best,g2_best])\n", + "savetxt('/global/homes/r/rknoche/iPyNb/Analysis_Code/Run04_CH3T_G1G2_Kr2p22/Sep2014_CH3T_Kr2p22_Chi.txt',Chi_hist.flatten())\n", + "savetxt('/global/homes/r/rknoche/iPyNb/Analysis_Code/Run04_CH3T_G1G2_Kr2p22/Sep2014_CH3T_Kr2p22_Chi_Diff.txt',Chi_hist_diff.flatten())\n", + "savetxt('/global/homes/r/rknoche/iPyNb/Analysis_Code/Run04_CH3T_G1G2_Kr2p22/Sep2014_CH3T_Kr2p22_Sig.txt',Sig_hist.flatten())" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:2: RuntimeWarning: divide by zero encountered in log10\n", + " from IPython.kernel.zmq import kernelapp as app\n" + ] + }, + { + "data": { + "image/png": "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\n/wOHNYLLvIhhfgAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "v=arange(0,3.05,0.05);\n", + "contourf(g2_range,g1_range,log10(Chi_hist_diff.min(2)),200,linecolor='none'); \n", + "cb=plt.colorbar()\n", + "plt.xlabel('g2')\n", + "plt.ylabel('g1')\n", + "cb.set_label('log10(Diff_Chi^2)')\n", + "plt.rcParams.update({'font.size': 18})" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[,\n", + " ,\n", + " ]" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\nJEwKJUmSBPx/giW9xxvzCXMAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "v=arange(0.1,3.0,0.05);\n", + "contourf(g2_range,g1_range,Sig_hist.min(2),v,linecolor='none') \n", + "cb=colorbar()\n", + "cb.set_label('sigma')\n", + "plt.xlabel('g2',fontsize=18)\n", + "plt.ylabel('g1',fontsize=18)\n", + "plt.plot([g2_range.min(),g2_range.max()],[g1_best,g1_best],'--r')\n", + "plt.xlim([17,23])\n", + "plt.ylim([0.09,0.11])\n", + "plt.plot([g2_best,g2_best],[g1_range.min(),g1_range.max()],'--r')\n", + "#plt.text(g2_best*1.02,g1_best*1.02,'g1={:1.4g}\\ng2={:1.4g}'.format(g1_best,g2_best))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.11" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/CodeForLUX/Python/Run04_CH3T_G1G2/Sep2015_CH3T_G1G2_KrypCal2p22.ipynb b/CodeForLUX/Python/Run04_CH3T_G1G2/Sep2015_CH3T_G1G2_KrypCal2p22.ipynb new file mode 100644 index 0000000..09a683e --- /dev/null +++ b/CodeForLUX/Python/Run04_CH3T_G1G2/Sep2015_CH3T_G1G2_KrypCal2p22.ipynb @@ -0,0 +1,1348 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Setup

" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "//anaconda/lib/python2.7/site-packages/matplotlib/font_manager.py:273: UserWarning: Matplotlib is building the font cache using fc-list. This may take a moment.\n", + " warnings.warn('Matplotlib is building the font cache using fc-list. This may take a moment.')\n" + ] + } + ], + "source": [ + "from __future__ import division\n", + "import scipy \n", + "import scipy.interpolate as ip\n", + "from pylab import * # includes numpy\n", + "import matplotlib.pyplot as plt # plotting libraries from matlab\n", + "import sys\n", + "sys.path.insert(2, '//global/project/projectdirs/lux/data')\n", + "import aLib" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Populating the interactive namespace from numpy and matplotlib\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: pylab import has clobbered these variables: ['linalg', 'draw_if_interactive', 'random', 'power', 'info', 'fft']\n", + "`%matplotlib` prevents importing * from pylab and numpy\n" + ] + } + ], + "source": [ + "%pylab inline \n", + "#always do this for plotting... don't ask me why... Googled the fix for LINUX." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "pylab.rcParams['figure.figsize'] = (10.0, 8.0) # set size of figures displayed in this notebook" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Let's make a Tritium Beta Specturm ! :)

remember, Z'=Z+1 = 2 for Tritium Decay

http://www.hindawi.com/journals/ahep/2013/293986/
http://journals.aps.org/prl/abstract/10.1103/PhysRevLett.54.1891\n", + "
Note on DocBD: http://teacher.pas.rochester.edu:8080/wiki/pub/Lux/LuxDB00000402/TritiumBetaShape.pdf

" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Defining Constants

" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "c=1; # speed of light\n", + "C=1e-6; #constant infront of Fermi funciton. Arbitrary. Read Katrin paper if you care about super-allowed and allowed transitions... and nuclear matrix elements that don't matter\n", + "me = 511/c**2; # rest mass of our good friend the electron, in keV\n", + "Q=18.6 # endpoint of the tritium Beta decay keV. Maximum kinetic energy the electron.\n", + "mv=0 # neutrino mass=0. There may exist a 17 keV neutrino, maybe 7 keV!! Will we ever know??? Is it The Dark Matter?? Mystery...\n", + "step_T=0.1 #step energy by 0.1 keV\n", + "T=arange(0.01, 18.6,step_T) #sweep from 0.01 to the Q value in increments of step_T.\n", + "Z=1+1; #Tritium, after the beta decay Z'=1+1;\n", + "halflife = 12.32; # half life of the tritium beta decay in years\n", + "tau = 365*halflife/0.69; # Decay constant converted to days\n", + "n = 1e6; # Assume 1e6 atoms are decaying.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Simplifications

" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Fermi Function. Coulomb correction for the charge of the nucleas\n", + "G=(T+me*c**2)/(me*c**2); #Gamma, Total energy(E+M^2) over M^2\n", + "B=sqrt((G**2-1)/G**2); # v/c of electron. Ratio of velocity to speed of light in vacuum.\n", + "x=(2*pi*Z/137)/B; # note: fine structure constant = 137. \n", + "F = x*(1/(1-exp(-x)))*(1.002037-0.001427*(B)); # from http://journals.aps.org/prl/abstract/10.1103/PhysRevLett.54.1891. Measured to 1/1000\n", + "F_Kat=x*(1/(1-exp(-x))); # Katrin paper... http://www.hindawi.com/journals/ahep/2013/293986/ (really the same thing)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

more blah blah blah equations, they never seem to end!

" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "KE=T; #(G-1).*me*c^2; % The kinetic energy, is equal to T\n", + "E=KE+me*c**2; # the total energy. KE + rest mass\n", + "P=sqrt(E**2-me**2*c**4)/c; # momentum of the electron" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Let's calculate the number density of final states in two ways... makes no difference for LUX

" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "N=C*P*E*(Q+me-E)*sqrt((Q+me-E)**2-mv**2)*F # in terms of total energy. E=m0+KE. Or where Q means Q+m0\n", + "N_Kat=C*F_Kat*(KE+me)*sqrt((KE+me)**2-me**2)*(Q-KE)**2 # eqution 18 of Katrin paper. Set nutrino mass to zero... http://www.hindawi.com/journals/ahep/2013/293986/ (really the same thing)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Normalize the count to number of atoms

" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "s = sum(N[~isnan(N)])*step_T # Total Counts\n", + "s_Kat = sum(N_Kat[~isnan(N_Kat)])*step_T # Total Counts (for the Katrin paper case)\n", + "\n", + "N = N * (1/s * n/tau) # Decays/keV/day/1e6 atoms\n", + "N_Kat = N_Kat * (1/s * n/tau) # Decays/keV/day/1e6 atoms" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

create variable of kinetic energy T and N (count/dE)

" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "tritium_beta_spectrum=array([T,N])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Make Plots!!! Woooo Plots

" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\nERFJUf8P/gVG4rDYZGUAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnMAAAH4CAYAAAAhL2uIAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xd4VGXax/HvnRBCl6r0jg0LImBFUezYEDuKq4h1XX3t\nuhZ017X3shawgB3F7goqRSwgCCgISJUqvfeS+/3jnOgwmUAmyWRmkt/nuuZKznOec849kwA3TzV3\nR0RERETSU0ayAxARERGRwlMyJyIiIpLGlMyJiIiIpDElcyIiIiJpTMmciIiISBpTMiciIiKSxpTM\niYiIiKQxJXMiIiIiaaxcsgMoCjM7DegCVAVedvcvkxySiIiISImy0rADhJlVBx52917JjkVERESk\nJKVUN6uZ9TWzRWb2S1T5CWY2xcymmtktMS69A3i2ZKIUERERSR0plcwBrwDHRxaYWQbwTFjeGjjP\nzPaMOP8A8Lm7jy/JQEVERERSQUqNmXP3b82sSVRxB2Cau88GMLO3gdOAKWZ2DdAZqGZmLd39xeh7\nmln69yOLiIhImeHuFk/9lErm8tEAmBtxPI8gwcPdnwae3tkN4v1QpGwys97u3jvZcUh60O+LFJR+\nVyQehWmESrVuVhERERGJQzokc/OBxhHHDcMyERERkTIvFZM5C1+5RgMtzayJmZUHzgU+juuGZr3N\nrFPxhSil1LBkByBpZViyA5C0MSzZAUjqM7NOZta7UNem0jpzZvYm0AmoBSwC7nb3V8zsROAJguSz\nr7s/EMc9XWPmREREJB0UJm9JqWQuEZTMiYgUDzP7HYhecUBECme2uzeNLlQyF4OSORGR4qG/T0WK\nT35/ngrz5ywVx8yJiIiISAGlwzpzRRYOKBzm7sOSHIqIiIhIHuFEzU6FulbdrCIiUhD6+1Sk+Kib\nVUREREQAJXMiIiIFZmZHmtncHZw/1MymmtlqMzu1JGOTskvJnIiIpD0zyzGz5lFld5tZ/wQ8bkfj\nk+4FnnL3au4e1wL3sZjZK2Z2b4zyJuF7zsivvpn93cwmmFm5iPPXmdlP0ddJeisTP0ztACEiUurl\nl2CV9MDwJsCkwlxoZplxXrKz9/YssAK4I7x/c6A3cIm758QdoCRUUXaAKBPJnLv31kxWEZEEMfNi\nfxUiih2HaLXM7BMzW2Fmy8xseMS5emb2npktNrMZZnZNxLkKZvaqmS03s4lA+x08YzrQDPg07GbN\nCu/9UfjMqWZ2aUT9u81sgJn1N7OVwEWFeN/58mCG46XAdWa2D/Ai8Iy7/1ycz5Hi4e7D3L13Ya4t\nE0uTiIhImXcDMJdgu0gDDgYwMwM+AT4AzgEaAV+Z2RR3/5KgJatZ+KoCfJHfA9y9pZnNImj5Ghre\n/x3gZ6AusDfwpZlNj2hgOBU4090vNLPsYn3HQUxTzex+YCiwlKAbWEqZMtEyJyIiZd4WoB7QzN23\nuft3YXl7oLa73xeW/w70Ac4Nz58F/NvdV7n7fOCpAjzLAMysIXAIcIu7bwlbxPoAPSLq/uDunwC4\n+6aivcV8fQvUBN5z980JeoYkkZI5EREpDbYBWVFlWQRJHMDDwAxgsJlNN7NbwvImQIOwG3W5ma0A\nbgN2Dc/XB+ZF3HN2HDHVB5a7+/qo6xtEHOc7M3YntoZfd/SeMbMs4AXgaeDvZta0kM+TFKZuVhER\nKZrUWEh4DtAU+C2irFnusbuvBW4EbjSzvYGhZvYjQTI10933yOe+Cwi6XieHx03iiGkBUNPMKrv7\nurCsMTA/ok5hJ2j8QZC0NSXvex4ccXwXsMjdrzOzjQTj5o4r5DMlRZWJljnNZhURKfXeAe4wswYW\nOAY4GRgAYGZdzKxFWHcNQctWDvAjsMbMbg4nO2SaWWszaxfWHQDcZmbVw27Tvxc0IHefB3wP3G9m\n2Wa2H9ATiHe5lHLh9bmvrHA26vvAfWZW08zKmdl5wF7A/8L3vH8Yb+6ki95AEzP7W5zPlxKg2aw7\nodmsIiKl3r0EidO3wHLgAeB8d89tUWtFMLFhDfAd8Ky7Dw+TopOBNsAsYDHwElAtvO4egla/WQST\nH/rtJI7olrbzCFrLFhAkX3fmTo6Iwy3A+ojX12H51eF7/QVYBFwFnOTuS8J15PoQjPebBeDuG4HL\ngIfMrE6cMUiCFWU2q/ZmFRGRAtHfpyLFR3uzioiIiAigZE5EREQkrSmZExEREUljSuZERERE0liZ\nWGcunOo7TDNaRUREJBWFS6h1KtS1ms0qIiIFob9PRYqPZrOKiIiICKBkTkRERCStKZkTEREpADOb\naGZHJDuOZDCz/5rZP3dw/m4zi3ebMikmSuZERCTtmdksMzs64vhcM1tuZh0LcO0rZnbvzuq5+z7u\n/k0h48sxszVmttrM5prZo2aWNuMP3f1Kd78PwMyONLO5saoV9H5m1sTMhpjZOjObZGadiy3YHT/3\novBn8WhU+Wlh+cslEUdxUzInIiKlipldBDwNnOjuI4rhfplFjwoH9nP3akBn4HygVzHct8CK6X0A\nGHEkbvl4C/gJqAncAbxnZrWKGlgBzQDODvevzdUD+K2Enl/slMyJiEixMMNjveKpX/QY7HLgYeA4\ndx8VUf6umf1hZivMbJiZ7RWW9wK6AzeHrWYfheWzzOxmM/sZWGtmmZGtf2G34jtm9lp43QQza7uj\n0MIX7j4VGAHsE97rFjObHt5nopmdHhH3RWb2rZk9bWYrw1asyBbIambWx8wWhC1+/8pt8Yu49jEz\nWwrcHfVZZZvZejOrGR7/08y2mFmV8PheM3ss/P6V8LgS8DlQP6KlsW54y+yCfB5m1go4AOjt7pvc\nfSDwC9Atn/o7/KzDFrXmEcc7a2ldCEwAjg/r1wAOBT6Oem7078zeEedOMrNfI1parw/La5nZJ+E1\ny8xs+A7iKDZK5kREpLS4CugNHO3u46LOfQ60AHYFxgJvArj7S8AbwEPuXs3dT4u45lzgRKC6u2+L\n8bxTwvvsAnwCPFuQIMOkoGMYB8B04LCw1e4e4HUz2y3ikoOAaUCt8P0NNLPq4bnXgM1Ac4IE6Vjg\n0qhrp4fv+77IONx9E/AjcGRYdATwO3BYeHwkMCzqmvUEn8kCd68afmYL4/w8WgMz3X1dRNnPYXl+\ndnTveP8T4EA/4KLw+FzgQ4LPMVL078wbEef6AL3Cn9k+wJCw/AZgLsHPalfg9jhjK5QykcyZWW8L\nFuMTEZHS6xhgpLtPjD7h7q+6+3p33wLcC+xvZlV3cr8n3X1BmPTE8q27D/Jgwdb+wH47ud9YM1sG\nfAS86O6vhrG97+6Lwu8HECRuHSKuW+TuT7n7Nnd/l6A7sIuZ7UqQWP2fu29096XAE8B5EdfOd/fn\n3D0nn/fxDXBk2AW7H/BUeJwNtCdoQSyogn4eVYBVUWWrgR39PHZ078KMPfyQ4H1WI+hi7RddYSe/\nM5uB1mZW1d1Xufv4sHwLUA9oFv68vitoQGbWyYJNDuJWJpI5d++t3R9EREq9K4HdzaxvZKGZZZjZ\nA2FX5kpgFkHrTO2d3G/eTs4vjPh+PVAhahxWtAPcvZa7t3L3P7s8zayHmY0Lu+ZWELRQRcY2P+o+\ns4H6QBMgC/jDgskeK4Dno66NNVEh0nDgKKAtQVfnlwS7EBwMTHP3FTu5PlJBP4+1QLWosl2ANcVw\n7wJx943AZwTj9Wq6+w+R5wvwO9MN6ALMNrOhZnZwWP4QwZi8weG1t8QR0zB3712Y91MmkjkREUk8\ndyzWK576RQxhEcHkgo5m9lxE+fkE3XRHu3t1oCkRY9jIv5uuuLdIirXaf2PgReAqd6/h7jWAX6Pq\nNoi6rDGwgCBR2wjUcvea4fXV3T2y1Wpn7+F7YA+gKzDc3aeE9z+JINGLpaify69AczOrHFG2f1he\nGOuBShHHdfOrGKU/cH34NVp3dvA74+4/ufvpQB2CltZ3w/J17n6ju7cATgWuN7Oj4n5HcVIyJyIi\npUY4fqszcHzu4H2C7rtNwIowgbif7ROSRQRjzoqqMMloZSAHWBq2Bl1MODEiwq5mdo2ZlTOzs4A9\ngc/D9zoYeNzMqlqgucWxFp67byCYVXo1fyVv3wNXkH8ytwioFXZR7kjMz8PdpwHjgbvDSRhnELzn\n9wsad9S9xwHnh5/fCfw1BnCH3H04wRjDZ2KcrkI+vzNmlmVm55tZtXAs5RpgW3iui5m1CO+xBthK\n8PNNKCVzIiJSGvyZnLn7XIKErpuZ3UcwSWAOQXflRIJkJVJfgvFPy81sYPT9Yj1jZzEU9Jy7TwYe\nBUYSdCW2Br6NqjYKaAUsBf4FdIvo/uwBlAcmAcuBARS8ZSrXcCCTYDJE7nEVgvF0eeJ3998IlhaZ\nGX5m+T1vR5/HuQRj8lYQTMzo5u7L4og58t7XEbSCrSAYL/hBgW/iPtTdV8Y41Y8d/85cCMwKu2Av\nI2j9heDn9JWZrQG+A54Nk8aEsmAsYell2hhaRKRY6O/TkmfBmnk93b1M7jxRmuX356kwf87UMici\nIiKSxpTMiYiIiKQxdbOKiEiB6O9TkeKjblYRERERAZTMiYiIiKS1cskOoCSE22MM0y4QIiIikorC\nbUc7FepajZkTEZGCMLPfCbaQEpGim+3uTaMLC5O3KJkTERERSRGaACEiIiJSxiiZExEREUljSuZE\nRERE0piSOREREZE0pmROREREJI0pmRMRERFJY0rmRERERNKYkjkRERGRNKZkTkRERCSNKZkTERER\nSWNK5kRERETSmJI5ERERkTSmZE5EREQkjZVLdgAlwcx6A8PcfViSQxERERHJw8w6AZ0Kda27F2sw\nqcbM3N0t2XGIiIiI7Exh8hZ1s4qIiIikMSVzIiIiImlMyZyIiIhIGlMyJyIiIpLGlMyJiIiIpLEy\nsTRJWjAzoCJQHagBVH+Wq9rMo2GzjVSovZEKNbeQVWkLWZUu54W5h/LDZqBSxKvi9Tza+DsOq5JD\nRsY2Mm0bmRnbyLSHuWnNiXyRQ5C85wAO5FzH45UHc1yFDHLccDecDHL8Hu5edhofrwU2A5tyX/dz\na50fOKRaObZuLsfWLZls21yOrZvO5t3Jp/DpbGBt+FoHrP2A0yvOollORTYsq8WypXsxefG+TFwJ\nrKO0T6MWEREpIUrmEs0sA6gH1H+Caw+bS6O91lKl8Rqq1l1NtdorqV7tWa7euH+QxJWPvPRDTucr\njs1zy658cEisR82lET9yUJ7ytVSpGav+Quoymb3zlK+nUv1Y9SexN59wap7yY/myQ6z6n9GFvly6\nXVl5NvEU//DLzVYAK8PXCmDlc1xZbQztsiuwcWUFNi7LZtPiimxYdBjfTe7MkDnAUmAZ7ttiPU9E\nRKQsUjJXHMwyPuLU1j+z//HLqdnmcl7YtBdT6gItgGaESdpndImZnM2hcbX9+SVPeQ1WxHzcBirG\nLC/H1pjlW/P5MTuxl7HJICdm+SayY5Znsylm+Vqq5CnbTDaVWG9AzfD1px/pwGv8Lc81fegZeeiY\nLQeWPMyNmd9yeFZl1q2ozLqllVm3qBLr5x/J8LHHM3gqsARYinvsAEVEREoBJXPxMqsGHAgceAOP\nnDWa9nvMZG61+TT8MzM6iqHsxZQ8l9bjj5i3XEDMhjCqszJm+XoqxSzPJHaDVX7JXE4+QyaN2D2g\n8SZz66gcszy/JHUFNWKWR30OBtQCav3EgXzMaQBNIyvsGf3Zm60EFjzMjTaKg6wqaxZXZc38Kqyd\ntQurph3Gd+MO57uZuK+JGYCIiEgKUzK3I2aZL3DZsUcxtPXuTNsH6ADsRZBQsJC6jOCIPJfNpHnM\n29VnQczyP6iX++1mwi5HYEV9FlRry081K7JhbTab1pRj6/pMtm1wbAwwGVgfvjYAG5oxq8G5vFXN\nsc2ObXJscw4Zm1axy2xgGcFYOSMYO2d1WdioG+9VBzIMzzS8XAY5GZvInkcw9q08UAHIBrJbMa3D\nmQxo4FjFHDIq5pBRYRuZFSqwcSLBOLkq4asyUCWbTe2b8HutDVQst4GKGeuplLGNcvkmqSupHrM8\nv+RvKbVjltdmaXRRdaD6DxzCB5wBsGfkyTc5L/jGbB3wR+7rGa4uN41WG3Zh1dTaLJ3QntFjD2Hk\nXNxjN12KiIgkgZK5SGbWnws6jKfNpTNo0fkXZjSZRfOMF+nF7kzLU701v8a8TYxkbiUwpxFz/SBG\n1qjMumWVWP9HNpvmZLJtxjoqjwTGAhsiJwb0Dl95nQT0yVP6r3zf2JnAM3lKn4aFseufC/TPU/oI\nfBW7/ikxS9+LOjbDgOxfaW2H811VwiSLcMJHK6Z1qcT6Jpspv8tGKlTdSIXK66lUsSprZhNMDqkd\n1gdgCXViPrcOS2KWRyTN26n718dQGWgZvvgfJ/I5XbaruyuL6GOnLDqFT38D5ka+BnHcyvos+G1f\nJi7RBA8RESkpSubMKgHHAKfeyv1nPcit1aKr/EgHesVIniKTuUy20oi5G+qycBEwGngXmAnMwn0F\nwNXhK7abivY+0oA7DmyEF4AXNgCLI8/3gXdiXzn6r2/NsgiSutoH8tPJrZjWYjPl626kQp31VKq5\nnkrVarJ8OrALUCesmwH5J3P5dX/PpVGessXsRm2W7gbsFn3uQW5hOEfSgPlez0atr8OS5TVZvuBS\n+gw6ghFjgVkEvw/qzhURkWJjpb0BIdaGteus8m6VWX8ycBpwLEFXIm9zDufxdp577Msv/ML+uYdO\n0MU5eiKtp93LXRW3kPX1OA74/ndvqoH2qcYskyChq9+d189ZT6XmG6jYYB2V66yhao2VVK8yjgMW\n12BlXaJmE9dgOStjjOObS0MaMj9PeSumMp1WecpH0452/BRZtAyYdQOPlF9BjRXVWTm9Bit+acGM\n787nrZ9xjz2TRURESr1YectOrykLydy93HHLZspXXUD9I6aw5wGtmFb1VS7OU3cxddht+8YistjM\n3kxaNoqDHs1m8yjgJ9xXlVD4UlKCdf5qECwjU28j2Q1P46NL11Kl3kqq11xK7SpLqFMugxw2kU1m\n1IxfByqxno0xZhovpRa1WJ6nvDGzmUvj7cpqsJxhdJq9HxMmAdOBaRFfZ+O+pVjer4iIpCQlczGY\nmRM1O7Mqq1lKbcqT99/F/RnvG6mwtjkzx1Zn5XvTafnaaG+vbjHBjKyT+Kz5Z5ycATQCGodfGy2m\nTrO9mNxxObUyI6+pympWsUueRWA2k0VFNpBDJtFWUY1q5P2V25/xZJCzqS4Ll9Vm6bxaLJtSi2Xj\nzufNz1owc4YmZoiIpD8lczHESuYABnMsx/41nn8O8DHw8V3cM/Jev0vJmxRKPfuj4iH8cGAFNrbb\nTPl9K7G+bj8umk+w3mAzggQwawbNacmMPNfvyiIWUTdP+XoqUpn1MZ8ZJn8bgd+AKeFr8stcvOwE\nvviuvi/YUGxvUEREEkrJXAz5JXNX88wfz3DNfwmSuF80+1BKRDCGr/6XHNPmea44dy1VWqykev0l\n1Km1gPqV2jGGb+mY57IJ7MN+TMhTXp/5zKdhnvJ1VKIK66jCGpozc3MD5i/dlcWz6rDkl4e5+S1g\nMu551nAREZHkUjIXg5l5ayasyGTbtiqsXVWXhUNzyHjpQ7qODmdXiqQEMzKu4tkGz/L3WkArgiVS\nWgGt3uacfc7j7TwL8XXmq5i7ioyjDW0Zl6e8EXOYQ5Pcw0XARGDiGqpMfoley49i6OADfJzGhIqI\nJElhkrkysTTJRN8n5t6kIqnEnRy4em7wYnzkufOMjBP43+41WNFxC1nt1lJlrxXUaHJAkLBVIWpr\ntCnbr4v8p72YHHmYu8RK55k05wYeowIbaGkTNjdi7uK6LJzWjFnf38m/3wV+07ZoIiKpqUwkcyLp\nLkj0TswdD/fSX2cOBm4CszoEO1vsBew5nZbHVmX13muott2ebXm2OgtNZB8ANlKRiexbfiL7NgQa\nduaro+7k3/8EtmE2laAlb/xcGk4axUETz+T9GRqiICKSXGmdzJlZM+CfQDV3PzvZ8YgkjfsSYAkw\nAuBO4C7DjmVw09os7byFrINXU22ffZmwmWBB5T3gr812J7BvzNvuw8TcbzMJEsW9gLNGcjDn8A7N\nmbmthQ1aUp8FU+uy8Ie9mfTphbw+UmvliYiUnLRO5tx9FnCpmb2b7FhEUk0wJvS4WQR7v4VbmBwf\nfGtWDmgB7APss5hdz63F0lbLqL3dWin7xph0ATCeNjgZzKBl5gxa1gXqAkdcyXO3XMjrGzGbAIwj\n6C4eD0zAfW1C3qiISBmXUsmcmfUFTgYWuft+EeUnAE8QbMvU190fTFKIIqVD0HL2W/h6/2W4B6CT\nDWvUgPnHbyK74wpq7L8nU1YBTcLXn8bTJuZt2wRD/SoA7cMXAI9znb9hYzY0Y9bsBswf3ZB5nx3L\nl5/u7z/HXm9FREQKLKVms5rZ4cBaoF9uMmdmGcBUoDOwgGCjznPdfUrEdQPc/ax87hn3rBARiWJW\nDWgN7Ae0OZAx3cdyYNXoaqPoQIfIvXRD3XiPgXTbrqwqq3mM62dfSt+vCP5cjyFowduciLcgIpIO\nSsXSJGbWBPgkIpk7GLjb3U8Mj28F3N0fNLOawH3AMUCfWC12SuZEEmM/+2WX1vx64hayjl1BjQP/\noF7T0bTfVJn1u0bXbcLvkUui/GkYR3Ik30QWbQZ+eYibli9m16ktmf7RFbwwFPdtiXsnIiKpo7Qm\nc92A4939svD4AqCDu/+jgPdzwi6k0DB3H1a8UYvIn8zqAm2AA4A2C6jXrgELmuepRg6r2IWq5B1K\ntze/Mpm9AajPfN+LyUubMPvnS+nzyiGMHKwFj0WktDCzTkCniKK7lczlvZ9a5kSSyAw7mU/2rMLa\nM1dTrdMf1Gs9gxZ1GjA/YxKt89RfQxV2YRVORp5z86lPff4AmA78EL5GEnTPagatiKS90rpo8HyC\n/SxzNQzLRCQNBLNqT5kM/Ct8YYZdwsstgaYEEyXaha9GY2kbM5FrzOzcRA6C3TFaAhduoRx7MsWb\n2tfLmjB7QiPmftme0W+c7J/OSfibExFJAanYMteUoGVu3/A4k2DGXWfgD+BH4Dx3n5zfPaLup5Y5\nkXRhttvzXH76B3S9eD4Ndp9OyxqbqADA2bzDO5yb55KfaEs7ftqurBxb6MCP60fQ8a0M/BuC9fd+\n1wLHIpLq0r5lzszeJOg3rmVmcwj6jV8xs2uAwfy1NEmBErmI+/ZGY+VEUp/7oivghSvgBYCWNr18\nO8actIWsM45iaA2gPrA/wSLGAIzk4Dy32UoW2WyqlIH3BHqGxfMx+2YB9UZ9yOm/XMV/h+Oek/g3\nJSKyczHGzhX82tL+H1W1zImUMmaVgQOBQ4BDuvP68W/SvUJ0tbu4h3vonefy9+jGWbxHU2bltObX\n+U35/fvmzBxwPIM+bu2/bkl4/CIiO5D2LXMiIjvlvg74JnwxziZlncPbJ2ylXNfF7HroLJo1nUej\n7I7BzmZ5fMMRAPxOs4zfadYIOAc4ZxZPb3nabDgwJHz9pEkVIpIOlMyJSFqb5Htvgb0/AT7JLeti\nn7Vsza+7AwcDHcOvFQBG0DHmfdozOotgzcpjwqLVmA3/lC4T59JoyJU8P0TdsiKSispENyvBOnMa\nMydSVpllAwduoMKRBzHqpsnsVWMrWdtVmUVTmjI7z6VdGciHdKUF07fty4TfmzHr672Z1PdS+o7W\nhAoRKS4RY+bSf5254qYxcyIS7VD7vkpTfj93LVW6zqNhu7VUqfkbe5SL/otiGxnUZikrqZHnHsM5\nYuERjPiCoEv2a9wXlETsIlK6lYodIIqbkjkR2Zne1tt6c09L4CiCZZCOBmqP4UDaMyZP/Ww2spLq\nVGBTZPFEYNBzXDmpAz++1c7HbCiJ2EWkdFEyF4OSORGJm1kGsM9/uaLnc1x1wRT2rBnZLXs0X/P1\nn0Pr/rKSXajNUmqynLaMXbA7U4fuw8TnL+Ol79QlKyIFoWQuBiVzIlJUR9g3uzRi7t9WUKPbTJq3\n6UG/irdzf54JZO9zBmfyfp7rj2LIhiF07g8MIuiSXVUCYYtIGtLSJCIiCfCNH7EKeDJ8Mdf6VyBY\n5+5ogtmvHYCMLzgh5vWNmFsRuCx8bcNsBPDpJsp/ms3mqWq1E5GiyLsBYilkZr3DWSIiIkXWyOdu\nxH0o7nfifghQGzh7MbtOqsrqPInZCXwReZhJMGPtkX70mHIAYzdcZK99/x+7/fJp1qp8ibwBEUk5\nZtYp3LEq/mtL+38I1c0qIiVpb5uUtT8/n7OWKj1m0OKgqexebSF1qc2yPHVP5SM+4dQ/j+sz39sx\nZlY33u/bg/4v4b6kJGMXkeTTmLkYlMyJSDKdZ2/VfYvz9wdOCF97AmygArVYxgYq5bnmS47hGL52\nYCTwEfAB7lNLMGwRSRIlczEomRORlGLWHDj5Y0654DQ+bh99ugprWEYtypNnm9hf7+XOKTVY8fI1\nPPM/jbMTKZ2UzMWgZE5EUtUZNrBlObb+3xwanzyBfRuvpzLdeI/3OCtP3eXUYFcWs41ytGbi5gP5\n6afW/PpCB358vZMP25aE8EUkARKazJlZJpDt7usjyqoDPYGawNvuPiGeh5cEbeclIumgrY2tuCdT\nep3E520u4I02wAGR5/txIRfRL891HRi1ZRQHvwYMBIbgvilPJRFJeSWynZeZ9QEOdvd9wuMsYByw\nd1hlE3CIu4+PJ4BEU8uciKQls4bAaUBXoNPpfJD5EafnqdaTPvShV+7hKuAD4G2CxC5PX62IpLbC\n5C3xLE1yOPBxxPGZBInc1cChwCLg1ngeLiIi+XCfh/uzuB8D7FaRDf324+dlRs521bryQeThLsDf\ngC8GcOay8+ytcffbbb2GWafMEotbREpcPC1zq4Ab3f2l8Ph1YH933zc8vh243N2bJCrYwlDLnIiU\nJt3s/WYZ5Nz8O01PnUnzevNpYFF7xAJwAv9jULiIcQumbzuYkWP3ZcJTt/DQm7jn5LlARFJCosfM\nrQZudvfnw+N5wEB3/0d4fDHwnLtXjC/sxFIyJyKl1Y32SJVHuOkw4IzwVRtgKbWoy0K2xdjkZxDH\nLT2OL/v3X2oZAAAgAElEQVQTdMWO1qxYkdSS6G7WWcDx4YMOA+oBQyPO1ycYryEiIiXgEb9xLe6D\ncL+c4O/k44C+b3Pu+liJXC2WchRDawP/B4wCJmN2O2Yp1aMiIvGJJ5l7BTjNzCYCnwKLCTaNznUQ\nMKUYYxMRkYJy34r7l7hf+jknNT6bdx7pwKh5WWz+s0o33ieLrZFX7QHct5Jdfj/OBi++yR5++mM7\ntVZJhy4iRRNPN6sBdwCnE7TA3e7uI8NztYDJwCPu/lCCYi0UdbOKSFl2qn1ctwIb/zmT5mc+xM3V\nj2Zoheg6L3Epl/ESADVZxhF8M31/fn7uZD59up2P2ZrnpiKSMFo0OAatMyciEjKrBHQBzg+/ZgEc\nwXBGcESe6n/n6fVP848XgH6k2LJTIqVNiawzl67UMiciEoNZbeCc39i95578dkCsKuEesbmHY4E+\nwFu4ryyhKEXKnIS3zJlZZYL/0bUCagHRD3N37xlPAImmZE5EJH9mWHdeP3Mxu948mvZtV1IjA6A+\n85lDYzLJs4rJhnu4a1w2m166lQdf02xYkeKV6KVJDiVYNLjmDqq5u6fU4pRK5kRECuZIG57dkHk3\n/E7TXkfwTb37uT07us5i6tCA+WwlizaM23gIP3zejjG3XOIvT09GzCKlTaKTuZ+ARgR7sY7wNGlm\nVzInIlIIZhWBU4GLCZY8MYBHuZ4beXS7qpVYRxc+m/4u51xBsI2YWutECinR68ztDTzs7p+kSyIn\nIiKF5L4B93dwPwFoCvTOweb04dI8VddTmUqsbwl8RbB23XWY1SjZgEXKrniSuT8AbdosIlLWuM/B\n/Z6X6NXiAMbd15afFkVXuYrncr/dA3gcmI9Z34VW96CSDFWkLIqnm/V2gjXmDnH3bQmNqhipm1VE\npPh1tzcOWE21+8fQrnN9FpQbQ7s8M+IAuvApq9hl9WF89/JpfHTbof79xhIPViSNJHrMnAFPAx2A\n/wK/A3mSOnf/Jp4AEk3rzImIJM6B9lO5G3nktPN4+yyC/WGzcs/NoDmtmIaHnUDNmLntGL4afCjf\n//1v/urMJIUskpJKZJ05Cxab7AucnV8VNJtVRKTsMqtLMEnucqDRzTzIw9ycp1oj5jCNVv2y2fy4\nFiMW2V5h8pa8OzHn71mCRO5DYASwIp4HiYhIKee+ELgPsweALt9zaB+gTnS1M3mPbDb3AHpgNhx4\nAviENBrCI5JK4mmZWw687+69EhtS8VLLnIhI8lxgr586nwb3f8+he28mmwy2MZ2WNOP36KozR9Ou\nzxLqPHOSf74mCaGKpIREj5lbAdzi7i8WJrhkUTInIpJ859lbLddR+enqrDy0HxdVi1XnKIYwk+Y5\nJ/DF/w7ju8t7eL/5JR2nSLIlOpn7AFieatt17YySORGRFGKWCXQBrgOOyi3+kfYcxI9/VqvNEk7k\nfz8czMjLr/LnJpR8oCLJkehkrgkwhGDs3DPuvjn+EEuekjkRkRRltj9wLdC9G++VH0i3PFWaMZOp\n7N6vHNsewv3XEo9RpIQlegeIoUAV4GFgrZnNNrOZUa8Z8TxcRETKMPefcb9kKbWaraHquGzyLkHX\nk76UY1sPYCJmH2HWtuQDFUlt8bTMDQN2Wtndj9pZnZKkljkRkfRwofVvtZyaL4ygY6c1VLMqrGEO\njalBnh0kP51P/fsa+PyRyYhTJJES2s2arpTMiYiklzNsYG3H/tuaXzv9mztrR5934CBGUYtlC45k\n+HW3+gMDkhCmSEIomYtByZyISJoKJkucBtwGtMst/pQunMKnQRVyOI7Bf3Ri2A23+gNvJSdQkeJT\nIsmcmbUg+MPVPCyaCXzk7ik5Xk7beYmIpLlgO8kTgLsdDurAj4yh/fZVyOEc3pn7FuefgfuYpMQp\nUgQlsp1X+KB/AbcC0Vt25QD/cfe74nl4SVDLnIhIKWFmQzjqzMt48dUZtKwUffpxruM6ngR4D7gD\n999KPEaRIkr00iSXAH2A74GHgNwp4q2Bm4BDgZ7u/mo8ASSakjkRkdLlLBuQUY6tvUfT/obcpK4R\nc5jK7lRgU261bcArwD24z0tWrCLxSnQy9xOwGejo7lujzpUj2K+1vLsfGE8AiaZkTkSkdDrLBmRk\nseWOMbS7+Tbur3wxr+aps5XMTTfw6Let+fWSy/zFOSUfpUh8Ep3MrQduc/cn8zl/LXC/u+dp+k4m\nJXMiIqXbWTYg41X+dmxl1t8HbNeg0J8L6EF/6rDYu/LB50cz5MJz/J0VSQpVZKcSncytBB529/vy\nOX8HcKO7V48ngERTMiciUkYEEyW6AfcBu28miz34jd9p9meV5szYegYDn23P6OvP9ndzkhWqSH4S\nvQPEaOByM9stxoN3BS4DRsXzcBERkWLj7ri/RzCWu9ezXL0yMpEDmEmLco9w07VrqDoVs8OTEqdI\nMYunZe4I4GtgDdAXmBSeag1cDFQFOrv7iATEWWhqmRMRKZvOs7fqrqXK60M4uvN6Kv9ZvgdTmMC+\nZLEVYABwC+6zkhWnSKSErzNnZqcAzwCNok7NAf7u7p/G8/CSoGRORKRsu9D6t/qDeu8O5ag2OWTy\nKV3owueRVTYBjwP34746OVGKBEpq0eAMggGmuW3XM4Gx7p6SYw+UzImICMDF9soJhj/Wl557xfpH\n4R3OXjWa9v078OO1Gk8nyZLoCRBHAJPdfUk+52sDe7v7N/EEkGhK5kREZDtmHYEngLa5RWupTCum\nsZB6HM6IlSfx+UW3+f0fJy9IKasSPQFiKHDsDs53DuuIiIikrmBsd3vgb8AfAA9wKwupB8C3dKze\nm94fdbc3Rr1sl+SZ9CeSauJJ5naWJWYSbOslIiKS2txzcH8N2H0+9R98kmu3O72ZbN6ke4c36D4H\nswvDZU9EUlI8yRzAjvpkDwWWFiEWERGRkuW+toHPv/UsBhy3Hz8viz59Cw+WB/oBX2HWsuQDFNm5\nHY6ZC3d1yP3vSlNgCbAuRtUaQDXgZXfvVcwxFonGzImISEGYYefw9sNf0/m6pdTJPJMBDODsyCob\ngXuAR3HfkpwopbQr9gkQZnYRwZgCgCOBKcCiqGoOrAVGAo+7+4Z4Akg0JXMiIhKPC63/bsuo9cEL\nXN62EfOyo8+vp+IvT3PNvbf4g+8nIz4p3RI9m3UWcK27p9XsHjNzgv9JDXP3YUkOR0RE0kXQrfpf\n4JjI4ju5l4e4mXN45/sufHbiOf6O1qaTIjOzTkAn4O6ErzOXbtQyJyIihRZMfLiQYFHhmhNpzQGM\nYytZALRm4qbzeKvXP/2+/skMU0qPElk0ON0omRMRkSIzq7OVzMc7MqL7SA7Z7lQWmzmfN7+9iNdO\nOMqHxhpXLlJgiV5nDjM7zMw+NbMlZrbVzLZFvbbGF7KIiEgacF+SxdYLmzHrgdos2W4Zri2UZz4N\nDj+S4WMwOyhZIUrZFe8OEF8Bq4BRwEnAEKAK0AGYQLCt18WJCbVw1DInIiLFqbu90WQOjb/6lo4t\nAaqymonsQ2PmQrDe6gNAb814lcJI9ASIQcCeQDuCGayLgWPcfYiZHQe8B5zo7t/FF3ZiKZkTEZFE\nON/evGcQx9/xEDdn9OTl6NOjge64T0tCaJLGEt3N2gHoE+7NmtvEnAHg7oOB/sC/4nm4iIhIunrT\nz7/7PN5qfjGv9Ilxuv1Cdht/sz30lHaPkESLJ5nLBuaH328Kv1aNOD8eOLA4ghIREUkHz/jfZ2d4\nTi/gRGBBbrkDPelb6WFuvuZUPprxX7uyUdKClFIvnmTuD6AhgLuvA1YC+0ScbwhoAoSIiJQ97l8A\n+wEfAjzHVXxOFwA+4dRmj3DjzN7W+5IkRiilWDxj5t4Garj78RHHxwHXESSFjwKj3P2kBMVaKBoz\nJyIiJcbMZtD8mraMfXI1u2x3KpuNXMLLA5/j6rNwz8nnDlLGJXrMXF9gqZlVDI9vBzYArwIvE3S9\n3hzPw0VEREoVd2/hM546g4HdmvD7pshTm6hAObaeAXyCWa0kRSilUJEWDTazykBnYBvwrbuvKq7A\niota5kREJBnOtberL6HOsCF03h+gPT8ygo5ksxlgLnAO7j8kNUhJOdoBIgYlcyIikkzn25sPfcMR\nN3zL4RlNmR15aitwE/Akpf0fYykwJXMxKJkTEZFkG2ttW7ZlXH/g4Ohzk9jrg5848KILvf+aJIQm\nKUbJXAxK5kREJCWYlQfuB67PLVpFNTrwI9VYvfY83jrien9sXPIClFSgZC4GJXMiIpJSzE4DXsvB\ndjmVj/mMkwFowLycnvS94h6/+6XkBijJlOjZrCIiIlJU7h8B7e/lrsW5iRzAfBpmPMTNL/7DnnpN\nu0ZIPJTMiYiIlDT3afNpcNABjF0aWbyRijzNP3q8TvePMMtKVniSXtTNKiIikiRn2YCsNVT9ZhAn\n/Dkx4lJe4kUuw2AwcDYpuOyXJE6JjZkzsz2ATkANYDEw2N3nxX2jEqBkTkREUt259vbjH3L6dR0Z\nweecRNZfu2NOBLrgPieJ4UkJKvZkzsx6AU3c/Y7wOBPoA/TIrRJ+3QLc5+73xh11gimZExGRdHC5\nvdDtP9z+WC2WN446tRA4BfcxyYhLSlYiJkBcAVSMOL4XuAgYDvQETgR6AeOBu83swngeLiIiIoEX\n/PL3a7G8A/Bj1Km6v7H7iNvs/juTEZekvp21zK0EbnX358PjxcB37t41ql4G8A1Q0d0PTGC80fFV\nAp4j2Bd2uLu/GaOOWuZERCR9BP+29QO6ASyjJofwA7NoxlU81+dJv7ZXcgOUREpEy1w5gu1GMLMq\nQG3gjehK7p4DvA3sFc/Di8EZwAB3vxw4tYSfLSIiUvzc1wNnAw9tojxd+YBp7M5Wsniaay69wp7/\nUEuXSKSdJXO/EW494u5rgbVAzXzq1gI2FiUYM+trZovM7Jeo8hPMbIqZTTWzWyJONSTYrBhgW1Ge\nLSIikjLcc3C/5T7++cwIjvirmAxe4IrTevDat+/a2VpeTICdJ3OvAd3NLPc36RXgDjNrGVnJzNoA\n/yDoai2KV4Djo+6dATwTlrcGzjOzPcPTcwkSOvhrMoaIiEipcK/fdc35vPFIObZsV96fHoeuoepg\nrUUnsPNk7lmCyQ5fmdm7wB9ANjDJzL4xs3fN7HtgDJAF3FGUYNz9W2BFVHEHYJq7z3b3LQTduaeF\n5z4AzjSzZ4FPivJsERGRVPSGd7/pfN68uSLr/yz7O09zCS93Bt7HrGL+V0tZUG5HJ919m5mdAtxF\n0PJ2ZsTpwyO+/w64xt0nFn+INOCvrlSAeQQJHh6MK7hkZzcws94Rh8PcfVgxxiciIpJQr/lFD5ez\nvovfp9srJ/G5Pcm1ud1RpwCfYXYK7uuSGqQUipl1Ili7t/D3KOiiweHM0Y7AHkBVYANBYvWju/9e\nlCCintME+MTd9wuPuwHHu/tl4fEFQAd3/0cB76fZrCIiUipcb48dcz+3vZTN5qZRp4YBJyuhS38l\ntgNEIsVI5g4Gerv7CeHxrYC7+4MFvJ+SORERKT3M6gODgH0iixdQ7/vBHHfK3/zV5ckJTIpDIpYm\nye9BLc3sMDPbpTDX7+z2bD+ZYTTQ0syamFl54Fzg4wQ8V0REJPW5LwCOBMblFi2mDsfy5aF96Tnt\nebuiVvKCk2SIK5kzs5PNbAbBkiXfAAeG5bua2XQzO3OHN9j5/d8Evgd2N7M5Znaxu28DriHYcPhX\n4G13nxznfXuHfdIiIiLpz305cAwwdgm1OZohTKI139Kx5ht0V0KXhsysU9QY/4JfG8eYuU7AlwRb\nd30C9AaOcfch4flBwBp3L1JCV9zUzSoiIqWWWc0T+Xz6F5xYI7L4UL5bcSH9W13hzy9LVmhSOInu\nZr0L+Bk4iGDJkmg/AG3jebiIiIgUgfvyBsw/pDkztlu0/3sOq/E2507uZz0qJSs0KTnxJHPtgTfC\nrbtimQfULXpIIiIiUlB9/NLfOjFsvxZM3xBZ3oTZdc7l7dcx2+EyZJL+4knmMgg2tM9PbWBz0cIR\nERGRePX1ntOOZsh+uS101/IEr3Ax5dnSFXhee7mWbvEkc5MJ1pnLz8kE3bApRxMgRESktHvRL5t+\nDF8ddB+3L3qc/yODP8fE9wQeUkKX2kpqAsSVwFPAFQRLgywCOgOjgAeAq4Ee7v5GYQJJFE2AEBGR\nMsWsEcHOTI2iztyG+wNJiEjikPBFg83sdeB8YDXBLhBLgFpAJvCKu/eM5+ElQcmciIiUOWZ7ACOA\nOrlFy6nB01zz1N1+z7XJC0x2pkR2gDCzrsAFwJ4Ei/tOA/q5+/tx3aiEKJkTEZEyyawtwTZfVRdQ\nj+MZxG/swY08cst//PaHkhyd5KNUbOdV3JTMiYhImWV25HRaDDqOwdmzaA5ADZb7//H4KXf6vz5L\ncnQSQ4lt55VuNAFCRETKJPfh/+aOJ3MTOYAV1LRX+duHj9n1eyYxMolSIhMgChDEPkBbd+9XLDcs\nJmqZExGRsu50+/Czjzj9pMiyDoxafTkvNL7EX16VrLgkr2S3zJ0GvFKM9xMREZFi0IbxJx/JsN8i\ny3ZnarVzeOdlzMpEL11pph+giIhIKdfbe3tD5rXdj59XANzLnfSjB5VZfwbwrySHJ0W0w25WM7sr\njnsdCXRy98wiR1WM1M0qIiIS6GUvNT2S4cMv4I3GUad64N4/KUHJdop9NquZ5QBOsARJQbiSORER\nkRRm1gT4Edg1onQjcDDuKbmTU1mSiDFzq4AhQPsCvJ6PN+CSotmsIiIiIffZwKkECVyuChuo8P5L\n1qtekqIq8xI2m9XMvgYauvseBQjin8C9apkTERFJA2Y9gNcAZtOYsxhATZbPPZiRTXp779K9CG0K\nS0TL3DighZlVK8jzKXh3rIiIiCRTsJTYC4M4jraMZTQdGMQJjRZQPyV3dJL87axlbnfgEOAjd1+5\nwxsFCV8ND5pvU4Za5kRERGIbZMdXuoanl05j94q5ZVls5mYeuvLffkfKDp8qzbSdVwxK5kRERPJ3\nub3Q+U3O/2otVf8sa8C8nOt4Yr8b/ZFfkxhamVTs3axm1svM6hQtLBEREUlVL/jlX3flg/siy+bT\nMGMRu32GWVay4pKC21k369bw25HAQILu1hklEVhxUcuciIjIznWxz77/nC6HZLKVB7iVG3gUg3/j\nfmeyYytLEjEBoh5wJcESJf8BpprZL2Z2j5kdUMg4S5yWJhEREdmx2iw96hi+XDSEo7kxSOQAbsfs\niORGVjYkbGmSqIdUBboApwMnAlWAucAH4WuEp+AAPLXMiYiIFFAwtOoXoG5E6Vxgf9xXJCeosqXE\nJkCYWXngGKArcArBKtLLgE8IErsv3X1j/ncoOUrmRERE4mB2LDA4qnQAcA4p2GhT2iSimzUmd9/s\n7p+7ey+Crtgjgf7h1w+BmwtzXxEREUky9y+BRyKLllLrrMf4vzuSFJHsRLEvTWJm+wHZ7j66WG9c\nSGqZExERiVPQAzcSOOBjTqEXL+GY38xD+2q5ksRKaMucmX1lZueEXaz5cvdfUiWRExERkUJw37yZ\nrAt60mfbaXzMYnZjCbvaII7/EjM1kKSYeLpZDwDeBBaY2RNmtm+CYhIREZEkK++bJy2n5teRZV9x\nbL1reOq/yYpJYosnmasHdCfYr/UaYLyZjQoXFq6SkOhEREQkaaqx+tQ9mbwusuwtzrvsEbuxdbJi\nkrwKnMyFkx7edvdjgebAv4HdgBeAP8ysr5kdlqA4i0TrzImIiMTvNb9oUyeGnVmeTX+WLaO2bSL7\ntSSGVSqVyDpz+TzYgGOBvxOsQQfwG/Ai0Mfd1xb65sVEEyBERESKppu9/+lAunVpwXRe5DKOZihA\nN9wHJju20qbEliaJ0AY4FegIGDADyAEeA6aZ2aFFvL+IiIgkWRXWdruTe+f8wn65iRzAM5hVT2Zc\nEoi7Zc6CH1x3oCewP7CFYG25F919SFjnaOAlYLW7J3XbL7XMiYiIFINg4uNYoFxE6fO4X5mkiEql\nhO4AYWadgUsIdn2oAEwlSNhedfdlMer3Ap519x0uZZJoSuZERESKidm/gMjFgx3ogPuYJEVU6iQ6\nmcsBNgEDCVrhhu+k/lHAXe5+VDwBFTclcyIiIsXELBuYALTKLZrEXr8sZte2nXzYtuQFVnokeszc\n9UADd+++s0QOwN2HJjuRExERkWLkvolgeTLWUplbuZ82jN/vXc5+McmRlWnFvp1XqlHLnIiISPEa\naGcMu5Ynj5xHIwB2ZZHfwoMtrvfHZiU5tLRXmLyl3M6r5HlIJrAnUIMYLXvu/k289xQREZH08SXH\n3rGEOiNyjxezm33HYQOvD3aLkhIWV8ucmd0C3ApUy6+Ou2cWQ1zFRi1zIiIixa+rffDVh3TtnHuc\nxWZu5z8n9vbeXyQzrnSX0DFzZtYTuB8YTzCTxYAngIeB5cAYgtmuIiIiUso1Ym63+szfmnu8hfJ8\ny+GvJDOmsiqeCRBXAiPDSQ25Ax0/c/dbgf2ApkBKtcqJiIhIYjzl/1h1NEOeyT3uykCe54q6mJ2Q\nzLjKoniSub2AAeH3uX2zmQDu/gdBgndt8YVWfLQ3q4iISPHbSIUbujJw4VA6MZButGQGwKOYxT0m\nv6wrkb1ZzWw1cKO7v2jBOjMbgPPd/e3wfE/gaXevVJhAEkVj5kRERBLIrC3BUKvIf2svxb1vkiJK\na4leZ24O0AzAg3Vm5hLsyZqrPcHYORERESkr3McCr0WV9sasQjLCKYviSea+AbpEHA8ALjezl83s\nVeBS4PNijE1ERETSw10Eu0Tlakgw1l5KQDzdrHsAnYB+7r7BzCoDb/FXgjcY6O7uKdU6p25WERGR\nEmD2GPB/ADNpxgPcunFPpjS53h9bnOTI0kpC92bdwUN3Aba5+9oi3ShBlMyJiIiUALM686k/6z/c\nXvlFLmMrWVxA/y/7+4XHJTu0dJLoMXMxufuqVE3kREREpIS4L7maZ8c9x9VsJQuAz+hy7CN2Y5Mk\nR1bq5Tt12MwaF+aG7j6n8OGIiIhIumrIvAuqsWrWanYxgBXUZDxtXgY67+RSKYJ8u1nNLIe/1pMr\nMG3nJSIiUnZ1s/cHDaTbn12rNVnmt/JAw5v84QXJjCtdFCZv2dGifveSN5k7FWgDfAlMCstaE2Tc\n44FP4nm4iIiIlC67seiSqqyeu4ZqBrAqaKV7AOiR3MhKr3hms54PPAMc7e7jo861Bb4GrnL3t4o9\nyiJQy5yIiEjJ6mofDP2UkztdxGvcxv20YOZyoCnua5IdW6pL9ASIW4FnohM5+P/27jtMrrLs4/j3\nl4SQkIQSkhBaCC0EAamKoIYgVUBQEFSKiAg2EITXzmuigogKglhpgigioFRBihJp5qWDtBRCSAIh\nhQRMJe1+/zhnk5PJ7O7M7sycmdnf57r22jzPOXPmnjPDzs1TIZIFA38JfKucJzczM7PmszUvf2Y8\nw/57BaewNZMA+gNfzjmsplVOMrct0NZaMTPSc8zMzKwL+2n8z6tbMvlnBdVneleI6ignmZsOHClp\njaY/Sd2Ao4A3KhWYmZmZNbRLgGy36kbAcTnF0tTKSeYuJ9kB4m5JB0vaMv35MHA3yT6tl1UhRjMz\nM2s0EXNJcoess0kagKyCypkAIeBnwOmtnPLLiPhKpQKrFEkBfA8YExFjcg7HzMys60jWrJ0EdP8P\nO3IhZzOImd/5cXz9h3mHVm8kjSRpNBtV9e28JA0DjgC2SqsmAbdFxLiyLlQjns1qZmaWn3t1wJ0X\ncvaH7+ZgAPbikbmPxN79cw6rblV8b1ZJ20bEhE5HliMnc2ZmZvn5gn7z6d/yhWuydd/h3GPPjXPq\naimzelGNZG4FyeLANwO3RMQTnQux9pzMmZmZ5WtnPfPWs+y8Xkv5YO6adFd8eOs8Y6pX1Vhn7hiS\nnR1OAx6V9KqkSyTtKw9gNDMzsxLsweM/z5bHMHKrc3XOdnnF02zaTMgi4qaIOB4YCBwC3AUcTbLb\nw0xJ10g6Ql43xszMzFrRneXf35Rpy1rKS1kL4Jz8ImouZU+AAJC0F/Ax4KPANsBCkv1a/wrcEcl0\n5LrgblYzM7P8HaMb7niIDxx6KpdxCpezKa9PBbYiYlm7D+5CKj5mrsQn3QE4kiSx2xVYBnwlIn7T\nqQtXiJM5MzOz/P1OJ21yHH+c2JOlvTPVHyXi1tyCqkO5JHMFAWxBsmzJ9Ii4sWIX7gQnc2ZmZnVC\nugI4OVNzLxEH5hVOParGbNYXgauA30fEjE7Glwsnc2ZmZnVC2g0oXBljOyLG5xFOParGbNbNgQuA\nqZJukfQRz2I1MzOzDol4EhhbUPu5PEJpJu0lZhuR3OT/Aw4HbgFek/QjSZ5SbGZmZuX6DUAAD7M3\np/PzL12iM3rmHFNDa29pkgURcVVEfBAYRtJKtwz4OvCCpAclnSSpTw1iNTMzs8Z304Wc9c5wXuID\nPMwvOL3Pq2zx9byDamQld5lGxMSI+DYwhGTNub8AewBXAtMlXSHp/dUJ08zMzJpCxII7OWTqeFZ1\n8P2HnU7NMaKGV/b4t0j8PSKOATYBTgcmAJ8F/lXh+MzMzKzJbMPE1XaEeIgPbP5jfX2rvOJpdJ2d\nzNAbWBfol5Y9a9TMzMzaNIf+v9yMqUtbyovpzTi2Oz/PmBpZ2cmcpLUkHS3pLuBV4DxgPeBCYIcK\nx2dmZmZN5sY4esV7eXS13ryn2PXQvOJpdD1KPVHJ2jAnAZ8CNgBWAHeTjJm7Pbwdh5mZmZVoE14/\nB9h/F57iJH7HsVzXB725MxHP5B1bo2lv0eANgeNJkridSLpRXyZZSPjqiJheiyA7w4sGm5mZ1aen\ntcu/duGZEZmq80kmW3ZZ1dgB4h2S1rvFwE3AVRHRUJMcnMyZmZnVKekE4PeZmleArankXqMNphrJ\n3GPAFcCfIuK/nYwvF07mzMzM6pS0LjATWDtTuycRj+YUUe4qvp1XRLwnIn7bqImcmZmZ1bEkv7iz\noGTlEvYAACAASURBVPYTeYTSyMqazSqpn6TvSnpI0gRJe6X1A9L64dUJs2gsW6YLFd9Qq+c0MzOz\niru+5R8rEPcz8oQbdIz3gS9DyTdL0kDgceB/gQ2BrUjWmSMiZgMnAjVbwTkiXokIb85rZmbW2P72\nKO9ZfBYXMoQpfIj7Bz7OHv5+L0M5me+5wGBgT+CDrLlA8K3AfuUGIOlKSTMkPVtQf7CklySNl/SN\ncq9rZmZmDSBiwdlcOPtnnMVrbAbABLb9Ys5RNZRykrnDgF9FxJNAsVkTk4DNOxDD74CDshWSugG/\nSOt3AD7V0oUr6QRJF0nauOX0DjynmZmZ1YlhjP9TtjyW9737t/p8yWvhdnXlJHMDgIltHF8B9Co3\ngIh4CJhbUP1eYEJEvBoRS0n6049Iz782Is4C3pH0a2AXt9yZmZk1rr7MP78P81eW32DjbpPY6tM5\nhtRQysl63wC2buP4rsCUzoWz0qbA1Ex5GkmCt1JEzAFKaoaVNDpTHBMRYzoZn5mZmVXIJXHG3Kf0\nwNQHGbGyh+8VtjyZZJOCpiZpJDCyM9coJ5m7EzhZ0qXAkoJA9gQ+DVzcmWCqJSJG5x2DmZmZtW4r\nJt3xICO+CLAnYxnBA0PhmJyjqr60gWlMS1nSqHKvUU436/eAZcBTwPkk4+ZOlPQn4AHgdeCCcgNo\nxWvAkEx5s7TOzMzMmtAAZv/0Mk5ZPp3BjGUvTuOXmyBtm3dcjaDNHSDWOFnanGRiwqGsSgSDpNXu\nixExrUNBSEOB2yNip7TcHRhHMjt2OvAo8KmIeLED1/YOEGZmZo1A+gfwoUzN2URclFc4eaj4DhCF\nImJqRBwB9CdZouR9wMCI+EgnErnrgEeAYZKmSDopIpYDpwP3AM8D13ckkcs8x+i0T9rMzMzq120F\n5cNziSIHkkYWjPEv/bGltsxJ2qy9hE3SvhFxf0cCqRa3zJmZmTUIaSvg5UzNCmAQEW/mFFHNVbtl\n7u+S1mvjyUewZkZtZmZmVpqIScBzmZpuwCE5RdMwyl1n7nZJaxcekLQ3cAcwvlKBmZmZWZd061J6\ncD8j+SoXcQK//07eAdW7cpK5Q4BdgOskrWz+S5cluQt4Bdi/suGZmZlZV/Izznx6I2bwIe7nYr7K\nnRwyzLtBtK3kZC7dxutokm29fgEgaXfg7ySL+u4XEYU7OdQFT4AwMzNrDJPY6rbldF85oH8OG+oV\ntjw2z5hqoSYTIDJPdgJwNXA58HFgNrBPRMzoSADV5gkQZmZmjeWDenDaQ3xw05bycfzhnj/E8Qe1\n9ZhmUfWlSSDZGxX4NnAqMAfYt14TOTMzM2s8Q5k8JluewLbvbeVUo43tvCS1tx/aPGAycF5mCF1E\nxMmVCc3MzMy6ovV56wrguJbyM+y8/sU6c8CZcfHsHMOqW612s0pa0YHrRUR071xIleVuVjMzs8Yi\noe15YfEwxvfcn/s4gHvZmpcP7RHL7sw7tmrrSN7SastcRJTdBVuv0gGFY9LNbM3MzKyORRArtONV\n3YgvZKoPINk+tCmlEzVHduixbU2AkLRtREzoWFj1wS1zZmZmDUg6EvhLpuY50j3cm1lH8pb2krkV\nwAvAzcAtEfFE50KsPSdzZmZmDUjagGTFjGxP4SZETM8popqoxmzWY4CngdOARyW9KukSSftKappu\nWDMzM6szydq1jxfUenOCItpMyCLipog4HhhIsgPEXSQLB/8DmCnpGklHSOpV/VDNzMysi7k3W5jF\ngAPzCqSelb1oMICkvYCPAR8FtgEWktzwvwJ31NNOEO5mNTMza0zPacdDH2DEHQ/zfh7iA/RkyZIJ\nse0ae8Q3k4qPmSvxSXcAjiRJ7HYFlgFfiYjfdOrCFSIpgO/h2axmZmYN5XRdOvhXfGn6ClatevYD\nzhl+Tpw7LsewqiIzm3VUzZO5gkCGkCR10yPixopduBPcMmdmZta4tteLC19i+94t5dO49IeXxunf\nyTOmaqrqdl6SJkk6vI3jh5G0fv28XhI5MzMza2xbMWl8tvw6m3gSRIFyZqQOBfq2cbwPsEWnojEz\nMzPLGMwb92fLr7Dl9nnFUq8qubzIRiQTIczMzMwqYl3++8eWf4sVdGd539e1Se+2HtPVtLqdF4Ck\nEay+tcSRkrYpcmp/4JMka9KZmZmZVcTP4quPr6vvzdmLf/d/H2NZn7cFvAd4IO/Y6kV7O0CMAkal\nxQDaGpA3ETg2IgoX+MuVJ0CYmZk1OOla4PhMzbeJOD+vcKqpI3lLmy1zwMXA1SRJ3CTgTODWgnMC\nmB8Rc8p54lqSNBovTWJmZtaoHmb1ZO79eQVSLZmlScp/bKlLk0jaB3gxImZ25Iny4pY5MzOzBift\nBDybqXkL2JCIFTlFVDW5LBpc75zMmZmZNbhkP/g5wHqZ2h2JeD6niKqmGt2shU8wBPg8sC2wIWuO\noYuI2K+ca5qZmZm1KWIF0iPAhxfRi2d5N9PY7GNHQdMlcx1RcjIn6cPAzUBPYD7wZrWCMjMzM8s6\nl++8/Wc+wYtsz3J68BFuO+YoODfvuOpBOS1z5wOzgY/W24xVMzMza25TGDLxOXZaWZ7K5lvmGE5d\nKWfR4OHAxU7kzMzMrNb6sGC11TTGM6zvJTqjZ17x1JNykrlZwJJqBWJmZmbWmvV4+4kNmb1y1uZC\n+vAGgw/KM6Z6UU4ydy1wVLUCMTMzM2vN6BgdW/PyauP132TDQ/KKp56UM2buamBfSbcClwCvAMsL\nT4qIKZUJrXK8aLCZmVnj24TXxwMDNuZ1duNJduWpwXnHVCm1WjR4Bau29Gr1QRHRvSOBVIvXmTMz\nM2sO/9I+nx3G+Cs35o2WqgeJGJFnTJVW7XXmvk8bSZyZmZlZNe3DA/8sqNoVqVsz7gRRDu8AYWZm\nZo1BEsk6txtkarcjYnxOEVVcR/KWciZAmJmZmeUnaYF6sqB2tzxCqSfl7ABRUp90RDzQ8XDMzMzM\n2vQkkN06dDfg+pxiqQvljJkbQ2lj5upqAoSZmZk1lSeX0oMXeBdPshtTGHL4KPh63kHlqZxk7qRW\nHr818BlgMvDbzodkZmZmVtxoRs38Ed/kHXoBMIBZw0KjNTpGN/ckgDaUnMxFxDWtHZP0E9bswzYz\nMzOrqNfZ5IHumWVuZzNQgd4H/Du/qPJVkQkQETEXuIIu3sxpZmZm1XVZnLpsa16el62bQ//984qn\nHlRyNutcYKsKXs/MzMxsDRsz/fVs+W3W2z2vWOpBRZI5Sb2AE2DVksz1RNLodJsMMzMza3D9mbPa\nunJz6L9dXrFUiqSR6fajZStnaZKrWjnUH9gLGAh8rSNBVFtEjM47BjMzM6uM9Xnric2Z8pHteZHh\nvMQePB5wWN5hdUq6f/wYSaPKfWy5e7MWMwcYD/wiIq4rN4Bq8w4QZmZmTUbaEpiUqZkDDKAJtrXq\nSN7i7bzMzMyssUjdgfmQrk+SGETErJwiqhhv52VmZmbNL2I5MK6gdvs8QqkH5SwaDICkdYH9WTVz\ndRJwb0TMa/1RZmZmZhX1IrBzpjwc6JJbipaVzEn6HHAh0BdoaQIMYL6ksyLiygrHZ2ZmZlbMSwVl\nt8y1R9LhwGUkLXH/CzyfHtoBOB24TNLMiLi94lGamZmZZcxg0MSpbM6LbM9LDGcBfQ69GL6ad1x5\nKGc260PABsCeETG/4Fg/YCwwNyI+UPEoO8ETIMzMzJrPmbr46Es484aW8hZMXjY5hq6VZ0yVUO0J\nEDsDVxcmcgDpeLlrWL3v2szMzKwqAt0nVq2aNoUhPX6sr2+YY0i5KSeZay9LbO41TszMzKxuXBJn\nzN2U15a1lINuvMmG++UZU17KSeaeAT4jqU/hAUl9gc+k55iZmZlV3WZMm5stv816dTXUq1bKmc36\nE+CvwJOSfg68kNa3TIDYBjiysuGZmZmZFTeQWVNIthMFYC4bvDvHcHJTcjIXEbdIOg24ALiUVd2q\nAhYAp0XErZUP0czMzGxNW/LKYwdz1+4te7TuyHOL4RN5h1VzZW/nJWl94ABgy7SqZdHgtyscW0V4\nNquZmVmTkvYGHs7UPE/EjnmFUwnem7UIJ3NmZmZNSuoPvJmpWQL0JmJFK4+oexVfmkRSd0k/kvSF\nds77oqTzJdXlXq+SRksamXccZmZmVkERc4C3MjU9gcE5RdMpkkZKGt2hx7bVMifpROAq4L0R8UQb\n5+0OPAqcGBF/6Egg1eKWOTMzsyYmPc3q69zuTcS/8wqns6qxaPAxwH1tJXIA6fG7gePKeXIzMzOz\nTppcUB6aQwy5am826+7AhSVe637g7M6FY2ZmZla6+9hv3kS2YTJDeZUtGMKUwy+AP+UdVy21l8z1\nB2aWeK1ZJHu3mpmZmdXEVXx2vT9x7MryodyxU47h5KK9btZ5wIASr7UhsMa+rWZmZmbV0pf547Ll\nuWwwKK9Y8tJeMvc8cGCJ1zogPd/MzMysJtZh4X+y5dkMWDevWPLSXjL3V2B/SUe0dZKkw0mSub9U\nKjAzMzOz9vRg2aPZ8nQ2Xnu0RnepVSzaS+Z+C0wEbpB0nqSh2YOShko6F7gBGJ+eb2ZmZlYTfZk/\nrjcLV5bnsS49WbJVjiHVXLs7QEjaBrgDGEayH+t/ScbS9QPWJdmbdRxwWES8XNVoO8DrzJmZmTW3\nL+lXszdg7oZb8CpDmcxWTNp7m5jYkGvNVW07L0m9gFOAjwM7kCRx/wWeI+lavSIiFpUdcQ04mTMz\nM2ty0l3AwZmao4j4a17hdEZH8pb2liYBICIWA5emP2ZmZmb1ZHJBeYs8gshLXe6lamZmZlaGVwvK\nQ/MIIi9O5szMzKzRFSZzbpkzMzMzayBdOpkracycmZmZWb16lPdMf5j3r9yfdQ79d3wg76BqyMmc\nmZmZNbQr+NzU33ESy1irparHhTp78Nlx4Rt5xlUr7mY1MzOzhnZZnLpsY6Yvy9bNZsCeecVTa07m\nzMzMrOFtxIx52fI8+u2aVyy15mTOzMzMGt4GzJ2dLc+n7/C8Yqk1J3NmZmbW8Nbj7dey5Xn0G5pT\nKDXnCRBmZmbW8Pbi3w/vzDMjW/Zn3Zypb8BReYdVEyXtzVqPJB0BHAr0A66KiHtbOc97s5qZmTU7\naSRwf6ZmLBF75RRNh1Vtb9Z6FBG3ArdKWh/4CVA0mTMzM7MuoXAZkoG5RJGD3MfMSbpS0gxJzxbU\nHyzpJUnjJX2jjUucA/yyulGamZlZnZtZUB6USxQ5yD2ZA34HHJStkNQN+EVavwPwKUnD02MnSLpI\n0iaSfgTcGRFP1zpoMzMzqytvAdm15voh9c4rmFrKPZmLiIeAuQXV7wUmRMSrEbEUuB44Ij3/2og4\ni2RU437AxyWdWsuYzczMrM5ErABmFdR2ia7Weh0ztykwNVOeRpLgrRQRlwKXlnIxSaMzxTERMaaT\n8ZmZmVmdOZfvrHiZrZnJIGYyiEO4c6/vwZS842qLkokbIztzjXpN5ioqIkbnHYOZmZlV120c3vux\nTNvP+xg7LMdwSpI2MI1pKUsaVe41cu9mbcVrwJBMebO0zszMzKyofsxbbUuvxfTaPK9Yaqlekjml\nPy0eA7aRtIWknsAngdtyiczMzMwaQh8WzMmWF7LOxnnFUku5J3OSrgMeAYZJmiLppIhYDpwO3AM8\nD1wfES924jlGp33SZmZm1qTWYeFqEyAWss5GecVSLkkjC8b4lyz3MXMRcWwr9XcBd1XoOUZX4jpm\nZmZWv3qxeHq2vIA+/fOKpVwtY+c6MmYu92TOzMzMrBJGMmbs3jxy4qB0PutAZk2BCXmHVXUNuzdr\nqbw3q5mZWRch7QmMzdQ8ScTueYXTEV1qb9ZypH3QXl/OzMysuTXsll6dWW/OLXNmZmbWHKS+QHZ5\nkiVALxoo2elI3pL7bFYzMzOzClkALMqUewL9coqlZpzMmZmZWXNIWuAatqu1o7rEmDkzMzPrGs7h\nB93GM2zl/qyHc9uIH8HEvOOqpi6RzHkChJmZWdfwD/brNZa9VpZHMmabHMMpWWcmQHSJbtaIGO1E\nzszMrPn1Zf7b2fIiem+WVyzliIgxHd3koEskc2ZmZtY19GHBm9nyYnoNziuWWnEyZ2ZmZk1jHRau\nNgFiAX0G5hVLrTiZMzMzs6bRm0WvZ8sL6LNBXrHUSpeYAGFmZmZdw/7c98iH+OfnBzKLQcxkALOn\nwLS8w6qqLpHMeTarmZlZ1/Aprv9PQVVDtMx5O682eDsvMzOzLkTalNWb4mYSsVFe4ZTL23mZmZlZ\nVzeroDwAqXsukdSIkzkzMzNrHhFLgLcyNd2A/jlFUxNO5szMzKzZFLbONfXyJF1iAoSZmZl1HV/n\ngp4v8K6V+7MexV/2uxBeyDuuanEyZ2ZmZk1lLO/r+SAjVpbn03fLHMOpui7RzSppdDrl18zMzJpc\nHxZkx8yxmF6b5hVLqSSNTJdSK1uXaJnr6Ma1ZmZm1nj6sGB2tryQdep+f9Z0LdwxkkaV+9gu0TJn\nZmZmXUcvFq82AWIxvRpi4eCOcjJnZmZmTWUtlq7WzbqEnr3ziqUWvAOEmZmZNZV/aL/Pr6Dbb/oy\nn/Tnb1vGK4flHVcpOpK3dIkxc2ZmZtZ17Mc/pxRUrZVLIDXiblYzMzNrNvMKyn1ziaJGnMyZmZlZ\ns5lfUO6XSxQ14mTOzMzMmk1hMtfULXNdYsxcugjfmHQNFzMzM2tuDdfNmm5uMLJDj/VsVjMzM2sm\nl+uUDW7i43Pm05d59GMZPeKFeFdD9EZ6NquZmZl1efdw4Nv3cgCxajSZLtEZPc+IS5bkGVe1NESW\namZmZlaqG+PoFX1YsFrdW6w/KKdwqs7JnJmZmTWdPixYkS0vp/tGecVSbU7mzMzMrOn0ZtHybPkd\n1h6YVyzV5mTOzMzMmk5vFi3LlpfRY0BesVSbJ0CYmZlZ07mYM1/qzaJdW/Zn7cOCmXB23mFVhZM5\nMzMzazoHcu/rwK6ZqrXziqXa3M1qZmZmzajL7ALhZM7MzMyaUZfZn7VLdLN6Oy8zM7Mup6G29OrM\ndl5dIpmLiNF5x2BmZmY11VDdrGmD0xhJo8p9rLtZzczMrOmcww+2HMG/2I0nGMY4TuTqA/KOqVq6\nRMucmZmZdS1TGNLjQUasLA9j/AY5hlNVbpkzMzOzprMWS9/Olt9h7d55xVJtTubMzMys6azF0rey\nZSdzZmZmZg2kO8vnZsvvsLYXDTYzMzNrFGux9M1seTG9euYVS7UpIvKOoaokRUQo7zjMzMysdsZo\n5PuAf7fszdqX+eM2i2nD846rPR3JW5zMmZmZWfORhgKvZGqmELFFPsGUriN5i7tZzczMrBk11KLB\nneFkzszMzJpR4XZeTbs3q5M5MzMza0ZLgGWZ8lpITTkJwsmcmZmZNZ9kUkCX6Gr1dl5mZmbWlD7G\nX3tOY7OV81k/y1Xbfg/+L++4Ks3JnJmZmTWl/7BTj5fZZmV5Eb0H5RhO1XSJblZJoyWNzDsOMzMz\nq53eLFqaLS+jx4C8YmmPpJGSRnfksV0imYuI0RExJu84zMzMrHZ6sXhJtlzPyVxEjImI0R15bJdI\n5szMzKzrWZt33smWl9Fjg7xiqSYnc2ZmZtaU1uadxdnyEnqun1cs1eTtvMzMzKwpPaAR1/dkySf6\nMY++zGcdFp4xMGb9PO+42tKRvMWzWc3MzKwpjeDBaQVVa+cSSJW5m9XMzMyaVZdYNNjJnJmZmTWr\nLrE/q5M5MzMza1ZumTMzMzNrYIUtc02ZzHkChJmZmTWlc/nOpn/j0JV7sw7npRF35R1UFTiZMzMz\ns6Y0g42Wj2WvleUBzO6TYzhV425WMzMza0rdWf5mtryI3j3ziqWanMyZmZlZUypM5hbTqyl7JJ3M\nmZmZWVNai6Uzs+VF9O6eVyzV5GTOzMzMmtWMbGEBfZoymWvK5kYzMzOz7Rj3xkO8P53LOp++zF+B\nZoom25heTfZ61tCRDWvNzMysSUiLWX1P1nWIWJRXOO3pSN7iblYzMzNrZk2/pZeTOTMzM2tmTb+l\nl5M5MzMza2ZO5szMzMwamLtZ65Wk4ZJ+LekGSV/IOx4zMzOrP5/mmk134Sm2YQKDmc5ZXPj+vGOq\ntIZN5iLipYj4IvAJYO+847HGJ2lk3jFY4/DnxUrlz0q+JjO0xzPswstswwwGs4A+A/OOqdJyT+Yk\nXSlphqRnC+oPlvSSpPGSvtHKYz8C3AHcWYtYremNzDsAaygj8w7AGsbIvAPoyi7irLHPsQOvMoQ3\n6c9FnPVi3jFVWu7JHPA74KBshaRuwC/S+h2AT0kanh47QdJFkjaOiNsj4lDg+FoHbWZmZvVvD554\nYwdeYAhT6c9c+rCwV94xVVruO0BExEOStiiofi8wISJeBZB0PXAE8FJEXAtcK2kfSd8kWQjwbzUN\n2szMzBrFaOCHJLNa5xOxPN9wKi/3ZK4VmwJTM+VpJAneShHxL+BfpVxMUnNvc2EVI2lU3jFY4/Dn\nxUrlz0odUfNtClWvyVzFeCsvMzMza2b1MGaumNeAIZnyZmmdmZmZmWXUSzKn9KfFY8A2kraQ1BP4\nJHBbLpGZmZmZ1bHckzlJ1wGPAMMkTZF0UiSDE08H7gGeB66PiKabSmxmZmbWWYpozrkBkg4GLiZJ\nWK+MiAtyDsnqmKTJwNvACmBpRLy37UdYVyLpSuAwYEZEvDut2wD4M7AFMBk4JiLezi1IqwutfFZG\nAacAM9PTvh0Rf88pRKsTkjYDfg9sRPLdc3lE/Lwjf1tyb5mrhrbWqTNrxQpgZETs6kTOilhjPUzg\nm8B9EbEd8E/gWzWPyupRsc8KwEURsVv640TOAJYBZ0XEDsBewJfTXKXsvy1NmcyRWacuIpYCLevU\nmbVGNO9/D9ZJEfEQMLeg+gjgmvTf1wAfrWlQVpda+azA6uPCzYiINyLi6fTf84EXSSZ8lv23pVm/\nvIqtU7dpTrFYYwjgXkmPSTol72CsIQyKiBmQ/FEGBuUcj9W30yQ9LekKSevlHYzVF0lDgV2AscBG\n5f5tadZkzqxc74+I3YBDSJq6P5B3QNZwmnMAslXCr4CtImIX4A3gopzjsToiqS9wE3BG2kJX+Lek\n3b8tzZrMeZ06K0tETE9/zwJupmDHEbMiZkjaCEDSYFYNbjdbTUTMilWzDS8H3pNnPFY/JPUgSeSu\njYhb0+qy/7Y0azLndeqsZJLWSf/PCEl9gAOB5/KNyupQ4XqYtwGfSf99InBr4QOsy1rts5J+Ibc4\nEv99sVWuAl6IiEsydWX/bWn2pUkuYdXSJD/KOSSrU5K2JGmNC5It7v7oz4tlpethjgQ2BGYAo4Bb\ngBuBzYFXSZYPeCuvGK0+tPJZ2ZdkPNQKkqUmPt8yJsq6LknvBx4A/kPy/RPAt4FHgRso429L0yZz\nZmZmZl1Bs3azmpmZmXUJTubMzMzMGpiTOTMzM7MG5mTOzMzMrIE5mTMzMzNrYE7mzMzMzBqYkzmz\nCpO0QtJVecfRqCSNTu/hkPbPrnoskyX9M+84mpmkE9P3e4Wk5ZKOzRzbJ63/dM4x7pmJcYWk7+YZ\nj1khJ3Nm7ch8obT2sySnuEZJOiKP5y5H5v6d1cqxtyW9JmnHtDpIFletVXxt3ccVVHDP1XRXmrY+\nS8slbVKp52sgAZwLnAA8XORYRUjaQNJiSU+2c96+6fvxm7RqInA8cGYl4zGrlB55B2DWQK4D7ixS\nX7PEo8Ao4GoadBspSYeRrHL+OrB/RExOD/0AOD8iapUkt3Uft6M6X973AL9v5dicKjxfI7gvIh4o\nUq8idR0SEXMl3QwcI2nniHimlVNPInnfr0wf9yZwnaQtgIsrFY9ZpTiZMyvdkxFxXd5BdJSkvhEx\nP+84ANKutKuBF4EDs1sbRcQKIJfWzkIRsbRKlx5fb5+ldMPv7hHxTt6xVNmVwCdIErYzCw+m+zQf\nCTwfEY/VODazDnE3q1mNSNpf0t2S5kpaJOkZSZ9v5dxdJN0o6Y20W2iKpOskbdnSVUfScvCZbBdd\n5vErJF0l6UOSHpQ0j2Tz5pbjW0i6NnP9iZLOk9S7II6W8WvDJP1Q0tT0/KclfbiD9+GLwLXA48A+\nhXtUFhsz15E4JH0ife3/lbRA0lhJRxXcg/buY9Exc229Px25J63JvI/vkzRG0nxJsyVdLmmdIucP\nlvRrSa9Keiftvv6tpIEF57Xcz3dJukjSVGARsGd6vJuk/01f/6L0Ph9d+N5Iujgtb91KLMskXVHJ\ne5Je+0RJSyTdIKlnpn4PSTdLmpW+Ly9J+rak7pmH/4Nkv8tj0wS20KeAdUg2QDdrCG6ZMyvdOpI2\nLFK/JCLmtfVASacCvwb+TTI2aAFwAPBrSVtFxDcy5x4G3ATMBy4HXgYGAwcBOwL3kYzf+QPJJs2X\ntfK07wGOSq9xdeb6Q4DHgH7AL0nGA40EvgXsLWm/tHUMVm3+fA1Ja9lPgJ4kLRo3SxoWEVPaeu0F\n9+FbwHnpa/hoRCwsclrLcxarKykOSeeSbFh9F3AOSVf4x4AbJX05In4NzKL9+7hGF2sJ788r7d4I\n6NXKZ2lZRLxdULcrcDvwO+CPJO/VycBy4AuZuDYHxpL8Xb8yjWsb4EvASEl7ZD6nLffzj8BC4Kdp\neXp6/JfA50kSn58AA4FfkWwSn70nlwNfAT4LfKcg7s+QdJFe3sZ9KJukb5P8N3RpRJyRqT8U+Asw\nIX09c4C9gO8DO5O0xhERIelq4LvAEeljsk4i+Yz9oZJxm1VVRPjHP/5p4wfYhyQZWJ7+Lvy5reD8\nFcBVmfJgklaPa4tc+2JgKTA0LfcmSTKmA4PbiWu15ylybDmwb5Fjf0yPHVRQ/+O0/qRM3aj0WrcW\nnLtHWn9eGfdvYvr7JmCtNs4flcYxpCNxALuldT8ocu2bgbeAPiXex1eAf2bKJb8/rVxvi3Y+S88W\neR+XAXsU1N8BvAOsk6m7FXgD2Ljg3N3Sz9h3i9zPfwDdCs5/V3rsbwX1O6SxFL43DwPTABWcda30\nqwAABvJJREFUPw54roR7cmJ6zRFtfHY+TZIY/jI99xsF562dvif3F4njjMLrA0PSujsKzh2WPt+N\n7bx/323vdfnHP7X8cTerWekuA/Yv8lPYIlHoaJJWpKskbZj9IflS7p5eB+BgYEPgwoh4o5PxPhMR\n92crJAn4CPBURNxdcP75JK0uHyuoD+CS1SoiHidpmdq2jHgGp9eaFB0bi1ZqHMeRfOH+vsj9vh1Y\nl6TFpiMOojLvz60U/yx9rsi5/05fZ9Y/SVrghgJIWhc4lKQrfUnBa55CkkgfWHCNAC6OVa2wLQ6j\n+L1+Hij8zEDy38XGwCEtFZJGkLwnlepi7U3SgvY54MSIuKDg+AHARiQt0P0LXv/fSRLBla8/klbc\n+4ADJQ3OXOezZCY+mDUKd7OalW5CRHRkzbHhJF8m/2jleJB8EUHSLRbA0x14nkLji9QNBPoCz68R\nRDLTbzqwVZHHFes6fJMksSnVj0haWv5HkiLia2U8tpw4hpOMBx7XyjWy97tc21KZ92daGZ+lSUXq\n3kx/t7zu7Uhe88kUTwijletMKFLXMu6v2OdnHMn/cGT9maSF+WTgb2ndySQth9cWuUZH/Jjkc3tc\nRFxf5Pj26e/ftfL4Yu/5lSRJ4InABZK6kSyN8jrFk1azuuVkzqz6RPJlcgJJN1gxxb5oO6vYeLSO\nWt5KfTnLRiwkafW5AzhbUreIOLsKcYikZe5gWl82Zo1kto619pph1etu+f0HknGFxSwqUtfpz0hE\nLJb0B+DUdKLFYpKxmrdGsqRHJdycXvNrku6JiMLlW1r+G/sfoLXlRl4vKN9CMq7uM8AFwIdJWhjP\niwivJWcNxcmcWfW1tH68WUJrzHiSL6ZdSLqBKm0WMI9k/NNqJK1P8mX2VBWeF4CIeEfSR0i6Gb+a\nttCtsZhwJ00g6Q6dGhGttc51VLXfn46aSJLM9Oxg63HW5PT3dpl/txjeymMuA75M0sr1X5Ju0Up2\nVf6TZHbp34D7Je0fEbMyxyeQvC8LS339EbFE0h+B0yTtzaq15a6uYNxmNeExc2bVdwPJ7LjvSepV\neFDSupnlFe4BZpO0XA0uPLfAfKB/OYGkLQ63A7tKKhxD9S2SL8S/lnPNckXEYuBwktd6pqSfVfgp\nriV5HT9Mu85WI2lQQVU597Gc96dm0paqO4EjJe1Z7BxJA0q83O0k9++MdIxly+N3Ys1xdy3P/x/g\nUZLu1ZOBKRFxb+mvoH2RLCh8MMk4wfsL3se7gZnANyVtUPhYSb2UrB9X6EqS1/o1klbjByLi5UrG\nbVYLbpkzK93uko5r5djNUXyZDSLiNSVrq10OvCjpWpJ1rgYC7yZJbN5F8gW4SNLJwI3Ac+kaXROB\nQSRfpBdGxO3ppccC+0v6Oskg94iIP5fwOr5NMlboFkm/Tq+/D3AMMIbWdyaomLSF7nCSFrozJHWP\niK9U6NqPSxpNMmPzaUk3knSxbUwy+/VgIJtUl3wfy3x/2jKsjc/SfVGw9l4rCru4vwg8CDwg6fck\nLazdSMZAHkHS/fr99i4aES9Iugw4BbhPyY4Jg0iWOHkS2J3iu2JcRjLhIYDRJcRftoh4WNIBJMnb\nvyR9KCKmR8RCJfu33gyMU7I38kRgfZLxdB8DPkqyBE32es9KeoLk/njigzUsJ3NmpQngk+lPMduy\natzbGuukRcTVksaRjOk5leRLZjbJgPJzyIyli4jbJX2AJOn6LMl6cDNIvoj+k7nsl4BfpOf1S+ta\nkpBia7W1XH+KpPeSfLEfl8YyjWT9t/OKzG5sS6lji4rdkyVK9kS9Bfhy2uV6ehnP3WocEfF9SY+R\nrIF2BtCHpOXmOaDwOdq6j8WuXer701asB6Q/xRyQXq/l3NbucWFc0yTtDnyDJDk5jmT82lSSpPmG\nEmJr8UXgNZJWtp+QdGOeRpLI7U7x8XfXAxeR3Oury3iu9hS+zkcl7UfSSjomTehei4h7JL0H+CbJ\nax8IzCVZb++nwLOtXP9KkuVb/kuybI5Zw5HHeZqZWSkk3U6yaPG6hZME0qEC04H/i4hDijy8tWue\nSDIL9QjgEWBe1G5f3pKkO0isT7I+3RPA6Ihot5XTrFY8Zs7MzFbTytjOd5N0Uf+jldmex5MkPK3t\nSNKWIGk9nAl8vAOPr7Y9SCYPPUHprdFmNeOWOTMzW42SPYM/TTJ7dBbJuLNT0sMfiIhnMuceRjIp\nYRRJy9zO5SztIWkjVp9d/VxEzOzUC6gwSf1ItsdrMSkiJucUjtkanMyZmdlq0rFn3ydZgqU/yXI2\nDwLfj4inCs59hWRyyePAKRHxYo3DNevynMyZmZmZNTCPmTMzMzNrYE7mzMzMzBqYkzkzMzOzBuZk\nzszMzKyBOZkzMzMza2D/DzZSxht2hlTwAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "figure(0)\n", + "plt.plot(T,N,'r',linewidth=4)\n", + "plt.plot(T,N_Kat,'--b',linewidth=4)\n", + "plt.xlabel('Electron Kinetic Energy [keV] ',fontsize=18)\n", + "plt.ylabel('Count/keV/day/1e6 atoms',fontsize=18)\n", + "plt.legend(('Used for LUX','Katrin Paper with 0 nu Mass'))\n", + "\n", + "figure(1)\n", + "plt.plot(T,N,'r',linewidth=4)\n", + "plt.plot(T,N_Kat,'--b',linewidth=4)\n", + "plt.xlabel('Electron Kinetic Energy [keV] ',fontsize=18)\n", + "plt.ylabel('Count/keV/day/1e6 atoms',fontsize=18)\n", + "plt.yscale('log')\n", + "plt.legend(('Used for LUX','Katrin Paper with 0 nu Mass'))" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "cut=T<2" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.18770132835158548" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sum(N*cut)/sum(N)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Load in NEST yields and tritium data from December 2013

" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "#NEED TO GET NEW DATA FOR RUN04!!\n", + "#Load NEST LY,QY [2 3] -> Doke-Tritium LY,QY [4 5] -> and Tritium_Beta LY,QY [6 7]\n", + "tritium_beta=np.loadtxt('//global/homes/r/rknoche/Tritium_Spec_LYQY_paper.txt')\n", + "tritium_beta[:,0]=T\n", + "tritium_beta[:,1]=N\n", + "\n", + "#Load the Dec 2013 tritium data.VUV corrected, spike count for S1. XYZ corrected rq with 83Kr. Cut from 35-305us. <20cm radius.\n", + "#tritium_data=np.loadtxt('//global/homes/r/rknoche/Run04_Sep2014_Kr2p14_CH3TData_TwoLineFloat.txt')\n", + "tritium_data=np.loadtxt('//global/homes/r/rknoche/Run04_Sep2015_Kr2p22_CH3TData.txt')\n", + "S1=tritium_data[:,0]\n", + "S2=tritium_data[:,1]\n", + "dTus=tritium_data[:,2]" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "g1_Doke=0.098 \n", + "Eeff_Doke=0.808\n", + "Eeff_Beta=0.808\n", + "SE_WS=25.55\n", + "sigma_SE=5.45; #From LUG\n", + "g2_Doke= SE_WS*Eeff_Doke \n", + "\n", + "\n", + "g1_Beta=g1_Doke \n", + "g2_Beta=g2_Doke " + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "E_Doke=1/73*(tritium_data[:,0]/g1_Doke + tritium_data[:,1]/g2_Doke)\n", + "E_Beta=1/73*(tritium_data[:,0]/g1_Beta + tritium_data[:,1]/g2_Beta)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Adding Detector Resolution.

\n", + "

We define energy as some linear combination of number of photons and electrons that we collect, so sigma E is a function of sigma N_photons and sigma N_electrons

" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

\n", + "E/W= N_gamma + N_electron
\n", + "E/W= S1/g1 + S2/g2\n", + "

" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Generate Tritium spectrum with detector resolution and recombination variance.
\n", + "g1=0.117, Eeff=0.58, with inst. flucs, with singlePE resultion in S1. For MAX det res

" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185\n" + ] + } + ], + "source": [ + "# Setup constants...\n", + "ex_to_ion_alpha=0.20; #exciton to ion ratio ... alpha\n", + "\n", + "sigma_PE=0.50; # resolution of 1 photon. We are using spike count, so this should be 0\n", + "\n", + "inst_s1=6; #measured from Doke 6 ... seems to turn off below ~200 keV ?\n", + "inst_s2=8; #measured from Doke 8 ... seems turn off below ~200 keV ?\n", + "#using 0.85 as average extraction factor for a 1000 us electron lifetime\n", + "#and 320 us drift length.\n", + "\n", + "g1=g1_Doke #From Doke plot\n", + "Eeff=Eeff_Doke #From Doke plot #### Please NOTE: using 0.48 makes NO FREAKING DIFFERENCE!!! try for yourself :) \n", + "SE_size = SE_WS # For December tritium data.... use 24.66 in Aug 2013, same as W.S.\n", + "\n", + "#######################################################################################################\n", + "coeff_ng_sig_stat=sqrt((1-g1+sigma_PE**2)/g1);\n", + "coeff_ne_sig_stat=sqrt(((1-Eeff)*Eeff*SE_size**2+Eeff*sigma_SE**2)*0.85/(Eeff*SE_size)**2+0.155);\n", + "\n", + "trial_m=1000; # about 150k with trial_m = 100\n", + "trials=sum(ceil(tritium_beta[:,1]*trial_m)); #tritium dN/dE is fractional so multiply amplitute. \n", + "subtrials=np.ones((tritium_beta[:,1].size,1));\n", + "\n", + "gamma_T=np.ones((trials,1)); # Tritium gamma spectrum\n", + "e_T=np.ones((trials,1)); # Tritium electron spectrum.\n", + "\n", + "\n", + "kk=1; # kk will equal the total number of simulated tritium events\n", + "\n", + "for jj in range(0, tritium_beta[:,0].size): #% sweep through each energy bin\n", + " print(jj),\n", + " subtrials[jj]=ceil(tritium_beta[jj,1]*trial_m)\n", + " mean_gamma_T=tritium_beta[jj,2] # 2 for NESTv98 LY, 5 is with first fit to tritium.\n", + " mean_e_T=tritium_beta[jj,3] # 3 for NESTv98 QY, 6 is with first fit to tritium.\n", + "\n", + " n_ion_T=(mean_gamma_T+mean_e_T)/(1+ex_to_ion_alpha);\n", + " r_T=(mean_gamma_T/mean_e_T-ex_to_ion_alpha)/(mean_gamma_T/mean_e_T+1) #mean recombination fraction\n", + "\n", + " #Add functional form of recombination variance.%%%%%%%%%%%%%%%%%%% Cancels out in E space\n", + " Recomb_V_T=(0.07*n_ion_T)**2;\n", + " Fano_V=0; \n", + "\n", + " for ii in range(0, subtrials[jj]-1): #% one energy bin, test for recombination and stat\n", + " \n", + " recomb_fluc = np.random.normal(0,sqrt(Recomb_V_T),1) #mu, sigma , 1\n", + " Fano_fluc= 0; #normrnd(0,sqrt(Fano_V));\n", + " #Add functional form of S1 and S2 smearing%%%%%%%%%%%%%%%%\n", + " sigma_stat_gamma_R= sqrt(abs((coeff_ng_sig_stat*sqrt(abs(mean_gamma_T+recomb_fluc+r_T*Fano_fluc)))**2+(inst_s1/100*(mean_gamma_T+recomb_fluc+r_T*Fano_fluc) )**2 ));\n", + " sigma_stat_e_R= sqrt(abs((coeff_ne_sig_stat*sqrt(abs(mean_e_T-recomb_fluc+(1-r_T)*Fano_fluc)))**2 + (inst_s2/100*(mean_e_T-recomb_fluc+(1-r_T)*Fano_fluc) )**2 )); \n", + "\n", + " gamma_T[kk]=np.random.normal(mean_gamma_T+recomb_fluc+r_T*Fano_fluc,sigma_stat_gamma_R,1) #recomb + photons and - electrons\n", + " e_T[kk]= np.random.normal(mean_e_T-recomb_fluc+(1-r_T)*Fano_fluc,sigma_stat_e_R,1) #%recomb - photons and + electrons\n", + " kk=kk+1;\n", + "\n", + "#photon spectrum: gamma_T\n", + "#electron spectrum: e_T\n", + "# Energy...-> now smeared with detector resultion.\n", + "E_com_Tsim_NEST_MAX=1/73*(gamma_T+e_T); " + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false, + "scrolled": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(0, 0.11481602889930663)" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "binwidth=0.25 # keV\n", + "n_NEST_MAX, bin_edges_NEST_MAX, patches = plt.hist(E_com_Tsim_NEST_MAX, bins=np.arange(0.05, 25 + binwidth, binwidth), normed=1, facecolor='none',edgecolor='red',linewidth=2, histtype='step', alpha=0.9)\n", + "plt.xlabel('Energy KeVee',fontsize=18)\n", + "plt.ylabel('normalized count',fontsize=18)\n", + "plt.xlim([0,25])\n", + "left,right = bin_edges_NEST_MAX[:-1],bin_edges_NEST_MAX[1:]\n", + "bin_center_NEST_MAX=(right+left)/2\n", + "\n", + "s = ip.UnivariateSpline(bin_center_NEST_MAX,n_NEST_MAX)\n", + "s.set_smoothing_factor(1e-5)\n", + "plt.plot(bin_center_NEST_MAX,s(bin_center_NEST_MAX),'k',linewidth=2)\n", + "\n", + "scale_factor=sum(N)*0.1/(sum(n_NEST_MAX)*binwidth)\n", + "plt.plot(T,N/scale_factor,'m',linewidth=2)\n", + "\n", + "plt.xlim([0,22]);\n", + "plt.ylim([0, 1.1*max(n_NEST_MAX)]);\n", + "\n", + "#plt.yscale('log')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

The Sep 2015 the data

" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false, + "scrolled": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(0, 22)" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAm0AAAH2CAYAAAAiQrujAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xm4ZFV97//3BxAUBRzi0ICCARQlzhGcwaiA3SYYr3GI\nE/68xqBE45CfuQ6RaGKc4jwABlS8jtcB8dJGHIIaUUAUB2xkkhlxQEQGmfp7/6h9uotDVfWp7qra\nVXXer+fZT+291qra30PRfb699hpSVUiSJGm6bdZ2AJIkSdowkzZJkqQZYNImSZI0A0zaJEmSZoBJ\nmyRJ0gwwaZMkSZoBrSdtSfZPcnqSM5K8skf9PZOckOQPSV7WVb5jkq8nOS3Jj5O8eLKRS5IkTU7a\nXKctyWbAGcBjgIuBk4GnVdXpXW3+CNgJeCLw26p6e1N+F+AuVXVqktsApwAHdL9XkiRpXrTd07Yn\ncGZVnVdV1wOfBA7oblBVv66qU4AbFpX/oqpObc6vBNYAO0wmbEmSpMlqO2nbAbig6/pCNiLxSrIz\ncH/gxJFEJUmSNGW2aDuATdU8Gv0M8JKmx61XG/fqkiRJM6Oqsris7aTtIuBuXdc7NmVLkmQLOgnb\nR6vqC4Pa9vrhNd+SHFJVh7QdhybP73758rtfvubpu+/X2dT249GTgV2T7JRkS+BpwDED2i9OvI4E\nflpV7xpXgJIkSdOg1Z62qroxycHAcXQSyCOqak2SF3Sq6/Akdwa+B2wDrE3yEuDewP2AZwA/TvID\noIBXVdV/tvLDSJIkjVGrS35MSpLy8ejyk2Sfqjq+7Tg0eX73y5ff/fI1T999v7zFpG0OJNkWePcG\nmr25qtZMIh5JkrTx+uUtbU9E0GhsBey7gTYf7L5I8gjgrwa0v6aq/nFTA5MkjV6Sc+ksPK/Zdl5V\n7bzUxiZt8+X3wOLtvP4RuGePtn/M4KTtiua9kqTps9M8P0FaLoZdksykbb5cW1Vf7i5I8vzm9JZJ\nbt1VtVXzegLw6a7yrYE3ji9ESZK0MUzaplzCscDK/i0uOgn49yV81Ef7lJ9dVeuStiTbYdImSdLU\nMWmbfgMSNoAd9gTe2V1y00Rvcc/r166Gx17SVXDdpgYoSZLGz6RtRlSRJM8D3kBnv9Y1UM9pqo9r\nXq9oXgckeo/Zuqp2HVeckiRpPEzaZtNXquo1Cc8BqKoDezWquukOEsnNut0kSdIASX4P3Keqzm07\nlra3sVp2Eo5NqD7HsRv5mTf5nGHbb+r9JUlakOTcJFcnuSLJb5J8MckOS3zv3kkuGHeMw6iqbZaa\nsCVZm+T3zc++8PqKUcVi0jZ5g8aobWD82s2sHrJuUPuNub8kSYsVsKqqtgVWAL8E3rPE94abD8ae\nJQXct6q2bZK9bavqbaP6cJO2llSR7mOhfJhesypWLf6crmPVMO27Wl0OtQLqnuvjOPHiJJ/sOu47\nyv8WkqS5E4Cqug74DJ09wzsVyZZJ3pbkvCSXJPlAkq2SbE2nc2H7rl6quyR5cJITkvw2yUVJ3pOk\n5/CuJB9O8tLmfPum5+ug5nqXJL/p875dkhyf5PIkv0zyia66tUn+uDm/fdNz+LskJyZ5Q5JvLfq5\nx7Z+nknb9Bi212yC999rBfCoruN2E4hHkrQRBgyBGfrY9FiyNfBU4DtdxW8GdgXu27xuD/xTVV0N\nPB64uKuX6hfAjcDfA7cHHgr8GfDCPrf8BrBPc743cDad31s0r9/s8743AF+uqtsCO3LTnsHu/w7v\np7OQ/Z2AA4HnMMGeQZO2KTFsr9m47g/ZErLP+mOdpwM/ac5vleQ2PY5bjjtOSdJMODrJZcDlwGOB\n7keEzwdeWlW/q6qrgDfR+R3TU1V9v6pOqo7zgcPpJGS9fAN4RHP+KOAtwMOb672b+l6uB3ZKskNV\nXVdVJ3TVBSDJZsCT6CSY1zb7eX+kx2d9P8llTc/gZUke1+9nG5azR3UTVXU9Xf9TJ+vKv7HQxQwc\n2eftnwJeOs74JEmDLV45oCUHVNV/JQnwROCbSe5Fp1dqa+CUZF2YmzHgkWKS3YC3A38K3IpO7nJK\nr7ZVdU6Sq5I8AHgk8HrgeUnuQSdpe1ef2/wD8C/ASU2y+faq+tCiNncENgcu7CrrNWniAVX1834/\nz6awp03D+ANwVY/DBXolSd0WxrRVVX2eziPORwC/Bq4G9qiq2zfHbatqu+Z9vR41fgBYA+zSPL58\nNYPHjX0DeDJwi6q6hM4j0ecAtwVO7fWGqvplVf1NVe0A/C3w/oVxbF1+BdxA5/Hpgrv2+9nHwaRN\nS1ZVB1bVbosP1m8sv02Su/c4dm4vaklSm5IcQCdh+mlVFfBB4J1J7tjU75Bk36b5pcAdkmzb9RHb\nAFdU1dVJdgcOYrBvAgezfvza8c31fzf37xXjk7uWJbkcWNsc61TVWuBzwCFJbtXE8uwNxDJSJm1j\nMGgttrZjG7OVwLd7HF9rMyhJ0sR9sZn9+Ts6g/yfXVWnN3WvBM4Cvpvkcjq7+twDoKp+BnwCOKcZ\nD3YX4BXAM5JcARwGfHID9/4GcBvWD/X5bzqPVfuNZwN4MHBic4+jgRd3rc3W/bv77+gkoJfQGc/2\nceDarvoCfrhonba3byDeJUufpHOuJKmqmtgz/iUkZ6s3ZnJB1zZWR1bVazYquKHvOfBnWV3FqiRP\nAF7V6+3ATsA1VbXLWAKUpGVo0r/X1FuSNwF3rqrnbuT7e36P/cqdiLAJbrox+81NyWDQTbWa/j/j\nSoCq+r/A/11c2Uz1Pmt8oUmSNDlJ7glsWVU/TrIn8Dzg/5vU/U3aNs2gHQQmsbba2PXrEVwGj3ol\nSVpsG+ATSVbQGX/31qr64qRubtI2AnPSoyZJkgaoqu8Bu7V1fyciSJIkzQCTNm2SAdufHNt2bJIk\nzROTNm2sDY3ZGzTeT5IkDckxbdoog5YsWT9Joa66ednGLXciSdJyZ0+bxmFQL9zKJFt3Hf7DQZKk\nJfAXpkZuoSft5uu01YrmpHvttucAX5lUbJI0j5JcPIn7VNX2k7iPerOnbQn6bUvVdlwz4pquo7ts\nbe/mkqRZl+TcJFc32zj9JskXu/b2HPS+vZNcMIkYZ5E9bUsz0UV0kzwJuEuPqr1Gfa9xqqqrgXXb\nVy0kulW1S5KjgMe2FZskzaNx9YRtRE9eAauq6r+SbAl8AHgP8KQN3QrsFOnHpG0IE1xE90DgTyd0\nL0mSxiEAVXVdks8A7wBokrg3An8FbElng/a/Bzan0xGyZZLf00ne7gHcFXgXcC/gauBzwEur6oaJ\n/jRTwKRtuh0N9PrXzcmTDkSSpI3RjG9+KvCdpujNwN2B+wI3AB8H/qmqXp3k8cBHq+puXe/fnk5S\ndzKdBO5LwAuBd0/sh5gSJm3T7UNVNXcJWucx6bre7+PS6b90KRBJmi9HJ7kBuA3wS2C/pvz5wH2q\n6ncASd4EfAx4da8Pqarvd12en+RwYG9M2qSxWk3/8YErk9y16/rqqvrNBGKSJI3HAc2YtgBPBL6Z\n5P7A1sApyboRR5tB/+FHSXYD3k5n2NCt6OQup4wz8Gnl7FFNTBWrqkhnbGA+Crmkc6xzYtdxSCtB\nSpJGZWFMW1XV54EbgYfQGZe2R1XdvjluW1XbNe/pNQnhA8AaYJequi2dHrlJjTGfKva0qS2/AS5s\nzhfWb7sQuDVwu1YikqQZN6n12oaV5ADgtsBPgA8C70xycFX9qlkKZI+qOg64FLhDkm2r6orm7dsA\nV1TV1Ul2Bw6i87h12bGnTa2oqpdW1Z5VtWdX2Z7A61oMS5I0Ol9s1mn7HfAG4NlVtQb4RzqLrH83\nyeXAcXRmiVJVPwM+AZyT5LIkdwFeATwjyRXAYcAnW/hZpkKq5n85lCRVVRvdlbp+fbHJdMcmOYbO\ns/sD5nEiwmLd/32TPJnO4NLPVtXftRuZJE2nTf29punQ73vsV25PmyRJ0gxwTJum1YOT9JrOfWNV\nvXTi0UiS1DKTNk2ruzXHYjcAJm2SpGXHpE1TY9Giu13O+z7s/FY66/RIkrQsOaZN02D14OqdHgh8\ndiKRSJI0pUzaGgnHJlSvo+3Y5l33oruLj7ZjkyRpWvh4dL1+2yst2EBvkCZkiyQf6VP3nqr63kSj\nkaR2nJfEToXZd94wjU3aFrF3ZyY8rk/5pyYahSS1pKp2bjsGTZ5Jm2bFjcBz+tS9GHjQBGORJGni\nTNpakuQO9J8NeY9JxjIb6sYehaurWJXkaRMPR5KkCTNpa89W9H/Mp/VW03+84YbGIUqSNDdM2tr3\nW+Dv+9SdOclAplEVq3qVO6tXkrTcmLS17w9V9ZW2g5AkSdPNpE0zbdEuCsemM/d3db8eOkmSZpWL\n62pWDVo3z7FukqS5Y9KmmdS9iwLkSMglEHvXJElzy6RNkiRpBpi0SZIkzQCTNkmSpBlg0iZJkjQD\nXPJD82TvhZMkz+wqP6+qvtVCPJIkjYxJm+bJs7rO39J1fgxg0iZJmmk+HtU8+CbwseZo1Iqu4wUJ\n1RzHthWkJEmbYtn1tDW/tF18dY5U1UcWzhPuzeDv1+9ekjSTlmNP26Bf2oNW2dcMWLTo7gHNoruH\nda4lSZpdy66nbYG/xCVJ0ixZjj1tkiRJM2fZ9rRpWVmZ5GdQAHTO19m9qqqdsCRJWjqTNi0HWwDb\ndF1v06+hJEnTqvXHo0n2T3J6kjOSvLJH/T2TnJDkD0leNsx7tex9Cdi962jcZDmQtS4FIkmaBa32\ntCXZDHgv8BjgYuDkJF+oqtO7mv0G+DvgiRvxXi1jVXU9cP3CdcJq+s8eXplk167rS6vq9+OMT5Kk\nYbTd07YncGZVndf8gv0kcEB3g6r6dVWdAtww7HulbouWA7lk/bHON7uOP2snSkmSems7adsBuKDr\n+sKmbNzvlc7uOrrLrmonHEmSBls2ExGSHNI5ex2wT3NouaqqRy6cJ51ppVX1yCSHAn/RWmCSpGUn\nyT4sITFpO2m7CLhb1/WOTdnI31tVhwAkvG64ECVJksanqo4Hjl+4TtIzV2k7aTsZ2DXJTsAlwNOA\npw9o372LwbDvlQbq9LitW7Lt6Kz/v211FataCUqSpEarSVtV3ZjkYOA4OuPrjqiqNUle0Kmuw5Pc\nGfgenbW11iZ5CXDvqrqy13tb+lE02wbNKmUDdZIkTUSWw2LwSaqq0jlfGL/U7t6jSbank4xeUlUP\najMWrdc1pu2gqvrCtPz/IklaPrrzlm5tzx6VJEnSEpi0SZIkzQCTNkmSpBlg0iZJkjQDTNokSZJm\ngEmbJEnSDDBpkyRJmgEmbVJvr0ny1YWLJF9tjn9uMyhJ0vLV9jZW0rTaoTkW3Lt5Pb+FWCRJsqdN\nWuRfgcd1HQvsYZMktcqeNqlLVV3Qfd21abw9bJKkVtnTJi1JrYZaAfXchGqOY9uOSpK0fNjTJg22\nGljZp25lkn/oun5HVd0wgZgkScuQSZs0QBWrAJI8Hjiiq2ZFc/LSruZ7Jbm+x8e8v6q+Na4YJUnL\ng0mbtDRnAm/ruv735vVtwCua84f1ee/nxhWUJGn5MGmTlqCqzgLevnCddJK2qnp7klOA9HjbC4FH\nTCZCSdK8M2mTNlFVfaNXeZInTToWSdL8WnazR6tIVc9eEWloXTNJy1mlkqRxWnZJmzQiqwfU9Ztt\nKknSRvPxqLQRFmaVLpZQk45FkrQ82NMmSZI0A0zaJEmSZoBJmyRJ0gwwaZMkSZoBJm2SJEkzwKRN\nkiRpBpi0SZIkzQCTNkmSpBng4rrSGHQW2V23zu6ns37jtNX9FuaVJGkQkzZptFYzeBurlUle3Zyf\nVVWfmkBMkqQ54ONRaYSqWFVFqgjkPZBL1h/rvKg5ntBSmJKkGWRPmzQ+XwTO6Lp+T/P6aeApkw9H\nkjTLUjX/+1snqarKhltOTpLtge8Bl1TVg9qOR+O3fjP5PA44CvgD8Is+zR9bVVdPJjJJ0jTpl7fY\n0ya155bAzn3qpuofGZKk9pm0SZN3AvDwPnVfo5PMSZJ0EyZt0oQ1jz1/3qsuydoJhyNJmhHOHpUk\nSZoBJm3ShCVUj+PYtuOSJE03kzZpclYPqBu0IK8kSY5pkyal3/ZV65cCkSSpP3vaJEmSZoBJmyRJ\n0gwwaZMkSZoBjmkbsySPBf6yR9XWk45FkiTNLpO28duN3kmbJEnSkpm0Tc7Xgc/1KL9m0oFIkqTZ\nY9I2OWdUVa+kTQIWlv5Yt/rHlelsGb+631IhkqTlxYkIUvtcdFeStEEmbVLLqlhVRaoI5GzIJZDb\ntB2XJGm6+HhUmk77L5wk6X48+uOqOr+FeCRJLTNpk6bTe7rOP9h1/nLApE2SliEfj0rT5ct0xrh1\nj3NbDVzYTjiSpGmRqvnfqzpJVVVauvdBwGuBQ6vq9W3EoNm0hI3knVkqSXOoX95iT5s0vQbNKgVn\nlkrSsmLSJk2pRbNK39HMKv3rzrUkabkxaZMkSZoBJm2SJEkzwKRNkiRpBpi0SZIkzQCTNkmSpBlg\n0iZJkjQD3MZKmi3/M8n+NOvuJvlIU35aVb2lvbAkSeNm0ibNlns1x4LHNa+3bCEWSdIEmbRJs+EI\n4Etd18c1r28DXjH5cCRJk2bSJs2AqjoNOG3hOuv3RPheG/FIkiav9YkISfZPcnqSM5K8sk+bdyc5\nM8mpSe7fVf7SJD9J8qMkH0uy5eQilyRJmpxWk7YkmwHvBfYD9gCenmT3RW0eD+xSVbsBLwAObcq3\nB/4OeGBV3ZdOr+HTJhi+JEnSxCw5aUtyZJK9BtTvmeTIIe+/J3BmVZ1XVdcDnwQOWNTmAOAogKo6\nEdguyZ2bus2BWyfZAtgauHjI+0uSJM2EYXraDgR2GVB/d+A5Q95/B+CCrusLm7JBbS4Cdqiqi4F/\nB85vyi6vqq8OeX9pxtU3oFZAPSWhmuPYtqOSJI3eKCci3Bq4foSfN1CS29LphdsJ+B3wmSR/XVUf\n79P+kK7L46vq+LEHKY3PamBln7p+5ZKkKZRkH2CfDbUbmLQluRuwc1fR7kke1aPp7YGDgLOWHGHH\nRcDduq53bMoWt7lrjzaPBc6pqsuaWD8HPAzombRV1SFDxiZNrSpWATR/Hj8JfKuqnpo0q+5KkmZG\n05F0/MJ1ktf1arehnrbnAq+js/x6Aa9ujsUCrG3aD+NkYNckOwGX0JlI8PRFbY4BXgR8KslD6DwG\nvTTJ+cBDktwSuBZ4TPN50nL00CSnde2UcFpX3cOq6nfthCVJGpUNJW1HA+fSScqOBA4HvrOoTQFX\nAidX1QUMoapuTHIwnYVCNwOOqKo1SV7Qqa7Dq2p1kpVJzgKuokkMq+qkJJ8BfkDnsewPmvik5WgL\n4HZd193nQZI081K1tKcpTVfdZ6vqJ+MNafSSVFW18osryUHAa4FDq+r1bcSg+ZXkFsA260vqN03N\nHYATgG2Be1fV5ZOPTpK0MfrlLUueiFBV/zzakCRtqmapnMsWrhd2Sqiqy5I4vk2S5shQs0eThM4E\ngN2AO3Dzxy5VVW8YUWySNlJnQsK6nO23TTK3emECgyRp9iw5aUuyG50xbrvTf4xMASZtUnsGLgXS\nLES9YG1VrZ1ATJKkERimp+09dBbXfSXwdeA3Y4lI0kbr7klLsgbYrqlZ0RSf39X8fwEfmVRskqRN\nM0zS9kjgnVX1tnEFI2mkbmyOxWWbtxCLJGkTDbON1bXAz8cViKTRqqo/qaq7VtVdu8ruSrOXryRp\ntgyTtH0ZePi4ApEkSVJ/wyRtL6Oz6vrLk2w5roAkSZJ0c8OMafs2nU3h3wK8KcnF3Hy8TFXVLqMK\nTpIkSR3DJG3ng5tRS5IktWGYHRH2GWMckiRJGmCoHREkzbZFOyV8OOHDndOLT4IdXtOU/7aqvjf5\n6CRJg5i0ScvDoJ0SgO33ZP1Cu98FnjT+kCRJwxhmG6u1bHhMW1WViaA0ZRbtlPBc4NFdtc9qTk4B\nHjTRwCRJSzZMgnUUN0/atqCztdVewI+AU0cUl6QxqaoPAR9auE5YSNreCHy2laAkSRs0zESEA/vV\nJXkYcAxw0AhikiRJ0iLDLK7bV1WdQOdf7m8exedJkiTppkaStDXOxPEwkiRJYzHKpG0f4JoRfp4k\nSZIaw8wefXafqtsDjwUeDxwxiqAktaFOaE7+srOeGwCru2eeSpLaM8zs0Q/TmT2aHnU30EnYXjqC\nmCRN1qA13Aas7SZJmqRhkrZH9ygr4DLg51V11WhCkjRJCz1pSR5KZ8mP71bVk7p62yRJU2CYJT++\nMc5AJE2NByU5aWFZxs75Oo+vqt+0E5YkLW8btXtBkjsAd28uf+5f4tJcuQWwY9d19/nmE45FktQY\navZokvsl+QbwS+DE5vhlkuOT3HccAUqamO/T2d1k4ViwF51hEJKkFg0ze/RPgP8Gbgl8ATitqdoD\n+HPgW0keVlWn9fkISVOsqq4FLli4TtaVX5DkxpbCkiQ1hnk8+nrgeuDhVfWj7oomoftm0+Z/jC48\nSZIkwXCPRx8FvG9xwgZQVT8B3g/sParAJEmStN4wSdutgV8MqL+kaSNJkqQRGyZpOwd4woD6JzRt\nJM2RznptdV+oFVCXJlTCsW3HJUnLzTBJ21HAfkk+nmSPJJs3x58k+RiwL51dEyTNh9UD6twpQZIm\nbJiJCG8DHgg8DXgqsLYp34zO1lafBv59pNFJak33nqNJfgjcEbg/1KXtRSVJy9cwOyLcCDw1yX8A\nT2T94rrnAEdX1VfHEJ8kSZLYiB0RquorwFfGEIuk6ffIhZMkj+0qP6Oqzm8hHklaNpY8pi3J7Qft\nepDkvkluN5qwJE2p93SdH9V17NtOOJK0fAwzEeEtDJ5o8CHg3zYpGknT6r+BrzXHgq8BF7YTjiQt\nP8MkbY8Gvjig/hjgsQPqJc2oqnpRVT2rqp7VVfpMqAc3S4F8sFkKxOVAJGlMhknatgcGjVm5sGkj\nab4NWgoEXA5EksZimKTtKmCnAfU7AdduWjiSpl0Vq6pIFYH8C+QSyPM715KkcRkmaTsReE6SbRZX\nNGXPBk4aVWCSZsrfJ/n2wkWSbzfHoW0GJUnzZJik7W3AjsAJSZ6cZNfmeDJwQlP31nEEKWnq3Z71\nazfSnN8d2KGdcCRp/gyzuO5/JXkh8C7gU4uqrwcOdoFdadl5F52Z4wvObl4PAj4w+XAkaX4Ntbhu\nVR2W5P8CTwF2bYrPAD5TVReNOjhJ062qfg38euE660e1+feBJI3YxuyIcBHwjjHEIkmSpD6GTtok\naQg7JXlzn7p/q6rLJxqNJM0wkzZJ4/RHwLP61L0bMGmTpCUyaZM0DucD/9in7lXAthOMRZLmgkmb\npJGrql/S2Uj+ZpK8GJM2SRraMOu0SZIkqSUmbZIkSTPApE2SJGkG9B3TlmQtUEN+XlWV4+QkSZJG\nbFCCdRQ3T9oeBPwJ8DNgTVN2b+AewE+AU0YdoKTZk/T8B9/qKlZNPBhJmhN9k7aqOrD7OsnjgCcD\nT6yqYxbVPRH4KPCyMcQoaXasBlb2qetXLklagmHGtL0BOGxxwgZQVUcDhwP/MqrAJM2eKlZVkcVH\n23FJ0jwYJmm7L3D2gPqzgPtsWjiSJEnqZZik7bfAvgPq9wd+t2nhSJIkqZdhkraPAwckOSLJvZJs\n3hz3SnIk8ATgY+MJU5IkaXkbZnmO1wC7As8FDgTWNuWbAQG+2LSRJEnSiC05aauqa4G/TLIv8ETg\n7k3VOcAXquq4McQnaY50lgJZtxrIhelMUXApEElagqEXwm2SMxM0ScNwKRBJ2kQbtY1Vkl2TPDzJ\ndqMOSNL86V4KBHIK5BLIjm3HJUmzZKikLckTkpxNZ0eEb9LZIYEkd0pyVpInjyFGSfNp3fptWaTN\noCRpWi05aUuyD/B54DLgn+n6C7eqfklnDbenjTg+SfPrpK7zi7qOg9oJR5Km2zA9bf8E/BDYC3hf\nj/rvAA8cRVCSJEm6qWGStgcDH6uqtX3qLwTuMmwASfZPcnqSM5K8sk+bdyc5M8mpSe7fVb5dkv+T\nZE2S05LsNez9JU1WVf1pVW1fVdt3lW0PfKDFsCRp6g2TtG0GXDug/o+A64a5eZLNgPcC+wF7AE9P\nsvuiNo8Hdqmq3YAXAId2Vb8LWF1V9wLuB6wZ5v6SJEmzYpikbQ3wyAH1T6Dz+HQYewJnVtV5VXU9\n8EnggEVtDgCOAqiqE4Htktw5ybbAI6vqQ03dDVV1xZD3lyRJmgnDJG1HAE9O8ryu91WSrZO8G3go\ncPiQ998BuKDr+sKmbFCbi5qyuwO/TvKhJN9PcniSWw15f0lToFl09/VQK6Del1DNcWzbsUnStFhy\n0lZVHwA+BXwQOJPOsuafoLNJ/MHAh6tqknuPbkFn4sP7quqBwNXAP07w/pI23eoN1LvwriQ1htoR\noaqemeSzwDOB3eks+3EicFRVfXYj7n8RcLeu6x2bssVt7tqnzQVV9b3m/DNAz4kMAEkO6bo8vqqO\n34h4JY1Q9/ZVSV5LZ7mP3wKXQz2sKf920+T0qnre5KOUpPFqllXbZ0PtNmYbq8/TWa9tFE4Gdk2y\nE3AJnXXenr6ozTHAi4BPJXkIcHlVXQqQ5IIk96iqM4DHAD8dEPchI4pZ0njdrjkWLOxz/PsWYpGk\nsWs6ko5fuE7yul7tlpy0JXk2cGlVfblP/d3pTAw4aoggb0xyMJ29TDcDjqiqNUle0Kmuw6tqdZKV\nSc4CrgKe2/URLwY+luQWdDauf+7ie0iaGe8HuodYnN28Pp/OsAxJWtaG6Wn7MJ2JB++sqpf3qH8Y\n8CGamZ5LVVX/CdxzUdlhi64P7vPeH9JZP07SjKuq3wC/Wbju2szqwjbikaRpM+yG8T8CXprk6CRb\njyMgSZIk3dywSdtb6YwvWwV8K8mK0YckSZKkxYZN2haW/vhzYBfgpO5tpSRJkjQeQydtsG4c2iOB\ntXR63P5ipFFJkiTpJjYqaQOoqh/T2YbqdOBzgOsnSRqDOrXZKWE/d0qQtJxtdNIG0KyX9ig6a6nt\nM4qAJKkxaLeElUnu0XXcYmJRSVJLhlny49F0No2/iaq6BnhSkoOAO40qMEnL28JuCUnuB3ypq2Zh\nAtTxXc3hVd+6AAAgAElEQVQfBpw7mcgkqR1LTtqq6hsbqP/ApocjSTdzLZ39jhcsJG1n0tktYeid\nXSRpFvmXnaSpVlWnA3svXCdUU753ku8AO7UVmyRNUt+kLclaOrNDt66q65rr2sDnVVWZCEqSJI3Y\noATrKDpJ2o2LriVJkjRhfZO2qjpw0LUkSZImZ5OW/JAkSdJkmLRJkiTNgEETEc7ZiM+rqtplE+KR\npCXpzCJdN8z25wkAqxfWd5OkeTNoIsL5OPFA0vRZDazsU7cyyeld1+9yDUlJ82LQRIR9JhiHJC1J\nd0/aTddpW7dTwrZdzbecWGCSNGaOaZM0y/YFdm+OBbsDh7UTjiSNjwvhSppZVfX7hfNmTBtVdUWS\na9uKSZLGZaikLckuwEuBvYDbcfOeOiciSJIkjcGSH48muQ/wfeB/0hkn8sfAVcAtgZ3p7Jxw/uhD\nlCRJ0jA9ba8HrgP2BH4D/BJ4SVV9PcnzgTcCB4w+REnaaH+a5H/2KP9tVX124tFI0iYYJml7BHB4\nVf0syR2asgBU1QeTPBJ4E/AXI45RkjbWY5pjsTWASZukmTJM0rYNcHZzfl3zeuuu+m8D/zaKoCRp\nE50CHNGj/PbAX044FkkaiWGStkuBu0BnxlaSq4B7dNXfDth8hLFJ0kapqq8AX1lcnuRemLRJmlHD\nrNN2KvCnXdffAF6S5FFJ9gEOBn44wtgkaWgJ1ec4tu3YJGlTDNPT9nHgRUluVVXXAK+lk7j9V1N/\nDfCqEcc3M5J8gJv2PC64Q48ySaM3aHsrmrpXTCgWSRq5JSdtVfUp4FNd1z9IsgedRw03Al+qqo3Z\nZH5e7Azcq+0gpOVq0Ebxnc3lJWm2bdKOCFV1AfDuEcUyL14EnN6j/LJJByJJkuaH21iN3s+rak3b\nQUiSpPky7DZWD6PTk7QbnbFaWdTEbawkSZLGYMlJW7PrwaF01mj7GW5ZJUmSNDHD9LS9is6yH/tV\n1a/HFI8kSZJ6GGadtjsDR5iwSZpd9VOoFVB/5vptkmbNMEnbGjq7HkjSrFk9oG7Q2m6SNDWGSdr+\nFXhhku3HFYwkjUMVq6oI5N6QSyBf71xL0uwYZnHdzyXZGvhpki8A59JZVHdRs3rDCOOTpHHYIsnt\naNbc7Zyv8/uquqGdsCSpv2Fmj94DeD2wLfCsPs0KMGmTNO12A07ruu4+3xs4c7LhSNKGDTN79P3A\nnYCXAN8CfjuWiCRpfNYCl3ddr2heL6fzD9JhhoxI0kQNk7Q9FHhrVb1nXMFI0jhV1c+Aey9cL+xJ\nWlX3TvJNYNe2YpOkDRnmX5W/A341rkAkSZLU3zBJ26eBJ40rEEmSJPU3zOPRw4CPJDkaeDfwc24+\ne5SqcnsrSZKkERsmaTuNzuzQPwX+fEC7zTcpIklq10OT7NSj/JyqOmfi0UhSY5ik7fUsLGokSXOk\nMyFh3V9vH+m8HHct7HdZV7O3A2+bbGSStN4wi+seMsY4JKkNq+m7jdW+WwFfA3YBdp5YRJLUx5Im\nIiS5TZKvJ3neuAOSpElZ2N5q8bG+vp4FfLbFECVpnSUlbVV1JfDgMcciSZKkPoZZ8uNU4F7jCkSS\nJEn9DZO0vQ54fpJHjysYSZIk9TbM7NFnAucDX03yQ+AM4OpFbaqqHPcmSZI0YsMkbQd2nd+/ORYr\nwKRNkiRpxIZZ8mOYR6mSJEkaIRMxSeqjWXT3bVAroN6aUM1xbNuxSVp+hnk8CkCSAA8A/rgpOgf4\nQVW5W4KkeTFg0V0AViZ5bXP+m6p6/wRikrTMDZW0JdkfeD+weF++c5O8sKq+PLLIJKklVaxaOE/y\ncuDlXbUrmpODmtez6fy9KEljteSkLcnDgWOAq4B30dlAHmAPOpMUjkny6Ko6YdRBSlKLvglc03X9\nvub1A6xP3CRp7LLUp5pJvkxncd29quqSRXUrgBOBn1bV/iOPchMlqarKhltu0j2+BNwPWFlVp47z\nXpLa0xnnBpDd6CR0Z1fVI9uMSdJ86Ze3DDMRYS/g8MUJG0BT9kHgIRsfoiRJkvoZJmnbEvj9gPor\nmjaSJEkasWEmIqwBnpbkfVV1Q3dFki2ApzZtJGk52SnJiX3qnllVZ040Gklza5ik7QPA4cDXkrwF\n+GlTvgfwD3Qen/7NaMOTpKm3BXDXPnW3mGQgkubbMDsi/EeS3YBXAI/o0eStVXXEyCKTpKnWqwft\nyq/DNs8FPgbsMumIJM23odZpq6pXJjkCOAC4e1N8DnBMVZ0x6uAkaQoNWHj3Nn9WVecnuW6iEUla\nFobeEaFJzt46hlgkaep1L7zbbf1SIJI0Hu49KkmSNAOGStqSPDTJx5KclOTsJOcsOs4eNoAk+yc5\nPckZSV7Zp827k5yZ5NQk919Ut1mS7yc5Zth7S5IkzYphtrF6NvAh4HrgDOD8Tb15ks2A9wKPAS4G\nTk7yhao6vavN44Fdqmq3JHsBh3LTRXxfQmcm67abGo8kSdK0GmZM26uBnwGPraqLR3T/PYEzq+o8\ngCSfpDPJ4fSuNgcARwFU1YlJtkty56q6NMmOdAYE/yvwshHFJEmj8g9Jftuj/GtVdezEo5E004ZJ\n2nYC/mGECRvADsAFXdcX0knkBrW5qCm7FHgHnTXiththTJI0Kvv1Kf8VYNImaSjDJG0XAluNK5Bh\nJVkFXFpVpybZBxi4IXySQ7ouj6+q48cXnaTlqjOLdPFE0p+fCn/8FuCxwONbCEvSFGvymH021G6Y\npO1Q4BlJ3lFVN25kXItdBNyt63rHpmxxm7v2aPNk4C+SrARuBWyT5KiqenavG1XVISOKWZJ6GbB+\n293vX1WfSHJHTNokLdJ0JB2/cJ3kdb3aDZO0nQL8D+CkJO8Dfg7cLHmrqm8O8ZknA7sm2Qm4BHga\n8PRFbY4BXgR8KslDgMur6lLgVc1Bkr2Bl/dL2CRp3Fy/TdK4DZO0fa3r/D+4ef9/mrLNl/qBVXVj\nkoOB4+gsP3JEVa1J8oJOdR1eVauTrExyFnAV8NwhYpYkSZoLwyRtY0mWquo/gXsuKjts0fXBG/iM\nbwDfGH10kiRJ02GYDeM/Ms5AJEmS1J/bWEmSJM0AkzZJkqQZMMyYNknSaDwmye17lF9WVf828Wgk\nzQSTNkmagEWL7q6gs+cycNy1sN9lTfn5gEmbpJ58PCpJ47V6cPW+WwFvnkgkkmaaSZskjVEVq6pI\nr6Or2dGtBShpZpi0SZIkzQCTNkmSpBlg0iZJkjQDnD0qSdPjTkmO7FP3hqr6+USjkTRVTNokaXrc\nEti/T927JxmIpOlj0iZJ7fsV8Lw+da8Fdp5cKJKmlUmbJLWsqq4GvtSrLsmLJxyOpCnlRARJkqQZ\nYE+bJLWss8XVzayuYlXX9d8m+WWPdt+uqi+PKTRJU8SkTZLasxpY2aducflf9Gl3A2DSJi0DJm2S\n1JJFPWnrLOp5Owy4Y49mjwAeN464JE0nkzZJmmJV1XNf0iRbYNImLStORJAkSZoBJm2SJEkzwKRN\nkqZUQvU4jm07LkntMGmTpOmzekBdv9mmkuacExEkacoscVappGXGnjZJkqQZYNImSZI0A0zaJEmS\nZoBJmyRJ0gwwaZOkGdOZkFDvh1oB9c8uByItDyZtkjQ7Bi0FAi4HIs01kzZJmhFVrKoiVQTyQsgl\nkMMgD19ok+RhzfGgNmOVNHqu0yZJs+0vmmPBZ5rXSwATN2mO2NMmSbPpIuA7XceC77cTjqRxs6dN\nkmZQVR0DHLNw3bVbwt8A32slKEljZU+bJEnSDLCnTZLm052TfLdP3Quq6ocTjUbSJjNpk6T5tBlw\ntz51W04yEEmjYdImSfPll8BD+9QdDtxngrFIGiGTNkmaK3V9j8LVVaxKcu3Ew5E0Mk5EkKT5MGi3\nBHdKkOaAPW2SNAeqWNWrvGspEEkzzp42SZKkGWDSJkmSNAN8PCpJy0DnMem6J6UnJQBfuwoee2FX\ns/9dVf8y8eAkLYk9bZI03wZMUHjMrYFtu45bTiYkSRvDpE2S5lgVq6pIFYFsC7lt51jnXsAb24pP\n0tL5eFSSlomq+v3CeefxKFTV75Jc01ZMkpbOnjZJkqQZYNImSZI0A0zaJEmSZoBJmyRJ0gwwaZMk\nSZoBzh6VpGVs0aK7r054def0x2fBfT/ZlF9ZVW9uITxJXexpk6TlacCiuwD32RV4XnM8YwLxSNoA\ne9okaRmqYtXCeZI9gId21X6wOXkr8A8TDUxSXyZtkrTMVdVpwGkL1wkLSdv/xqRNmhombZKkDbl1\nkn7J26er6ryJRiMtUyZtkqQNuRXw0j51JwAmbdIEOBFBktRH/RJqxU2PNZcDbwMuaDs6abkxaZMk\nLTZgZunu96qqt2PSJk2cj0clSTfRPbO0W2dNN0ltsadNkiRpBpi0SZIkzQCTNkmSpBlg0iZJkjQD\nWk/akuyf5PQkZyR5ZZ82705yZpJTk9y/KdsxydeTnJbkx0lePNnIJUnAoUm+1+N4VduBSfOm1dmj\nSTYD3gs8BrgYODnJF6rq9K42jwd2qardkuwFHAo8BLgBeFlVnZrkNsApSY7rfq8kafQ6s0jXTSRd\n0Xk57lrY77KuZttNOCxp7rXd07YncGZVnVdV1wOfBA5Y1OYA4CiAqjoR2C7JnavqF1V1alN+JbAG\n2GFyoUvSsjNg/bZ9twIeDLxpUsFIy03bSdsO3HSBxgu5eeK1uM1Fi9sk2Rm4P3DiyCOUJAGd9duq\nyOJjfX1dBFzeYojSXJv5xXWbR6OfAV7S9Lj1a3dI1+XxVXX8mEOTJEnaoCT7APtsqF3bSdtFwN26\nrndsyha3uWuvNkm2oJOwfbSqvjDoRlV1yKYGK0mSNGpNR9LxC9dJXterXduPR08Gdk2yU5ItgacB\nxyxqcwzwbIAkDwEur6pLm7ojgZ9W1bsmFbAkqbdmgsJHms3l//+E6hxfuTrJec3x47bjlGZVq0lb\nVd0IHAwcB5wGfLKq1iR5QZK/adqsBn6e5CzgMOAggCQPB54B/FmSHyT5fpL9W/lBJGl5GzBBAeBx\ntwJu0XVI2gipmv/9f5NUVWXDLTfpHl8C7gesXJjVKknLTZLNuUmHQF3X1NwJ+CFwRVXt3kJo0szo\nl7e0PaZNkjRHmicoNy5cZ/2vnevaiEeaJ22PaZMkSdIS2NMmSZqkWyV5Z5+6Q93VRurPpE2SNEm3\nAJ7Sp+7zgEmb1IdJmyRpEq4BXtqn7iDgHhOMRZpJJm2SpAmoa3sUrq5iVZK/xKRN2iAnIkiSxmnQ\nGm4rJxaFNAfsaZMkjU0Vq3qVd3ZPkDQMk7YhJLkz0G/W0y6TjEWSJC0vJm3DuSWwd9tBSNKc+niS\ntT3KP11VL594NNKUMWnbOL8CXtKn7pxJBiJJcyTA5j3KHX8tYdK2sa6pquPbDkKS5sQz6CRsiz0V\neOuEY5Gmlv96kSS1pjMhoW6Aur7r+EJV3UDXHqaSTNokSe1wKRBpSD4elSRN3JBLgeyQZL8e5Wur\n6iujjUyaXiZtkqRp94jmWOwaXG5Jy4hJmyRpWl0EHNejfHPgMROORWqdSZskaSpV1beAby0uT7I1\ncNbkI5La5UQESdLUSag+x7Ftxya1xaRNkjRNBs0qBWeWahnz8agkaWr0m1UKPWeWbpHkoD7Nv1RV\n544sMGkKmLRJkmbVLYDX9qk7Czh3cqFI42fSJkmaNTcAh/apWwncbYKxSBNj0iZJmjF1bY/C1VWs\nSrIrJm2aU05EkCTNCre+0rJmT5skaSYMufXVO5L8oUf56qr6p9FGJk2GSZskaR7dvk/57SYahTRC\nJm2SpHnyMmCrHuWrgEMmG4o0WiZtkqS50HlMerMnpQsTFC5rIyZplJyIIEmadU5Q0LJgT5skaaYN\nOUFh8yRb9v6cum6kgUkjZtImSVpOntgci92A67tpypm0SZLmWp+xbsBXroF9f0VnOyxp6jmmTZI0\nrwaNdQMedytg14lEIo2APW2SpLnUb6wb9B3vJk01e9okSZJmgD1tkiTBFkk+0afuHVV10kSjkXow\naZMkLWM3WebjaZ2X466F/boX4/3oJCOS+vHxqCRpORowSWHfrYC/Br43qWCkpUjV/I/FTFJVlRF8\nzk7Ad4Dzq+ohmx6ZJGmaLExQqCJJjgAeD/wU+FWP5t+tqndNMj4tD/3yFh+PSpI02L37lP9uolFo\n2TNpkyRpkd4L8v7iu7DifwEPBf6uhbC0zJm0SZK03mr6bjJ/l4dU1fFJtm0Ktkpy+z6f89taDuOP\nNFEmbZIkNYbcfH6/5uhlh5EFJTVM2iRJWqL++5h+/Up4zPnA7SYdk5YPl/yQJGnDNrCP6Z/dpqr2\nmEwoWq7saZMkaQPcx1TTwJ42SZJGoHl0uqI51iZUwrFtx6X5YU+bJEmbZsCMU1Ym2b/r+odVdckE\nYtIcMmmTJGkTdD86TXJxV82K5uTI7vZJruzxMV+tqheOIz7ND5M2SZJG58td5wd2lXUvDXKbHu+7\n5bgC0vwwaZMkaUSq6rkL58lC0lYH9m593Zdhq8OB9449MM0FJyJIkjQeG1gmZMv9gGsmEonmQpbD\nLhtJqqoygs/ZCfgOcH5VPWTTI5MkLUeDlwn56emwx4e7Cv69qm4Yd0yaHv3yFpO24T7HpE2StMma\npUD6zTgF0j3DdKequn7cMWl69MtbHNMmSdKELcw4TbIr8ISumnc0J28BXoHDmNTFnrbhPseeNknS\n2Ax+bHr2j2DXd3UVfKuqzhx7UJo4e9okSZp+Axbq3eW+wL90Ffx7ks/0aPiHqrp09KGpbfa0Dfc5\n9rRJkiYiyeuBzTtX9arBrY+7Fva7rLn4WlU9a5yxabzsaZMkaYZU1T8tnCfcn4ETF/bdCvgVcMex\nB6bW2NPWu/1+wJ/3qLoNsC/2tEmSpsTgcXCXfxNu97fA04FzoG/bExwfNz3saRvOPYEntR2EJElL\nMGAc3G0fBfXTm5ff5HEqAEk+3eMDzqiq9296iBoFk7bBvgIc06P8qkkHIklSL13LhzwE+Nf1Nd+6\nHzziDr3fte9WwFHAs7sKn9Kj4bcAk7YpYdI22OlV9dm2g5AkaUOq6rvAYzbUbv3j1Hpl7xbn/gDu\nfjTwt6OLTqNg0iZJ0vIy4HEqwM4PgHpAc/GUZKEH7gfnwgMXnj6tAF5L7ydPl1fVlSOKVV1M2iRJ\nWkYWHqf2Mnh7rQfsDPxVV8F/9fmY1yQ5qve93UN1U7SetCXZH3gnna06jqiqN/do827g8XQy+gOr\n6tSlvlfLV5J9qur4tuPQ5PndL19+95uma3zcnYG9u2o+1byuWMLHHNEcLJ7wkOTzPdrfHngNcEWP\nuiur6pol3HNZfPetJm1JNgPeS+cZ/MXAyUm+UFWnd7V5PLBLVe2WZC/gUOAhS3mvlr19gONbjkHt\n2Ae/++VqH/zuN1mzo8K62aQJz2HgI9V+9t1qUaL3wj4Nn9Z5udms1o8l+Y+u6zsADwQu6vEZT22S\nzeOAq3vU3zjrPX1t97TtCZxZVecBJPkkcADQnXgdQGeGC1V1YpLtmi/l7kt47zpJ7tuj+H7AucDi\nL/FuG/sDSZI0bwY9Uu1n8KPWfm6W5L2iOZbgEOCQp24gpg046SLY6+usX89ubXO+cKwF7gT8CPhS\n1xtvC+xFnxwEuDfwbeB3zXV1vVaPsp7aTtp2AC7our6QTiK3oTY7LPG93f5z48OUJEnDGDbR27gk\nb9T23AGWtAXYAXQmYoxJ7+yy7aRtY2zsHqJLeQ6/2BuTvHEj76cpkOR1bcegdvjdL19+98vZP7cd\nwFi1nbRdxE0fRe7IzZ9TXwTctUebLZfwXgBGsVm8JElSmzZr+f4nA7sm2SnJlnQGIi7egeAYmhWb\nm9WeL28GSC7lvZIkSXOh1Z62qroxycF0ZnosLNuxJskLOtV1eFWtTrIyyVl0lvx47qD3tvSjSJIk\njVWq+k5SkCRJ0pRo+/HoWCXZP8npSc5I0mePNc2jJOcm+WGSHyQ5qe14ND5JjkhyaZIfdZXdLslx\nSX6W5MtJtmszRo1Hn+/+dUkuTPL95ti/zRg1ekl2TPL1JKcl+XGSFzflc//nfm6Ttq7Fd/cD9gCe\nnmT3dqPSBK0F9qmqB1TVoKVgNPs+ROfPebd/BL5aVfcEvg78r4lHpUno9d0DvL2qHtgcLvc0f24A\nXlZVewAPBV7U/H6f+z/3c5u00bVwb1VdDywsvqvlIcz3/99qVNV/A79dVHwA8JHm/CPAEycalCai\nz3cPG780lGZAVf1iYTvLZmP6NXRWkJj7P/fz/Eut36K8Wh4K+EqSk5M8v+1gNHF3amaZU1W/oLOC\nuZaPg5OcmuQ/5vERmdZLsjNwf+C7wJ3n/c/9PCdtWt4eXlUPpLO69ouSPKLtgNQqZ1wtH+8H/riq\n7g/8Anh7y/FoTJLcBvgM8JKmx23xn/O5+3M/z0nbUhbu1Zyqqkua118Bn2fwFmeaP5c2exST5C7A\nL1uORxNSVb+q9csifBB4cJvxaDySbEEnYftoVX2hKZ77P/fznLS5+O4ylWTr5l9gJLk1sC/wk3aj\n0piFm45jOgY4sDl/DvCFxW/Q3LjJd9/8sl7wJPyzP6+OBH5aVe/qKpv7P/dzvU5bM9X7XaxffPdN\nLYekCUhydzq9a0VnAemP+d3PryQfB/YB7gBcCrwOOBr4P3S2wDsPeEpVXd5WjBqPPt/9o+mMcVoL\nnAu8YGGck+ZDkocD3wR+TOfv+QJeBZwEfJo5/nM/10mbJEnSvJjnx6OSJElzw6RNkiRpBpi0SZIk\nzQCTNkmSpBlg0iZJkjQDTNokSZJmgEmbJEnSDDBpk7RJkuydZO2A47q2Y5y0rv8mL+tT97skFyX5\nkyE/9+Qk1ya5w4A2t05yZZI1GxO7pOm1RdsBSJobHwdW9yhfO+lAplWSJ9BZsf1i4LFVde6QH/Ef\ndDZEfyad3V56eSqwNZ1tfiTNEZM2SaPy/ar6eNtBdEtyS+D6qrpxCmL5a+DDwBpg343cWukTwNuB\n59I/aXsucANw1EZ8vqQp5uNRSROTZKfmseE/JVmV5KQk1yS5OMlbktzs76Qkuyb5aNPm2iQ/b9pu\nvajdh5vP/qMkRyb5BXAlsENTf6skb28+5+okJyR59ML7uj7n6CRXJblNj1ge3NzjNUP+3AcBHwW+\nB+zdK2FLcpckH0hyXvNzXpTksCR3XGhTVVcAnwHuk+SBvf5bAQ8HVi++R5KnJ/nvJFc0P993kvxl\nn3j3S3Jcksub7+fUJM8f5meWNHombZJGZeskd+hxbNOj7SrgCDqPU/8eOPX/tXf2MVuPURz/nJKK\nYc1bsWaZyPvS8A/zBxNRWRvyllUkUUleCisyLzPmHyapHpE/TJY8WCJZ0tqMlrchkkJektdSUccf\n57rXr6vf/XQ/7XkeHn0/27X7uc917vM71+/e7p3nXOc6P+Am4Jaikpn1IgKd04DJwAigHhgFzDOz\ntgX1yoOjXwM6A5OA8UTgBhHsjAYWA2OBRcBs4uHixYcwPwF0AC4p8XsosCX5XhNmNh54FJhPbInu\n8ABrM+sKvAsMAJ5J63wKGAgsyu7hdMCIjFrOkLSW7fwzs/uT3Z+BO4BbgY3A82Y2LNO9lvheOhD3\ncAzwJfC4md1T67qFEM2Au2toaGjs8gDOIOrWtqTXfLxY0D0syX4HumZ2PgC+yWTLgI+AvTJ5/2Rn\nUEFWl2QzSnzsk+YmZ/JzKr4XZG2Ar4AlmW5H4BegvhH35PP0Ogto14D+HOA7oEsmPwn4C5iQyZcD\na4s2iUBuNbAGaFOQn5J8mFhy3XpgHdAxvT+UCObqSnQfATbn35uGhkbLDWXahBBNxRTgrJJxe4nu\nbHdfnckWAJ0r257pZOXxRB1Xx2L2jsiWrQfOzmw48GDJ9c5Pcw9vp+w+l6gxK8q2Etmsk83s2MLU\nhcA+NCLLRmT8HFjh7n+VKZjZvkTm8UVgc7bOVUTgl69zOtAJuKAg600EXTPSGipcRgRtT+dZUCJo\n2w84NeleBLQD6kp0XyLqoM9sxPqFEE2IDiIIIZqK5e7+Ro26X5bIfkqv+wMbgKPT+7uIbbocBw4u\n86NE1o1tma+cT4EemWwasY04FKi07RgK/EAEOrVyP5F1u8nMzN1vLtE5isjuDQWuKpl3YEUme5K4\nJ0OA55KssjVal+n2SPbL1l6xf3BB14A3a9AVQrQwCtqEEP8GDZ3mtOz1IWBuFd2fc4G7b2zAtjcw\nV7TxtZnNBS43s1uIoO904AFv3EnUDUSW7yVgrJm1cfexmU5lnTOBGVXs/Jn5t8bMXgV6m9khab4v\nsNjdPy2x/zdwLtXX/2FB14FLgR+r6FYL/oQQzYyCNiHEf5VKxmxLIzJ41VhJZJu6E5m1InmWrcIU\nohbuAqAXEcw0uveZu28ys75E3dqYlHErNt39PNnes5HrnJb8uxL4DWhfxb/lxJbmSnf/Yic2K/d8\nbRPccyFEE6OaNiHEfxJ3X0pkgIabWbd83szamlmnGs3VE1mkMZmNPlQP2l4mivqHA4OAt939sxqv\ntx0p+9cPmAfcYGYPF+bWEac1B5jZqWWfN7MDSsT1RDZsMLE1+gfRuDfnaWLt91VpqXJQ4e2zxMGH\nSWbWvkR3PzNrV7pIIUSzo0ybEKKp6GVml1WZm+3uG3bB5hVEq4z3zWw66SQpcATRHmMcNTSRdfdX\n0nbi1anv2evA4cAw4oTqCSWf2ZqueQeRCRu3C/4X7W0ys35Exm20mbV191Fp+lrgLWChmT0FLCX+\nqT6cOCk7g6yuz93/TrqV7dbp7r6+5LpLzOzutI73zGwWEYx2AU4mDovsnXRXmdn1wGPAx2Y2kzgM\ncSBwIrEFeyTxRAchRAujoE0I0RQ40VNsYJX57mwrpq/0U9u5UfdlZtaT6LfWF7iGaBeyktgKnF/i\nRzUGAPcQ/dfOIVqMDCAyad2rfGYqcBuRxZpVi8+ZL9v54+6bzaw/8AJwXdoqHZlq6HoR/dP6Eyc+\nNw0A4HYAAAEJSURBVBItPOZQnkGD2CK9kfIDCMXrTjSzd4CRRLZxL+B7IpM5MtOdamYfE33zhhOn\nS9cCnxD3olqtmxCimTH3mn47hRDif4mZvQ/s4e7HlMx1JgKnJ9x9RIs7J4QQBVTTJoTYLbB4Dmku\nOw84jqg1K2ME8Ts5pRldE0KImlCmTQixW2Bm9wI9iSa+v6a/BxNPOejp7t8WdC8mnt5wJ7DA3c9r\ncYeFECJDQZsQYrfAzM4lasaOIeq01hE1cRPcfUWmu5XofbYQGOLua1rYXSGE2AEFbUIIIYQQrQDV\ntAkhhBBCtAIUtAkhhBBCtAIUtAkhhBBCtAIUtAkhhBBCtAIUtAkhhBBCtAL+AT5fCkz5MPj1AAAA\nAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "binwidth=0.25 # keV\n", + "\n", + "n_data, bin_edges_data, patches = plt.hist(E_Doke, bins=np.arange(0.05, 25 + binwidth, binwidth), normed=1, facecolor='none',edgecolor='black',linewidth=2, histtype='step', alpha=0.9)\n", + "plt.xlabel('Energy KeVee',fontsize=18)\n", + "plt.ylabel('normalized count',fontsize=18)\n", + "\n", + "left,right = bin_edges_data[:-1],bin_edges_data[1:]\n", + "bin_center_data=(right+left)/2\n", + "\n", + "\n", + "data_scale_factor=sum(n_data[bin_center_data>3])/sum(n_NEST_MAX[bin_center_NEST_MAX>3])\n", + "\n", + "plt.step(bin_center_NEST_MAX,n_NEST_MAX*data_scale_factor,'b',linewidth=2)\n", + "#plt.plot(T,N/scale_factor*data_scale_factor,'m',linewidth=2)\n", + "\n", + "plt.legend(('Beta w sigE','Beta','Data','Data with Beta values'))\n", + "plt.xlim([0,22])\n", + "#plt.yscale('log')" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\n8f8Bp6smacWbfmYAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "num_data, num_data_bins, num_data_patches=plt.hist(E_Doke,bins=np.arange(0.05, 25 + binwidth, binwidth));" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nHaSWFzCe24vADlLLCxjPTBcAwABCFwDAAEIXQBJlJYBls6YLIImyEsCymekCABhA6AIAGEDoAtiX\nWl7A8bKmC2BfankBx8tMF8DCzH4BR2emC2BhZr+AozPTBQAwgNAFADCA0AVwRVSyBxZjTRfAFVHJ\nHliMmS4AgAGELoBjpawEsD+3FwGOlbISwP7MdAEsndkvwEwXwABmvwAzXQArotQE7BozXQArodQE\n7BozXQBrwbov2HZmugDWgnVfsO3MdAGsLbNfsE2ELoC1dWH266Kvk0IYbCa3FwE2igX4sKnMdAFs\nNLcgYVMsFLqq6s6qeqaqnq2q+y7R58NV9VxVPVlVtx/mXFbl7KoHsIPOrnoAO+jsqgewZIvcghwb\nxKrq1KifxYzPfDMcGLqq6kSSjyR5d5LbktxTVW+f9HlPkrd299uSnEny0UXPZZXOrnoAO+jsqgew\ng86uegArsNBasFeXGMxOHdP7sLhTqx4AB1tkpuuOJM919/Pd/UqSR5KcnvQ5neThJOnux5NcX1Un\nFzwXgKWbBrGXTyw4Q/bqqmbMYNssspD+xiQv7Dl+MbMwdVCfGxc8d4+/9LtJzb8/d3WS6xYYHwDH\nYt9aYScubrv2ZFVNOl372izE7TmrrvuHF7e9sU9y7fnur95wxcOGDbGs3Yt1cJf9nL1+sbeati3S\nx3nHe946jmnbz1vHMW37ees4pnU4b2oapvZr27fPPgGOo6qq+1c9Bi5vkdD1UpKb9xzfNG+b9nnL\nPn2uXuDcJEl3HzGoAQCsv0XWdD2R5NaquqWqrk5yd5JHJ30eTfLeJKmqdyb5UnefX/BcAICtd+BM\nV3e/WlX3Jnkss5D2UHc/XVVnZi/3g939yaq6q6q+kOQrSd53uXOX9tsAAKyp6nY7HQBg2VZekV7x\n1PGq6jeq6r9X1Wer6pdWPZ5tVFUPVdX5qvrVPW3fUlWPVdX/qKr/VFX7bBzhqC7xmd9fVS9W1a/M\nv+5c5Ri3TVXdVFWfqqrPVdVTVfX+ebtrfUn2+cx/eN7uWl+Sqrqmqh6f/8186sKGhaNc5yud6ZoX\nT302ybuSfDGzNWB3d/czKxvUDqiqX0/yp7r7d1Y9lm1VVX8+yZeTPNzd3z1v+ydJ/nd3/9P5f2B8\nS3f/6CrHuU0u8Znfn+T/dvePrXRwW6qqbkhyQ3c/WVXflOQzmdVifF9c60txmc/878S1vjRV9Q3d\n/ftV9aYkv5jk/Un+Zg55na96pkvx1NWorP7/+63W3f81yTTUnk7yU/PvfyrJ9w0d1Ja7xGeeHLmE\nDQfp7nPd/eT8+y8neTqzXequ9SW5xGd+4/xl1/qSdPfvz7+9JrP18J0jXOer/sN7qaKqLFcn+YWq\neqKq/t6qB7NDvnW+qzfdfS7Jt654PLvi3vkzYX/cba7lqapvS3J7kv+W5KRrffn2fOaPz5tc60tS\nVSeq6rNJziX5he5+Ike4zlcduliN7+3udyS5K8kPzW/LMJ5dLMv3r5J8R3ffntk/lm69LMH8NtfH\nk3xgPvsyvbZd68dsn8/ctb5E3f1ad//JzGZy76iq23KE63zVoWuRwqscs+7+zfn//laSf5/LPpqJ\nY3R+/kzSC+sy/teKx7P1uvu3+vWFq/8myZ9e5Xi2UVVdldkf/5/u7k/Mm13rS7TfZ+5aH6O7fy/J\n2SR35gjX+apDl+Kpg1XVN8z/CylV9Y1J/mqSX1vtqLZW5eI1Fo8m+cH59383ySemJ3DFLvrM5/8Q\nXvA34lpfhp9I8vnu/tCeNtf6cr3hM3etL09VvfnC7dqqui7JX8lsLd2hr/OV1+mab2v9UF4vnvqP\nVzqgLVdV357Z7FZnthjwZ3zmx6+qPpbkVJI/kuR8kvuT/IckP5fZI7OeT/K3u/tLqxrjtrnEZ/4X\nM1vz8lqS30hy5sIaDK5cVX1vkv+S5KnM/k3pJB9M8ktJ/m1c68fuMp/598e1vhRV9ScyWyh/Yv71\ns939j6rqD+eQ1/nKQxcAwC5Y9e1FAICdIHQBAAwgdAEADCB0AQAMIHQBAAwgdAEADCB0AQAM8P8A\nSolM8GyI+bsAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "num_sim, num_sim_bins, num_sim_patches= plt.hist(E_com_Tsim_NEST_MAX, bins=np.arange(0.05, 25 + binwidth, binwidth),normed=1);" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:4: RuntimeWarning: divide by zero encountered in true_divide\n", + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:4: RuntimeWarning: invalid value encountered in true_divide\n" + ] + } + ], + "source": [ + "\n", + "\n", + "SimToData_scale_factor=sum(num_data[bin_center_data>3])/sum(num_sim[bin_center_NEST_MAX>3])\n", + "frac_res=(num_data-num_sim*SimToData_scale_factor)/sqrt(num_data)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from matplotlib import gridspec\n", + "\n", + "fig = plt.Figure(figsize=(8,6))\n", + "gs = gridspec.GridSpec(2, 1, height_ratios=[10,5])\n", + "ax1 = plt.subplot(gs[0])\n", + "ax2 = plt.subplot(gs[1])\n", + "\n", + "ax1.hist(E_Doke,bins=np.arange(0.05, 25 + binwidth, binwidth),facecolor='none',edgecolor='black',linewidth=2, histtype='step', alpha=0.9);\n", + "ax1.plot(bin_center_NEST_MAX,num_sim*SimToData_scale_factor,linewidth=2,color='blue')\n", + "ax1.set_xlim([0,22])\n", + "ax1.grid(True)\n", + "ax1.set_ylabel(r'Count',fontsize=20)\n", + "for tick in ax1.xaxis.get_major_ticks():\n", + " tick.label.set_fontsize(18) \n", + "for tick in ax1.yaxis.get_major_ticks():\n", + " tick.label.set_fontsize(18) \n", + "\n", + "\n", + "ax2.plot(bin_center_NEST_MAX,frac_res,'ko',linewidth=2)\n", + "ax2.plot([0,22],[0,0],'k')\n", + "ax2.grid(True)\n", + "ax2.set_xticks(np.arange(0,22,2))\n", + "ax2.set_xlim([0,22])\n", + "ax2.set_ylim([-4,4])\n", + "ax2.set_ylabel(r'Frac Res ($\\sigma$)',fontsize=20)\n", + "ax2.set_xlabel('Combined Energy (keV)',fontsize=20)\n", + "for tick in ax2.xaxis.get_major_ticks():\n", + " tick.label.set_fontsize(18) \n", + "for tick in ax2.yaxis.get_major_ticks():\n", + " tick.label.set_fontsize(18) " + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:1: RuntimeWarning: divide by zero encountered in true_divide\n", + " if __name__ == '__main__':\n", + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:1: RuntimeWarning: invalid value encountered in true_divide\n", + " if __name__ == '__main__':\n", + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:2: RuntimeWarning: divide by zero encountered in true_divide\n", + " from IPython.kernel.zmq import kernelapp as app\n", + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:2: RuntimeWarning: invalid value encountered in true_divide\n", + " from IPython.kernel.zmq import kernelapp as app\n" + ] + } + ], + "source": [ + "thresh=num_data/(num_sim*SimToData_scale_factor)\n", + "thresh_err=sqrt( (sqrt(num_data)/(num_sim*SimToData_scale_factor))**2 + (num_data/(num_sim*(SimToData_scale_factor**2)))**2)\n", + "no_nan_cut=np.logical_not(numpy.isnan(thresh))*np.logical_not(numpy.isinf(thresh))\n", + "thresh_nonan=thresh[no_nan_cut]\n", + "xbin_nonan=bin_center_NEST_MAX[no_nan_cut]" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def func(x,mu,sig):\n", + " return (1/2)*scipy.special.erf((x-mu)/(sqrt(2)*sig))+(1/2)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 1.22163236, 0.30049353])" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "popt, pcov = scipy.optimize.curve_fit(func,xbin_nonan,thresh_nonan)\n", + "thresh_yval=(1/2)*scipy.special.erf((bin_center_NEST_MAX-popt[0])/(sqrt(2)*popt[1]))+(1/2)\n", + "\n", + "popt" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from scipy import optimize\n", + "\n", + "def line( x, p):\n", + " return p[0]*x + p[1] \n", + "\n", + "def linef( x, p0, p1):\n", + " return p0*x + p1\n", + "\n", + "def erfit( x, p0, p1):\n", + " return (1/2)*scipy.special.erf((x-p0)/(sqrt(2)*p1))+(1/2)\n", + " \n", + "\n", + "\n", + "def fit_function(p0, datax, datay, function, **kwargs):\n", + "\n", + " errfunc = lambda p, x, y: function(x,p) - y\n", + "\n", + " ##################################################\n", + " ## 1. COMPUTE THE FIT AND FIT ERRORS USING leastsq\n", + " ##################################################\n", + "\n", + " # If using optimize.leastsq, the covariance returned is the \n", + " # reduced covariance or fractional covariance, as explained\n", + " # here :\n", + " # http://stackoverflow.com/questions/14854339/in-scipy-how-and-why-does-curve-fit-calculate-the-covariance-of-the-parameter-es\n", + " # One can multiply it by the reduced chi squared, s_sq, as \n", + " # it is done in the more recenly implemented scipy.curve_fit\n", + " # The errors in the parameters are then the square root of the \n", + " # diagonal elements. \n", + "\n", + " pfit, pcov, infodict, errmsg, success = \\\n", + " optimize.leastsq( errfunc, p0, args=(datax, datay), \\\n", + " full_output=1)\n", + "\n", + " if (len(datay) > len(p0)) and pcov is not None:\n", + " s_sq = (errfunc(pfit, datax, datay)**2).sum()/(len(datay)-len(p0))\n", + " pcov = pcov * s_sq\n", + " else:\n", + " pcov = inf\n", + "\n", + " error = [] \n", + " for i in range(len(pfit)):\n", + " try:\n", + " error.append( numpy.absolute(pcov[i][i])**0.5)\n", + " except:\n", + " error.append( 0.00 )\n", + " pfit_leastsq = pfit\n", + " perr_leastsq = numpy.array(error) \n", + "\n", + " ###################################################\n", + " ## 2. COMPUTE THE FIT AND FIT ERRORS USING curvefit\n", + " ###################################################\n", + "\n", + " # When you have an error associated with each dataY point you can use \n", + " # scipy.curve_fit to give relative weights in the least-squares problem. \n", + " datayerrors = kwargs.get('datayerrors', None)\n", + " curve_fit_function = kwargs.get('curve_fit_function', function)\n", + " if datayerrors is None:\n", + " pfit, pcov = \\\n", + " optimize.curve_fit(curve_fit_function,datax,datay,p0=p0)\n", + " else:\n", + " pfit, pcov = \\\n", + " optimize.curve_fit(curve_fit_function,datax,datay,p0=p0,\\\n", + " sigma=datayerrors)\n", + " error = [] \n", + " for i in range(len(pfit)):\n", + " try:\n", + " error.append( numpy.absolute(pcov[i][i])**0.5)\n", + " except:\n", + " error.append( 0.00 )\n", + " pfit_curvefit = pfit\n", + " perr_curvefit = numpy.array(error) \n", + "\n", + "\n", + " ####################################################\n", + " ## 3. COMPUTE THE FIT AND FIT ERRORS USING bootstrap\n", + " #################################################### \n", + "\n", + " # An issue arises with scipy.curve_fit when errors in the y data points\n", + " # are given. Only the relative errors are used as weights, so the fit\n", + " # parameter errors, determined from the covariance do not depended on the\n", + " # magnitude of the errors in the individual data points. This is clearly wrong. \n", + " # \n", + " # To circumvent this problem I have implemented a simple bootstraping \n", + " # routine that uses some Monte-Carlo to determine the errors in the fit\n", + " # parameters. This routines generates random datay points starting from\n", + " # the given datay plus a random variation. \n", + " #\n", + " # The random variation is determined from average standard deviation of y\n", + " # points in the case where no errors in the y data points are avaiable.\n", + " #\n", + " # If errors in the y data points are available, then the random variation \n", + " # in each point is determined from its given error. \n", + " # \n", + " # A large number of random data sets are produced, each one of the is fitted\n", + " # an in the end the variance of the large number of fit results is used as \n", + " # the error for the fit parameters. \n", + "\n", + " # Estimate the confidence interval of the fitted parameter using\n", + " # the bootstrap Monte-Carlo method\n", + " # http://phe.rockefeller.edu/LogletLab/whitepaper/node17.html\n", + " residuals = errfunc( pfit, datax, datay)\n", + " s_res = numpy.std(residuals)\n", + " ps = []\n", + " # 100 random data sets are generated and fitted\n", + " for i in range(100):\n", + " if datayerrors is None:\n", + " randomDelta = numpy.random.normal(0., s_res, len(datay))\n", + " randomdataY = datay + randomDelta\n", + " else:\n", + " randomDelta = numpy.array( [ \\\n", + " numpy.random.normal(0., derr,1)[0] \\\n", + " for derr in datayerrors ] ) \n", + " randomdataY = datay + randomDelta\n", + " randomfit, randomcov = \\\n", + " optimize.leastsq( errfunc, p0, args=(datax, randomdataY),\\\n", + " full_output=0)\n", + " ps.append( randomfit ) \n", + "\n", + " ps = numpy.array(ps)\n", + " mean_pfit = numpy.mean(ps,0)\n", + " Nsigma = 1. # 1sigma gets approximately the same as methods above\n", + " # 1sigma corresponds to 68.3% confidence interval\n", + " # 2sigma corresponds to 95.44% confidence interval\n", + " err_pfit = Nsigma * numpy.std(ps,0) \n", + "\n", + " pfit_bootstrap = mean_pfit\n", + " perr_bootstrap = err_pfit\n", + "\n", + "\n", + " # Print results \n", + " print \"\\nlestsq method :\"\n", + " print \"pfit = \", pfit_leastsq\n", + " print \"perr = \", perr_leastsq\n", + " print \"\\ncurvefit method :\"\n", + " print \"pfit = \", pfit_curvefit\n", + " print \"perr = \", perr_curvefit\n", + " print \"\\nbootstrap method :\"\n", + " print \"pfit = \", pfit_bootstrap\n", + " print \"perr = \", perr_bootstrap" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 4.93207585e-02, 4.35289791e-07],\n", + " [ 4.35289791e-07, 9.86429261e-02]])" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pcov" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 0.22208277, 0.31407471])" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "popt_err=np.sqrt(np.diag(pcov))\n", + "popt_err" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:1: RuntimeWarning: divide by zero encountered in true_divide\n", + " if __name__ == '__main__':\n", + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:1: RuntimeWarning: invalid value encountered in true_divide\n", + " if __name__ == '__main__':\n", + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:2: RuntimeWarning: divide by zero encountered in true_divide\n", + " from IPython.kernel.zmq import kernelapp as app\n", + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:2: RuntimeWarning: invalid value encountered in true_divide\n", + " from IPython.kernel.zmq import kernelapp as app\n", + "//anaconda/lib/python2.7/site-packages/matplotlib/axes/_axes.py:2790: MatplotlibDeprecationWarning: Use of None object as fmt keyword argument to suppress plotting of data values is deprecated since 1.4; use the string \"none\" instead.\n", + " warnings.warn(msg, mplDeprecation, stacklevel=1)\n", + "//anaconda/lib/python2.7/site-packages/matplotlib/axes/_axes.py:2968: RuntimeWarning: invalid value encountered in double_scalars\n", + " in cbook.safezip(y, yerr)]\n" + ] + }, + { + "data": { + "image/png": "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\nAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "thresh=num_data/(num_sim*SimToData_scale_factor)\n", + "thresh_err=sqrt( (sqrt(num_data)/(num_sim*SimToData_scale_factor))**2 + (num_data/(num_sim*(SimToData_scale_factor**2)))**2)\n", + "plt.errorbar(bin_center_NEST_MAX,thresh,yerr=thresh_err,xerr=None,ecolor='black',elinewidth=2,capsize=0,fmt=None)\n", + "plt.xlim([0,20])\n", + "plt.ylim([0,1.4])\n", + "plt.scatter(bin_center_NEST_MAX,thresh,c='black',marker='o')\n", + "plt.plot(bin_center_NEST_MAX,thresh_yval,linewidth=2)\n", + "plt.xticks(np.arange(0,22,2))\n", + "plt.yticks(np.arange(0,1.4,0.1))\n", + "plt.ylabel('Data/Theory',fontsize=22)\n", + "plt.xlabel('Combined Energy (keV)',fontsize=22)\n", + "plt.legend((r'Fit=$\\frac{erf}{2}(\\frac{(x-\\mu)}{\\sqrt{2}\\sigma}) + \\frac{1}{2}$','Data'),loc='lower right')\n", + "\n", + "\n", + "ax=plt.gca()\n", + "ax.grid(True)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Minimize Chi^2 from 4 to 20 keVee to extract optimal g1 g2

" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "g2= \n", + "19.0 19.05 19.1 19.15 19.2 19.25 19.3 19.35 19.4 19.45 19.5 19.55 19.6 19.65 19.7 19.75 19.8 19.85 19.9 19.95 20.0 20.05 20.1 20.15 20.2 20.25 20.3 20.35 20.4 20.45 20.5 20.55 20.6 20.65 20.7 20.75 20.8 20.85 20.9 20.95 21.0 21.05 21.1 21.15 21.2 21.25 21.3 21.35 21.4 21.45 21.5 21.55 21.6 21.65 21.7 21.75 21.8 21.85 21.9 21.95 22.0 22.05 22.1 22.15 22.2 22.25 22.3 22.35 22.4 22.45 22.5 22.55 22.6 22.65 22.7 22.75 22.8 22.85 22.9 22.95\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:33: RuntimeWarning: divide by zero encountered in true_divide\n" + ] + } + ], + "source": [ + "Fit_min_keV=array([3,4,4]) # normalize the histograms above 4 keV\n", + "Fit_max_keV=array([16,18,20]) # fit histograms to max keV. Nominal is 20 keV\n", + "Chi_hist_min=1e6*ones(Fit_max_keV.size)\n", + "Chi_red_min=1e6*ones(Fit_max_keV.size)\n", + "g1_best=ones(Fit_max_keV.size)\n", + "g2_best=ones(Fit_max_keV.size)\n", + "\n", + "g1_range=np.arange(0.08,0.11,0.001) #scan g1 ... use 0.0002?\n", + "g2_range=np.arange(19,23.0,0.05) #scan g2\n", + "SE_size=SE_WS #measured in Dec trititum data\n", + "sigma_SE_size=sigma_SE #measured in Dec trititum data\n", + "\n", + "Chi_red=10*ones((g1_range.size,g2_range.size,Fit_max_keV.size))\n", + "Chi_hist=1000*ones((g1_range.size,g2_range.size,Fit_max_keV.size))\n", + "\n", + "E_step=0.25;\n", + "jj=0;\n", + "print 'g2= '\n", + "for g2_scan in g2_range:\n", + " ii=0;\n", + " print g2_scan,\n", + " for g1_scan in g1_range:\n", + " \n", + " E_com_test=1/73*(S1/g1_scan + S2/g2_scan)\n", + "\n", + " n, bins = histogram(E_com_test, bins=np.arange(0.05, 25 + E_step, E_step), normed=0)\n", + " bincenters = 0.5*(bins[1:]+bins[:-1])\n", + " nTs, binsTs = histogram(E_com_Tsim_NEST_MAX, bins=np.arange(0.05, 25 + E_step, E_step), normed=0)\n", + " bincentersTs = 0.5*(bins[1:]+bins[:-1])\n", + "\n", + " for kk, minE in enumerate(Fit_min_keV):\n", + " norm_real_s=sum(n[aLib.inrange(bincenters,[Fit_min_keV[kk], Fit_max_keV[kk]])]*E_step)/sum(nTs[aLib.inrange(bincentersTs,[Fit_min_keV[kk], Fit_max_keV[kk]])]*E_step) \n", + " diff_hist= (n[aLib.inrange(bincenters,[Fit_min_keV[kk], Fit_max_keV[kk]])]-nTs[aLib.inrange(bincentersTs,[Fit_min_keV[kk], Fit_max_keV[kk]])]*norm_real_s)**2/n[aLib.inrange(bincenters,[Fit_min_keV[kk], Fit_max_keV[kk]])] # (diff/sigma)^2 ... where sigma ~ sqrt(no)\n", + " Chi_red[ii,jj,kk]=sum(diff_hist)/(n[aLib.inrange(bincenters,[Fit_min_keV[kk],Fit_max_keV[kk]])].size) # devide by v to get red_X^2. The two hisotograms are nomalized above norm_keV\n", + " Chi_hist[ii,jj,kk]=sum(diff_hist) \n", + " \n", + " if Chi_hist[ii,jj,kk]< Chi_hist_min[kk] :\n", + " g1_best[kk]=g1_scan\n", + " g2_best[kk]=g2_scan\n", + " Chi_hist_min[kk]=Chi_hist[ii,jj,kk]\n", + " Chi_red_min[kk]=Chi_red[ii,jj,kk]\n", + " \n", + " ii=ii+1\n", + " \n", + " jj=jj+1\n" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 0.86234909, 0.90076005, 0.89024017])" + ] + }, + "execution_count": 52, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Chi_red_min" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[array([ 0.1 , 0.1 , 0.097]),\n", + " array([ 20.3 , 20.05, 21.55]),\n", + " array([ 0.79452055, 0.78473581, 0.84344423])]" + ] + }, + "execution_count": 53, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[g1_best,g2_best,g2_best/SE_WS]" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "Chi_red[isinf(Chi_red)]=max(Chi_red[~isinf(Chi_red)]) # clean up inf\n", + "Chi_hist[isinf(Chi_hist)]=max(Chi_hist[~isinf(Chi_hist)]) # clean up inf\n", + "Chi_hist[isnan(Chi_hist)]=max(Chi_hist[~isnan(Chi_hist)]) ####\n", + "Chi_hist_diff=Chi_hist-Chi_hist.min()*ones(Chi_hist.shape) # Chi_diff to get 1,2,3 sigma intervals" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "savetxt('/global/homes/r/rknoche/iPyNb/Analysis_Code/Run04_CH3T_G1G2_Kr2p22/Sep2015_CH3T_Kr2p22_g1g2.txt',[g1_best,g2_best])\n", + "savetxt('/global/homes/r/rknoche/iPyNb/Analysis_Code/Run04_CH3T_G1G2_Kr2p22/Sep2015_CH3T_Kr2p22_Chi.txt',Chi_hist.flatten())" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "Chi_hist_diff=Chi_hist\n", + "for ii in [0,1,2]:\n", + " Chi_hist_diff[:,:,ii]=Chi_hist[:,:,ii]-Chi_hist[:,:,ii].min()*ones(Chi_hist[:,:,ii].shape)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# calculate the chi_diff to n_sigma\n", + "conf_to_chiDiff=array([linspace(0,40,10000), 1-scipy.stats.chisqprob(linspace(0,40,10000),2)]) #1-chisqrprob\n", + "sigma_to_conf=array([linspace(0,8,10000), scipy.special.erf(linspace(0,8,10000)/sqrt(2))])\n", + "chiDiff_to_sigma=array([conf_to_chiDiff[0,:], interp(conf_to_chiDiff[1,:],sigma_to_conf[1,:],sigma_to_conf[0,:])])" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "Sig_hist=interp(Chi_hist_diff, chiDiff_to_sigma[0,:], chiDiff_to_sigma[1,:]) # get the sigma contour from 2D X^2 diff" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "savetxt('/global/homes/r/rknoche/iPyNb/Analysis_Code/Run04_CH3T_G1G2_Kr2p22/Sep2015_CH3T_Kr2p22_g1g2.txt',[g1_best,g2_best])\n", + "savetxt('/global/homes/r/rknoche/iPyNb/Analysis_Code/Run04_CH3T_G1G2_Kr2p22/Sep2015_CH3T_Kr2p22_Chi.txt',Chi_hist.flatten())\n", + "savetxt('/global/homes/r/rknoche/iPyNb/Analysis_Code/Run04_CH3T_G1G2_Kr2p22/Sep2015_CH3T_Kr2p22_Chi_Diff.txt',Chi_hist_diff.flatten())\n", + "savetxt('/global/homes/r/rknoche/iPyNb/Analysis_Code/Run04_CH3T_G1G2_Kr2p22/Sep2015_CH3T_Kr2p22_Sig.txt',Sig_hist.flatten())" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/anaconda/lib/python2.7/site-packages/IPython/kernel/__main__.py:2: RuntimeWarning: divide by zero encountered in log10\n", + " from IPython.kernel.zmq import kernelapp as app\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAqsAAAH5CAYAAACmtXeQAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsvXmcbUdZ7/2t053u080JhEECJCAq4AVRpiAiIIngwHDx\nFUU0KA4MVxkU1IuiiEFR8RWRSfC9gDJ4FcLgBV9xAgwxIhBBQWUQmUKABAMEOOlzutOdun/Uqr1r\n166qVbVW1Vprn67f53NO916r6nmetXf33r/+rWcQUkoqKioqKioqKioqpogjYwdQUVFRUVFRUVFR\n4UMlqxUVFRUVFRUVFZNFJasVFRUVFRUVFRWTRSWrFRUVFRUVFRUVk0UlqxUVFRUVFRUVFZPF+tgB\nnKoQQtQ2CxUVFRUVhwpSSjGUrzOEkF8qZ/6TUspblzNfkQJRW1eVgRBCynOsg/sdDO122JPip7T9\nSH8X7MAF2/5t1/bwud8nXuBEl+eoQZ+4AU44jj0XeFKb335ugX4vs4Yr/hTkuI6XAI8xHveNyYcc\nz5dGjut2IebaXwM8PNJeiThzvz45XxdYjO/NwAMz2y/12mvkfj5M/ALDklUhhLygkO0LGPZaKsKo\nyuqQsJ/tmHeNTeP7WNJk+mnzsWk9jvGRYj+HP+A067lLIYHr1t5U8rplxJxKXPvEDbBlPY79ID/N\netzlA7DPy6xhxt+FhNjXAf0/zLs+p23o8uvtQ47Xz4Xc114iztwx5vg5NmHG5/r57IsSP/MmXB/6\nJQlsRUUOVLI6JlI/3YYglqnkuO8ntPY3IAnsQ163rNegD3ntorpuoZ7yLdI+xPuSihwfcLlISG6C\nZMelkZMkQV7yCtMkhqXJ69SIK7h/fnKrw0MT2FUir77f34pTC5WslkTqO2MfYgnthG9ochzrBzh3\ns6O/Bn1IYC7yOpTq+q3at3Es9cMxt/KqkfLUlyKvsHg9d+1ot6TCB/0JQSlieFfm156bvEK/OHO+\nJjn+APt6z/FVJ7BVfa2YGmrOaiEIIaT8lsCClN/8IXJdU330yOMcLHe3Qd+80a45r31yXaFf3FPI\nFe374Zbzw33quZUliEDuay6V65szzlXIRzZRKl4TpXJgXc/JGDmrv13I9tDXUhFGVVbHQorM0uXe\n1RRVV5evUtdjoG/eqKm8jpUyAGlx584VHSPnNaeKNvXcyhK3YUunS+QiWjnjLKVolrpNPoYCW0p9\nHUt5rSTmcKC+ziWRko8Z+8ne9f5Mn1zUEikJLj+xvvr4I1/KwJCFWtA97hwkI3fO69TIK+Qlc1NL\nGYDDSV6hTJwlb5OXJrBDkdeKipyoQwGGwKb1rw3rxr8YrJO2JyWWLvHYPmL9dPVl+0vAaeuL/1Kw\nvr74LwVbm4v/UtE1ZlAfhua/LjjN+peK1B9ZF+zr6FtoYV9Tn0rv3LHZz1cOYpDrWjVyX7NGyThz\nosRrpFHquYW8P/djwBV/jn8uCCFuJ4T4YyHEB4QQVwshrhFCfFAI8btCiJvFxiyEOF8I8Q9CiP8S\nQnxZCPFvQohfEUKc7lh7fSHEC4QQlwshTjRrfzJg+4GN7eNCiM8LIS4UQtw6Nrapov4xNAZSVM4u\n91JLtq7KoYSuiOoK3bsM9FFdIU15Has91kIM1uMxlFcoW90+NYUvd2X7EKkSMO3XRGOK7cxslFK2\noZz6egrgbOBmwBuAy1Ev6TcCjwUeLoS4s5TyqpABIcRvAE8F3opq53otcC7wDOABzGtoEUKcBrwF\nuBPwfOBDzZoXCSFuKqX8Ncv2Q4HXAv8M/DxwA+DJwCVCiHOklFf0uPZRUQusCkEIIeX9mgclmvR3\nedcrXUTV9Z14yMEEIxU99RlMMOZQAsjzIdjnwy7nB3yuD/SpFy+tQsEW5L/ukqRq1Yq3YPiiuJ9j\n+AKr5xey/dPEX4sQ4vuBC4GnSCmfHVi3BnwJ+ICU8putc68CzgfuIqV8f3PsccALgSdIKV9krH0d\n8GDgtlLKTzXH1oFPoj7lvkFKeaI5fifgPcBLpZReRXbqqMrqEOiqdIZISpc/2afac3VFVFfonje6\nqqor5Fdex+jxqrEqvV4PQ84rlO/zCuUGKsDq5b9ONa+4DybSZ/Wy5usNW9adhgr5Sse5zzZfrzGO\nnd88fqm19rnAQ1HD5jQ5vi9wc+BpmqgCSCnfJ4S4CKX8Pl5KedAS4yRRyerQKEFcbbsxtqc4kMD2\nU7rDgO0v0WcO4gqrNVEL+n8AlujxWslrGKtKXmGagwo0avcBhVXLc+0LIcQmcAw4CnwD8CxAoibw\neiGlPCmEuBj4biHEU4DXo17e84CfAl4lpfxo40MAdwHeI6Xcs0y9u/F3d+PY3Ztj73S4fmfj43bA\nB+OvdDqoZLUkNsmnjpau5p+i6jp0hwHb54oNJYBKXjUqeQ1jCPIKq6G+5lYFh+g+sCq5r0NgJBLz\naOAFxuOPAz8spfyHiL3nA69AEdxnNcck8Ewp5a8a626Ienk+bRuQUu4JIa4CzjIO36L5urTeOHYW\nlaxWOFGimGrViWsXH139dPVl+0vwOVZfV8jbHgvGJ69diUQJ8jqlPq+rQF5h+i3CwK8KlkofOKyp\nA6cY/gxF+o6h1M+HADeJ3LuHIrevAP6yOfZ9wK8IIXallL/ZHNtuvvreyU8aa9rWn7TWrBwqWR0S\nKeSnC3Fts2nbbbPdZX2OEa2roLom+MzVYQCGVV1hfPKai+TlqJzPSZJKktepK3lT7rBgohSJLRXz\nUKkDpyp5/VDzLwZSys8An2kevkkI8QbgUiHEtpT+oVpCiC3gH4F/klKeb5y6UAhxHfAMIcRrpZQf\nAXaac77mhkeNNbSsP2qtWTlUsjomUouppnB7vqquvX1OYSgBTIO8rmrKwJQLg1ZJySutOEP5iVBw\nuKdujU1ecxVY3aX5p/HGhL1Syn8VQvwz8DggNAH2YcDXoaa52ngt8APAvYGPAF9EPb1n2QuFEBso\nJfci47Amz2cBH7a2aBuuFIGVQCWrJZE7J3VqRVFVdXX7HKGvK/QnrzB8zuupku9a4gM8F5FbJTJU\nOm1AY+ojTVfpD46JVONPAVvAjVrW6LzSNce5dUA0X5FSSiHEe4G7CCFOk1KaP1b3aNZeahy7tDl2\nT+Btlu17Al8G/iPiOiaJSlaHRO6c1NJkceopA6XbVa3wUALo1tt17IKtvrezc5CdEuQVppU6sEpk\naBVaZtlYBfIKZXNfh8KQnQiEEGdKKZfaTgkhzgPuiEESm4lWNwAuM1pJfQBFKH8UeJ1l5sdQhVYm\nAf1T4F6ooQO/bxx/EurH6kLj2NtR7a8eLYT4PSnlThPHnVBtrV62qm2roA4FKAYhhJQPSdgQ8w5R\nukl/iv1U213eAYcYStBnSMAIgwn6NPnvM5hAo8+AAugX/9jDCTQOw5ACWJ0m+Ks2CGCVXitIe70e\nw/BDAV5fyPb3sXwtTW7qzVGk9JOoXNC7AT8IHAfOMxr6vxx4JHCulPLi5tgR4B2oNlOXoCZhaXf3\nAi6UUv6Q4e+0Zv03oboPfBB4EPA9wK9LKS+w4vt+4NXA+4GXoMjyk4AD4Bwp5WdZUVRltSRSJJoY\nxbC0Mtq1ACzGdt/b+VNLGbD9jdDbFQ6X8jqFsbCQ9/b3VFtlwTBq3lSVV42pK+QaJVMdShbbrSD+\nBEVAfxj4KpQS+kngxcCzpZSXG2slcJ25WUp5nRDifqhxqw9l3p/1I8BTgN+z1l/brH8mihDfGPgo\naqLVi+3gpJSvE0I8BHga8DuoT5e3AL+4ykQVqrJaDEIIKR8aWBD7G5/yzlBSiSypunbZcyqOgu3j\ns0Hf8ap91dcxlVfo/wF9qiqvMP0RsRolyFDpCUtTfp00hlBfx1BWg134e+CBDHstFWFUZXUsxMoL\nXYu0IK/yWlJ1tfdMRXW1/ZT21cdng5w9XmH4jgN9OiXAqVOwpZFT3TzMVeyrNAhgqOEKUDb3taIi\nJ+rPWEnEko7c6QIu/7mLlw7jKFjb1xBdBrr6bDAl8jr2dK2ppA3A+BO2NFahddSqdB0wUfJ1mnqa\nw9A4bKNeDysqWR0SXar8V011XcXerjlU1665rin+bJ+pfhmXvE6p0wCMR15heuNhNVYh93WorgNQ\nZorVlHryujC1PqoVFVDJ6ngo0Z5qKPKa026KbXttzPqhlNAe6mclrwqVvM6Ri7zCtMbEwjBts3Ll\nvQ7R97XUyNhS42KhEtiK4VHJakmUIHhdiV2pTgBT6u1aIl0g1YfLT4ov21+sT5/vEcnrmPmuUMmr\nRsl8ysNGXmF1eqgO2SVhTPJaSczhQH2dh0KJ2+qlVNeuMZRoFVWKnNuxlBwFa/tK8Wf7HNIv+UbD\nwuEr1oLDR15hmuStZPP70oVrpcgrlFVfKypyopLVsbCqqmvuLgClCrVKk+guPvr6c/lN9Z2x0wCM\nNx527GItqOTVh1Uo2oJhCewUySuUz38dApUoHw5UsloSJdTJsVXXkl0ASqmufUe0Trxd1WikmfGU\n17FTBqCS11isUhP8IXJfp0reNU4FAltx6qGS1aFQoo3VEKpraH1pQteVGI9NXG0/Kb5cPvv4TfW9\noj1ex04ZgGmTVzi1Ow7A6uS+rkrer4nSfWr7oLauOhyoZHUslFBIS92ujyF4pW+jdyGuuTsL2HHE\nxOLzFeuvr1+X79J9ZRv0JYBjkdccqivkJ699CcJhapcFq5P7ukrKs0ZVXyuGRiWrJVFCoexis81u\niVzQKUzTKj2MwI5lrJZVffz2IcwJvnMQwLE6DfTN1Z3FYD3uO10L+hGEVWmXBdMmcLkJ7FDkHcoT\n2IqKXKhkdUiUUCi7kMdcxHEqLayGUJRj1o/Vsmos1bWH7ykVa0HNeYXVynuF1SKwUySvcGr0UK0F\nVocDlayWhP5AdH0QjqmQliDEUymmmtIYWDsejdJ5r2P4dPkekABOjbxC/z6vMK76WpK8wuoQ2Nzk\nNXfaAJQnsLB6JLbi1EIlq0Mg5gN8zFZWJWyWJK9TSEXosl4jV97rEGkDY6UqsNrkFaarvkI3cpP7\ndvcQBHaK5HWIoi3In0M6pUEAJiqJORyor/PQSCWukD9/MxdxLNFhwBVDiQK0Nruptrus1xiavI6R\nNtA3RYJTj7zCOFO2YJots2A10gdyk+xS/V7HUmArKkqgktWSaCNzpdtZ5So8KmFziBZdOe2m2nat\nj9kD45LXsYrEOvieEnmFcdTXqZNXOJzqK+QlsKWGFWjUSv6KqaOS1aGQWlyV+zb4KrXHyhWDbXes\nPFrfnth9Q97C70kgpzKgAIYlrzCN1IFcpGmqhVuwmt0Hppg6YGKVW1HVLgSHA5WsjoFSxDWHva42\n2+yW6O1aOoaStl37SpPJLkRySp0GEv2fiuQVxlFfS5JXmH76QO7UgdzkFSqBrTi1UclqScR8WOdu\nZzWV9lhtdrv2dh0rBtt2KuGPsT+kEpqr1+qQ5NX2P6LyCtNIHVj1oi2N0ukDU8t9XZWBBTamSGBr\n7uzhQCWrQ6KNIORWNMcmmaXaSJW6tV8y3zXVvr2+pBI61q37FVZeoYz6CsNP25pa3qvGlPu+Qt7r\nHXJgAeQlsfU2fMUQqGS1JDbpRyRz5qYOQfBKFTNNoUVWm+3SJHGoyv+cBLJvsVZf/4kx5CavMHz6\nwJTJK0xHfZ06eYWyraKGILEVFTlRyWppxHx4jklc2+zF2ky1W4IQp8Zgx7FKxVpDVf73YQh9i7Vc\n/leIvML4ua9TIq9weEbGwmqRV40hUglyw5XXnQVTv/BDhkpWh0YbWUglrqF1q0Qyp9ZlIHccpZ63\nrvFAeMJarK8BW1Ut+U713zOGSl4b/9bjKZG6kqkDkJeoT63fqw+lOxFUVMSgktWS0M9uVzLZ5Vb4\nkN0AUuxOhTROgZjbtnMT19R9U+mzmsN/nxhGGLHqSh2ANBJrkte+Y2JzkFeYDqkr3TZrKtepMcSo\n1Kmpr6687yyorHxSqGR1CMS8Y6YQV58Ne92p0g2gFNEuFccU0iy67utLIEdUPnvHkMF3DvIH3RXY\nvu2ycsU/1dSBPrWELkydvGqUJrGVSFSURv0ZGwNt75i58k5XlWSWKtRqs901jpxtrEq3x7L3lWyP\nZfuK9Rfyneq/TwyVvBYjrzA+sSuhEE6VpPswhBJbUZEDlayWRI7iqlwjWUupa13bbeWw6bJbqkVW\naG2pTgCr0h4Lyo+EDfkfK+e2g+8cqQOwSF67pgxAf/IK0yCwuYhd7ir5qfd79WGIYq5c8KXSVJxa\nqC/zkGj7kE1NF3DZcNlqU11D61x+p1xUNRR5zXkrvZSqbNtu8zFG5X+JdlV9/I+g/PqqmWNJYJ+i\nralM2ZrF4zg2hb6vq9R1QKN0GsGUCWzFqYdKVkuir2qai7x2yXcNrcul9naxadst2UIqZL9UN4A+\n1xay29VHVzKZM3Ug1mcO/1NQfht0nVTVVXWFPOQVpklgpzoythQRLE1ip6K+FmtdVTEp1Jd5KAxV\nZHXYyGvJFlK2/RwpA644cl2bbbfNvu1jiDZZGmNW/af4nwh57Zo72rdVVq4RsTA9AjvVnq9QVsks\nRWLr2NOKkqhktSRCrava3tlykc6cpKgLeR26WKskeS2R72rHkOK/za7LfshHjoKt2D1jFk65/K9K\n2kKDscgrrA6BzaG+Qp7OA5C/eAvyqplD5cNWVHRBJatDIEflfo6RqrnVytxFQmN3L+hjO1eLrL5p\nCzGxlO44MFb1fa6c2yFJs8t/hzhypAxonCoEttTY2KmQVxiewE6SvJbqs1oxKVSyWhKbdOsAMIbq\n6rNj25p6ykBu8lUqHWHIoqox7XdZrzGW+jp2ykLPOPq2m8qhvkJZAjsl8grTaZ0Fw6cQTJLAVpxy\nODJ2AELhyUKIDwohTgghLhNCPFsIsR25/2FCiD8UQvyLEGJPCHGdEOJWgfXXF0K8QAhxeePv34QQ\nP+lZe1Fjz/53IIS4a9QFblr/bKxb/1xoO9/mI8aGbceHmHhj/cX6TPEb81x0tW3bz2Wzq//S19fF\nfu54csTn8z2UT9tvV4mgYxynrS/+S8X6+vK/rtjadP9LhX1NXa5ry/rXB6dZ/7rC/jHJpSbZ15rj\nmjVyXHcvuJ60HP8cEELcTgjxx0KIDwghrhZCXNNwl98VQtysLVQhxLoQ4g+EEP8khPgvIcRJIcTH\nhBCvFkLc2bH+24QQvy+EeL8Q4ktCiM8JIS4RQvygx35/zjJRTEFZfS7wROD1wLOB2wM/DdwZuH/E\n/scB3wy8D/hP4Ot9C4UQpwFvAe4EPB/4EPAA4EVCiJtKKX/N2iKB/wKeBAjr3MdaI1snrIp2UURT\nFdNTUXWN9Ztqs6TtFBmljzLaFodtf6xuCn33aIzRtipHtX+Oe8IjKa+QL31Ao0QLrdTrWpW2WRql\nVFiobakCOBu4GfAG4HLUy/CNwGOBhwsh7iylvCqwfwO4K3AJ8ErgK8CtgB8H3iWE+C4p5UXG+t8G\nzgL+DPhX4HrAw4E/EUKcJ6X8H5b9fpxlwhBSyvGcC3EH1AvweinlDxjHn4Aik+dLKV/dYuNs4DNS\nyuuEEC9AkdevkVJe5lj7OOCFwBOklC8yjr8OeDBwWynlp4zjfwd8tZTyaztcm5QvtQ62vbu0vUG3\n7Y959+rrI8ZGrJ3cPrv4Lmm7lN2pXF9p2333aXQhk2P4zBlDT/9di5xs9CGwNrqmEGjkuqYcRK7E\nrfOMT/USYq/5boCU0iZJxSCEkNJ7H7Wn7cvir0UI8f3AhcBTpJTPTvYlxJnAp4C/kVI+2Dh+H+AS\naRE1IcRFwH2Ab5RSfsA43pmzTB1jK6vnN1+fax1/CfAs4IeBIFmVUl6e6O8awKaRzwUeivqLZekH\nTQghgGNSyq8k+FpGm6LVt+/qlFTXFPUuZm2pwqc+ttvsj12s1TeOsW379qXshWHycnP4zBlDT/+l\nxsRCvhzYqYyOHbvrgEbfX5MQptJT1YlpFFhpceyGHfdfBZy090sp/96z/nUosnpH4AP2yWycZUIY\nm6yeA1wHXGoelFLuCiH+Bbh7LkfNi3cX4D1Syj3r9LtR8rnL31nAcWBLCLED/DXwS1LKD7c6DRHD\n3MRyrA4DMXZSPnRz34Lv8oFfimQOUayVM46+tnOmI4T2pu6fAnmN9Zsrhj7dDsjbYsqX8zr0AIMp\nkVcYjsBC/jZakyKvA0AIsQkcA44C34AS1yTw5sj9R1DEdB24JfA/Ubf4/yIyhFs2X690nOvOWSaM\nscnqLYCrpJSu38lPA/cUQqxLKXP8gXhD1O/Yp+0TUso9IcRVqBfZxMdQuSXvBw6Ae6Dya79dCHFv\nKeW/R3vvS+hSVNe+xNVlP8aGbWeovq6xfl022+zatkP2SxG7IclrqXzXEi2yQvtLE7kRc069McTG\nkYM4k4/saeQeYNCXvMK4XQegXAP/3CrsqAMBxmExjwZeYDz+OPDDUsp/iNx/e1QKpMbVwG+hSG8Q\nQohbAI8BPoriJybycZaJYWyyuo3/bfKksebLmXzR4m+hA4GU8lHWmjcIIf4cuAh4DvBdQY/62e3b\neipVFZ1iukAOdbJLoVYJ1awEySxJ7IZIXUixOwQhzFE81WdE7Bjk1Y5jqEK1Br6K/FwK7BijY6fU\nMstEif6nOX6EDxH+DPggSl29C/AQ4CYJ+z+OKiDfAG6DSnm8AUqp3fFtEkJsNb6vBzxYSnlgnu/N\nWSaMscnqDvBVnnNHjTW5fIE/wyX4Q6IhpbxECHExcJ4QYlNK6X0LvOB18+/PvYP6VyRXdRXSBUqo\nk11yXUO+u8RQgtyVjnnsvNuupKyPHNQ3HWSMXqu5ldcxUhfIR2JPVfIK/QnsECkErkt9d/PvVMBF\n18BFkWxDSvkZ4DPNwzcJId4AXCqE2JZS/nbE/h3gbfqxEOKPgPcCXwc80LWnST14I6qbwCOllO+I\njDWas0wZY3cD+CvgfsC2nQoghLgEVZ1/ZoI9bzeAJmf1OCpn9duscxuo94vXSSkfHuHnD4EfBc6S\nUl7hWSPlG5oHfSvw++wv3WEgR3eBGDup9kpV7ZeyXbIKP9V+7tcs1X+ft9IhOw6MXfHfN4Yc0lnm\nj72+qQR9ug/07TagMaWuAzZydyGwL/UOjNANYKk7aSbb/5J2LUKIfwRuIaX86k7+hPgt4CnAbaSU\nH7fOaaJ6f+AnpJSvTLTdylmmjrGV1UuB70D1SZ3lejQvzJ1R0nUWSCmlEOK9wF2EEKdZ5PgeqJ5k\nl7p3L+F2qN/TL0StTlVOYfFdoE++as5c1772fT5i7KTa66Mehvz3sT1WFX6q/dyvWap/372PLikd\nbb58+4bK/czd6SAlhhLqb4p/B8acvpVr4lap3FeNKeXAjk0gJoYt4EY999PYmJFVi6g+JpWoNkjj\nLBPE2D9rrwF+CdXA1kxMfizqhfvf+kAzHeIGwGVSyq6/r38K3Kux//vG8Sehfl8vNPxdHzgupbzO\nNCCEeBDwrcBfOLoKLMJHBGPe4EMfniGS0Idcxnxg50xJ8Pmw7fhspdibQsV8qSECqbZd9qdMXn32\n23z4fMX4y5HzqjH27fs+ubc5/HeJo8HYo2NLEdg+6uuqpBEMhgFZjBDiTCnlUgW+EOI8VBsp89b+\nEmcRQtwE+Lyjb+rNgB9A3f39d+P4BvB/UET1f0gp/ygQW3/OMmGMSlallP8mhPh94PFCiNej2j7c\nAVW9dpGU8k+N5c8CHgmcC1ysDzZNc/Vt/XOar08UQlzd+PgNw8ZLUJMiniOE+BpUgvSDgO8Bft1K\nHTivWffnqAq7fZQC+wjgc8CTky62pEKZi7x2UUX7qLqxPmJttcUT8tu2fgq5m6VyTVNtl7i+oSvb\nS3dYMNGXwI5JXnP498XRIZaxySuUyX2F6RPYlSGvZfFiIcTNUaT0k6hal7sBPwh8Cfh5Y62LszwC\neJIQ4s9Q6ukeaurmI4EzgEdJKU8aNv4EVRT1t8BJIcQjrHjeL6XUXQXycpaJYWxlFeBnUC/aY1GJ\nxVcBzwN+1VonUT1ZbXw78HTr2M8ae2ZkVUp5rRDifsAzUT9cN0a1f3iClPLFlo0Po9ICHgScifrd\nvRx4EfBbUsrPtl5Z6E1+qFv/pVIGXPtzFFnlJK9TqJqfCsEsZXvIGNrsd/Xj8pVKXmP2mBjz9v1Y\nLbNiYoGkePqSvhxDC6aWPqCRm8BOVn0dlsX8CYpY/jCqOFyiSOuLgWdbQ4pcnOXvUeT2QcDNUd0A\nrgT+BnielPJd1vq7NXbuj3v8/DOYt8Dqz1kmjFELrE5lCCGkfCvhN94+xU1d7faJp08xVcybbswb\n/FgFWyV8p/pPsV2yYKvEc5YaQ1cfXX0NWbil0bfgZ0zfff1rZIgjR8FTjrGxUyvg0shZyPU1jFBg\n9S2FbL9z2GupCGMKyuqpjVz9UHPlnnZVXdv2tu1PbTPVV6ksUdhUOnczVTUcK+d1qDZZbXF08eHz\nlVPFzrEPxr19X6p4bIQ4cuSLTiV9AKavwFZUlEAlqyWhn139RtL2xpuSNpDj1n8fIt0nTSHmQzTn\nbfYhiFiJjgApdttsu+znIo6lyKsrjlONvKbsXfXcV18cqbH0jCMH2ZtS+gCUJ7CTJq++gr6KUwqV\nrA6BEgppjoKrrjmy9l57f+72WLZ9l49YXym2bHshmyVU1xS7pW3b9sdQXu0YYmJx+Uj1U7Jllmvv\nUMQtN3lN9e+LZYQ4ShDYHOorTIPAVvW1YmzUnNVCEEJI+U7jgO8Np0+eaJcc0aHj6JMjG7umzU+q\nrdz2SuZtTsF26fzPkvm3XXwMmVubY2+fXMkp5J1OIQZOvdxXyJ//ejNGyFm9XyHbb605q1NCVVaH\ngk+pSekKkKJ2pt7675OvmqMzgc9vzhzVFPUmZ/5sV79t/vvazqVIllZ0p5Y60FXN7KNkrqr66vK/\nijEw3dxXyKu+Qn4SW1HRF5WslkSOW+459vUhrvaetji6EtcYv7Frcre1ypk/WzKfcuhb6rHPV5vd\noclrWzy2jxL2bR8xfnLtHXtogCuGlDimEAPTyX2FvAQW8g4xqKjIgUpWS2Kd+ZtojhzTrvv6ENe2\nGEJ7+xBdHHwzAAAgAElEQVTXtv0pa3LnWnaxF5vrGlrbx38X2yn2S9mNsV+6oGqIgi2Xn1hfrr0D\nFiwVIY9TiKFDHCXUVxi3+wDkL+DKilpgdShQyWppxJBG+1zutlRtMaQopyF75t6uqQKuvfZ+l43Y\nNbnJWM7CL9faXP59tnORzFLFWl3sD0leYz+wuxKxVew60Ne/HcNYXQfsODrEkovkmQS2a95rafUV\nyJNfXFHhQCWrJbFJ/ur+WNUzhbiWqPTP1c/VtT/Ghr2mj69Yf7a9XMQuZc9UOwKEbOeo8C9JXkur\n120+Qv5WIXXA5z82hlJdB2L9Z46lxNQtmEb6wCioLOZQoL7MpZGjNVXfvNWuimuq/y4x5yCUsR+C\nuZTS3MSxy4d4F/LcFkdqLH2I8ZiFZqnPd0kV2OUj1k9XXzn25iKQXWMo5T8lBl8sHeI4lfNfKypy\noJLVkmgjjhr6jcD3xp1CHn32uhLXVP9t1xLa49rniicHoYz9kMpZrJVCelI+REvd2k+1P5U80Ckp\n113jyVW0leIz5617E0NV/ufw74ohRxwZCOxY3QegEtiK8VH7rBaCEELKy+jW17TLHt85l62UtW1+\nu9hrs9n2JhjzhpvDRsy6mDfsWF+pb/65rqFPHCm2S11fadup67t8iHfN9etDGLr6zJGX2DXuXDmR\nfYnWmM+BgVxFTjn6vwJsXzNCn9WHFrL9htpndUqoymppxCqP4FdfY9TKlNzV1DzTFJUyR95qmzKR\nQ33tkjrQxU+MDZ8tn71Uu31ue7fFkaKElcynHbLXa4mc1DHyOcco3tLIqRx3IVq5e792iWMC+a8a\nuVIIKipKoZLVknB9GPTN+eyT89qVuHb16/PdZs+22ba/LaaY/bFx5C4O89nx2fPZtO2m5m3mSh2Y\nCsEsaXuonNSh8zn7ELAxcz+nSmDHiIFDSGBr66pDgUpWS0I/u6Hc01QVtQuJ7EJczbVd/fp8t9lr\ns1liv8uGbScll9fnp0/Oa0mbpYqOShHzKdnO0RGgNJlcRQLbp3CpFIFdtRgaHDoCW3HKoZLVIdCV\nREI6efXtSSWuIZ+hOH0+Uu2lxNIWT8z+VBtdUgZifKTYctnMWdQ0hcKqVbXdN5a2eHx+Ynz5fA6h\nZI4Rb8h3in9XDKlxTCR9AMoS2IqK3Kg/ZgWxb72prMeSSPN4XyLZh7h29enza+/pQ0Bzk9c2G13I\nb0ny2teey2auvM1SOa8u26cqeXXFA2UJ7Kr1f51K+6pTgUQ3mPSkKh8qizkUqC9zQRw0z+5a88vu\nJK85VFd7vW9PKnHt6tPnt23PmOS1zUYO5TaG7HUlTCVUz5DdPkRwVQhmqeeuy3qNodXQKfR/Tdk/\ndv/XqcSQMY6VJLAVpxxq66pCEELIL+1vsLm7t3RuzfGLvu56E/G9IfiOp7SeyuEv1WfbnrZ9XW22\n7e27P0ebrNg3/9gPm9z2Uu2O7X8I+6Vj77pn6LZQY7ShykGWxm5flaF11SSehwbX7sPGl0ZoXfXo\nQrZfWltXTQlVWS2M3c2N2feauB4Yz7pLdXWmC0BaygCEldSUzgAhBa9kvmsojhSbbXtd+0NxpaQL\nxPiOXWP78vmz7aXcsk+pms+hHPat2m+LY1U7DvTZkyt9YJVyX3MULsGw1f85lM+J58BWVORC/fEq\niIO1tdn3awcHC8QVFHk9sF6Btf3EXNfQ8VhC2pW4hvyZtkrtK33bPoaI5043SFmT01+KvS527fWx\n19MWQ2ocUyavbfZT4zFR+nkN+RqCAOYgbTBO7CH/qTFMKY6KioyoZLUgdtlgk0ZNtYgrDKC6liCu\ntt0xyav9JtyHRMYqr6kdAlLJZN8c0Zjc0CmQ11iFNjWG1DhKKctdbNv2Y3zkzO8sQa67+An5HCr3\nVSNn0VkX/31jmFIcpVBZzKFAfZkLYxdLTWUvP3GF9qIp83gf4hqy23ZuVYq17P0xscT4bNsfayOX\nr1Sfts1cdksWPqXaL1lUNQR5de2J3TdUfC7SU9JfaH8XO6dC79Ucz4MrjoqKQqhktSAOjKd3rXkX\nMMlrTuIKHdMFuhBXc629PuTTPtdFQc2hurrO942lC/HMeQs/h8Kb6rOP3Rz5rr4YUuJItV2SGHex\n3+ajz76hyOtY/nLZmQJxnEoHgjFQCfOhQCWrBXGAIqJrHCwQV3VsP0hcYTnP1UVcoVBrrDbiW5q8\nllRdY86n5qvmIJ65buGnqq45fKba7Xu7OyfRmgp57WLf5SPGj2vf1MlrjM9cymXO9ArIQxxTYsgV\nR67ns6KiJypZLYi9hoxusNi+ykVe7fcQF3m1C7TAXaQFgUIt14eH61hM7qpeC+E3xi7ktW9P2bY9\nsXHYdrvm3dp7c+x32bDttPkxkdNnyG4OmyVvwafYLqnquuyXzJfsGxt0I5Mxvlw++zwXqX59diqB\nTY+hoqIDKlktiH002VwkmbnIq6vDACR2GWgjrzZxtQPscpu/JHlNUTtj48iVs1q6vVasnT5kLLf6\nmjMntMR1+WxPJe+1zX7IV27yCsOS6ykQr9zKMQxf/Z8jjjGZRGUxhwL1ZS6IPTbZYNcgrRrlyCss\nK7CdyatPdVUBLKKL+ppKXvsS4bYPt5SUiVAMPnu598fYcNmJSR3wretKXmPthWym2PWtH0MhHTp1\nIMaHy0+br6HyXn3+uhZvDUlgc6iOfcljjhxYVxxTqPyvOLSoZLUgDlhjL+rdswx5he79XZ3EFeLJ\nqxlkX8Lb5tu2lZK7mqrYjn3rP4f6GvuB2iX3NQfBK0kcp6CQlk4d6OKjq68cyjCUzX8NFeAM0Yaq\nFHmEYTsR1NZVFSOivswFsayoKuJpElhbeV3nYJbrOl+TTl4hPnXAJq+txBX85M08F0NG+6ilOfNd\nXTHEpBr0JY+lUwdibMTa6eLL5y/Wns9uLuLYJ4bUOMZKHfD5aPPj8lWicAuGLSwL+Y31ncN/DhI7\nRQJbUVEAlawWhCKl4XeOZeV1cX0X8upqkwXxHQdCxBVayCuBczFFW6lqaZ+UgRz+QzG4zveJp21v\nDv+xcdhrchCxKRDHvkrhVFIH2uwP6WdMZTjWXw7fufz3JbFjE9iKigKoZLUw2sioCVt19a/fML7b\nm7XI0jZs1VUd328lrzHEFSLJK4RzPlNV1FIpA6atWP+p6maf3NW+ea8uGyXIa5/b4H3zXlPtumxP\nIXUgJ3lNtT+kn1y384fM4RybwPa1k5vATom8VnX3UKCS1YI4cKQBhFIAbLjI6/IeP3E17bT1eQXY\nXJsrtm3EFRKHE0B8wVZqpX/f2/Wpeas51M2QKtnn1n+JvNc28tr3FvtQuaGlyOsYMeRqG1WiQCrV\nz5BpDTn8+vznqJ7vq8KORcCnRF4rTklUsloQTiXTIJMpqqtrT4i4zo8sE9g28hqjuELicAJoL1ga\nSnVtO9eHOLv29YnFZT9ku0vO6hB5synrSt3iL5kXOkQMQxDLVB+l/ORSX2E4AluqE0FKDGMR8DGZ\nxIC+hRC3BX4E+A7g64CjwEeB1wLPlVLuRNo5H3g8cDvUs34Z8JrGxleMdfcF/s5j5v+XUj7EYfuB\nwC8Dd0K9gm8FniKl/ERMbFNFJasFEVPBr9FWeAUqf9VHdl2FWmrNcr5rG3k142wjrpBGXqOJq3m8\nhOpq7+nj27Zl78sVi892StqAvb+Lapqy32cjZZ3tM+Q7xe4Uug4MSV7b7Lt8DOGnS9FW7D4o0wpq\nSALbN4ac8U+h+n9c/ATwOOBNwB8D1wLnAc8EHiaE+BYpZfBZEkL8BvBUFIm8oLFxLvAM4AHAtzq2\n/X/A31vHLnfYfiiKOP8z8PPADYAnA5cIIc6RUl4Rc5FThJBSjh3DKQkhhHyj/M6FY8uFUfN3jE1H\n0ZSNDeOdYt04b6/d8LyjrDtt+v2uWe9oSzEeLNuDOXm1sWa9Qa67wvS9ibqOh94SfHZ8e0Jv3qm+\nY2y22Wjbm3p9sbbb9vfZG2Ojz9oS/lM/nGNsl/Lf5VZsF/LR9ZZvidcn517oR8bG9N3Xf5+9Rtzi\ngyClFD2sJUEIIeVvF7L9C8vXIoS4K/ARU/1sjv868EvAE6WUL/LaFGIN+BLwASnlN1vnXgWcD9xF\nSvn+5phWVn9MSvnKYLxCrAOfRL0i3yClPNEcvxPwHuClUsqfbL/yaaIqqwXRPgxgjiU106F+7rVK\nWr4iLb9SuxeR86rsLua4pgwlgMWc12jFFbqlC/jW23u6KJ0+37Y9l81QLCnx+GLqElfOlIMShVND\nFG7lzA2NsT1UwVabbZf9Nh9d/di+cirIob2p+8fM4wwVCpXuhFBCuT4FIaV8r+fUa1C33u/YYuI0\nYAu40nHus83Xa1wbhRDbwEFAub0vcHPgaZqoNjG/TwhxEfBwIcTjpZRulWniqGS1IOx2Ur5+qook\num/Da/hSBkwSaqcJuNZrtE3WMomrqzWWTVwB71ACmBPYpA4D6qLmCBFXFcgiuua6hnykkDXbZigW\ne3/XnNfUnNU+t/z75sr6bPns+db29Z/6Qd31uoYk5D7bXQqXShClWOLaxXbu/TnzOLsqmGO08qpF\nVCm4ZfPVRUJnkFKeFEJcDHy3EOIpwOtRz+x5wE8Br5JSftSx9XnAywGEEB8Bfl9K+Xxrzd0BCbzT\nsf+djY/bAR+MuaCpoZLVglhULUOwSaK/+AkWiWub2uoisG3kdZlI+1tj+VpiafjyXV15rmaaQO88\nVxXIHF0KpUJ+Xb7t8yGbqbHYe3PF1DUPN5W42vt9dmJjCa0fOj809rq6EvJcxNkVQ5t9l48YPy5f\nuQi4y3bIfu79udtYpfr3xVFaAZ4qeR2ZxQghjgC/gso9/ZOILecDrwCe1fwDRTKfKaX8VWvttcAb\ngTcDnwFuATwKeK4Q4k5SykcZa2/RfP20w6c+dhaVrFbYCFXq+8mrq6J/EXbKALgLtJZjiCWvpof4\nnq6+YQQ6Tk1c+3QXCBJX+7h5rgtBc+1JuT3fZjMlFl889r7U285d1dyu+2wMkTpQgryG7Nq2+xLy\nUmkDXez7/MT4KkXAXfZtdC3iit07hU4AlbyOhecB9wCeKqX8SMT6PeDjKML6l82x7wN+RQixK6X8\nTb1QSvkO4Hut/S8RQvwl8GNCiJdKKf+xOb7dfHW98ietNSuHSlYL4oTxc2EXQZkqJo50ALO4aZ8t\nY61aqQujXMRV+3YVae3hL8Car2knrjreGCwpw2uL+9pyXENIGkigj4c+WFJTBmI+YELxdSWvseTb\n3meviSXSufaF4nLZctkL2e2TI9o3P9VnO3cubV/VNxSDy36bj5CvMfKGY/y1+QztHUKBDfmPjWHo\n1IGx2EQmvxd9BC76z7Q9TWHV44E/kFL+vxHrt4B/BP5JSnm+cepCIcR1wDOEEK+NIL2/BXwX8KDG\nHoBum+V65Y9aa1YOlawWxFc4HVgkqpvNu4WZDwr6NvzWAiFV/xu31A0iO187J647rC9V8Cufi+TQ\nJrIhAhtOM+hGXpeKyRy5rsUIrO+47409lrzq9bMgPH585/uQ1y5kMTWNIhRLl9zdtrja7PnsppL1\nkF+f777pA6XJa2itL4ZQHF19uPzkSvvoW4zk8hnjt88+6N9GyxdDaQJ9CFTUc2+r/mk846/C64UQ\nF6CKql4mpXxcpJuHofqz/oLj3GuBHwDuDbSR1U80X29iHPtM8/Us4MPW+rOar64UgZVAJasFcTVn\nzAicJpE7bLHJ3owsbrLLGgczAqnp3vw2vq2qqrNahV0kruqc+n9OHGNIrElgfeS1fYiBO7khRGJ9\nxWSuTgOu/q4x5BUyEdg2FbdEb9W+HQ9c+0J7u5DXLgQtJq42m6GYQjZj1NcUnz6/tt2+6Qh9UiFC\na31xhGLx+WjzU6roLeSjzVcOv7mLuDSGKOYaI2d4xdEQ1acDfySlfEzCVp1X6mq7sw4I4njZ7Zqv\nZkHXpc3+ewJvs9bfE/gy8B/RkU4MlawWxFc4nQ12Z0RSk0FNMjfZY8cgiVp11eTV3OMisaayemAR\n0kUCC6YCq2G/J7kKt0zius/ags34CVxx7bHAXbAFy6kDEK++ru2z1G0AEgmsj7wSsIFjT2hfH/Ka\nku9q7usah20zNRXBF5dtK2TTZTcXeU1Z5/Lr8l0iHaFr0VbMelcsuVW4IbsCDK0q5iB0uYu5hk4f\nGAIDt84SQjwdRVRfYRU42etuhmrKf5nRSuoDKEL5o8DrrC0/hiq0utSwcSMp5RcsuxvABc3aPzdO\nvR3V/urRQojf09O0mj6r90UpwCvZtgrqUIBiEELIR8kXAnP1FJiR1zUOFlRXs1BKY9N4h1hs1j//\nXhPJ9Zl9/+ABc918v3u93SrL9uey1TbIIM7/so2Y1AZIG1JgDyiYxed6U7bXht7wfW/qOff4jrd9\noHSJoUscMbHE2ChhL8ZOCqHIGX+K35TbxqkEKXV96i3sUtfZ1UcOn31Vxb77h36ePP7EO0cYCvAH\nhWz/pHMowOOBF6Ca7z8duM7adqWU8i3N2pcDjwTOlVJe3Bw7ArwD1WbqEuANzb7vA+4FXCil/CHD\n37tRt/ff03w9C3gEcBvg+VLKJ1vxfT/wauD9wEtQZPlJwAFwjpTys6woqrJaEF/hGGaD/7WmEl8R\n1d2lPqY2Udyx1FV1bndmA1hIH9B5r+AuxgJaFVitVe444oFFNTW9WAuwyK5rHGwMXKqwr89rbPqA\nS4FdUl9DaQMqEHegOW+v58pdjVFJ7X1dUwZcdl02XLZ89lw2+yjMoZhSbre3+c1x67tEIVrX9SXy\nerva9vmI8eXzOcRt8dyq8VTV1xIYlsWcg1I0b0XT99TC24G3NN9LLDIrpbxOCHE/1LjVh6JaV0lU\njupTgN+z7L0W+H+AJwBnoAYG/DPwK1LKC23nUsrXCSEeAjwN+B3Uq/IW4BdXmahCVVaLQQghHyBf\nz3qjoNrq6TY7M9JqpglsLCia83cNl9Jppg3Y5yCsgvoU1UXiuphva8cR8ufzG1ofMw7WtmHHbyK3\n+po0HtZ3LlVFzaW6ttnrEkObv6FV0xhbOZTXWFtj+ky1m2q7iyKXW23vYjuHvyF95bQxQNzi7SMo\nqy8tZPvRw15LRRhVWS2Ir3D6Alk9YXwPy0rrPmsLqqlZLLVjdAIAvPmuLtUVXCqou+/rovK6Mfvq\n6zjQ3i7L/w4Zl/Pq6ju7TJjbBinoWLuqr1Gqq4ZLAe2qvOZSXTVyFGzlyHcNxWT78Nlz2e2jLsfs\nb4unrXjLdb6USppatDOV/NdcxWEhHyF/uQvRQr5i/LXZ6FN41jXuQ1RMVTENVLJaEFdzBtucmBUm\nbbA3+/6AdbbZmZHLOclcnCQFcIKtBQKryauPuKpj4Wp+m7ya6QC+mv7l78JFWrZP94hXhdiRsDGp\nA7HkVcfb1nlg9BGxqUVNIcLYxX/snlAcvlh8a3NV3HftHdslDtuey+bYRVYu21NIHyhVXNV3eEGs\nr9wENsZnaH9pAjulbgADF1hVjINKVgtij81GqdxyklaYF1eZpFUdX2xjZRLYOXl1E1eAXeM32KW6\ngksJ1e9Sy4rqIvxjZGM6DPhXL2J5/fKePnmvsepriLhCC3ltI67mcRWA4bhlfdfOADkq/LvsccWS\nsjZGPUtRToeu1m9TXUM+XX5TSGbIdh81uY2glHhOfbZj4snhawgl0/aZ6nvoVlY+nxUVmVBzVgtB\nCCFvKj/JBnuz/FRNTLfYYZ2D2dfFNe3dAOwOAPNOA4s5pr6Kflt1deW8hroMmGkAoVxYO4/UF4/p\nz2fXtSd2X668V1e+qyvXFXrmu5bMdQ3taTuXs9NBqp3YNV2vO3e1fp9YSvnsY7uU3SHyRYfIge2j\nKvYtTOrjO3P+q3jrCDmrf1rI9g/VnNUpoZLVQhBCyK0vfYHtYzusHVHEVA8DWGOfbU6wzQ4b7LHJ\nrrMIS8NFNF2kcpHQ+omrz6Z53EdaTdumfQ3fOnttiLiafl12fftiCrxccfliCJLtyEItV4ssJ3EF\n9wdHrsKr3OS1DxHLXWjTlYTmINm5ishSSUMJonlYyOtQflaRwPaMuZLVilKown1BnLj6dA7219g6\ntsPB+hoHR04sEFJgdnvfzGW1CaZ5+94uqprfKt/FbNq/Z93KDxVGuQq1NNzDARYnZvlvu7uLuFS0\nc7iIdGrKgBnr3F98zqs9qMDOezVTBnx5rhBOGXClCywQ1665rkMVSeXIW3XtddlwxeWzF5uzmpKv\nmvuWe1t+Zqnb67bvXDGUSh0o3TYrl5/SeZ1jpRDkjrmiIhOqsloIQgjJ+yQcBY7tsnVsh42ju2xu\n7C3c9t9mZyktAPzqpam8+lpY+dIEQnZt2y67MW2xuqiuIQXT9uvyb9uO3ePbGxpU0LVFVoziCgnp\nAkPdrs+turbZTLXVZq+EMhxjI9ZeydvNua9jbJtd10N5ZbSPEjqWAlsgfUC8eQRl9Q3t6zrZfmhV\nVqeEqqyWxFXA9YD9TU7sr3FwbI299U22j+3AkUXiY+adrrHPYnN/d+sonVZgK6PLgwJciivYqqh+\n37OLtNo6Cyy+Y7qLr9Q1rbWus62Z8fj9u3Ytwq3WLquvtvIaGg+rXwezSGumhhvKq9ldQJPWmCKt\n6O4C5nEVxBxdiqTMfV1aU6W2j/LZd9lqsxcqJot5jtrspcbWZi9VsctdtJYawxDdDEJ2u6xPjcfl\np4R9l59YfyG/sb7HKuCqqOiASlZL4mrUL/ABsL/O3snrw7HmVvrRNTY35rf557fY1xbUVZ0W4CKv\nri4Ay7ezt2ffu4YIKD+7lo3Fnq5mhwJtxzzm6+eaI10Alnu7zq+ne6eB+H1pnQZcRNskrq5+ruAm\nr1F9XX3kVZ8LfYiGPnD6ktcQEbZtmujSFWColIZQTD5bIXt9UiRM9LnNHhtDLNEslTrQZrs0ge3S\nZ3QsIunyPQRxHotNVBZzKFBf5pI47ji2v8nOLTbF5he+LDnGLJcVaHqvzvNT7X6rmrya5/T5E2y3\nEimtGPpuwb+GHxU/zzPlLhsLKQSm7TX22WHLmzKgrsPXfsutFtvkeHlkrLJgx+4alKBht+WKGQ0b\nt29RdW3DEnldW9yzs73l7jIQ2X7L+wu87znpI7Cggu3bJqvNt4lcuatdyGvXPrKhmGw7LnttRDiF\nBNv2QnZ9trsqpTlU0r49bEO2u6yHcj1oQz5Cftp8xvrNTZxj/VZUZEIlqyVx0vH4qPp27/g2eyc3\n2Tq2A8dg78gGW+zMlq6xv6Ro2gRVQ5Mm87wmgJqg7rPmLECycTU3BNx5sC4C20d9XSali4TUJrHq\nOrYcz0F7ERm4J2zFkFhfysOicqwjSVNeYZnAwrICC/EEFjy/2G0k0vVBnUOxDam/MXGYtjW6kk2f\nsplizxeTy05KbL79Ljs+e764fLZDaRND+u1iN9W2b31KPKmxtMXj89Pma4p+K3mtKIhaYFUIQgjJ\n70r1C30Mlbt6OsgHMkvYFv+B5NguG0dVAZYuvtIdA+aFTYsdBGJaNmmCdcAau2xwwDo7bDkJIMAn\n+G+zuB7JS6TpxySgPvKqju0tqZwu5bWtYEsjvu3U/sL6UPGWGZsdjy+WUPFWTNwbgdfOF6Mzzsg+\nr73bZfmO52yXFdoXez53W6ouhVop9mPtjFnwFGOvROFRKtEpWZiWun6o9ll9/Q3gU7xhhAKrNxey\n/cBaYDUlVGW1JK5CEVUN+xf+JLC/yd4xpUDq4qu1I8strHwkE1i4La/cKFXOJKgnrtti5/g2J46r\nHNaNo1YwN5p/ezVnqDVWr9Y9NmZdCEzVVBM2s8WWHf9OkztrK6/68QnrvPJHE8eimmnCTCkw83tD\nubJOdbNjCoFLrQ3lvcZO13JZsRVYeyzsbF1sCkFIOXWpJj4VJjZ1QK+fBeAJrC0PV6Nr7mqOYjLX\nmi5xuWzkzvH12YyxF5M64Fvn8pvrtvqUUgi63mLvmkowRi5s31ZaFRU9UZXVQhBCSJ6sW1cBR0H+\nLEt/pYl3ITmdRoGdt7haXz9g7ciiYplyG3iXDU6wzcF1a3OSevWmKvoya7C2QH7Tclzn8VfSJKt6\n0pY9uGCNg4WUAZ/iqu1AWHXVcCmQvuNmq64uk7bstWaMPr++1l1ta2Ni8dlpixH6qa+QoXVW7P6Y\nfTH7uyiooX191eCYNTEf8rmVvVyKbmxcpZTJKSmwXVTKLgSvz+31gVVf8acjKKtvLWT7flVZnRKq\nsloSXzG+dxVbAVyD6hZwDGDe4mpt/WCmfh6sr83U1hjssTEjqQf7a+xddX2l4l4BfNFYeFrz9ZuW\nbeywzQ7bS0RwjX1OWMTVVFlNtVQT1xNsNcfcXQxs1dWETWRdzfvn6ubugqq6rDnOsZxv6m7jNY9j\nkfCZeaxtea9tHQdcua8qosX0Afv1z53/mtSBIKUQK0aVzFHhn8Nml5zS1LzPLjm5Lj997KUqwil2\nXOtCa0u2uSqpwObqQADTy4WtrakqJoaqrBaCEELyQ/OcVfmiZfVytvZvkBxDKZ5aZT26z8YxVXCl\niatWWw+uc/f91JiR1OPbcHxdqalXo8jqFc2iptDLpfZq3IF/lnZPVz0i1lRbYZ5X61NbYa4o+hRX\njZCC7CO0qWNiXX77qK+hPNauAwtCsfvslFZfiyivffflVl5LK6Nj5JnmUE1L5J+uogJbMv9VY1Xy\nYC1/VVmtKIXRlVUhhACeBDwWuDXwX8CFwNOllDuBrXr/w4AHAHcF7oC6pltLKS/zrL8+8BvA9wI3\nBj4KvFBK+Qee9Q8Efhm4E+pX+q3AU6SUn2i9uKtphgK0rDverGkIJFtg92U92F9UWwH2Ti7+2Xyw\nvzY/fnxTqanHmRPV/0Q9uzBXVQPYafJDN9ljj002jDxTrZqaxFXnjGq1dZ6/ujZrY2UOKbAV17nf\n+Y+lr/hIQyuzJkEGU80MVe+Her+q8/5Hi+/voZzXmE8C18CCxX3pI2Jdnn2jYl39X9t6vzqHFkCa\n8gDYzRkAACAASURBVGoH2kXxzK28tqmHfZXM0nmmLns5VNMS+adT6dNasudqF2V0aEU0dzutITGF\nGCqKY3RlVQjxPOCJwOuBvwJuD/w0cLGU8v4R+/8O+GbgfcAZwNcDX+Miq0KI04B/QBHP5wMfQhHd\nhwIXSCl/zVr/UOC1wD8DLwVuADwZ9et/jpTyCjwQQkjuI5Wq+ma/ejlb/xozdxWlsm6hCOzRfVhv\nFMMAWaUhqxxfVykI1zBXVS9HkdXLmauqEXHd5LpPS507u8UOm+yxwe5MRXWRVrujQWgsrOv2ty9f\nVe1xdwMw82Bjx8RCupqaY2RsbOeDlLjdsZdTXnuprjHncnYe6BJD39zVIXJfc/oawkaqvS5rp6K+\ndrHfdc8QcUX6Eq8aQVl9eyHb963K6pQwKlkVQtwB+Ffg9VLKHzCOPwFFJs+XUr66xcbZwGeklNcJ\nIV4APA4/WX0c8ELgCVLKFxnHXwc8GLitlPJTzbF14JOoX89vkFKeaI7fCXgP8FIp5U8G4pLcRT23\n8r0RZPUPkTOieowmFcD4vkkNWMLJ5s9KfWofOAF8ibmqqonqJ4DPzrfKj7THtf3lL0pgloawdeQE\na+yzzYkFQmqSVk0W3W243G2wXHARMhfWHARZ+zB9mutNhIqlSpDXLmkAMe3K2mMPF2zZcc7WWeS1\nWLss37kudlaNvMbYiF3T5m8o8hprq4vNUgQ2xfYQxVJD3tbP4GsUsvrOQra/pZLVKWFssvpM4KnA\nfaSU7zCObwKfBy6SUj44wV4bWb0EpareWEq5Zxy/N3Ax6vb+s5tj9wP+FnialPI3LTtvAe4G3ERK\n6WRUQgjJ10jkx9oJ4WzP/0JyFHVLxqWyatJqvqno7080Xw9QJNW8/f8hFFE10gDktQlxXbYvWT+Y\ndSrQ/WC32WmU0zlJbMtpVd8vq60aIVUV/CTNJKzK7t6CLVefV9fjVAXT13EgtduAK64+HQfa4nHZ\niOpJ25G4QoC8Qp6819zktQ8BHSqPNGbNEPmqlbx2s51qv8t6GCwHVry0ktWKMhg72+Mc4DrgUvOg\nlHJXCPEvwN1zOWpyY+8CvMckqg3eDUjL392bY65fhXcC5wG3Az7odXp1YpDHUXmmujerzitdR5FQ\nTVphkZzS7Ntv/ukUgCuAjzNXVj8L8IVmg9FYtTUuxZJ1pwLdD1ZP3dJ9YOfjUtdmRFV/TzOYwCaT\nO84+pe52Vuqyt5eOaWV3nk+7N9utydaulZQVst/eY3XD8Z2N+HzXeUz+jgNtnzau6WTmRLOYnFcb\na+yza+yz811Tcl3B02lg9sD4fj9wTAUyR2zuao6JWyk5nF37qXap4k/pPtA1D7PNxti9V4eckpU7\n17RkD1iN2hWgYsUxNlm9BXCVlPJax7lPA/cUQqxLKXP8etwQRfU+bZ+QUu4JIa4CzrJiw7XeOHYW\nAbIqvxCvXoKqzBe/iZK6dcHVtSiVVRetmORUr9NfTzbrda7qx1HlY5+gIaqfAK5EynukxXUHhHgH\n0iz6OthfU6NiN+YDADTZ0qTRJK2KpG6gi5pMMmmPagVm7azs4y5sstuQNWV1j40ZxfIVQcWSV2Vv\n03o8J7CxrbLayKsdqx1vW/srG6H16xyw10Je7WKtGOIKy22yOpHXNuJqHu9aeGXvbSPOLnv2+VRC\nF1NU1UZefXZiiL7PR2i/y0ZfslmqdVUpklm6fZbLR5cirsNCYMdmMRWDYOyXeRv/r8dJY82XM/mi\nxZ8p24XWn7TW5IPuDKDVVf0mcFpzzOzXahLUXWPt1Sgl9dMofvpxgCubB58A7tEtrpM03Q3U1K29\nk5tsHdtZmLoFc/J6wBpb7GCSVHPClN1zVcNWGNsUQE2OzU4F8+/nsH35yKurt6tNmF2qZ9vkrEUs\n09XYbgOqs0I8eV1ev5zqsMfilK0+xBXc5FWnDNjkFSI7DfiIY4iMxaqdXTsD9CGFXfrPxtqJea58\nPkL2c5PNHOpnid6vfWPIabuLfdeeGEK5yl0BKk5pjP0jtgN8lefcUWNNLl/gb55z1PIVWh8VmxDi\nAuPhRVLKi8IhNpZ1birG16PWurY8u2uZU2pA5Q30+PP3OIosHzRmjq/DMdUua39/jX3WOFhfgyPz\n/NT5iNiD5rb0nKSqUPXjRbS1rrKJk3mr31ZZ5+2xFGLIqys1IURg/URwY+F7k7weOEh6SH31EVeN\nFPLavnZZdfXBJq46vpj2WOAmsEktskLHVTDLiFFfY8lrbBwxsbTF5LOTooymqrtd0hJsGz5bLnsp\nNnO0lupLMnMSzLSbJ8OkD0Dwtbzo03DRZyJslMTYLKZiEIz9Mn8GuL0Q4jRHKsBZqBSBXDcYvohi\nbGfZJ4QQG8BNgIus2HQcH3bEBu4UgRmklBckR3kGc8J6PeaFVro7gIbOUdXHTmOusALcsvn+K82/\nq27dLEiHeHNT+LWOypvV8awfsLY+J3X7+2vsbahb8LvANifYZQPdp1VhkbQesG7lViqYCmUYGwYp\n3mePjaaAa3vWccDMObUVQ21fq7zajglzytZ8nz63u5DGYOa8aornShkwr02TQZuE7zcJyusJcWrY\ncZjPwTyPmOZ8d/LqUp2d+biOyVoQlzbggnOyFszTZVzwEVFI7/Masyd0HSG7bfbN/SEbMepwn+cq\nZr+J3AS2jz2fzdT1JRXSXNOuUgls2x6YxXbu16p/Oq5nvKdlX0VFR4xNVi8FvgPVJ/Uf9MGmG8Cd\nWSSPvSCllEKI9wJ3cZDjewCCxUKvS5tj9wTeZpm7Jyo14T9CPsVdkTFtq2brX4nkjObBMZoeq8wJ\nqS6wOoEisgco0mp2CNBFWWcAZzZrD1B5rCfOVn7ER6SUt43PWz1qfNVdCY7tsnF0d6HvK8DBdWvs\nHVGEVZO4XeZEyjUa1UVHY0fLgkm+5kVc5mCCnYa4grvyXw8omJ9fJJE+pdc1KtYmr4vXvExgVfwm\nKZ1HZ5LYefGaP9UglFJxwopzMe92kby2F5nFK6+h2GCZxMaMhnWNhYUAgYV2EusjHSmpA6E95j4i\n16QQ5Jj9seTXtaZEikOsrRL2fDZTiF2pAq62OEoWiPn2xOwN/eFVEmP5rRgUY5PV1wC/hJpg9Q/G\n8ceiaNH/1geEEDdDNeW/TPc87YA/Be7V2P994/iTULLjhcaxt6PKkh4thPg9PU2r6bN6X+BlvrZV\nM9wsMbqbGN+vM29bBXOSCPOCqxBp3QdujiKp16DU1U9swf7ZpLzs4h2NqgpzVfXoPhtHdxdUVY39\n/TW15ggzVRWWb2PbpLUPFlMLFPFyFX2pS5iTSpvAAS0qrFqh/l9WOF3kVftyEVh7nUnJNoznxVZW\nTSV5meimEdgu6msbedVxxmCpqMwir86OA642XB4CCy0k1oU+qQBdCKa5P7fSmSOft81uTFyxfny2\nYu2VKODy2e2rko5FYGN+Dn2YWnFVxaHBFCZYPR94PPB/gDejRqY+Efh7KeX9jHUvBx4JnCulvNg4\nfh/g25qHD0aptM+haRwlpfwNY+1pwDuAbwJegKrkfxDwPcCv27fthRDfD7waeD/wEhRZfhKKHp4j\npfwsHgghJI9uhgK8JGIowDuaLgAnUQqm2abKzGE9ur84CECTVpiT1pMst6/6MIvjVonrtSrexfwH\nRE/UOrY767nqg+7Fajfqh0Vypx7HNf8PwZyGZfZ5NR+7fMb0Yg31Xl0zfKjH7gKuthxY1xpfDDGD\nCFL6w/rijLnumLUu/z47rZPAIqZrLaxv+SBd6v3algtuI0Q42j7E23ISQ/u72u4TU9veWNISU7Az\nhq1Ye6l2S/lPtd3FfqIP8bsj9Fn1N4/sZ/v2tc/qlDC2sgrwMyg69VjggcBVwPOAX7XWSVRPVhvf\nDjzdOvazxp4ZWZVSXts0+38m8IPAjVHNnZ4gpXyxbVhK+TohxEOApwG/g/pVfwvwiyGiOsMtW1fM\noW//mwqLSVBNFfPYAbPRqifXFxVVO/3zJqjiqGuYk1q7WMsD8X7kguhpqKohogqL6QB4enr6bg2n\nYlGpXVQFF3u9sqBK6r3q8YFXFXXdQle2d2e254Vc4dxSs4jL9rV4Tcu5sPr7mNZZ9nXaa00F1le8\nZacDmCvb8l5d/WmXc3bbFdguyutsbSD/1dU+y6nAthVP9blVn5prGoqnzXbX/Nc+6qtrjcuH7SfG\nVwlbsfZ8dmNzYEve4m/zkasPbMjH0JgCi6kojtGV1VMVQgjJy+bPrfwJv4opPrPb9Fa1CF1DUDUx\n1LfdD5p1eyc3F0mrqbReg1JYr0JpzJ/AGAwwh7w0ENd/IJc+jCJU1dny9QPWjhw07avmWFLLDALT\n1qbKhblKOieg5ihXl8JqHrP3uuLyKaOukbHrs3jaFdBFm+HxqLZPX/6tDd80rRiFNhRTaMKWK357\nj2vfRkCNjh0PC24FdrbHo8TaKmzyuNjQh3dfBbCr4plbEc6lZMasyeUrVk3MrYCm2CutkHYhlh1U\nWPHbIyirHylk+7ZVWZ0S6t8kJXF23LIb3+wqVUl/cnNGRM18UBcx1D1OD5p9M7VVK60aOg/2bOat\nrGIT0o8273A67cBTVOXD/v4aaxuLPTohXVG1q+R9mOenzlVFs1rdVlxdOZ8uRdI1uMBub2We16qi\n7nKwqLwq7zoGE6FCLtunVl7t9llxBVwbs9zXtsKtUG/alAlb7j2ufYv9XkNwtc3SMdqts2Z7Ai20\nQu2zgPQWWua5mDzMnLmwqYpw17xXe29bPClrcvkaq41Wir0cOaq+OLrY7+JjLNQCq0OBqqwWghBC\n8u/Nc9u8KchvWlYxb82HpCZIe2xwcN3yh+zakWWV6OA61d8UWCC5M7X1eKO0XoUiqVegxq5eYRhp\n0gHkc5bjmqm9MFNvN47tsLZ+EE1WYa6u+rCxQH7a2lT54VIGTYXVzp21FVdzHywrr/Z5bV8dX1Q6\nQ50HTNsm3CqkWxG1/br8+W0uK7Ch63fFEpuXa/rz2Q3lvvqU35C/mD9mlvZYKqxLefXlviarr7Hn\nu9jtsqeL8tpmM2Z/jI3YNX1jjbWTYq+EmttlfeEcVdvPKMrqZYVs36oqq1NCVVYLYuvsLwLz2/Zw\n/aU1p/MVDlhHdQbdYffIvG9oEEdgb0OR2/VjOzNldqa2sq0UUZ2zqvuyQtSrbhLSvZPqT9dUogpG\ndwAPTng6AezbKREtOFg3KvePLKukm4aS6MpxhUWCqtf6KvJhUXW0W2W58l7D7asWr3e5nZbaYU/9\n0h0IbOKqrn95jK2OYzGndGP21dUua3FNuWEF4Ulb4fGwer/vdydWhbWVV9/ULd/IWIhooUXE+Ryt\ntNqU4NC5Pl0HYva7bLjsdKn2b/PTRy112XPZ7GPLZa/r+lw5ql1V2IpDDyHEDYGbomqI/ktK+cVO\ndqqyWgZCCPnVTZmi+QH6KW4z+0vtPvytBPWBfsDa7MN0PrbUT9jMtVqR1GqrVlr3Tm7C8U1FVI+j\nVNWrDSPGm5J85FxdPWPvCqkJqsbB/hpbx3INE3PD9qn9huBqn2USaq3sujoTmK2tQrmnbRX3vrxX\nX85rTCcAOxbTn6sDQUxnBVe3A/u6Q2pmSq7rot/0vNfUbgPhKVvu56RL5wGIz3k14VVgobsKm6qk\n5lReQ/Zi9ua0MZTKm9PWEIrnCHmw4tdGUFYLTdASt1i+FiHEbYEfQfWH/zrU/cmPAq8FnqtbXAbi\nXQdeCJwDfDWqEeVngHcDz5JS/ou1/u9QrTJ9+Fsp5XcZ6y9i3h3JhATuLqV8byi+HBBCHEF1WHoY\nKna7iecVqB76rwXeJKV0Fc4voSqrBXEmnwNs0nmb2XdaVdUfvFuszZSleUP9ZTXogHW2OdGs2Wty\nM9dnauv6+oHKF10/4ODoLnvHt2G9eal1J4DAK7++fgCWguoikikI7bcJaV9fpj2tBh+sr7F2ZN5/\nFZiprTAnLu7cU3+/U62+6nO28jn3M88vdY1ztdHWhcDMg90g3E9Vw6fAKtvznFffxC39k7iouvpH\nymosVfQn5r3aiquZD2z6dsGlwGqbtgprq8SukbHgnroFy+orRCiwkK7CdlVScyqvLnumTddee38o\nphQbqSpvn/zSLopxrB2XrZBdn+2UOEzk6kRwauMngMcBbwL+GNWf/TxUh6GHCSG+RUoZetY2gLsC\nlwCvRDWZvBXw48C7hBDfZY1lfyaqbaaNH0S13XyTdVyiGlQ+CZbS+z7WdnF9IIRYA34K+EXgFqgy\n70tRLUk/38RzIxQJegjwQ8BnhRC/CfxBW9/6qqwWghBC/nepZgzoD1b94fjXPEQ8nFdIfWyPjYU1\nWinVx2wCC4vKqj5nq62m0nri+PZcZTVhqqt3QJzJZbMfCDN/NvW2vAlNPl0q6QIxtc+f7PBueNR6\nR27IqiatptIK/vxWDZdiaauQtq2QIutsaO9V/to7EPjU1kU74VzbmC4D5nX5rs1e41prr4/p8ZqS\n52rCFYsrHpfNNuIP3ToOQIferxqpXQhS7OTuNhBrO8ZGHzVz6HzV3F0CYm129ZG5S4B4+gjK6ucK\n2b6pU1m9K/ARKeVXrOO/jhpw9EQp5YuSfQlxJvAp4G+klA+OWP9BlDJ7Cynl1cbxvwO+Wkr5td7N\nhSCE+DCqlPvVwKuAi32qaaO+notSqX8ANezp9iH7h/Nvo4FwUz63QDDN70/n+OyxJppmodU+a7PH\n+kPXJK+msrrLBmvNDlNt5QgcbKyzt7HH9rEddo5vK9LKcocBdTv9hosFT0cMBcn4SYklrjZJXVJM\nTTsmMTXfQGPfTPX24/aP9Dp7x9Zg/YCDRm02lVZfHijo3qvLKqmteJrjXkP5ri7V1QXf1C2zN+sm\nu+w1K02y5i5SW6yw1zHMp4ttNn53Z359o2KX81yX+7va1+dTaJXv5etWvtyK6/rsZ1xhOc9V+3Cp\nr2q//RzZ6quturryXX0dB3zqK8QpsJChC4FLSfUpnn27A5RQT/sqo6nxxfpw2Sup4vps+uyGfOTK\nge0azymCwG301wC/DNyxo2ldCn3DtoXNIKSvB/7EJKrWGgEcs0l1YfwF8NtSyivbFjYk9m3A24QQ\nTwV+oW1PJasFcSZXLnwI6g/Pn+eZ8gzmuaoAG833s0KrhrzuNUQU5orpOjtB4upMEziyztb1T7B3\n/cWfXZOc3por5drCOQNHDCIUQVyXOhTMNjgIqn5jNN8gzYG6poDVReDdX4d1N2mFeXGWVlx97Zo0\neVXfz4mtJnQ6ZcAkpyr85XQBE74WVj51T/+cuEir3azfhi91IFSoZcKVLrB8PW1IK9ZKbZGVSmBt\nMt9GXFUU8S2z+hLYKPLqI2gpKQChW/wpt/f7DB5w7U8t3vJdU6z9GB+xtnIWbYXsptpvEwFyxXN4\ncMvmaytRg5myeEPUM31L4H+ihqf/RcT2R6Fu97/Uc/4sVJXKlhBiB/hr4JeklB+Oia0rpJQ/277K\nue8K4Mlt62oaQCEIIeSvy58DFgusTFXnoNFDzdv8uwaBbVNczWPq++V8V7tYa5eNYMGLGZvG7kLM\ny9fiShdwklVzgAGESaoZkpm64Ju+Zac3mDgKHEO9Lawzmwim0wNgrjSvN491R4HQGFXXMAJ9PFSo\n1aasthUP2QVVmrT60gliCrXahiK42mO5itJc8dvX4EsbiEmbCI2D9fm29y3G5U83WH7e4wq1THQZ\nWgAZ2mel3Bbv2n6rRNFYjO22/UMUbcX4KlFoNaUUAsda8QvDpwFc+6Uytk+7Qdy1NMTzEuBuwB1l\nxJgCIcQ3AP9qHLoaeBHw9FDBkRDidNRonyuklLdxnH8ZqmDr/ahP0XugxtfvAveWUv57W2xTRVVW\nC2L+QbU3I3xbuhiKOdnTSqlSSXdmpFUTEU1a9V4zp9W0Z6cLzNMC5oRzraHI/liZpRXAvJhLw7S3\npdccmV/P2sbBQjstYHny1nqAvJ7O/HsNn5qqu16dQP1NakJzgbVmnUFUN5quBqa6apNUH8znybxd\nbkP/4bCo5m0Y//thF33ZTf1NVdQeGOBSRO2xqbYKq36e5mkKpm99za52XOYfVWrPYiGYRluRmvbn\nGh0bGkqwPA7W3RYMzFQNrPWbxvf2vrACruLu3y5rYU+giCu2fVby2NiUNlmmrT6jZlPVV9N22/4S\nRVuuNW2+uqRI+GyFbPps++znbF1VGQSo8fD3AJ4aQ1QbfBy4P+pN5jbADwM3QEkroY4C5wPbwMtc\nJ6WUj7IOvUEI8eeo6vvnAN+1tGlFUJXVQhBCyN+Vj5s9DhVH7bExO+9SWvX3rvZWdjGW77iZchBS\nmezbp20Ka9t1weIAAwjkssbksMbAXn8Ur5rqI6kpTfBDLavm9pZbQ6XAjmedeTsu7Vv/ceOCTWJd\nLavaBhO0FZ61teRqGw8bO5zBXmPGE/Jv+jURKuBKVY1DvtWxPCpsscEFpdTUMVTYoYqh+qi8KX5S\nbabaTbXtsC9+bnhl9eQ1eWy9/WK4+O/nj3/jN9uvpSms+mVUNfvjQmtb7FwPeC/wUSnlAwPr3g3c\nGVVE9VnfOse+twH3Bk5v6VbQG0KI/wb8Gip/90rg5VLKVzjWPQJ4pZTSJ0ctrq9ktQyEEPKFxh85\nuwYJtNXOLqTV3G/b0Pvt42a+XgxpsvP7Qm21XOkGrrh0ykCIvJrH1OKERFVXBwGLqPpIalslve+W\ndAxZVfbdhNX3PJt7NOxxsSZpDfn3dRYwz8VW4HftchDTdSC2t629xrV27jd8O7+NwKb2fA3Hl5ZK\nENuFILX3a1LqQNs5GJ7EliLGbftj7OS+/Z+byGbuAGBC/MzqklUbR68XvhYhxAXA04GXSSkf09ef\nEOK3gKcAt5FSftxx/o6o2/t/LqX8nkTbfwj8KHBWkyNaBEKIs1HpDTcAvoC6V7oO/CXwg1LK48ba\nJLJaRfyC8KlO8+prXY2toKmfnR6gbc2J4OaCfbO4SqcFbDR21jlYSheYx+d/19I2NHRhFyymGZj+\nVWwbjnNzX7OUgY05eV1vbsvvW/1RoX0ogIm9k5twrHnO9T6LpAILI2DDzeT9RLUL9tj0FvnsOf6Y\nAZy9VhVZ2lgoC3IVTIVg/vGkfzbtW+Jz64sxLyr0i3+UaLiUT1cqgbZjT9Za7CDgnqxldxnQa9X/\n8yto60HrSyeY95tdTCHwpVWYiOk6oOFLJYjtQmBP3YL2wq2o1AGN/ZZzKrBlhFIC+u7rmgYQU/3e\nd/pWn9v/Kbf+u972T00l8Nl12T4kMIjqH+Ugqg10YtuNUGkCNh5DuLAqhNuhXt0vdAstGr+CehP+\nDinlW4UQ1weeBvwc8Jamj2ynLOOqrBaCEEL+L/kjs8e+FlamYupVI1nDX0S1THLa1E0TLrJmr1sk\nKsu2QgVe5p7Y2Lr0dzWVWJvg2j1WIW7ykkbbLeZYZVVjw0EOwf0zEOqRqvus2iqr67ralM+Q8urb\nEzt9Sq0NT/nyqa4xfV5NuzZSpm21PUd9e7+WSCFI6f866OQt37khFdiSRVxtNmLVyxyFXKk2CxZd\niZ8cXln90n57/5EuuMH6nvNahBBPBy4AXiGl/PFAbDdDKYyXSSlPNMduAnxeWsSrWfteVPXFmVLK\nk9b5DVTh1B5wtqsIqyGGx+1zQogHAX8O/IWU8r+3XngPCCE+1Pj5Oev496OGKPwrisheXZXVCWGx\n/+WcmJgqqf6Q3nW0oDILqvSe5bZVSpU0yav9gW+rmz5sGn41XAqraWtRxQ0pr/PCLbNoyxWbVl9h\nrsC2Qd/Wt9ML7Fv+sRX5GqmKahtRBTdJhXn3BtcfNvNeq/PCKmVnWWVd/s79+RS6Nt3T1YZJLk3V\n11ZiTehpW3qtq6+t3TZLF6/5+rwuq6rLiiqElNjlaVspCqxLTTXhap1lvwou9XV+NcupCy71OqX/\nq691VurkLeioxIaKuQjsIXFfySKuNhuxBWYpPlx+bH8hmylFXbE2XXYPAYQQj0cR1U+ieoQ+wlpy\npZTyLc33zwIeiWp+f3Fz7BHAk4QQf4ZST/dQPVMfCZwBPMomqg2+F6W4PivQLeA84DlNQdXHUK/Q\nPRqfnyOiPVQG3Ar4N/uglPJ1TRut1wNvFULcP9VwJasFYX6YmiQTlj/MzC4AsJgiYHcQMIkrLCqf\nywRxmbyGsFz5v9glwEwz0PEo2+nkVdu0Y1vsc9n+jqhHzYI7vcAmqTlu6dvxdbHpUpntdmWmDw3t\nyyasmoC5RqG6KFEqgTVjtnuRzvfPSaw+Z1boq9Zr9s9DHHGFZcKo7WrYnRP0CreC6R6gEEoh8PV/\nbSOv7t6v7vW+FALbXix5BbIQ2Nk+RxrBLHYfiR2CwPZNH3DZtG27bMSQV99el42UdV3iddlps5na\nmWBA+DprFMI5qFvxtwJe7jj/dkCTVQnYxPLvUS2uHgTcHPUmdCXwN8DzpJTv8vj9icbWHwZi+zBq\nvOmDgDOB04DLUS2xfiulIKsHrgJu4johpXyzEOJ7gT8D3or7+fOipgEUghBCXmgp7q5b5+r44u1z\n+xZ/6La63bfVtu8a1RqDXcc7Vkqaga87gSs2Oz5fX1dfPG37Um7Ttz1P9t7UFADbj4uonmCbg+vW\nvB0KNOHWbcj092ZagB1fShFQDNr6srqOmb1g7YKqNdwjcF02XLZT+qjGpoDEpBDEjIu1bcXG69tr\nx+Ozl7v/a2iELGQq5uqSCpA75SB2TZ8UgNxdAnLe+u+RmiAePXwawBfkVvvCDriRODHotZwKEEL8\nNXCdlPIBgTXfDbyhebhZuwGMDCGEfL31etnEy67cV8fiiKs6Fm7Wb653T+5xw3UL05dnuxijn0zb\n5NV1zuXbRx5d/St9HQk0mdMwyZArZtN3G/n0EStXGzDTru3XVFRPXLe1kM6g0xhmPo8csMWOl7BC\n/0EEoZ+X2DxQVxW+qZiG2mf5iKu2M/fhbsnlOtZGXF1wkf1U4mr7tu2FYo8hr7HDC+x4bYRUw3S9\nqwAAIABJREFU9S4kNksrrdDxLmSxb55qyS4EbTZS7OXOW43NWf2RSlYPM4QQPwM8G7idq6OBse47\ngTcCG5WsjgwhhHyj/M6FYzYBiCVurluvrsKq+bmwAhuCixyGYnKR6FglOERgXb7tGFxx+8inj/S0\n7WtDH7LqI6o7x7dnI2FN2N0MzJZVG+wuFV9BPCkLwXdL2tdSyuXP7ger47QLq7Q6vHhs2V+bousj\nsS7i6orfdS1t/V+7Elef/xjy2va8t9lTx7sVGEKeYq7kIq4hi7fa9naJJdZ2Tlsp+aU9/I1BVj8r\nb1DE9s3FlypZTYQQ4gxUnuwHpZSXtazVE7+WerA611eyWgZCCPmX8tyFYzFV9va6tlvmy0S13611\nG3bMtlLbhbzaMfjSI1xx+kh3qCOB7xa9WZVvqp0+3y6kktU2orq/v8aJ49uLfWaZE1VQ3Q22j+0s\nEVZTZdWxdB1G4PsjoWt1vpme4BoXC+1pArafmMEAbd0GbLQRyb7E1eW7K3nt0+/VZ3PxXMcuGQkE\ntvggg6636kv0f42xHWsjh50CBFb8UCWrFWVQyWohCCHk38h7Lx33pQJAGnlVx/23zGNV2BDsW+2u\nllpmTC5C7fOdms5g+rERmtqlEfpg1wMY2ki1Cylk1b79bz4+wTa7exuKqB7fng83OGp9olh9Yzc3\n9pyEVcfkUxJ9iE3DSMnPNAmePdTAjtNWW13k2DegYB6bm8T6iKsPoaEF9nX5ztnxxAxPMP1pdGmV\n5dq3uKcbiVXn49MJBievoeN9btWXaJ8VYzvFVo5UhD45qyOQ1cvljYvYPlt8vpLVCaGS1UIQQsi3\ny29eOu4jgBqp5NW1Vq2JU2JdcBVXmXtDk7fsWFwFXjEE1vQzP+8mjq682FDag/0hrad7+Qirz3eI\nqCq7brJqtqfSBVUzonpyE45vhquDm4lcW8d2Zq25to6ccCiWy2TQh9hiNfvazes3nwMNm2yaJNWl\nttrKp6m2mvba+rqqtYuE0UdaQ3ApsTF5wV3zem1fpj8T7X1t/dfWlcCG/M3PRVxfwgQuSEwdyEle\nu+4dsiiqlELcca14aCWrFXMIIbZ0j9netipZLQMhhLxE3m3puIsshohRm7rYdqs8RGJd8JHZ2A4F\nbd0J7Bh8JNYVS+i5axs3C341SJNbU5G10wLMtba9GLLqI6pmnuqJ49uKqJ6EWQcxu3ZgvfnnIKyu\ntAAdZyjvMPTz5yLvIXIaIiuujgX2MINQioDtM6VoyWc/Bm0DC7qOiO0yGtb067Lfdk1dSaza21aM\nFv5ZgP5DDLLkvIaOa3SxmeP2fkn1dIAOBJWsVmg0Qwr+Qkp5nyz2KlktAyGEfLe849Lxtkp7jZCy\nFaOs2vvacj1dCMVq9oRNyUmNIbD2ulAbLfuxmQ8aW1Smen/O99gq6zwOR09KB/Gxh0H4bv8Hiar9\n+W2GsoUirMf2Z2kBW8d2lgirjs9UWV2wuyjY12o/n11yM+14fKRV23eRSlcXgBQyF2qPFUIofaCN\nuHYpQjORmu/qI5x9SGzIrtrryV0dibxCB+W17VyJzgMxNmLOlyavMTE0EA8Znqx+Ut60iO2vFp+r\nZLUjhBA3Av4WOENK+XVZbFayWgZCCPleefuFY6mV7RoxOZR9FVgbPhLr6lDQt62Wy2dM7mTKqNkQ\nTDXWTCHQpNWG3dQ+NIbTpdZGE1aXqqq/tiirsExU54Mm3K9N6I+Otib16vmIaV21XABmk1RfXqtp\nx/w69+f+9LULzVzFWiGERsS2qa22nxTyaq83YzCvbb4/PW/VtuFCFyLbtQ9sStFWcfIaWtM3BaBk\nD9i+tvt0A6hk9dBDCHEmajDCTYB7SSk/lsVuJatlIISQ75O3mz1uawml0UbS2m5Nz+20FyeFiFyb\nemuSVlcxlT7nirsLeTV9+n24iHRsy651L2l1xaIRIiUhtdYkrTtsL3YCMAusNMxCK4+aqv2GUgBc\n7br09c+/96d4xBAqCOdihvrCwiJJ9Q05aPPhOubqNvBsniZ+kWc43wT3WWvtRqCvoy1VwHWNrmuK\nIX72nrY2XnYcLoQIbRcy26UXbAnyCh0IrEbu/NfSnQJKtedKsCMeODxZ/Yg8u4jt24rLK1lNhBDi\nlsDbUET1XCnl+3LZnsjAtFMTZu6i/eZ8YHwQauyztnQL2dx3wNrSm/cuG843eZOiqdGny75COZyh\n8ZRmnDrGA9ZmI2Pnsc3JpRm3+X5nU0mTIJrECpZH1s736BG1u0t+zfGxLsyJmTnWVsVgjrm1n091\nLFYxU//r+PfYRA0k0DHusHZknxMb23Cs8bFudDI4uvgJYXcC0P59JHX5dqwmb3Ol1RyXq593PTRB\nE+/YyU8xt9Z1SzHdDku/rvNRo4oYH7C+cM58JWI7NeiY9KjiNQ7YYXv28/IVTm+x4y+uOkAVtu2w\ntfD8a9umCr9n2FgcCzv/I8AcPavRNkI2NBJWQ4/A9RNPPwsxSbsL7jx4216e8bGgrs8esZk6OrZ1\nZCzEj43VT33b0xD6ce1jYz/iXNfY7F/zmPGuFYcZl6CI6gNyElWoymox6L/4ut76h3RlUSOl44AL\nKfmvobGuscVTqfGGnitf39cQFtVhd85rl4lO2sb/Ze/cw2w5ynL/+/aszOyZ7IRwUyAqiIqCCnJL\nABUCKAiIevCCRwFR8IKAgBfkCCKgCBwvYLgIRI6IeEFBBLyhqJsQLoIgl0AUjiHJUa5BE7Izs2eY\nSZ0/qmt1da2q6qru6l5rsvt9nv3Mnl5VX1X3usy7vn6/93NdCmx5gcn+7rHRcAbYO7mxQFLn6yUW\nU8VuEftdGha7armPtSGYCVsgzM19p/qbujFSEJIVvIofnWdNHsEF3g9Cnz5Vz9+dZ4aNtCCktTXj\nQ/FCXrhhLejiF6MU/Wu9l7TnqLmXvMKsNnlC1y5cfXWvkO88AAXdB1wcViutQBy575RZPZUhIteh\ni6oe3Do4E1NmdWC0ZU8hLfOaOg8WP7zjOY4mfFlYF26OxF7FJtR2ZjQ165q63xDhtrOve2wsrOvD\nrpUd1nvRGUV7BV9mVR+PZxvXq391Nlb/m3HQyLLq+RXxWN9jb33xD2roFnSbKwH4CEXz+XIzqTbs\nx3xIyaS6OGDGLrWu1vdFbM86h31HwOtmWduwzl4jQ2syjQbbzu8uwlnaLbbYZp1dDlhrZAjt52Xb\nyWxuWON32JpnXu3nzJ9R1WfjZmL32QxmXl3EeEjouTR79CPObNzn1s6kg51NN4/vLbxnzdop2Vdf\n5nU+PpKBBZKzsMHsayzL6Y7Rm11EW2a3y9yS+2qLMzJyWolPGByvAb5PRH5FKfW0koGnzOpA8Am/\nU6v4UzKobQVQoXmxDFmX4q22LGTIpsr9vc22KkWrG2pW0BwTa9Xqb2+bklUM/ZG3s5WuJtbs2daz\n2lnWUOxYFjVFIxlrnhDSq+Y0k/AhplH0+cDG1ku1nPIVwplr8o9820LG5P68MZBdDdtQbbHNGgfz\nn3am1Yxx47Q1KUjVnbZZZrn7bcZqz9q6yMnIxr4o5ToapLoN6GP+/XdpGQuFirgM+hRO9YndJ3ub\nqbOVe42fWb1E3XKQ2LeVy6fMaiZERIBXAD8EPFEp9cJSsVfo+9H1D67e1HeLuEvm1ad3jc21ESNV\nvg96v361Jjtmjj/bqiPH9mPgy4C62tNFAtPM9rnZT1fzCnHdq9mDS5xd3asds404mX27mliTWXUz\nrTZhafvDm1qBXu/Vfa4Ws+I+vWro3PvC1meG4qbKD9y4LrTutkleXWxb2VvzOo0RqfUqw7pZvW5M\nRtAuHGuu2fwCYL5sbFtZSzvj6sLOBtuZ2GZWtZlR9WlgAU8mtj6r3Iys78tU833eJK7u+8ftNBfL\nutbj/NnX0HMfuyvgy8IaAutmYX0aWENefRrYWWo2sk132kfL6s7N0aq2ZXd98UdGm3f4hPGgdPbz\nR0TkWuD5InKlUuqPSsSeMqsDwe5Z7PsA9f1xLpl59c2NvalzyEJbNjW1K5e7J98eYgTWNya1das7\nr4/m1YZtnxRzJ4hlWttuSaeQ0xDRNaQ4pUVtqg1YCoGNkfpcD9gY2qQKaxzwEe4YzJZ8Pe/xfiCG\nsttncVWVB6+zrMYdIJbttjOvbTpXH3xZ2JD21azjj7N47bt5qqb57ea0kU3Rusb21fZFMjcLW8KB\nwMWoDQ2G8mu1xsjdxs+s2q47JXEH+eiUWe0BEXkeOrta5NvElFkdEOHs1Mx72zNWgW/gy55C6rdL\n/6dRSPva5j4QzqYSfMTWb/r21HYeIQ2qIYbNDGydebUr+5vr6cdNRtGneXUR0tOF9urLENuZVnNN\n9lljk/15xs5FDiGNoUly3Qx/e5Z1UTeYdls+Fa6Nll30FsNCId51VVbziNaFpviq+pwBjGuBgS3D\nAP08b7I9z7JuWBlWcw5mnu0IYDsf2BlQ855zv7T4fGXtdcweXe0rhDOpvndtKBsbnhG+l2KuhUFb\nFjU01jfenufzAQ59wQnpX/Vjfg0s0MjAhjKvEHYgmM+1Lm00G5ujO43pTYfQwPrmL4lNlLzbM6Ec\nlFI/LyInSsWbMqsDQUTUfynX1T3dJ1Ufd7OQ6V2oumZfc2LkdNlKzbz69pRyLrEMbKrzQIrmNRe+\nTG1IE+vqWKGdeEK6uX1zX02XAnMM4g4PKQ0qSsB1Z5g/N9eFn5P9fYvonHSITuWscNX6zVozJV/M\nFcEPRVcfegbXsMVOVWRl1MaLLg16/KJG1adxTXE5aNO9uv+v95+WrczVtKZ4yOZ042rTufrmhOb6\n9uXDEN6vjXkRFwIo6ESQ8vhAGlj5hvEzq27znVK4k1wyZVZXCBNZHQgioq7ed4iRRxsVum3ZRzoA\n6RKA0LfSlAKuPvZTMfLaNt63F3c/i/sLyw1SOjaF5rahTV7gs/rqotPMgY8UhwirPhZuq2vPLbO3\nRQJvGibYcMnoQYio7q/BrCKCR3fZvdGZrX98tj7/394PRddKbDY74NiRmqxu6vYOrLE/1zmHiqps\nqUDX7lo++YArHfATsHiB0/z8OpLYFOKq9+pvZtCnhWzXLl6pMoIc8grtBBbyrbR6FXINVYhVzZ3I\n6oShMJHVgSAi6uS19e++20Uhe5XU7GuIOPXRvsbi5upNU7KYodip7WHbSHmu72uJzGHIF9ZtvWoj\nRqZz0W7VFdfN6j3mZVlNvBJ79hHVnROLOt4FUmpgun85tyjVbUj+wyNX7OsPxllEv3l0lzPOumaB\nsM44mP+Emgi5WUZX3xrTnLowvq523FATiC4EVu+7G4kdkriG1nfnxeanxOtDXiHNzq1LJjamhe2k\nf217LDOm3HZ8svpu9XWDxD5HLp7I6gphIqsDQUTUF67W//fpl3zkFdKzrzFikCIf6HP7PxQj1zYr\nVw7gm5MyL0SqUzOv9Zi8jKebrQzJC9quW0hP3Nxb2nNmjocIq2/fOVlWe34qfER1hy0Orltj+8QW\nB/trNTH1kVK9yeZPHaQBdW4GWf0I7R+MM1i/yec546xr2DyyU0kCasLqkkkfedWZ2DorapPW+NL+\nQi2DtlvuXQmsXiu9gUMucY21ju3TmCCErrKIrgWD0E5kSxZyFZcQtLVb/aqJrJ6qEJFHVP/9faWU\nsn6PQin1qqT4E1kdBiKi1Gf8AvqQ+L5v9hXKywfq8fnerzmaV/1Yt2xqytxYtbt/b3kFjG0EN0Rc\n+6DtnGIENqQJdQmrvefSWdZQNnWP9SZRPbGVTkzN3/mTzTHqfulE1UDe4SGs9tO2CRz1E1ZbjwqL\n2VVDZpvNHZouAm2w47vygVjm0h7fHLPIRLpkYX2kNOb/2oW4xtZ34/vQRwOb4/vafLwbiXXJa5v2\nFQbwgk3Mvi6DrF6k7jxI7G+S905kNQNV9yoFbCql9qzfY9dQKaWS/hhObgADw/1w2N9Y/CAx5NX9\nENrdWPd+yz5YW6zSB79Xao7zQKh7VU73LBs+T1ObWC16py52SfJV8S86CtSWTO5c0Negrnpv7inW\ncUvPzSOVLkE0z5O5eiFXgi4w18A8Zy6ZbPOurSv9m96rtn+u8dk1rw3zWrCff9sxwCDkHGCvXe8p\ngajuU//B3GkE0nDIKfvWsS94t9COtjrWa4HTYY8zuQbYP7Y2v5BbbDe6PrkFc6ajlq6An2HrT2GR\nOC6+rvRzUHutrjlV8U2/1G1Phf+i08fil5uYfZaNkK+quSD2u1V33KqvR7N7VT3GvC5cRwEbrhOC\njhF2DTDwxfN1Ukvxfa27iflj1mv63wvmefElIFwf2FAHLmj+/SjmBRtyIGhzEZhwKuLeAEqpPfv3\nUpjI6pDw2HrYHwzmgyOHvMLiN23zYRazmZqP9ZBXfTydwJZqGeubk3oOKQ0WzJqu1VaT7Mats3yN\nBWIIkQz7vNL+/LfDnMFi9jl8TmZ/botZM8M0KXBjujZbs4rMN22+NIt0v4Do9ZpaYJfo1rvOkFoM\nSVTteDZOWv8/Wv3bh70TW6zNDthb35s3F7C1pG5LVWMlZV7H69TP2hoHrV67ppHABrsWKa5JK8AO\nm877axwC6yeui4TUhU0Ew+Z2zX36JDM+wglx6ZNrm+WL5SPBoaYFenyYZJv4+hzCJNbtZOfeabP/\nFsRIbKiNLAxknzXhlINS6q2x3/tiIqtDYp/6CrcQVxiWvJoPPR/x08cXiSYs3vIq23WrnfD6M8iL\nSHN59R2NEz2zr66wyWF9LN9qygeXBoT+aOJ8QfDty/Z/hUVyCnX22s4OhzLW7npNIlsTWDsDOx9z\nZMbamQfs7q2zNjvQxVVGq3pyNieIUP08RlMGcJLFMV1wNHDM/oN9DDi2z/qxbbaO1Y4ANuwMIehr\nUhOfWmKxxQ67tL8+dlmfZxtdP1fby9XG+vz5rl8jvi93Owm35w0Zj0kLzOvLdJKzH3czlfZ6Zh3b\nF9b3qt6ef261FziZzl+xO0E+b1oXdqa8RmxO/ItXjuWcj7hCWCYGYS9Y83ckh8C2klffYyNh8lk9\nNTBpVgeCiCh1hXPQ92aOvMF933hhfM2rPt7deaCL3jV1HqSfi0/D2lbkFdufD6FiqT56WB9Ct9H1\nHvxuBBC30vLvtRnbjZ9zHUPyC1c/azcCcN0AFgqt3Mp/VypgcQt1j4wCq3+KFFiZmGvADYFju9zg\nJv/NGesnOINrqofSW+Xa+lVjfbW4pN/A3sT0dbRqQ5tGNeROsFj4FG5W4epOXT9Yd72YxjeEXE/Y\noDZ04bzSiq9y9K9tseq5cY1xKf3rfHxmAVdI+ypfNL5m9a3qnEFi30vePWlWe0JEBPgW4KuAG7Oo\nX1VKqV9OijWR1WEgIkp9rPrFx01CJDVwPERcYVjyCv1ss7r4o6bOa9tLqOgn1v41RNbDWcsasT2H\nXAi6wudeEGqLau/dJa5d/V/byKuLlPHG0sslrcYZwHitGsJ64PzeRmDV7TPI6kdRrcUmM+CsXTaP\nbXPGmddwFldVuc40IhEirLY8APzvKR+pc+OmfLHzkRpT7FWPWWw4kNM2NbZPmzCbdV2SHLO8iu3B\nnesixTO1T2OF3KKwUKwcJwL9eJlGBl2ss5ZBVv9WfdMgse8nF01ktQdE5KuAPwe+hnCRVXKB1URW\nB0KDrNoIkc6ByWuOVdZ8Tkb2NdVxoEvW1TcvNt8XI4Voxdbp0u7TjtfmSZsCP/kIk9b6uP98bSst\nf4V/iuVX3Jc2dk1CjgMuad1mc+GLho+8QoTAVlBfNmv94yOf2K0/FPc9z5Uhw0f32TzrGraObc+9\nVt2sYug9lEJYzfWYn5tzfX2WWCGZD/ityEIEL+bd6iOy7vE6VtMlwGe1ZTLDNil2r4tvjz7ktiBu\na2FcOgsbixGKFXJOSI2XnWHOsM6CJoE97QYTWZ2gISJ/A5wHPA34B+BzvnFKqcuT4k1kdRiIiFKX\nVL+EeE7sbnAh8pqTdZ3PGckuq8+t/z4xctrExtZZXKNddhDaXzxueG0fuUz1t/X5v8ay3inkNbSm\nu7a9vs/f1UdaXX/YxjlUbVh9LVft7lYpHazO2vuU8s1145qmAMayyiV4setgjwsR1rZsdMzL1R3r\n61pm4MvkuRZb9hruOabaW9k+sj7i2kZaXeS2VU0lsm0Etj6fblnY0LopMfKzx741+pNX8BPYo6dP\nZHWChohcC7xQKfWUEvGmAqsxEBKhu59jNk9wP098hVrW8b7FWpDvNgDd7bL6uAzYMf1/sOJFUrHK\n/NxCrRhcg5sa6X4AbeffrKpfLOYCX4V3c0c2EYrZjYWssHy3nd0io/qxurjKthaz92GIminoMq4F\nu6yzzu58/AFrbLGtCeGRKs56HWdjfW9OYg1uct016sojZwf/AH0xV6iNdd1KFVho8wqwZrVv3Tyy\nU/mqLhLVNvgKr/SzYzwZNEJfdPawJQG60t/YYPkaO9jk34VLPu1b8T5CvMNW8u15E98UW21V52PW\nOZg/x2bva3PSav7vK5IKFUXtVwVgi58Nxmmg7Tlyr8+6d87ix7fPTcX/xTRkr+XCdiTw2WjpNdLd\nCMx1Xlxnf+F14SviancfKFM8moOS7Z4nFMUu8PFSwaZneUjYn2bmMytEQt3x9pzYvJ7kFdoJbMjr\nVW8x3y7LZ5MVsp4KEbsQifMRWJ9llkGIyLloo6rh/fvmpxFfH3lvrun/Q9ju0en3fq3JYtPGp43A\nQkw3vDGPaaBJ5qI7gCFZxmHAJa2bbDfkCrvWfpuxt+s/vEfy/phtmvM5UpG99cXnyhDZtSNan1p3\noMrTFhrY1f01Ya0R6hpmW2JBk7ia393rtceGl6zuOWR1jc1G5tenI9VfVPwdqlwYcmuTUfM6ayOt\n+lx35+dhX1d/hb45J6q9Nq+n7TRgRtifR2b9Jnzv2XwrsHpvobsrae/3NrIb8oP1kVfwS0x85DV0\n162tdeyEUxJvBr4ReFmJYJMMYCCIiFLvDzzY5fZ/13kd3AYgXz6QKh3oU6xl0LdVbOyWfGqx1uIa\naR20QmNjc31IbSnr+71rcZYvVk4hnDvftw/XGcDODPo6bbV10wpd649wx4Xs6tfzHmXPCWUha7u3\nuno/dFs8FMONY2BX9tvnFXp+YtpSn4TCOCyEsHZksbOWWccnW4B2baaB63jg69y1zi4b7OHTtNpI\n7bYVeqytQMyXSU2REXSVEPj2aO/TXqNL4VafLlyxrLl7HjeSndFlAG9Q9xsk9nfK304ygB4QkZsD\nFwIvRcsBeqXdJ7I6EEREqX92DnbRrsbmxebG5hS0y4J014GcPvK5BBbSi7B8Vk6hsW37MWg7t5SK\n+dDc5v7yi9Zi5NWnc+3SBrft+qSQa3cvMeJq9uUrGnLj+/b3z3zjwh+hc7lQueuadXyxTOW/jyja\nY0OvDTdLGNO8mvH2MTPWJpTmmI+k7rHO7t763AbMh7XZAetHd5nNDhaIq32OMZLsgznXLbat/O5i\nu1n9eK1p9RV71dcroKUMZCcX7Z/yCKweEyex6aQwz4mgTbfqm+ObG5vvP7c88npzuXoiq6coRORS\nz+FjaMuq64BPwMILSimlviIp/kRWh4GIKPUuOmU8gXGzr5HHhrTMKuX1CulZ2DYSk+s6EIqTWpHv\nQ64jQRsRjp1zSgFV/Xj6lw13X6H1fVluH3n1EUgfUU0tmAP4R75t/ofo3vzN/IMwlrW19wD+rJ+N\nEFn1vZ5cImhneM269nm32VbZ400L250TW3Ai8lo+ug8VYfURV3t/IQIb68i0wR6bbDPjYP7TJq2G\nyJrH7CIsew2DNo1wW0Y25HKg10yzlrL359tjF9Kr97qYrc/Zkz2vXjetUC2VuDYf3z8lyKqI/C/g\njsCdgS8HLlNK3TontojMgCcDDwNujW7ufBx4qlLq3zzjzwSeDfwPNPn7d+BFSqmXBuI/EHgqcAe0\ntuTvgScrpS7L2WcOROQ4RPypA1BKJbVlnTSrQyNVa2o/BqEeg/GYvnkputfIYz7z5zb9q6/Tlq9o\nK7VgC/xFWzbCRRMuUejaXjWnxWRcCxujqiltY20stp71RQ+fs32+voyUTWBj7VT12Obam4H91jPX\nG+TKbeHqFm65xVxGmxojqL5z8hH6M7hmoXLeZx9l78ugTVfsWliZ+AutNK2Msv282OdoiCdU7VSP\naI2qT1JgN1XYO7mhiepVG1R9CwKYwRkz9mYbcHSfndnWAnEFLRewi6xi2TZ7bwfssMs6W+xgunYZ\nre2ixKF2Dqif06ZONLVU0bwftx2Nq/36cDPdoS+o/sKudc//YlgcFfqksl8bOa1k3RaydrGWPT+l\nhWysdWxI9zoWUhu2FMSz0TZM7wPO6hjjjcD9gdcD5wM3BX4SeKeI3EMp9a9moIicBrwFTTzPB/4V\neADwEhH5IqXUs+zAIvIQ4E+BfwF+FrgB8CTgIhG5i1LqUx33HIVS6rwh4hpMmdWBICJ1Z9yu2c62\nx1ck+2rgy8Kmer528Xudz83IxC7LPit2m705rvvt/9D8Lt2kFuPGnp80K64UXWluAwNXMtDcVztt\neA0/JA/l9+YfgikZ2xxJh68C33jHpsAlqYZ4gnYjgGbBF2hiYWdTD/bX2DuxBSdmcBU6hxPDMWAN\n2ES3l7WyrVBLBXxrz/ftuDDs768xmx3M3ROMNtUnDdDuCgfzn226zdS2pSnWW7HM62K8tNv0qfrX\n0DzfvlOK92J76uLx6tubi1vKZ0bPrL5OPWCQ2N8tfx3KrN7KZChF5EPA6TmZVRH5LuDPgJcqpX7S\nOv7lwMXA25Wq08Ui8pPAi4DHKaVeYh1/LfDtwFcppf5fdWwGXI7+rvO1Sqmd6vgdgPcCv6OU+onU\nva4SpszqGOia7fQ9bo/JiRubZ8+NzQslTyIOBD7rrJTM63x8IAPbmO+bF8jELn7ItmciId8bNZbN\n3GInSP5C55LunrCIkLGNgVvtH7tF7du3cQRo7jlObn1uALadlX6sSRBNhimUeTWx6zNxtNZdAAAg\nAElEQVSMv27MvDM40SC9tpuAr+uZm710HzcIfZmo10ortLM9ZPdObmjyWf2EmjzuownhDpvNsVee\nCSfRJPUqWjKr6Pf5DK0u2wE2ZzCrs63MDtg5sdUgr1CTZ1+TBjNu/+gae+vrbLLNgdVEwVwr83OL\n7XkW1GQ87Yym3cVrpyL+7YVHNZpGLXZFfzjz6sLOxDZdCdoN8dwja+x7Xi/rjbF2hX6K/CFmeRVy\nBWhzHGizy1oGxs7oFriVfh76dvkrnbgfF5G3Ad8qIl+ilPqP6qEfAK4FfseJ8wLgIcBDgV+vjt0L\nuDnwNENUq9gfqG7TP1REHquUGsS+QUQ2gd8F3q+Uem5k3FPQmeJHKqWSbpBMZHVIlPBX9c0PEdwY\nCQ3F7kpg7bkZ9lkp5BXCnq+NuVH/V894D4H1E5o0Amvgy6IuEsm4/MDMSzkXH3nVMfsQ2CZ5NUi9\nxeaTU/hgyKD5v4FNYN3xwAKB9JFXqK2nfHvy4af4NbVlreNabdXFVGESbR53iat+LnYDz/Us6Q++\nnU01JNV01do7sQUVUbSJq/l97+SG1qf+N/pP3UngyupnDLvo974hrdcCp6MzrSc1cWUGeycq8gpz\nAtuA7VF7cgZH9zk4tqYzt+v6GrivhWb2VDsH7LIxJ43Na+laUoVfq9obdtN6XdZyAtdyKkZeXfjI\n7KKdlu+zI25m1ySvYdK6uJ/KGzXw5TNEQH3k1Z0H4Wuc+rkzAaj/si5+y6+PnQv8h4gIWh/7Xk81\n/bvRpPeu1rG7Vsfe5Yn9LuDewG2ASzyPl8Cj0AT6qS3jXgs8C3gb8JKWscBEVsdDjs4UFm/Vd9Cb\nJsXuSmBjc3uQVwgTWGhKCHKysV2bF0CcBIYaGbgx7fkh/9QUAhvT9KbrdtNHGM/TNrh60xj2LEJo\nk9E2R4F6/J6XHBrUxMf3t8APIzOw92E0siFfWJMJtr1h9T7t7lPrwO6CFEA/shcuQgtkU9lfq9u9\ngr5NTzObuX50V/9u9KlXo7OqJrMakgEYcnoUTSgNST2teuza6jHzNM3JK5rA2nHc/1cZ2r2TZ7J3\ncoPNY9tsHduGI0aTu1Ndu/p9Yt4zW+w0SKMhiDGP1UUsZmTta28/Czl+qb59ufB/aYpnX21iGiKt\nLoLeqNadiDbNqrk2bVpXM9dgCbrRw4wPAwLcB33bH5hnJc+tfv3S6ucN0e+0/3SDKKX2RORK4Gzr\n8C2qnwvjrWNnMxxZfQjwF0qpf48NUkr9XxF5I/C9TGR1BVAr5BfRdvs/ln1tmz9k7BwC68u8WrFs\n8mrrXUNdtyCfxPZtXgDh28kpXbjc5gX+rGt6966cojRzTn0kBHES3IwJqRkWf4OG+D50hy6T+dRF\nSxq+P95dblPacggfcQWXYO/MyatNXKmur35O9Q43K/2lIa317e1AEdqR6jzW15nNDtjfX2NtdqBJ\n66xJTKHOqJpja7OK/pmxhoRi/XRxsnpsRk1Sj1lzjY7VvB/Nz6Oe195J50PnjHrs+tFdvccjTesv\nu/Bqh61KKqD1vYZ0rXHAttPNqq0JBiySL2iSrV3Pe8JtPuDC1ZT61jBduNzjdjwjcbD3VDcuqJ0f\nTLOCtg5d9t5iWWNYfP/5isdsgh+buyyskiQhEa8GngY8S0S20cVTNwWeia70B+YvEPMzdGvvpDWm\nbfxJZ8wQuD3wK4ljL0JfhyRMZHUMtJFDKEswc3SvubHb9pZDXK3joY5b4M++QpzE5rSOrTshNW/1\nhnwzDdz2sdD8A9JGXO14Kd27QvNDWZ8QiW3TsNr7b2ujaTKIqUUuNlG2r0+srawNu6WsIYvtN1nT\n9tVE87azm/l1yatNXNs6cbmk1UWT3OxzcGS2QFrn5+kUOhnMjlW314/usseZmmSajGpIs3qD6ucZ\nVNlS6tv/5ndo3Pq392BjTqiNFKCSAawf22bz2DYb69rCyn7tum1njVRC56abY+zrFPMRnu9n/h4/\nmP/cZiuqSY3BLa6accAJjINBTWJNIV3MQ9V1JPCN22YLX6GZXn/xvefLlur49YdmiMSGWtuac/Wt\n4dvXBD+UUleJyH2BV6G7Own61v1bgecBvwh8vhpubg+FvhkcpSkniI0/6owZAmeg79+k4Crqr7Gt\nmMjqkDCfBbnE055rkBOjjZy2xc8lr/b80Nye7WJh0W0gtXVsTtbVR1zBtt/xk4u27GVq5tSO2Xd+\naha2a/Y1hczG1wmVvDThzzDXpNVP1pt2UW0wI0Ok1d4LEM266v00s60x0urC3redgT04MoN12Fvf\n4+C6tUYFvvfLwjEtIwCjbzVvrpaLYbsBGJLqOALAYjZ3fo2q2/xGR7t3cgOO6bmbx7aZzTSha6ts\nN9dsHdvuqx0h5wZfdX0oKxd77bhOAmsW6fW5F6xxMCeAPj/Wbau1rRlfr+UnsvYYm8ga+LpqLWZl\n66zt9vzzLd6swM0I2+jVnqgHSkkQLjn+Gf71+GeKxGqDUurDwJ1F5NboW/efUEpdKiLPQxNXY131\n32gRzdluDBFZB24CHLcOf6L6eTbg+rWaGD6JQClcjS7wSsHNqvFJmMjqGOibNS0RI9d1IIe8uvND\nc9uyri378BFYCGdhfcQV4llXn1wAwj6SKbrXFLlAPbZZ4BNCaL4bx0VqMVqbFyzkZVJ8xDZeYmIj\nLBuwSauLmOtCaAV7F8YHthljkbzGdK4m8xsjrS5c2YidgZ1LB44053gJ+xEtI+CYJpY7sy1gg9ZL\n4rGsciv+YTGbu3bkgIPr1uZZ3X2n6MvMMfZV9rm6rw03u1qj/QuI65ers7N71XPT7Dblu70fazKx\nxn4jMe02NfCRV71r8zptfhb4PErtPbpE1p4D9evf9ix2x5jziRHY+rGmj63ew+I1cNHmTnAYcNvz\nvojbnvdF89/f8MyPDL6mUupSwO789EB0VvXt1eNKRN4H3FFETlNKfcEaey46K/se69h7qmN3B/7B\nWe7uVeyPFj2JJt4PPBh4TsLY76jGJ2Eiq0PCFCz4jttoI57Q79Z8l/m5ulV7jVS3gpQmBwlZ4pCE\nIKR9TSGvcaeBuI2RSzZSs5YxApuie82NY2Kl6Hnr8WkaVr2e7TCwSNbtNUIUZPFa+arCw8UtKR6w\n9jWwo7jEFRabRrTpXDV5Mbf9F0mrXr/5gnYz6m5XqsW2oeHs9hr7rK/vsTMzWklqHWsIkS5WNryv\nA6O1ZZ219Zq8uj6r/jaebqZuA230td+QjoTgFtzZ3rzb88xmM+vpk/LYz2fotnx9DXbZqiy4dizi\napNHn+QgRmLdNezmC/X8eFbWl5G117Q1sbYeVp9/0wM4pI219+QS2gkaInIztMDmCttKKjD28cDX\nAr/kjP0j4BuBHwNebB1/IvAF4E+sY28FPgk8WkSer5TarmLfAW1r9YqhbKsq/DFwgYj8pO0J60JE\nHoMm249ODTw1BRgIIqLUnwUebHtfp7zv2/4Gt8XoO79r/Ni8LnMSxoVaxua0i4X8xgU+/79Qpi+1\nXaweG37yQvFz2siGPWDTbqu3+R6mNGYIxfERinp8fkMDaBLalMYF9j7ceaFWraaBge0KEHIzcDN7\nLvlqI1D2nrbZmq+5wxa7e+uLFlMO2tqsQnsmzXeOtuF/vfc6ps+6zCaDdjwbodeEOW+3u1dIfuB2\nDHMdHHznbJobuK1jzf/NuoutaRezo6EmAwahAjCftMB3jvY6Lln2kfcQYu1kQy1Kh4KIqJerhw8S\n+8fk90NNAR4G3BKdwXwcuhTxN6uHL1dKvdoa+0rgEcB5SqkLreN/ic6ofgR92//+wHcCbwIeYhPK\nqoPVO9DFSy9EV/I/qBr/y0qpZzj7+x40afwgcAGaLD8R7Zx8F6XUJztdkASIyBq6cOqcag8XoLOn\nn0frU++IJqj/E/gn4JtTyfNEVgeCiCj1R7STQkgjY0OTz7YYPQljUfKaMjfyWA55DRHX+ZwAge1L\nXiHdaL4e7z+xHAKbG8NGVzKbQ9R92bM6Tre9u4+nkFd3P/aeYp23fF233LhuTPu2tnvebRn2PTbY\nZnNOvrbZYue6ePcsQ1Bt4hMimD6Y/bvnZ8fxWUOFSLfpcAVhYm+TeJtsgrGX8pM4mwS78+2uYeCX\nPYQ6btnEFVggr/69+LWqLnyk1peVdZ9D+/EYcTVok/n4sr2hrk9DYUlk9R+BewamvVUpdR9r7O8C\nDwfu45DVp6LN/G9VHboE+D/Ay5WHlInImegq+4egHQP+HXixUuq3fZsQkQeiK+1vj75h9BbgKUqp\nj8fOuQRE5CbA64BvRhPxhSHAhcD3KKWuTI47kdVhMCerLsYirylrLTP7OgR5jc3PJK+hrKtBTvY1\nlbg2Hw9XNPuQS2JLZGDbYvmQei3aiHpu+9Oc/Yc6YoXG+zKwbttYl1SFCPHi+s1GCKDP0b5tGz6v\n2Zzs2qS1rdVrrb2MZyLD6zZJakiPaceOxTfkD/xfTtxstZ1RtTuAAcFMsa+t7c6JrUYTBjwFZWuz\nA7aObbN5RGd/TRbYXEObuNprupnMLtfaJp4hAutmX90vIG5WN2XdGKl9mLxudLL62+qRg8R+jLxy\n1HO5vkFEHgx8N/B1wJno7OrFwOuUUm/Kjbd0oUnVoeGJaD3GrYDPojUYTzd6i4QYD0R3TLgD+lvE\n3wNP9rVFE5E7Ab+E1oCcjv6GcgHwQqXUdc7Y4/i/QSngrkqp96Xsr4EuelTIt6PyrTW07tWN0aVo\nq49WNjY/stfUZgUQ1r0C3raxqQ0KGnMSirZs5DYt0HP8JCxHS2vi5JCY1GuRaq/lHg03McgvRoM0\nLWyzkKt2AQCHBLE217j6/Hx9sRcKq2j/olOfV7OYa53d6vkKv/ZcshSyS/LBJZKuD627RipMsVX9\nfw2blMayokb24BaJ2TrchU5hJ7a03dZJqoYG+irM92R0v8f2OdhfY/+Y1uQeHJlV13yn+lnrRe1r\nad7LbobclSzE4HarWuy6Vq+5OGY235/rCdv2fnatrXy2VhMmVIQ0mZRWcoe7Ax9QSi24BCydrKL7\n2z4enTb+deC2wE8B3wB8S9tkEXkI8KfAvwA/i9ZnPAm4SETuopT6lDX2nsCb0f5eL0A3H/xW4PnV\nuj/hhFdo8vxEdOraxqW0IYVQQjc3AF+soYuu+pDFtsdSyWvKvnruJ9fzNVa4lUJe5+PnRTw5dlD5\nJLYEgY3FCcX1/RHMaXKQ6h7geyTeiavdlcEllL6OW4ZkhsirTVzdIiobPiK7y0ZVCLOWnMk2RFW3\nptWdinYsAuODT7uY8no0vrJgzm+7cV6h6+g+HsKiBjieSTXEc+fEFo22r1VbWLeZQqND2ImZ/mww\nXb/cQln7/6fP2DvjTPaObbF+bHuBtO5ZWWpTDGUKruyMcYi8GvjuGJiCLn399r3k1VdcNeMA419r\nmgZssNfaWtaG3ezA1+hgwoQOuBHwj2hO5joZLJesisjt0ALl1yqlvs86fhlwvoh8v1LqjyPzZ2jB\n8eVooe5OdfxvgPcCz6BJQM9Hi4zvppS6vDr2UhF5KfCjIvIqpdQ7nGWuVf4b+t3QRgghLfuaEquv\n60DKXn1xhiSvvnnu/Nh5xchvhufrfCueLGwOeYW48wCEvVEh/kfeR2JLEFi9ftyRwMTU+8jLyoav\nQ40YcQ1ZQuXR2/Zr4RIwt8+9jtLMMOp5djvWRRLtI7LuWikuB7WF1vaczIWuje+5DFWg+zTHTTum\nxayy65rQBSm3+4PZ0fmJzmAGeyc2mp23TlYE1ZDUk9W/K1kkq/b2T6L/ouzXrWTXj+7OSevOkaa1\nlZ05tcleiLzGpD/r7DXIra+QzF5jg915i9p1K4vqktYUuMS2a3OFEsiRIU1YeQRlF8vOrP5A9fMF\nzvELgOcCD0NXlIVwL7QB7dNsqwel1AeqW/gPFZHHKqUOROQstNj4byyiavBKtAzhh9FVdw1UUoVj\nSqlQ7xc/SmVMfbF88XLJq29MF5LoxunasCBXApBz/jkENiYdcOKmSggOZunSgca8DjIC8EsJIFbt\n69eIplpgNddOK/7Jie1KCOyZmw7508hvCOAeWySRlX+o54+jTcDsjJZLYJvk1Yz3fxHB2oOr2WzL\ngLmE2bW/stFGUFK6bLn7NwR2n7X581NfU7/9WNu52JX9NlHduW6zSVLtDOk1wLVVINO/Zw19W//k\nrPlet0mqmXcVdRtaAzPnaDXmJHAWWlS2v8HesbV5Y4T1o7sczHQDB2NB5SOu9nna5DV2jWyCa/vI\n2pKCEHGtiaqftJr5Ibga25ys7IQJXbBssnoX4DqaprYopXZF5P3AXVvm3xV9q/5dnsfeBdwbuA26\n0s686306WHPsbp7HzkZ/jG1WfXzfDPyCUsrtDtGOUhnT1HgpcUo0LPDFsWN13Wcbuc6N2zY/VXqQ\nqX+F9OyrjRCR3Vhrtw0K9ZxP7cClkU5gIb2hQTwrm0ZgFwl8Ez4CG5cCLCI00tftKkRk3Wviux0e\nslDSj/mLgNxbvi5it+DXrTdJ14yYT1dbr7G3QHhqn9pamhBr9tCMt1jhb6y4vMVQJptqk0+qn+Yl\ncS1NAnqS5q1/k1X9b3Tm1FzO06w5R9HdvvbRbpf7zLOszGbs7K+xM9tq+NUa4moT1fq5bJJXXyGc\nW6xmiKZLXEG/Bszv2x7iusX2XA+8X4kV9HOZ8h5Zn8e197wMpNxlmHD4sWyyegvgSqcrg8F/AncX\nkZlSKvROuIU11jcfNNm8RCn1aRG5EribiGwopexPaWM18aVOjEvRnmEfRH8MnYvW195HRL6papkW\nRpdb/qnZ1y7xhtC9htZqi1VKOtAWty22Pb+P9CAQN9Q2NlTABflFXI25AU1sSja2EcdDYLsUcrnI\naTFbI06Owd+tKr0zl/9o6Ja5gVtE5UYyt78NQjZbcbK6qF+NZWLttQ3srJret95Tl17u5hw250Sn\nmTV2u3e5ml3zhcEmrfZrx1dAZc7R/t0Q1e0TW3U29cRG81a+/U9fCA1DOI9Sv39PoAmnyaaeqH66\nMgA3xunADdHkdhfd/PJkdbwirXvH1mB2wMH+WqPIyxR42RlXvURc027gkxWsWa9ZQ1Td37eZscX2\nPBtak1T/+ywkG9lh03p9Lna+mjChJJZNVrcI05+T1pjPR+YTiHHSGQO6kOpXgNeLyNOpC6yegf5I\naijElVKPcmL+mYi8CTiONgG+f2BffnS5DQ/dspm+eF1kCKkyBXct35olNapDEthYRtidX1ADG8rC\nGoSkBAYxTWyOHjaELm4ENrq0iM1xKFjsatW/tawvi+oi1F3JJbNuAZJBKBsLfrKqNajNc11sFODP\nrLtoc6XwoU2a4OpqXQmC6X9kulPZpNU+n5g+dXdvfVGbuk99+96+lW/Iqk1OZ9Vxcxl3qUnqf9Mk\nrSeos7AuaT2BTmOYQqx9KqJKnZE1pHW2Me8O5hLXg1l1Da2sq++aA3MrLp8e1i3k2rfeP4a41p6s\n+/MvMk3SGoYZs4fphFXH22mxRBsKk2b11EBRsioiZwA3VEpdkThlG7hp4LGj1pjYfPDTMN/856LV\nSj+D7p4g6I+0nwZ+Fdpf9Uqpi0TkQuDengxtA8/48+o/a3DebeC8r/YMsv9WdClgyonX5ZZ+inQg\nNjZGllPJ6xjFZbkZ6C6Z4ZY9hbKwBiEpwXwLCW1koekF69PDgv/2cygDGCOxNkKk08BHPkNr+qql\n28hrjnVWPccQzXjWKFa45sZfpL1Nn1j7PEK3x93b9y559X85ybOQCn2whQl8Mztq9uiz+aqLzAx1\n1f/sbLbdptbsd9fMqJbeO7kBswP9aX9ypj/dD9DvtdPQ77Fj1hZtsmnf0t9FxzDzDLHdIJ5Z3UD/\n1TDjZ07cCGzCatrRQt3ty/wfaHjF7s99X2HvyPpcUOFqujfYaxRUmRarNmk1BHeLHXbZ8MpCfLfZ\nTbHWJ49/lP88/u9Aug/vhAldUDqz+lPAs0ggfRU+AdxWRE7zSAHORksEYmmfT1hjXQ3p2dXPuUSg\n6gzxdBF5DvD1aLL6gWq/Lwfembjvy9DFXTcEPhUa9IwHOAfqT10/SmlVffFKFG21vVr66l9Da41R\nXNbXUzaVvLZlhJ0xuTZaEHcjgEXyCn5Hghhx1cfDt68hjcTGCGwKeTXrtpHXEPGNEbbUQja91zTn\nBZe86lvj9lw/ATTnEEIbeTWoyWI7sWhzZXAlD4ZcupX/ts2Xa+/lZlY3rd9tT1qTWa0zgPusr++x\nU2lB5zZVR9d0xf8xFmUAbnbUfi+a8YZ0nkD/VbgWXTxl4GpWjW71JmjTxDOqY6ejibMhsFVG1ehX\noZYCAHO/V9e8f36Nj1jvm2rfa05mNSav2WPDklpogmtn/E02NpaldAvAAG503tdzo/O+fv76e+cz\n/zE4f8KEPli2DOA96Nvw5wBvNwdFZAPts3o8Yb6gjWRdX667o+UDH3UnVc4B77bW+54qzl8m7vs2\naKrxX4njm2jLGhqkkteUmKmkMycTaqMtA9tHX9tF69tXn1vafSDHNzajgAtY6MCVY6U1n9OjmUGK\njZb9R7CNxIY8JkOZUx8Jde2fcmy5TIz2zGOYzC6S0DS5RCzrmkpcwe8Dm4sQ4TXXxWcllptt9ZFW\nIw8AfR1rVwGtk92utJIHrLF2ZJ+D9VmTtM4qb9XZTBNOu3of6lSKfdd6pxp3FP1ePVb9M24ABq4r\ngBl3lvX/Y9Qk9Zg+X7vICmiQ1FAXq+A1PmKy0X6iGnpNmmIq47NqYGdZt5wbmbEWyja5Xeat+NQ2\nzxOGhYg8ArjQ14ypBFrJamWkn4ovz1z/NcAvoE33324d/zH0R8kfWPu4Gfq76xWWTdVbgU8CjxaR\n55uOVyJyB3Tm8xVKqehfBxG5MVoC8BngZdbxM4ETnq5WDwLuAfylUir+18x8ZqSSQyhDXvvqVFPj\nxGLmZjZj6/W9LZ8ap0tx2VCa3Iy95cgHbOlAqIALmuQ15APb1sQgloWtx4RJbAnyOkRXLrPnXB2w\n+yfV1xwgPesalzyUQFv3LruoLTfb6pJWfS2bLgI2cTWvJbsTlya5W3HSeqyysDKw31O2z+rRSkKw\ngyakZ6AFYkepyapNVE2sGTqrarKpZzAnqblZVF+rVd81Ntlnl6jarx33tWln0+2CK5NlpdpRCO6X\nkFVxApiwUvhd4OHoO8+IyAHwcKXUHybO/yyaQ3rvVqdkVo+j7aFSIBljUUpdLCIvBh4rIq8D/gq4\nHbri/rhjxv9c4BHAecCF1fx9EXkC2ov1IhG5AE1onwh8GnhGY3MiDwB+Dvg79AW5FfAo9PfiByul\n7EzpvYHfrAqqLkXThXOBH0QT2yelnmfnDCn0J6+lsrghAVsfScOQmtUSNmFDaVd989y5PfeWaqEF\nYQIbI656u37yatCVxIa0sCHyCmHNaqpswMTQ68aLwNqIbKobQzyLuoh4B692x4Rc2H6xNmwS2ySb\nekXzOnCzrXW8OttqMsC7Ffm0XQRc4qpj1O1jbYmAS1r31veapLWC27nKoOEosImWARj9qRGo+bSo\nx9B/cTapJAG7jSyqL4NqzsO+bj7C6cKnSU2ZNz9HRw5Q68W1YtgtwIo5YexXaWk9drmZzdT2wxMG\nx7U0i9SDBv8+VIlB1wN/jpRneRf4CJDCju9LboU8PAH4ODqb+kB0hf5vAb/kjFNoT9bmQaVeKyLf\nATwN+LVqv28BnqKU+qQz/DL0d+fHATeu1noL8Gyl1Mecsf+Glhk8CPhi9EfVfwAvAZ7jiZ2OPuQV\nuhPErrFK7C+XvPYldr41lq19LZ25dWNkyAdSCrdKdeCCJpFtq1TPKeSKZV9TZQNmjbYmBnoP+UQ2\ntbCrrfDKHu+ODXvIttuJxdBGdn1FVC5xdVvNutnWkK7VdhFwiWuItK5T+7Fur2+xt77H1rHtRgET\n1NlNA+3Xus3O0cqv9ehGrWMNZVZBjwmQ1LZb/CkZUX09FmGIqvsaSulAZT+npqLf/GZrWevxIcO3\nPed9O2VYT3F8GHi8iHwW7akB8DVtd+eVUhemBBddcxQZIPJu4IhS6i6twUSeCjxLKXXKe0mIiFLP\nsw7kfPnL/aKYkjxJjZmaiMnZY9/9paxVct8lrmfs8bb4bbH7zI885mpfDVzXAQNb8+qdt9b+MRDT\nm8UyJjGNnO+PayxL1EbI2vR4sdih+IuesIt7jrVk9a3ZZjXVBW3duuzz8LWCbXbSqq2o7H1pytVs\nxep24LK1kXYnK1OYZRdpGYnALuvssbFwbUOZb9cWa+fEVu3dGnopViR189h2g6C6rUtDmtLQGBuh\na9hGckMIrZPikxyC+aJ3XB6AUioro9YHIqKeoX5+kNjPkOeNei6HHSJyb+B16HsNSVPQde9JfDHl\nT/f7gEcGKvYnpCInm5qqKTXootdMdRrI8XgNxe27v1JZ05Kx+lhnlXYecGPkXMtM6UCq5hX8rgMQ\nlxJAXAsbK+aKyQe6NjNIue2f21Y2rSNXM/OaKxnoNjJ1drzQyy3uCkkF3IyrybYCDfLqZl3djKud\nbdXHd9hjnc2KuNqdoEKkzs7I7q6va/3rsW22T2x5x8/nHd1lY33PW+zUZvJvvwbc14h7K37PuYau\nVVUOQl++Ur5U+WB8V5eFPl/GJpSDUuofReTW6M6iN0e3sc9xWYoihay+Fv2n8CboYqYY3oi+VT6h\nDTnkNXd8ik61S5FVW0xf3K4x+5DB2Dopa/nilb5F30Y+c+PH9tfxi4BNXrtoXm20kdg+BBZMpim9\nlWxM/2rQt7VsTkeutoYG7oySnbhiaF8nzxN2sTgrLBUwezcwt/vBZFg3nN99Gdcdtiq5Qey53rRI\n4TabHDBj68g2x868JprhtwmqnU2NEVEX7r78RXWuq0Lz9RH78pYKX3vXxZhTUdUEP0Tky4DPKqX+\nrvr9mcBfKaXeWCJ+K1lVSr0FretshVLqQ8CH+m7qeoMhKv1zxw/tNtAWuyspLtBzYTQAACAASURB\nVK0lja2Vsp4vXskMZ4n4boyu9lmefcccB9r8XqFbFraNwEKYxLZlYLua/ENaNja2dpeGBm3kFWgQ\nPhdhTWs+1p3/18R/u0GK7etgd99ys642cdXjm44Idbz6ObGtrAxx1RpKTRt1l6/61n4KXHJrywli\nMGTVPId2xygfzH58j4d1zH7S2hVtspM2ortKXaNWaS+nOD6OdgMw9U2XoYuuimAqoxsTfYijQegZ\n60M0+1T0x2L3yer2Ja+hdUJjhyKwfQuk3DF9rkvX4q9A4Vtuxy2DUAHXfJuR5gWQloXNzcDWj7d3\n5eqTjU0x4+/aShbi5VTdqGr7rJBLQS55tbOuQIPA6nmL7gDmuTDEtZ4H647WtQ0xLWz8/BdJdsxt\nYjPw2oy9rkKk1SCHvLraYYP6efCfb1vV/ZRtPeXxBZqeGfcCLigVfCKrQyImzIc88mrHtNGXvPr2\nEdpLLoEe0skghUj64uSMLUFg+2ZH28aU9H6154bmZVpmzbfRQmJLamG7yAggjcjmNjQwiDUmSGtT\nmUZO4jrGvdYsoYscuQH4srtp5NX+aeASTPuWv8mc6t81oTTnfjAnhduNdUJx653WZNcmbqnWSG2v\nLZ/PbluGP/xVQP8v5lKxZ5F1337q/zdJ6g5xnW7qXieccvg48B0i8udKqaurY8lWpm3IIqsi4naJ\ncqHQ1lBXAH8LvEG12Q1c3zGUTVVu/KGypL7YsfhddaS55DUUJxQvdeyqEtiuJLRtbsq8hOs2VBYW\n4pnYHFutLkS2LRML4Wxsl85aNdplCD7YJvMpSJEbxCQGsbFuMZUNH4m3ySpQEdZmNtUm43WW1P/c\nuNfhDK5ZKGgyEoOu8GV2zR5DGVYb9fVLI61tsMm3uydD+g+ua8ba31/t2+xd9dgTiuOFwIuA7xIR\n0Hzw1SLy6sgcpZRK4qG5mdVbo+2Pb1r9flX103RP/ixwBO2X+uPA20XkAUqpYrqFQ4++pNGg7637\nElnSnH3EYvvi9yWvsVi+eKG4Xdcusf9CHqve+KmxB5Q1dM3CGqTICUJZ2HkMT1vZhTgBWUFbJlaP\nielj/RZbqc0Nwmi3IEq9bZwqNwjpWGGxwMuQNLs3fb2vJpG1EcvK6nhrjXahIQut5nk0n4OaWJ9o\nnENovkuUQhX19l5c0t2GXWrSaq6tuaa+7lP2nmzJxa7nfNzstLHtSsHBipPYCeNCKfUSEfkI8K1o\nN4AfAi5CN1XqjVyyei/gONp8/9eVUp8FEJGbojtDfS9wH+Bq4H8BPwM8HRjGCG3Vof1F4sglr3Zs\nG6V0p31JZs5eYvFLaFZDsUIxfXF98YcqjnLjDElgu8oH2q5ll+vnXLsUEgvDZWNdbKzl6WLn+4iQ\n2TCJTTP2j5HNUOcpG+4t+RBS5QbuDlOyr26lv5kXgh1vq7Kncufb8F3fxWxqjMjG5QNtWVwz3i4G\nM8d3W76A2GvZdlXQzKq6pLWZxd/1SCBmCxIHk03dr7p4zbt55WCJxHWIVsMTukEpdRzNERGRRwIv\ny2i3GkVrU4DGYJHXA9cqpR4WePwPgNOVUt9V/f4m4LZKqa8ssdnDBBFRXq/iLu+r3K8UuWvkxl/2\nfnLiDbXXlLglziNlnVictvl99tj3/EpcwwqhhgY2Qs0NXMSaHcQaHaToQUP6x7D3ZdkGB7G1+qzh\nixnOWvpiplfsh+K1xUjJguq4IZ2nS1YXM7d+ApvW/MAHV+ZguxO48ffnY5pFYk2SbPnJesjqzomt\ndKLqI6i3PG30pgCPV/97kNgvlCdPTQF6QERuibayWrxN0gG5f8rvAzw58vjbgOdav78FnRKeYFCi\nqArKFm7lxh8y++rG75J1DcWKxcyN3cWNoIvuNjeLW9qvNie2O3+o4jLPuDZNLKRZbEG8wMvNxObY\na0G6xZZPCxsr4mprB2sTs5SMXuoaodvx0LwebQ4N7YVGcSeGthj+uX0K3tr8Yxczob5Ws+7aLnwN\nEerMedOFwCWpJrtt232ZubvWXtbY5+DIjL31dWZnHbC/7+cWMRJrJAHLbA4wYbWglLq8ZLwubgBf\n0/KY/U3kOqh8SCb40YW8Qvfb4EPE7zK+CylM1dOWJOfLJK+h9boWV/nmuvP7xE6JX0IekTiulJwA\nmgQ2xx8W/N2p5vOtE2n2WV8kf77OXAYxcqnnphVkxYrIUv1hfcQ7RuRTLI9cMtpmIRabG5/ftXDN\nb8EVa3zgwtXpLnav2p3Hb9p/tTVYqMmskQ3YutlG964junuXb38b681r6BZiAXwueIWGw+Szuhqo\nCvAVcH+l1H5CQT7oAqv7psTPJatvAR4jIv+klPpjZ6P/E/gJ4C+sw3cCLstc4/qDLnrULo4A7lql\n9Juh+G1rdBnfJcuYUwxW6vzGJK+p6/XNRKd6rPoeH6r7VkoMX6yELyJdSWxIC+vKBnIbHOQ2Nkjx\ngoWwjRakEdlSzQ1iBDjFpUHvoXlt+rSfDY3ObQQRIq8+4uq2mvXZWLnwZWHd9rNmDTM2RFzNuZn2\ntG3Z1i1PgZtey9rnEf0j1dprwvUet0YnKMX6fTnWVcBPA+cAfyAivw783+r4V6Krvz6JLqpCRI4C\ntwReVWar1wOUKqaCst2wfGusknSgRPHYUNewRDY0Z0wXv9lc+UGudCBlDXedrjHcOCmxCkkJbPLa\nt8VsSfJaP55GYiGNyMZstXyZ3xTyamKkSBFSs7ExCYCPgO5Xt75dtFn/+3bSXKv9Nj6Y82p63m46\n5+OeQ0g+ECKv0HQdcBsqbLCLaXpQN1aou3bpOL6vBPU5rwpJ7WMtNqEclFK3iv3eF1mvNqXU5SJy\nB+ApwLcD51YPXYZusfU8pdTnqrEn0RrXCSHkEjgbObf2x8rwDpV9LdkZq0tcX+y+cbuQV9+4VbDN\nCo1xx5WSAJTI5iaOcQlsrMVsm/Y1VT6QSl4hLB1ojknzgjXI0cTGMqc53rImFrRralNaz+qxIRLr\nL1qLyRHSmiMsanltuMS12anLhqn+r/1Ym7f1D6wvCHHyautczVptxLV2ZljMrqYW102YUBpZbgAT\n0iEiSj3BOtD1S2iXeV2/aA691lCuA6vgDpATe0zHgdT1xoxTaq2UWCX2HHi8hAPBUM4DKVmvFJIR\nq7APmfl3WS/V2D21G1VOy9AUJwLf/tpi+Xxh9bxwC9iYXZavTarPC9a3rk1e3fV9bWZj5+hb26x7\nkdxvdDeAR6kXDRL7FfK4yQ2gJ0RkEy0HOBP4PHCpUqpTHdNq5PFPBXTNonaZN0bRVpe1+kgHSt3i\nHzP7Gordp73tELfkh47jxhpTAlDi3APvi64OBDEJQVfpAMQ1no04LXICPSacjQ1pYts6csUyv23F\nUiEnglBWN7WZgY4ZR0jL6jY7cGO53bpcEunzwzVaUd9tfVePCot+tibzamK46zabBMTlAqFrYWAK\nvpbdQWrK7K4eROTuwDPR3vz2i+kLInIceLpS6t05MSeyukx01bD2LV6CYSyzfGuVkg6s6i3+UrGH\nLNzyjRuSwHaJNaQEoLR0IvIlqguBbdO/tjUwyGkpC2Ei2yYpaHMlGOq2fyh2rvVUiMS29fvK0bK6\nBDaVvILflcEudgpLCGrZgNsdDGtNQ15BPy++RgXr7C2QP/v3ZoewdB/dCacOROSh6Fql04DLgQ+i\ns6pnArcH7gfcW0R+QCn1utS406trSJhPwa6ZTeiWfR3LdSBlvaHIa+7YMb1ZY2ssI/uaOq5P5tSN\n16fCP4XEtq2Xu07Xjl4dLbTaWsqmElhoJ7GQRmTbSGyIwOZkXw1iJLaOESeeqZldO54vTnu73TDa\ntKy+VrN2m9mmVrgmkr5925X6vgYFPgKr54UJrO0K4JJXH2yZgnnel53ZXPb6E2qIyBcDLwc+Dfyw\nUurvPWO+Bfhd4BUi8jal1GdSYk9kdQx0JYbQjcB2Jb2lCOwyMpO+sbHxfffRthffGn2lCatCYPus\nW0pK0LbeEJ6wOdnblthDEFhII7GQ18wgVtiVa6sF7R6pKQ0OfOu2xYxJFEJoI7O+Hba1mm0WMS0S\nSbuJgB7vlxCY/YFfPqD35y/k8vn76mKrxcwqgK/oKlU/POGUwo8Am8A9lFIf9g1QSr1FRB4IvA94\nJJDUgmwiq8tCSQI7lPYVxnEFGEv32ja2hH1XbI0htLXLILChdX3rd81qunFSY8We7763/3OztyMQ\nWEgjsZBPZGO62BCB7aqDhXR/2FzS2cWZICUuxDLWfmsqO6uqRy1mOO05viysT0Jg9upaitm37Ztk\nddF6bIvtxp7bCsg2ViSzOjZE5H8BdwTuDHw5cJlS6tY9Y74G+F7gYqXU7Z3H7gk8FPhmtB3oLvBR\n4EWu3301/jhwT88yCrirUup9ffbagvsAfxMiqvONKPUhEflrdIfTiawuHfvkXeExC6N881LnDu37\nOqTna98scOn9jEVgfXH7ZDBz1++ydldCnFPM1fX2f5e57vyEMSkNDEIkFsoR2a4EFtILutparoYy\nsl1u/6egL5m1W6/aM3JJrC8La8sPbBJr7z22V1eb2iSsYXuqVdSstjljDIBno5t1vQ84q28wEfl2\n4Lsh0IkBngecDbwe+BBwOpq8/qGI3Fsp9ePOeAV8FngizY6iAJf23W8Lbgecnzj27cBPpQaeyOrQ\n6EoIYdzCqNjclPmrogkNrVGqcKvUfmLrDKGBDcVNjRmKW1LDmrN27Fx63qLvdfu/hJdsRx3sfHpB\nIhsr7mor7GojsfM4PTKyKZKCLo0J0tFWnlWvZ+D3V10ksSkE1ow1cOfU0dcJtXN192lfZ1/W1CWu\np6Ap/62VUpcBiIghj50gIqcDLwZeBHxnYNiTgYtU02f0t6oM6qNF5LeUUh9x5lyrlPqjrvvqgbPQ\netUUfBq4YWrgiawuA6tCYHPWHTs7WjrDO5T2tW0/MJyNVih2znPdlxjH4o8tAQi95rpkOEve/i/l\nvJD4xaAvke3jTpBa1AVpZDZGZNuysXEi2724y4bPfsqHUPGUWQt8JHaxOYB+fOYlo3odf+Z5s+Ua\nG5g9+DxUQ/tedqHV2BldQ1QL4VfRjWufRoCsKqXeFpj7WrQ04OsAl6wiIgIcU0pdU2arSdiEljd+\njS+Q4WQ+kdVVQUkCm/NFt5QDQdu8IW/td1knlxz3Ift9b/XH1hkq9pDZ45KFXUORzKFv//dxS/DF\n60lkc0hsF3utRpwMq62YtKBP29ku2Vh/rP4Z2jYbq8Xr1MzCgr9QyyB0kzxGcE1XKxtubJ8bw4R0\niMg5wGOBhyqlTmhumYUvrX76MplnAyeATRHZBt4M/IJS6t+67jcDg3SamsjqkOhDIqG7FrVP8ZZv\n3dS17XmlM69ufBupJLmkrjY0LzXGkJnnPrFLSyC6yjFSyXmMvLYRxK7eqr7HS9z+D8VxY8Xi+WJ2\nlBX09YcFvB262jKykN/0INUjFsI+sQYpTgV1rHZS6/NPdffmFliZuCHng9D1SZFc1HtPz0q77Wj9\nrWxH144eWojIGvA76GKkZK9Ra/4tgB8F/h24yHn40urYB4ED4Fzg8cB9ROSb2oqfCuAVIvKyhHFZ\n/HMiq2NiWeR1GWsPLRsIrVWKxPWVTfhilLjFP3TsoYvuSmuJx9SX5kgHUuL7YvjihGL1jTmAO4Hb\nXrZEUdc8lkOOchod5DQ5sNGHyBq0uRc0O041CaI7N0ReoV+muo5lNK/5RHRZVDWlXe4K4snoNqQP\nzp1YtTB9PVor++1KqcYLQin1KGfKn4nIm4DjwG8C9++y4URcyJRZvR6idAa0D3kdeu2+5BWG93wd\nu3htyKK1oQvictcoQY5TzjG2Zpfb832kA74xpW//h2IO4V3LIoFNaS9rkEJkcwhsW/YV+mVgoRyR\nhSaZbSOhPuLqzsvpANZHP5ySRXUzr4cRVx7/MJ87PnTSEUTkK4FfBJ6llLo8c+4G8AbgTsAjlFLv\nSJmnlLpIRC5Ed47aUEql6VwyoZQ6b4i4MJHV1UNJ/WnusztGdtM3PnXOkK4AofhDFq+NTTCXSdyH\nKIYbI7M5gj1V0jqxWL6YfeQEGRnkFA2sQddMbF8CC2kNDvTj7cTPIMVqy0ao+EnHapLQGHE181Ls\nutr0tG1k1ictWDUJQCmt7Fnn3Z6zzqstTj/6zNcWievBb6Ctr94gIl9RHRP0O2u9OnatUupT9iSL\nqN4H+JEO1f6XAfdCV+B/Kj509TCR1SHRJwtnsIziqdDaqet3IaJjSRzGyvD61mpbb+yitTGIe4n9\nd72tXSoL2Vc+4IvTJwvrWzMUs1RhV45+l36OBCUILKRnYdvcCObrZBBZaG9+AE0C69Or+taNdetq\n6/5V7yEtK+u/bos4lDfil4cvA24BhNK4HwP+AvgOc8Aiqt8C/KhS6lUd1r0N+t37Xx3mLh0TWR0b\npbOfsPrZ1y6kuZQ7wliWWSlrdVlvVXSvofi5a8TWKa2t7aMHXTV7qqFv/5fW74bG0U0LC+mWWvM4\nA8gI5nGcE0vNYEK4wKtNr6rHht0H2lrOmrh6D92su3II7FhYVjOCFIjIzYAbAFcopXaqwz+Dv5nA\nbwM7wJOwMp8isg78OZqo/rhS6ncj650JnFBKXeccfxBwD+AvlVKp1lJZEJG3AU9VSl2YOe8+aEnE\nN8XGre6zfKpgyr6mr9nXDcCg5O3zPmv51jtM0oHQGrnrDFUcllpU5BtbIntaIovZtl6XNVPX7esv\nGxrnGdvFjQDyO3T18YZNKegCP3lKLfAK2UnFSGaOdrWNzJq1QmTW17ErRGCvrxCRh6HbngpwU+A0\nEXlq9fDlSqlXW8OfCzwCOA9dfIRS6h8CcX8DuEYp9XrnoT9EF0X9HXBSRH7QefyDSqkPVf+/N/Cb\nVUHVpeh34LnADwKfQRPhofAJ4LiI/Avwe8BfK6U+5hsoIrcDHgg8HO0T+5q24BNZHRK75Ffdw3K1\np771c/dQIvs6VNU9jOf56lurbb1Vlw6krOFbJ7ZW33MIxe5TvOUbWyp72pUIh+KNtfc+++6w5xKe\nsAYukU2REUB+Jha6ywp8TQ7azP4hniVN1a6a9UNrmfXanA1OETwKuKdz7FnVz7cCNllVwHWkw1dJ\nf+fq+LdU/1w8E92GFeDfgPcADwK+GDgN+A/gJcBzlFKfzNhLFpRSDxWR84GnA88Hni8iVwEfR0sP\nBLgR8BXAGdU5vRmdLX5XW3xpdvCaUAoiotRDAg+WeG/3/ZqxzD10Xbvrel3mjbnH3LVy18gZ3+d1\nkbuvLmsNeS4psVPXT1m7LVbO/lP31XfNlHVK7zthjK+gyweXxLrw+cIuxFjLK+iJ9a4P3cKOdYNK\ntWpKKTxKJZqx/djrnCMXo5TKdrfvChFR56m/HiT2cXnAqOdyfUJVJPa9aFJ/O3QGWgGfBS5G22i9\nLqcb2ERWB0KUrLoo9cW0D4Fd9h7GJEmHgWQPSWBXmbwPTWBz1yhFAlPXLU3GS5DBEgQ2NVZqvIw1\n24hsG4GFsiS2C3mtH08hoO17zamgjxFadz93kksmsjphEEwygFVA36Ipg9K+q1320XUPY1p2jaXN\n7LPekJX+YxaVlbjF37ZOrlShr8G+L3ZXDWvX9frEy70ln9v5K7ZWqWtwSAq65rF6OBPkOhKkeMOm\nald1vHaZwTIxtXk9NTCR1SFhPne6XOUSBHaI4q3cfYxNDH1rdi3e6rLPofY4ZBHTqheVhdZpWyuH\nROWu04fE5hLY2Hpd4vX0Vs16LkoVooVipX5pcMZ3LeiCmsTGCrqgXIOD1K5TfYmsQQ6hXa4PwITD\nABGZAVvAtlKq7R0axERWx0AJ0gjDENhl7KMkgU1Zu+t6JTKiBkPscchK/y5EzyD3Goy5Vtc1+5LK\ntqxgCnkLrds1XmFv1d4Z69R4JYvRrMdLesPCcA0OIN2ZADSZzSmwSiG0oEltGqGdcKpBRL4feBhw\nV+Am1vEr0QVgf5Db1GDSrA4EEVHqO9rHzVHya8OY+s82jF1MtYw1x9LADq017XPNx9TBdl2v7/ql\ntbFt8ZahBY3FKanfbVsrN94SiunGLOqax8oo7oppY+fxOr6RQtrZW8pnRtesnqPeOkjsd8u9Js1q\nJkRkC3gjusvWNvB+4D+Bk8BR4GzgG4BNdJHVg5VS2ymxp8zqqqBU9hXK+64ajJmFHfvWdJ81S+l0\nobwPat/sa8oaXeeWbK6Qs27b+qE9lM7GdslmhsaW8nTN9Vb1xRjDEzY1VihuAS1vaqvZEv6w81gR\nXWwj/lrc+zRVYuCNnZipnXBK4lloB4CfAi5QSi28S6puXD+Gbjv7TODnUgJPmdWBICJKPdA6UOpr\nwTIySjEsez+HwX2g6xxYPXunruuUmAeHy3JtzCr71PF911yWk8JQa/fNSI/sSuBDama2dFbWh5vL\n1aNnVu+sLhok9nvlm6bMaiZE5ArgT5RSP5sw9jeA71NKfWlK7CmzOhZKaEVLxenbNMDGqnXgGjr7\n2nXNUub6pRssLKP7WWnXirEKD3Pa+LrrpGRe+1TZ+8aXWnPI4qqUNWNr5+qgS7kTzCKPBdZyM7Gp\nBV0GITIbyszmtp9txEzQrXYltBOu17gpcEni2I9g6VnbMJHVZWEo8tolVinrLIOSHbjGLCAbq7K/\nz9yhq+9zb423rdW2XmhOyjyDErZrQ3XR8sVPcSIo8ZwO1dkqlUj6YqXuqw/ZzFm767kMKCMAfxY2\nl8z2tduax+1BaCeccrgM+DbgFQljH1iNT8JEVlcFKX/MusTqGq+U7yosR38aWnuMLF6f8y1l61TK\n1qrPOqH1UtdcNokd6otEafLnixmKO1T2NTVWTsyuBDxn7T7nMqA/bIzIQh6Z7aqPncdtIbS5Hb1K\nY8rwrhReDvyGiPwJ8ALgPUqpL5gHReQ04BzgicB3Aa1ygfncSbM6DEREqftSTh9a8mvFqlT82+i7\np2VVlh8WzecYzgNd1+q7Xon5sHx3gC4xU+PmxC5dfb8Md4Cc8aXPpfTznHm+Q2ljoV0fe4PZ3uia\n1a9T7x4k9sVyzqRZzYSICJqkPq46dB1wJfqr3gb6tv+R6rEXA09QiSR0IqsDYU5WXaxacVPJOAZ9\nz3HZRVt993B9JbBd1+m6Vt81+85dleK2w0Jgc9YtHXOIYrSUtUs/3wOdR6rNlkEXQru7sb4Usnpb\n9b5BYl8id5rIakeIyO2AHwDuAtyCqikA8Am0z+prlFIXZ8WcyOowCJJVFyXJK1w/CexhJ6991h+T\nqI29x2W+JlaR3K9K/NIEdoi1l+Crmr126Qx1aszEcbkE1kaIzB49nYmsThgEk2Z12ShZmQ/DFm71\nibeMqvPY+mPvYRX0r21zx95jSUeGnHVD81etuK30te/ThStVPxoaW7qN7RCa3pItbWPxUtwV+sQM\njcvUxUKY0LYVe02YUBoTWV01DF2ZD/2e9VVpHTsR2G5rj+E+4FsnZa3Qeqlr9lnXN3fZxW1dnRmW\nSSJjY33jSxdg9W35Gorb9rwNsW7p9rUdGr50KfQaG6FuWhNWGyLypcCXK6UuTBk/kdUhUarC/1Qk\nsGO7Dvj20GUvQ1SwD0nUxsowdl0rtmafdVPWLkW4c4nlUKR+rCxsLG5JT9XctUue01iEPCfmUF8w\nIvNSsrMTJgTwCHTHq6RvGxNZHQulCeJhI7Bjk8bQPpa1l2XZdx1GApuyXt91fWt3yUynzCvRVrfP\nWrH1hsjCxuL6Ypc08M9du7Q/bGz90mu7MUuQYjdm6rwlMonJuurUwERWl4lS+lKDMQgsdNvnqpDG\nIfcC48kISmcaV4nAhtZLWbPPul3fj6tA7tvWXBUSmxO7a1OD2Pp95QR9sqHLuv1f6vkJxU+ZM+GU\ngIg8ImP4HXNiT2R1lVCavEL5Ai4ol4UdqnnBsggsrKYONmUPJbKMQxdV+dYcct0xi9tgGL1u29pD\nFfiUit2FwLatX/r2uy9mLG4fLWmp7lqxWKG4sfgTJmi8ElBAqotCsh3VRFaHhLHB7YrSt+ahbGcq\nGyWIZymyPiSBhfGzsCX2UeJW9FgaT4Ohi6pKEdjU9UpfH4Oh5BZD3fbPiT1E4dAQhDPnOSqRjXXH\ndu2uFVo3FDe2xpJwMNGYVcK1wPvRjQHa8N3AQ1MDT8/y0ChNDocgsDD8PpclHTAo+aE7JIldZjHX\nEJnGwyR1cNfs81z0ycDmzId+ZLZkNnYoSUFXZ4ASa+fsITd238x17DU3xq3/qbhqwiI+AJyllHpd\n20AR+ZqcwBNZXRb6Vr7bGIrAwurdZh8j27zMLxJDFXOl7KWEz2fXDGPqXBjPjWAZDgRt83PjQDlp\nSNvaQ5HYPpXvvng5a+fsITd26Qxvynux6xebFS2uAtibCqxWCe8DHiMim0qpnYTxyU0XJrK6Clhl\nXakPQ5G7rvtbZaeFVSGwvr2MQV5T1ikxd8yiqmWS2LY4OfHGumZ9JCgp5LGkHnsITWxu7D4kNkZe\nY2u2rR1aP7bOhFMRvw98DjgGtJHV3wcuSg08tVsdCCKi1N0KBhxKHzTE15VSey29t9LxVu08++yn\nyx7GXq/E/Nw9991niddIqdfHKl+z1DVSYw+956HfL6XOs+tznjuv2ofcdvx2q1+kLh8k9mfkllO7\n1RXClFkdEuYb51Ca0lXNwK5a5jUUr2/MVZNIjO052ud57nvOYxVV9b39OZTFWc4eYnHGumalsvip\nr9MhdbVdxkN/KUFKFravPKJtXpdCrIFxcN3UwepUwERWx8BYRVGlMn2lSeIqaUKHjrmsW/YhdL32\nq2JLlbp2aP6QpHtZxWNte8jZy6oS2NLkNTduKH7bGkPqfLt6qo7hpzoxiQkDY3qJLQtjeKrCamZf\nV00TOnTMZXfAiu1lSPLqWy9nzdDaOeuX8jsdy2ZsaNeKMQlsSSLYlbzmxm2L32WNLnP6uAekFnKF\nYsZi++LHxo6A/f0ps7qKEJFLW4YotK71CuBvgQuUUtcG402a1WEgIkrd4UAF1AAAIABJREFUpUeA\nIb9GDKF/XVU9qMEQ17NkzFXRv3bdR4lrsUx9Z5/9L1O723f9PnsYQ+c8lEY1J3bfdbqslTM+ZU9j\n6JVnIHcZX7N6g91PDhL76o2bT5rVHhCR48AtgK8ErgY+Xj305cANgI8Bnwe+AjgL+CjwzUqpz3rj\nTWR1GPQmqz4MRWAPQ/HWYSDYpWOuAoFdNhHruwfoto9lF1Yt+9qtKoHtWPiThbEK0bqslTJ+jH0E\n1pC7TWR1goaI3AH4e+BpwCuUUl+ojs+AHwOeBXwr2pv1McD5wMuVUo/xxpvI6jAQEaW+wTowFNE8\nTAR2FYmci4nADr/+solYnz0sm8Qucw+nMoHtsk6fNXPWKp2F7RFf7jU+Wd28+r8Gib1zgxtNZLUH\nROQtwL8ppR4bePwlwFcrpe5b/f5q4J5KqS/zjT8y2E4TIRpPEpFLRGRHRK4QkV8Xka2MGA8UkbeL\nyAkR+ZyI/ImI3Cow9k4i8gYRubJa72IReYKIeK9FTuwo9p1/peDGLRV71/lXAiX36u6v1D59e+x7\nTYc+7xJ7GnP9Ute4z2ug6/p9917idTvEHoZct8ucnP3lxu/6HITOv8v5tK2Zs07OfkL7yN3LhAnt\nOBf4YOTxDwLnWL+/A/ji0OBVKLB6AfB44HXArwO3BX4K+AbgW9omi8hDgD8F/gX4WbQW4knARSJy\nF6XUp6yx9wTeDFxVrXslOg39/Grdn+gaOxtDFAYNGXus4q3Dsk/ot9eSVbVDFDHl7GNIC6/cvcB4\nHa7a5ubML1FY1WcPpYvK2tbMnbMM+6zUtULrpaw7lMVWl/2U6Ki1BBxMBVaril3grsDLAo+fw2J7\njxOhYEuVAYjI7YAPAa9TSn2fdfxxaP3CDyil/jgyfwZcjj7hrzXtvSqtxHuB31FK/YQ1/v1ose/X\nKlU7CYvIS4EfRYt739EltmdvTRlAVxwm+cCqSwdsnIoygsOuo/ThsOpxl11YtQwZyBja4TE1qn3W\n7Lr2kPKI3Hmevch9x5cBrH/u6kFi7934BpMMoAdE5P8APwQ8FThfKbVdHd8CngD8CvB7SqkfqY7/\nKfAlSqm7++ItWwbwA9XPFzjHLwC2gYe1zL8XcHM0cZy39lJKfQA4DjxURNYAROQs4PbAhTZRrfBK\ndI/aH+4Se1AMdQtmDOlAiVvzY8kchpQ6rIqMYIjb9yX2UVLOkLOvPnvo+zyXeJ2U3n/XNfvcRi89\nZ+zb+6E1+66du1ZO7LY1UscO9Rmaib2TG4P8C6GvdFFEZiLyCyLyERE5WUkSXysiX+0Zey8RuS7w\n742B+GWki/3xs+hb/b8KXCUil4nIZeg7288GLgZ+rtrzUeAk8OJQsGXLAO4CXAe8xz6olNqtsqB3\nbZl/V7RX17s8j70LuDdwG+AS6u+B256x5pjdIDUnth9ugrsUhrjNP6QsofSt+aH2WuJWbAglb/uH\n4o11u7z0Pgxyb4nG0HVffa9J3+d5KDnB0DKI0NqlTfe7zCl9TVLXja3dtofc10GXc8yRCpT+/Drc\n6CVdBN4I3B94PfoO8k2BnwTeKSL3UEr9q2fOy4C3Ocf+wx00qHQxE0qp/xKRc4FHA9+OtqwC7RDw\nJnQicK8aexJ4eCzesl9qtwCuNJYGDv4TuLuIzJRSobfKLayxvvkAZwOXKKU+LSJXAncTkQ2llP32\nvk/180u7xA7srYmhtJQGYxDYkq8W93oMRQbh8DVcgG57LvF8DUVgDUrtycbQHadKkOhVJLF9yFrX\ndYdac2yNamzdEnvo0nXKt1ZJsrxizQCWgUq6+DjgtY508TLgfBH5/hbp4ncB3wa8VCn1k9bxV6Mz\njecD9/NMfadS6g9b9jYDXoiWL36zJV38G7R08Rk4dTlDoyKjL6n+9cKyyeoW4bfTSWvM5yPzCcQ4\n6YwBXUj1K8DrReTp1AVWz0C/7eyxubHzMTaBPUzkFVa3fazBqu+51BeYkuc5xJeKsYuDYuuWWD9n\nH6X3P/S+x3yu+hDtIb8gpeyjy2ury1oliqqWzSLGLbCKSRefi5YuBskqcB76ju0r7YNKqY+LyNuA\nbxWRL1FK+bKmW8CBk2izYaSLT3Oli5VB/0NF5LFKqYPI/gaDiNyk2s+VXeYv+2W2jU6B+3DUGhOb\nD/63lm/+c4FN4GeAf0LrVK8Bfhqtq7Bf9bmxF/AMqw/DeVtw3umx0RVWnQDF4pWKa1A6+2pwGEl3\nqT0PRWBXzXGhJClalQz1GFnYZex7bOlCic+tZbo3jCG3SHx/H79Y/zuF0Fe6mCJHPJfFW/y/RUVw\nReRjwIuVUuc7Y/pLFwtDRG4BPAf4TuCM6tjngTcAT1VK+e5ce7FssvoJ4LYicppHCnA2WiIQ+774\nCWvsv3nmg3UbX2nrg6eLyHOAr0eT1Q+gSerLgXd2je3DM0I0PBerToDa4paKP/ateBhWC1tSt1vS\nRqvkrfpV0vp2Jdil9tCX4Pcl88uSQYy9btf1Sn0OLON6DU1gA/HP+zr9z+CZf9Ky5hA4OSqN6Std\n/DCad9wHfdsfABHZRJNUaMoRv4Amdn+F5iS3AB4FvEBE7qCUepSzN7MP394gR7rYEyLyZWiSfDPg\n/ehzB7gd8Ah0FvluSqn/lxJv2WT1Pejb8OcAbzcHRWQDLVY+njBfgLsD/+A8dne0fOCj7qQqRf5u\na73vqeL8Zd/YDdgv19JXegjiNmTGcaj4Q5Ekg8NSeFZynyWfpzFJ7GEjj0NpYfsQ2LGyi2PLF4bS\nDOfEGDuDXKroKldCcP1GX+niq9HtR58lItvAW9B3l58J3NiaD0Blpfk/nBgXiMhfA48Ukd9RSr3T\nmTecdDEPvwzcEPh2pdRf2Q+IyAOAP6vGPDIl2LLJ6muAXwCeiEVW0X1jN4E/MAdE5GboyrYrLD3G\nW4FPAo8WkedbPl53QOs3XtGmzxCRG6MlAJ+haV7bO3YDQ5IegzGKlkru+bAQQReHRUawatIBG2Nk\nm6Ef+RrThSC2j9y99NnDMrPIy5AvlCChy3JwGMvxYugkxqrgn47Du4+3jeolXVRKXSUi9wVeheYb\ngr51/1bgecAvEia6Np6DdhR4EPUd4d7SxcK4H/ASl6gCKKX+WkR+m1oD3IqlvuyUUheLyIuBx4rI\n69Cp7tuhbSGOK6X+yBr+XHTq+Dzgwmr+vog8AS1ovkhELkAT2icCn0YXTs1RsfmfA/4O+BRwK3RK\n/SzgwUqpeZPh3NidcBg1n4cx+2owlgYWVnPfqyYd8GFom7OxM5++PeTuI7SXZWZgc2MMUcw1pBY2\ntm7K2iXmj5lBzllrjMRLDko5Etz5PP3P4EXP9I3qK11EKfVh4M4icmv0rftPKKUuFZHnoYmrz7rK\nxWXVz5s4ezP76CRdLIwbAh+LPP4xNPdKwip8R3oC8HF0NvWB6Ar93wJ+yRmn0MLm5kGlXisi34FO\nrf8a+m33FuApSqlPOsMvA3bQ1hM3rtZ6C/BspdTCRc2MXQ5DfRiMIR0wGFL/uqrEyMaY+15F6UDf\neDZWwX/Vxqr40y7bEzYWIyXOUGRy6HX7rB2bP3YGOfc6dfVsvX6hr3RxDqXUpcCl1qEHorOqb/fP\naOA21c9PO3vrJ10si/9AJxdfGnj8nni8YkNYarvV6zNERKmvGniRIb5qlLTO8mGIPY/xlWvI61J6\n/yX3OtS1HSpuiXMvube++ym1l1XYR98Yfc5hmWv3Xb/r3K57zlnPWUMePn67VT4wEIe5gyyci4h8\nHboo+8+UUt9rHX882s7qYeaOcEC66EU1/7eAX1JK/bJ1/Eb2Hd/q2DqajN4dOFcp9c/V8RnaY3UP\n3SLeli6+Fy1d/PH8C9ENVSH7k4H/DTxXKXV1dfxM4CnAz1fHn5oUbyKrw0BElPoy68DQJBBWmwCE\nMDTRPIzXxGCVSJONw/acrRKBLfU8lNjPqrwmDjOJXdb6ffadu9+MteTR12+yWq15PvBY4M9pShff\nppS6rzXulVTSRaXUhdbxv0RnVD+CvmN8f7S105uAh9i1MCLybvTt/fdWP88GfhD4SuB8pdSTnL19\nD1q6+EG096uRLh4Adxn0jrCDyhf2b4F7VOsbmcIt0A5Mbwfu10bkDVZBBnBqYOgGADCejnDIxgVw\nOIq4DtvzWfI5PGzP2Sp15Sr1uhlKRgDj72dZBUqxtfuuP7SUYcxitFXTqC4fvaSLwDuAhwI/VP1+\nCfAY4OVqMXv4p8B3oaWLZwHXolup/qJSasEobGnSRQ+UUtsich7ww2hHg1tVD70ZTfRf2abvtTFl\nVgfCQmY1F0Nk7qYs47ixD9t1OUyvuSHir0qm0WCVsrCwWhnqMTOLq7L22NnrDnuVn1hCZvVdA3GY\nu/kzqxOWg1P7+9EqY9U7BNkY2usUhnUJGLOJAazudRmzAA/KPIer0vXKxSoUUMX2AuUysQZjZTJj\ncbpmFg2WYbE1xrpd5o5x92jC9QYi8ogu85RSr0qKP2VWh0HvzGoKhvrgGPorzGHVwB7GQq6pCG+4\nuKuUaYTVy8TC6lyjZeliD6Met0cWdimZ1bcPxGG+ccqs5kBErkNLH3KumVJKrbUPmzKrw2JoT9JT\n3TfUhyEtlJbR2AFWT186dMZlqGzsYdHClswMw/L0uTCsTZTBsjxPYfjOWcvIxJbsljXhVMK9hww+\nkdUxcX0igUPu2+AwFHKN0d3lsBJYg1V+HscgsDC+/6mNoQupbPQlYVCOXI9R4FW6c9aqktih/bQn\nHHoopd46ZPzppbZsjG2mfhhajhoMSb5hGNI21of6YWqtO/SXkdLXfIjM7lCtXGE1SKzBKrkUDNWB\nqkuWcWh3gNjaqet3ee5WoRnAyfYhEw4/JrK6qjhsNlTLuEU+hHZyqOt+fWitC4cro77KX0aGLuaC\n8iQWDn+Bl0Fpq62ut8nHav1aUsYwsYYJS8D0sjssOCy92G2MTdBsrDLhaYtfYo2hntdl6XZhtfdf\n4v15GLLlY0gKlpW9Lklgx8iEhtbuu/7QOtzSWIXs7oTBMZHVIWE+CA5TBhCWU0Cz6oVKNsaQQBym\nwqhlSR9gmP2vKnk1WPZteh+GzBQv04qs6/Xqe52HysQuQ4c7YUIBTGR1DBzm29cGh1E/6uIwZxuH\nWucwZ9ZhXG/YVSnkKk1iVz27X3J/y8xkljiPZZHYMYpgJ0yIYCKry8Bha9Xpw/WBgMPhzzYOcY2W\nZU216tKWoQu5VoUcGoxRaGawiiR2mRrYnPkwDInt22BhLEwZ3VMCE1ldFRz2W+/LIOBw+FwIhiZq\nh+E2bwhjOxKsmq75MGXOxyjqWnameFkEMDY/N87Y7gATJgyE6aW3yhj71vthue1u47DeanYx5B+G\nMQksHJ4vWYdB1zzE6/swEHdYXX/h0tZUpb7Y5MRalj/sEJisq04JTGT1MOH/t3fmUZtURZ5+Alm0\nVBAUW6oUcYMBbRFlsWyRRWxHcDnuNiKiCIPgAtM6Rx1tET0tM+3C0i4M2NraCqK4gKKNAiWLorSA\niJSIsskqhShLFQVVxPxxM6kkK9/t+97MG5FvPOfk+aoyb97MvDcy8/dGxo3r/fMsdDfftNdPzVXa\nvAavIhB85oT1OpkB2Lp2T2m1ukpLNU5dbaa3GnbcIJgSIVZb5L7iBl6vzVbuQ+xoVwIWfGdRKOky\nF6x1EViSK02aBU/fsPrmWyd0d+3QjuDOJWLbykZQpYu42BhcFRggxGoH3NfwoGhNwPZh8BZ094D0\nnvgeug8hmGb9nr2wYPdTddt1Qjve2L7nhrWWyWHaOVpzcF/uEwi6IMRqJnolYLsMxM/hSQZ/3uQc\nkxlY9mJW6YOABZte2JIuBkyBbU/sNEbzl0zLI9tViq0gmDJhfobIKmC9eSxLupjFCvzP3AR+MxGU\n5MgJC+14Ia3m923TRryHE8D801nBdPPDQnfn1PY9MleseHiDVgmxapy6gO3U+wr+BF8V797LEs8D\n6zwL2BLr8ZVV2urLNoVKlxM7QP5+6yLtV0kXM14N2z8IpkSIVWd06n2F/gi+Es/Cr4rndFoeB0M1\nYT2+skqOuOb5HKPr7AQlOSc7GEfwdZmlACLXamCGMLsWWVXc6Ou23MpNAhZ6FkJQ4tFzCf1JC+Yx\nH2yJ5/bx8gl9nGNYFfQw/WePxVnF5vtDwJoX1dr5BK0QYrUDVjXcTG0LWOjQC5sz9RT4FbDQj7Rg\nfROwJR4GdHn6hD6q/rZELNgSsm2dp5V0W0HQAiFWM9EkYKF7L6xb72uVPgnYnAO5wN4MTuPUPe36\nS3J48NrywnoYpOdtcFeVNmfHgumK2K5DCdomPKszQYhVY9RFbIjXOdJ3AQu+ridHJoJp1l/Foxj0\nHKvtNU3aNH+wTfMHZlse2CBokRCrxsktXqEHoQMlfRKw0M3kDNDuD40c+WCnfQzwORDR8w+tXIP0\nYHr5Yq2FgngdTHVP7hMIusCDKQYVcsS/ZhWw0G0IQaQGG41HYTbOMaZ9nK7byeqsVE14TLFVMq17\n2UM6MK8CNugdYXYtsqLywHhYi4LLgoB1nT6rSu5UWh6nxoV+CNhBx5nm8bqOg+3DYDSwH04A3cza\nNe1QghxTzgbBHAjz6ogVDQ+KPgnY3uV/rdKn6WS7TAvmOU5y3ONZ89bVyRkGAfYGMI1T7zTrn/b9\n3NWEAtMUsW0TA6xmghCrGakL2DbFK4SAnSp9EQFVcmUi8BInOe6xrHrrquTOqAD2hFsX9XsZwGg9\nA0Awc4RYNUTX3lfo8QCukq4fun2JGy3JFdsJfkVsnwRsiacYdW8i1oug7yqeeVJigNVMEGLVOH33\nvsKMClho32vpXZTnFuRgV+DUyRVyUeJZjFvuYy9tEamsgpYJseoMC95XmIEpZKH7VFpexV5JnwRs\niUeBU9KnsBivEzQMqr+NnKse2iII5kiYYItUBVebnsKuva9gZwrZzj2w0N0L39On10HknJHLszBv\nq34L/V9i/Xq8ZSbwEk4wbWKA1UxgwdRmgi4/dTd5XyGPBxZ6NogL+hdjCfkHcoHPaWWreBWwkCce\nses8o2A7tjfHdLMw3alcg6AlQqxmpFMvIXk8sDADWQhKcsZYep7MoMSCOAdf6bVyeq5LPNm4x3Rq\nHmfr6pKOB1iJiACHAgcCWwC3AicD/6Sqy+dQ39eB1wKXqeoza9vOBnYZsvuPVPXFlfJLgBc0lFNg\nB1W9aNLzs0KIVUPkFq+QV8BCeyLWlICFbrywfRmkZuHawM8kB1baC+wLQcjX32BbxIJ/IdsORwHv\nBE4BPgFsDbwLeBawxyQVichLgVcDg0Tux4DjG9a/AdgLOLW2Xkni+VBAatuumuTcrBFi1TA5BFZO\nAQvdemE7H8RVpYuR+13NXlXSVy9sSY7E99Bu8vtcNlFiObY014xdbU45O61jwExmABCRbYB3AN9U\n1ddV1l8DHCMib1DVk8as6+HAZ4B/BV7RVEZVzxyw74dIPfDVhs13q+qJ45yDJ0KsOqNr7yvMloCF\nTCI2h3iFbp4Aub2w4NvL3LUXdtrHGIbX6We9nvewY7RxnC64r9Oj7V38Paq2/njgSGAfYCyxCvwz\nsA7wQQaI1SZEZGdgK+BrqvqXAWUEeISq3jluvdbxaJpuWAE8rOVj5BCvYE/A5shEAD1IpZVLrFgZ\nld6naXO7EjRtHa9KW+2XY8IG8DMav08ith22B+4HLqyuVNWVInIJsMM4lYjIjsAhwOtV9a6kLcdm\nf9Ln/hMGbF8E3AU8TESWA/8JfEBVr5jkINYIE2yZFQ3r2hSw2WIzyZeFAPKIV+jYC9u3HKNN9PUa\nc00z22ZfWRgQ58WT2bWIhfYzUbRxnLmwutOjLQSWqWqTP/cGYLGIrKuqA1tMRB5CEpo/VNVTJjm4\niDwSeA1wtaouaShyFXAecCmpZXYixdfuLiLPV9XfTHI8S+Q2s5mkLmC79r5CdwIWZmcigyqdtbmV\nHKPQbUaCridsAD8CpkqO0I/cItZyHGydNm27K8/4bKWvWsDgO/eeSpk7htTxv4AnAy+bw/H3Lur/\nQtNGVd2/tupbInIasAT4FPDitXZyQohVA3QtXiEEbEkvBSx0O/VqSV9TapV0dX0e0yvN57jTPnab\ntt/FNfQxj7MH/rgErl8yqtRyYNMB2x5aKdOIiDwV+BBwhKpeO+EZQgoBWAV8adwdVPU8ETkH2E1E\nNlBVl0PjZtUsTZNDvEII2Dq9mpErh3cS7KRR8p5WK2d6JcgjZPsi/sD+bF1VLH/yb2JaeVY33TUt\nJRd8pKnUjcDWIrJeQyjAIlKIwLAW/CRwG/BdEXlKsU5ILbt+se5uVb25vqOIPIMUM3uaqt40ziVV\nuIaUr3VjYK26PWDR9IIaXce9VplFAVuSwxObfRAX5PnEDv0Rsbk9zH0ZiOd1MFQTuWangn545e1w\nIfAiYEfg/HKliGxAyrO6ZMT+m5PiXgfFjl4JfA94ecO2Axg+sGoYW5J6789z2NcEs2NiPcOagIXZ\nyEQwE1PKWhKxOfKAhoCdjC4FTM5E+F7tIrdXvm26TV31deADpKT751fWH0h6BT+Q91REHgdsBFyn\nquUr+x+BRzXU+znSa/0wGjyfIrI+8EbgFuD7TScmIhsCd6nq/bX1ewHPA76vqveOvkSbhFhtkfuA\n9To8Xk4BC/YyEUQu2CljJU4U+pGRIPdAJOhP3/VF9EG+2N4qszs71VBU9TIR+QxwiIicApwObEMa\ncb+kloz/SGBfYFfgnGL/s5rqFZFPAneq6rcHHPqVwCbAkXUxWmE34FPFgKqrSJa0E0nk/okkhN0S\nYrVlmn70hYDt5tizJmAhU3v3XQhBfyc2sJJpoaSLdEtdidgSj3HFIWSH8W7gapI3dU9gGXA08OFa\nOSXlZB0XHbLtrUVd/zakzBWkMIW9gL8hSY3rgc8CH59DnKspRHVY+wRzRUT0d2OW7VK8DqJLAdtE\nl3GwTXQpYut0mZEA8rd15y+7Lq83hx113Z997b8+t2NH1yZngqpOlOF+XscTUd7Ukob5inR6LcFw\ncr+2AvJ7X6HZAwuzPZCrpG8ptXLHHPc6ptKSp7IvA/P6OntT7thYCAUQuCFM1SiDYsYtiNhZGchV\nYiWlVo4QAuiova2IvL7Ei0K/xRfMnogFv/GxbTJbkxLMLF7MMSiw6oXNHQcL+T2xuXLC5hKxMCMD\nuvogSqrMWu7bLlNr1ek6Pha6mQErlEPQMWFyPSAEbKKzBPsDyDWgK5eIBWNZCcBveqE6Fq4R+iFi\nc4jKcY7t2cMd3sygY0Kstsgq8jVwCNjZ9cCW5JxeNlsMch/zptbpe6xj3z3qw47Z5nFzzWLXNt3m\nWQ0yEWK1ZXK+0+pYFLA5shBYHMw1qwIWMqXW6puAhf6m1yrJHU5Q0icRmyueOggmJMRqBnK/06rk\nHsiV2/taktsLO6sCFjKFb+RO/A/d3PSzIPCsZJeAdq+zy+N6yrM6Thxv4J4Qq0awJGBhbRE7SxMZ\nVLE2qQHMZhxsrwRsSU4ha+VaPcdtNmFNyIY3NugJIVYNYyk1nkUPLNjxwuYOI4B8IjbnQC7IMJir\ni5eyFQ8lzIaIhf6lEht0zBxtGwTzJMSqQyx5YXN6YMGOFza3gIXZzEYAGdo+p2cpRGx7WPPGdp2h\nwKsaiMwEM4FX8wxqdJVacBQxiGsNsyxgwV4oAYSInSohYtslRGwQPECYYYusIJ9QCu/rGqyHEED+\nMIKuBCzYy0iQJRsBhIidJrOQC7ek67jY3IMER3FP7hMIusCCqfUaK5+pwc4PZwveV7DVN7m9sDnj\nYGEGvbBgT8T27XqtDWAr6ZPnOT7BBx2xTu4TkMRhIrJURFaIyHUi8gkRWTBBHXuKyPkicpeI3CYi\nJ4vIFgPKPkFEjhORK0VkuYhcLyKnisjODWWXiMj9DctqEXn2XK95xYAlF6salq65r2HJgaV+uW/V\n4KUrVqxce+mSVavWXroiW9uvHLC0TdODoIsHwixdK+Tp31zX2gXD+nI+S2AKC57Vo4B3AqcAnwC2\nBt4FPAvYY9TOIvIq4BvAxcB7gI2Aw4DzRGR7Vb25UnYz4CKSSD8OuBJYCBwAnC0iL1PVH1SqV+BW\n4FBAaoe+auIrHYElT5+FMALLHljI1zeQN5xglr2wEJ7YB9G31FOQ7xOUlfAJsKEMgqBCVpMUkW2A\ndwDfVNXXVdZfAxwjIm9Q1ZOG7L8ucCxwLbCzqq4o1v8Q+CVwOHBQZZf9gE2AV6jq9yr1nEQSrgcA\nVbEKcLeqnjjHS5w31gUsdGtEuVNoVfEiYmdhYgMIEbsWfQwnmLXUU2BLxEII2SALuc1u7+LvUbX1\nxwNHAvsAA8UqsAuwGfDBUqgCqOqvRGQJ8HoROURVVxebHln8valWzy3A/cBdTQcREQEeoap3Dr+c\nbrAkYCG8sHWsidhZ9sJCiNi1CFE3XUZ9Mu5bzlgLD/wqOWO1gs7IHbO6PUkkXlhdqaorgUuAHUbs\nvwPpU/0FDdsuADYEtqysO4P0Of+zIrKLiCwUkR2AE4E7gE821LOIJGL/WsTEniIiW428so6xFGsJ\nNsJ/rMTBlliLVbYWC2shHnamY2JzxU3miIntKjYWbF1zW0ScZ9AyuT2rC4FlqtqkI24AFovIuqo6\n6DZYWCnbtD8ksbkUQFWXiMghwBHA2ZWyvwMWq+oVtTquAs4DLgVWAzuR4mt3F5Hnq+pvhl3cfeTz\n7oEtD6yVH+O502g1MUywdt1fs56VAIYL1l5PNwu2vJO5ptiF/sbG5gyjaIvVo4sE/sktVhcw+Pa5\np1LmjiH7M6COe2plSm4leXJ/RIpT3RJ4L3C6iLxAVR8Qvqq6f23fb4nIacAS4FPAiwec1wNYirEE\n2wLWgngFGwK2xEJIQW4BCzZELOQTstnz81qJm+zz9ZZYC6MAv0I26A25xepyYNMB2x5aKTNsf2i+\nldbaX0QOAD4DbKuqSyvrzyBlCfg4sO+wE1bV80TkHGA3EdmgCFkD47SyAAAgAElEQVRo5PjKv58N\nPKfyf0siyYqAtep9LQkRuwYLAhbyD+qqkmOyg5kTsbniQ0tmcYAXNF/3BrDkTljSONIjCKZLbrF6\nI7C1iKzXEAqwiBQiMOzxdGOlbP0T/qLibzVE4H3A0qpQBVDVy0Tkt6QBW+NwTVF2Y+DmQYUOGLOy\nkhCwa2NFwIJfEZtTwIIdLyzY8MT2eqKDkgHipnUsemNL+jb5wUrYdX3YdZM1qz5yS4vHG0TEys4E\nucXqhcCLgB2B88uVIrIBKc/qkjH2F2AxcFZt22JS+MDvKusWAb8fUNe6jN8eW5JukT+PWX7OWIqx\nzO3NK7GQQqvKsIFbFoRsvd9mLQ62igVPrLXpZktmLjsBdPvQsBJKUZL77R8EE5DbXL8OfICUdP/8\nyvoDSe/Ur5YrRORxpIT/11XSVP2ElIbqbSLyaVVdXpTdluT5/EIlbRXA5cDfisiOqvqLSt2LSQL0\ntMq6DYG7VPX+6gmLyF7A84Dvq+q987n4uWDJ+1oSXtjBWPTGWvjRkd3zV8FCPGxOAVsycym2wIaY\ns+SFLsn94JyE3Klvgk4QVc17AiLHAIcA3wFOB7Yhjbg/V1VfWCn3JVI86a6qek5l/WtIuVgvJYWJ\nbkQSv6uB7VX1pkrZl5NmyloBfJ41A6wOIqXxer6qXlyUfQVpENVppKwAq0jZAN4ILCvKDvLSIiLa\nlE+rK3IL2Co5c8A2YfU5bKnPwF6/5fLG1skVE1vStYgdRJb+sDDQJ2f7577+EdcuS0FV67M9toaI\nKE9tScP8Xjq9lmA4Fh577wauJnlT9yQJwaOBD9fKKSkn64NXqn6zEKEfBP6F9Dv1x8D7qkK1KHuq\niLyINPr/LSRheztp1qqPqeqlleJXkMIM9gL+hqQlrgc+C3y8Xrc1LHlgrXheSyx6YMGeF9Zav1kJ\nJ8jtic09yUFJlv6wMGI9p0cy9/Vbi8EKZobsntW+IiJ6dm2dNU8V2PLmWWsfy89fS/0G9vouvLAP\nJrc3Nmt/GOmDWfDIypUZPKtPaknDXB2eVUsYeaTPBtY8VWDbA5u7bSw7ETx4YWE2p5itYmFAF+T3\nxmbtj9zeyBKrHlmwI+iDYAAW3rszjRcBC90LIWsCqMSbiLU2mMtaKAHM3ixdJRZn6wIDeWLBhpDN\n3Q4eROw9o4sE/rHwfg1qWHvBl1hJoxUidjI8CFiwJ2IteGHB1iQHJb2f7ABsCNncDxXPIjboFbnf\no8GYmHzBN6yzJoJyC1jI/75pwor3vMqwDDQ5+tGEYMLWJAcl1iY7gBkTsrkfKqPCCoJgyoRYdY41\ngWbF+1piUeSX1N83Fm5GiyIWbPWjFRELtoTsTMfFVrE4JWsVCw+aaTJsVpagN/TNbANsCVhr3tcS\nS+KnJLezZBghYkdjRiwVWBGyVkUsGBKyFuJjwcbDJggaWCf3CQTdsKJhycV9DYsVLLVTyaqGxQpN\nfWmhT5v6MVdf3rfqwYsFVqwcvHTFqlVrL11T75ts/bRyyNIlTQ8bIzY7kNUtLQOQxGEislREVojI\ndSLyCRFZMO4pi8ieInK+iNwlIreJyMkissWAshuKyLEicn1xvMtE5KBp1O2JyLPaEiKiPxqy3eIP\nWAufxqvk9toNw1pbgU2bqhN9OhgruWGHkTNvbO5csXWy95eFQU61NpDrMuRZ3bglDXN7c55VETma\nNMvmKcAPga2BdwHnqOoeo6oVkVcB3wAuBk4gTU50GOlnwfaqenOl7Hqkqei3BY4Bfgu8BHgVcLiq\nHjHXur0RYrUlRonVOrmfe8PI/RKvYlnsgK22KrFsW2C3T631ZXZxNAALEx9YErIm+ilTn8iN/Rar\nIrIN8GvgFFV9XWX9O0hicm9VPWnI+a4LXEvymT9dVVcU67cFfgmcoKoHVcofDPwr8A5V/Wxl/TeB\nlwJPU9U/zqVub0QYgBEsf3mx8jkVbH5yrmKprUqsf9mz2qfW+tLMJ+saOUMJSppCCnKEFYCRPhoW\nVtC3kfz3tLQ0s3fx96ja+uOB5cA+I852F2AzknB84JGiqr8ClgCvF5GH1I53N8lLWuUoYH3g9fOo\n2xUWfgMGA7A6hz3Ym23K6gAgsDUIqIrlAV1gs0+t9qWpQUTYyRmbe3BXFVMD8CwM9PLJ9sD9wIXV\nlaq6UkQuAXYYsf8OgAIXNGy7ANgN2BJYKiICbAf8UlXvrZX9RVFP9Xhj1z3iHE1i5b0UjIlVAWtN\nvJZYFDwlVtssROzkWBWxYEskhYhdG0v941LEdvsZZiGwTFWbjnoDsFhE1lXVQY/RhZWyTfsDLCIJ\nyo1Jj5C1yqrqvSKyrCg7l7rdYeX9E8wDi+LCUvqsJiym1LIseMB+xhsPfWqlL8GWSLIuYqF7IWvK\nW+5RxLbDAga3xj2VMncM2Z8BddxTKzOsbFm+moFgkrrdYeEdE7SENS9sCNi5YV3Egj1bKxnmdMnR\ntx76MkRsM+GNbaBP8a/3LwFdMqrUcmDTAdseWikzbH9olvn1/YeVLctXjzVJ3e6w8D4JOsTarEkh\nYOeO9bazZmt1LPWttalmmzAjkLAz4QH4ELFgJEtBG0xt8NquxVLykaZCNwJbi8h6DaEAi0ghAsPO\n6MZK2Ssa9oc1n+xvJz0aFtXKISLrA48hDZyaS93u6Kv5msDa1KNNWPSIWfc+WYyZLLHcdhZtrY4l\nAVtiXchaErFgxxtrKaQAZlTITp8LgRcBO5LynwIgIhsAz+LB4nHQ/gIsBs6qbVtMCh/4HYCqqohc\nBGzXII53KuqpDvQau26PROqqDrGYnqcJq2mOrKUSqmO5f622nfW0WmA3tRYMnqnLQv9aS7VlIcVW\niaVUW2Crn4zz9eLvobX1B5J+O361XCEijxORrUSk+pvyJ8BNwNuqM14VuVB3AU5W1er8WScCDy/q\nr3Io6TF08jzqdkVMCtASIqKnz3Hf3J6ccbH8Y9yCx2kYlvvYcttZtrkSy30LtvvXkofPwmQHVSxN\nfADNfSW3ZZgUgLY0zMAZrI4BDgG+A5wObEOa0epcVX1hpdyXgH2BXVX1nMr61wAnAZeS8rNuRBKf\nq0mzTN1UKbse8FPgmcCxpJH8ewGvAD6qqofXzm3sur0RYrUl5iNWm7D+Aiwx9jxdC9Mv6twnMALL\nbQf2bS/6d+5YErEQQnYQ6/91JsSqkATggcAWwDKSQPywqi6vlPsi8CZg96pYLbbtCXyQJEJXAj8G\n3qeqVzccb0PgY6QpVh8N/AH4jKp+rvGsJ6jbEyFWW2LaYnUY1l+CRp6jA7H8kgb7/Wu9/cCuDVrv\nW7Dfv5aErDURC90K2VkQq0EeDN3mwVyxPOAH7A+ssT6q3nr/Wm8/sJsj1lpqrSYsD9oDWwOHrAzu\nqmJtoFcQzIUw1R5jcWRziUcBC3Ze0GBbxFpOhl/H4qQaYF/IjjuIK2ffW8lUMGowVy4x2w8ha2W4\nY9AmbswxmA7eBCzYMtIQsXPDg/e1jmV7tNjHgxglanPYQZOIzRlO4Mkj60fEBn0izK5FVmD/hQy2\nBSzY98KCDzFmrZ89CP8mLNujdW9sE1bswIoXtopFj2zOFFvNmDuhoAWsPGN7i5UH8aRYEzZ1LAuG\nEo8C1kIfW0+C34QHe/TkjQU794+lmNg6Fj2yQdAG1p6nM4OVB/EkWBQ2VSx/ti2x3u/WBY0nIWt1\nUFcd6z9Mq1i7f6yFE5RYmo42CKaBgdsqKLH2IB6Fl5ecda+XB++7dREL/oWsJZv00N8l1u4fy55Y\n6KM31sJ8bUHbGLh1gmFYexCPIgTs9PDQ917624OQ9fBlwFNMrMX7x7KQ7Z+IDfqEpedgMAEeXr4l\n1sMHSjwIWLDvgffS3yUWRU0Vz+EEdSzYgtX+tjjACzyI2EhdNQtYetYFU8J6jktPnxg9eLvAtoD1\n1N9VrIqaKl7ss8SyLVh1AFj1xo7KVBAE08TqMy2YIpaFTBUvn5TBh0iwLrYsC5dhWG9X8GGfVazf\n+1b7fJiQhfxe2SCYFmHKM0oI2HbwEEpgve89xUVWsd6u4EvEevgxY1XEllgNLZguMcBqFuiVyVrD\nm9Dy8LIFf2LGg0CIvm8Hq5+W63iw0RLPIhZs9LvV0IIgGESYZceEgG0XDy+yEuteWOteozp9ELLW\n2rYPIhZs9b/1+8qfNzYGWM0CZs1vlvAksMD+AK4mvPxIsC5gwf7Ltgkv95iXtvVgp1VGyRkLdmC9\n7/2J2KBPhJkZxovA8uAhasKLgPHi3bL+sm3Ciw14aNtRM7Rbs9cqlsXsqIjM3DYwapBXEEwDy8+P\noAHPL9fcD9Vx8fIjof6OsHoze7QF75+USyy1s5d8sU1YtgdPNtAOoZZnAevPiGBMPCRi9yhaSjwI\nWC8eWLA/AGUYXn4wgg+PLPiy3TrW7cHzvRYEJR6eBcEc8CCuwM/LtAnrL6kSb/GFXl+uXuwB/Pxw\nDG9su3h+/q4hUlfNAtbv92CKePC+lnh+iHoQLV49WR7twoM9gL+29WrDYN+Z4M0Wgv7j4b52S3nD\nW73BvbxEq3iOz7L+ggK/AsCjN9aDPYA/4TJOBKNFe/ZgD95sIegPFu/Z3uEt1ZMnD2wdbw9TDy8o\n8Ctiwc8nb/D1A9JTu9bxkrnAiz3k/RAfeVZnASv35Ezh7SHv5YE5DE9t7kXAgl8RGz9q2sHzl48q\n1u3acqqtIGgDK/fezONJTJV4eYEOwlObe2tr6y/7QXgKJ/AoWDy1bxNe7NqjbcydGGA1C1i7x4IK\n3sIHwJ+oquPJ4+axrb287JvwZBvg74uIt/at4i3jhjfbCALL91NQw5MnsEofHoxe2t5rW3tOUeRN\nZHmzEa/eWI827c02gtnB6j0TjIkXEdWER89gFU8vUc8vIa/e2BCx7eOtjUu82bTtnLExg9UsYPXe\nCOZB3wQsWHggToaXPrD9EhqOtxd+iRfbKPFoI14Henm06RiLH3SB5XsgmCLeXpB1PL4w63iLQfb6\nw8HjC9/r/enVRjx9FQGfIQXdEXJ5Fgg7n2G8viDreBWyXj9hehUo3kSsN0FVxes9Cf7uS6+TIATB\nJIQNt0j9IeKhsT2/IJvwGBfr9UdE30Qs2L1nPd+nXoWsNxFbxaONB0GVsNMO8Sheq3h+QVbpi4AF\nH+3uVcSCP28shK10jef2hj4I2cizOgv4sMWe4i033zC8P7D75O2JNm+fPolYsG8zfRKxYL+9S7xM\nSxv0n3Vyn0DwYFbVFu+sGLB44r4hi0UGtbmndvfU3lXq96+X+9irzXi7N0u8tncdG3Y+zArms0wf\nEdlXRC4SkeUicrOIHC8ij5lHff9HRO4XkTsatn2x2DZouWLM8qtF5FVzPcdpET+MjNMn72sVzx7B\nKt5CCvroAbfc3iUePbElXj2EXj33Xts7GI6IHAZ8EjgbeBfweOAfgeeKyI6qOtFvFRF5FnAYcCcg\nDUU+D/yoYf0Lgf2AUxu2KbBPQ32/mOTc2sDDszKoEQLWNh4FlecXpMdPxCXe72WvduPVZry296wj\nIo8GPgr8HNhDVbVY/18k0fhu4MgJ6lsH+H/A6cBGwHPqZVT158Xx6vu+ufjnvzXVraonjnseXeLp\nuRgMwbPnZhh9FLDWX4h1vPaBV0Hif8BLwqMX36s3FsYPIbDc/nPDRfDEK0lNf2wpVAFU9XsichXJ\nmzm2WCWJ262BVwNfHncnEdmc5Fn9maouHVLukcBd1XPNjadnXzAH+ihiPb4Eq3gVUVU894Hn9u/D\n/ezVO+jZbqp4vncds33x94KGbRcAbxCRBaq6fFRFIvJE4AjgcFX9o0hTBMBA3kr6xH/CkPr/CjwS\nuFdEzgE+qKoRBhDkoQ8vvTreH8IewwfqeBUi4NurFt7YfHi2myp+710PQxhZWPy9oWHbDSQBuRD4\n/Rh1fQ74A/DpSU5AkqrdD7gLOLmhyE1Fnb8E7ga2BQ4FzhWRl6jqWZMcb9p4eo4FHTALItb2g/fB\n9EHAlngNJwDf/dCHe9qrkAoh2y9EZCPSoKZxP48frap/ARYAqOrKhjL3FH8XjHH8fwD+Hvg7Vb1/\nzHMo+Xtgc+D4Jg+uqn6gtupUETkRuIQkkLea8HhTxdPzyh3VG9z7Dd2HF16JR+9Nlb58jgTffeFd\niPQlh6ZXG/JuPyX5I0andQZXFstQHgX8E+OL1a8AfwGWA4jIBg2C9aHF36EhACKyMcnzeUIxeGpS\n9ied9xfG3UFVfy8iJwNvFpGnquo4nt9W8PI8co/XB+ooQsTawbP3r04f+wJ89Yf3e9uzN3BUlk9P\nduSHpxVLyQ/XKqGq1zK3/PQ3Fn8XAVfVti0iicgbGc7hJO/rCSLylGKdkMxZinUrVfX6+o4isgnw\ncuDXc4g/vab4+xjGC1NoBS/Pnd7i+dPoMLy/6Kp47qM+iKYqIWLz04f4WM9CFvrjlZ0hLgQOBBaz\ntlh9LnDFGIOrNgcezuCcp1cClwHPbNj2ZmB9JvCqVtiy+HvLHPadGtlnsJLEYSKyVERWiMh1IvIJ\nERkZv1GpY08ROV9E7hKR20TkZBHZYkDZJ4jIcSJyZTGLxPUicqqI7DzfuqeF91lNhuFxdp8mvM8+\n0/3cLe3S1/7wxqAZvDzd695nl8ozN1NOXMxg9V2SCb1DKsP3ReRlwJOB/6gWFpFHi8hWIrJhZfWR\nwGuB19SWy4u6X02Kp21if2Bl/TiV4y0QkQ0a1m9XHkNVrx7jOlvDwg/ho4B3AqcAnyDlDnsX8Cxg\nj1E7F9OAfQO4GHgPKUHuYcB5IrK9qt5cKbsZcBFJpB9H+iWyEDgAOFtEXqaqP5hL3W3j3aM0DO+J\n0at49sJW6UtIgff7pm+fg717Zb3bU0kfPPyeUNVlIvIh4F+AM4uBS48H/idJbB5d2+WdpNjY/Sjy\nqA6KUxWRdwKbq+q3B2zfCdgGOElVbx9wik8DfiAi3yHportJGuwtJHM5cLwrbY+szwcR2QZ4B/BN\nVX1dZf01wDEi8gZVPWnI/usCxwLXAjuX05WJyA9J6RcOBw6q7LIfsAnwClX9XqWek0gddADwgznW\nnYW+PDzrRBiBPfr06dH7Z+CSPvWJZyEb9pQTHz57Vf2UiCwjObyOBu4ATgLe3xACoIw/iKssP4i3\nFtsH5lYFbiZNzborsDfJbG8CTgSOVNXfTXAurZA7DGDv4u9RtfXHk0bG7TNi/12AzUij4x54Xqjq\nr4AlwOtF5CGV8o8s/t5Uq+cW4H5S/rG51m0Kb5+xrhiznNdPi3Xm0ze/aeWM5oflz46XTVje030z\njLn2xa/aPKk5YjWs4JIxygwLK/BkW1bvb0+o6pdVdTtVXaCqj1PVA1R1WUO5j6jqQ1R15OxUqrqb\nqm40ZPv/KOoamCdVVW9R1Ter6jaq+ihV3UBVt1DVt1oQqpBfrG5PEokXVlcWqR0uAXYYsf8OpF8M\ng2aF2JA1wcEAZ5BGz31WRHYRkYUisgPp18MdwKfmUbcLrD40xxWrTVh9kU3KuP1yeZcnNSVyvuSm\nIe4t3jNzZZTosChWB5E7RnYcsToKq8/kSQjRGrRN7q8rC4Flqtpk5zcAi0VkXVUd9NwZNSsEpLQQ\nSwFUdYmIHEKaquzsStnfAYtVtaqZJqq7D/Tlc3VJX2Jh6/3iUYgPwnvsXF8+/5bcB6xm7X7x0h91\nvIcTjRKsHm1s+niS9cFcyX3PLiCNUGuiOqvDHUP2Z0Adg2aFuJXkyf0RKU51S+C9wOki8gJVvaG2\n37xmnPCO59mfmuirgC3x3j8l3kUs9OvHX18G3JV4F7ElfbKxIBhG7ntzObDpgG3jzOpQblsr5ULT\n/iJyAPAZYFtVXVpZfwYpS8DHgX3nUncT7xq2MViL03KfgCO+m/sEnNE0EXYwmK/lPgFH/HvuE5ht\nroXDn9he3YEVcovVG4GtRWS9hlCARaQQgWFfPauzQtTDHhcVf6uf8d8HLK0KVQBVvUxEfksaVDXX\nuh+EqsqgbUEQBEEQzA9V3SL3OQTdkHuA1YXFOexYXVkkp30WtYFXA/YX0qwQdRaTwgeqI9kWAYNG\n8K/Lg8X7pHUHQRAEQRAEUya3WP168ffQ2voDSaE3Xy1XiMjjihkdqiE5PyGloXpbdcYrEdmW5CU9\nWVVXV8pfDmwlInVxvJgUu1qdxmzSuoMgCIIgCIIpI6qT5J1t4QREjgEOAb4DnE6aaeGdwLmq+sJK\nuS+R4kl3VdVzKutfQ0qseykpP+tGJPG7GtheVW+qlH05aaasFcDnWTPA6iCScH++ql48l7qDIAiC\nIAiC6WNBrApJAB4IbAEsIwnED1dndRCRLwJvAnavitVi257AB4Fnkkbv/xh4X9NctiKyK2n0/44k\n8Xk7yYv6MVW9tKH82HUHQRAEQRAEU0ZVYykW0vy4RwA/A/5Eiku9GPgAsKCh/JYkj/CfSbNfnQPs\nNuExNyRN63o9yeN7GXBQ7raw2F6k8Iv7Byyn5m6PabYXaVKKY4DzgDuLa9x3Dsd0aV9dt9WM2dY+\npIlQyjnAryUlmNhxFmwrR3t5t69YYsm95M4GYI23AgcDpwL/QUovuBvwMeC1IvJcTbNrISJPJj3o\n7gWOJD3sDgD+U0T+uw6Z2qxERNYjeWq3Jb1sfwu8hDTD1mNV9YgpX9+06bS9KhwHnFtbd/18LqQj\nxm4vYE/g7SSbuAR43qQHc25fnbZVhV7bVjF49cskYXYicDVpWumDgJ+JyJtUdWTmKue2BR23VwWv\n9hUEecmtli0twLOBRzas/ygpTvXgyrqTSQ+4v62sezhwDSk91jjHO5j0y/rg2vpvkiYeeELuNjHW\nXqV3YmIPo4VlwvbaFHhY8e9Xz+W6PdtXhraaCdsiZUPZuaHcY0kTptzUd9vK1F6u7SuWWHIvubMB\nmEJVL1LVOxs2fZ2UxuoZAEV2gJcBZ6vqryv73w2cAGwpItuPcci9SZ+VTqitPwpYH3j9xBfRIRna\n6wFEZEHh9XDDuO1VlL1VVec7j6Bb+8rQVg/QZ9tS1dWqWvfsoap/IsXuP1ZEHjvGId3aFmRprwfw\naF9BkJsQq+PxhOLvzcXfZ5JmtrqgoewFpIfdDsMqLAaWbQdcrKr31jb/AtBRdRhm6u1V42hSzOsK\nEblCRLxPFla21y3TqrDH9jX1tqoxy7b1eFKYzl+GFeqxbUEL7VWjb/YVBJ0QMasjEJF1gA+RPmGf\nWKxeWPxtmsGqXLeoYVuVjUm5ZNeqQ1XvFZFlY9Rhjhbbi6LO75JSnN1Y1Ls/cJSIbKuq+8/1vHNR\na69pznLZO/tqsa1gxm2ryHqyI/DvDQK0Tu9sC1ptL+ihfQVBl4RYHc3RwE7A+1X1ymJdOUnAyoby\n99TKDGJYHWU9o+qwSFvthar+FHhlbfXxIvIDYD8ROUFVfzaHc85JU3tNgz7aV1ttNdO2JSJPA74C\n/BF4zxj19tG2oL326qt9BUFnRBjAEETko6QJC45T1f9b2VTmf22KO3porcwghtVR1jOqDlO03F7D\n+DgplGCvedTROUPaaxr0yr5abqth9Nq2RORJwJnAKuAlqnrbGNX3yrag9fYahkv7CoKuCbE6ABE5\nHPjfwBdU9eDa5huLv02fusp1TZ+8q9xOyk24Vh0isj7wmDHqMEMH7TWMa4q/j5lHHZ0yor2mQW/s\nq4O2GsY1xd/e2ZaIbAGcTfKCvkhVLx/zEL2xLeikvYZxTfHXjX0FQQ5CrDZQPLz+Cfiiqh7QUOTX\npE9gixu2LSYNMPivYcdQVQUuArYrchZW2Yn0a/vCyc48D1201wi2LP62NehmqozRXvOmL/bVRVuN\noJe2VQivJcAjgD20Yfa+QfTFtqCb9hqBK/sKgmzkzp1lbSE9uO4nPbyGlWvKG/oI0uwmS2tl1wW2\nopZ7kDW5Cg+prT+FJO42z90extprk4Z61yfNXLQa2D53e0yrvWr7DM0d2lf76ritZsa2gCeSktv/\nGXj2iLK9tK0M7eXevmKJJeciqkqQEJFDSNMHXsuaB1mVW1T1x0XZpwA/J8UufZo0I9OBwNOBPcty\nRdnyYbdEVXevrF8P+CkptdOxwFJS7NIrgI+q6uHTv8rpkaG9fkEKKfhl8XcR8EbgqcAxqnpYC5c5\nNSZsr82BNxXrnw68AfgWaSYdgC+r6h+Lsr2zrwxtNRO2JSKPAC4lCbBjafaAnqGqtxb19s62IEt7\nubavIMhObrVsaQG+SPqVO2g5q1Z+K+DbrJnr/ic0zHVPetCtBs5s2LYhabrC6vzab8/dFhbbC3gv\ncD7pk9nKop4zgdflbotptxdrZrwZVPYFfbavrttqVmyrcv3Dll7bVo728m5fscSSewnPahAEQRAE\nQWCWGGAVBEEQBEEQmCXEahAEQRAEQWCWEKtBEARBEASBWUKsBkEQBEEQBGYJsRoEQRAEQRCYJcRq\nEARBEARBYJYQq0EQBEEQBIFZQqwGQRAEQRAEZgmxGgRBEARBEJglxGoQBL1DRDYQkQNE5DsicrWI\nLBeRP4jI10Tkv+U+vyAIgmB8YrrVIAh6h4hsBSwFzgXOAG4EngwcDDwceLGq/iTfGQZBEATjEmI1\nCILeISKbAI9X1Utr67cGLgYuVdUds5xcEARBMBERBhAEgRtE5IkicoqI/LVYvl2su0ZEzirLqeqf\n60K1WL8UuAx4RpfnHQRBEMyddXOfQBAEwTgU3tLzgE2BzwG/BXYGlgAPG7MOATYDbmnnLIMgCIJp\nE57VIAi88D5gIbCfqh6mqsep6j7AySQBOw5vJ4nVL7VzikEQBMG0iZjVIAhcICKXAxuq6uNr6zcl\neUqXqOruQ/Z/HnAmcDmwWFXvbfN8gyAIgukQntUgCLzwJOD39ZWqeivwl2E7ishzgO8B1wMvDaEa\nBEHghxCrQRD0GhF5NvAj4HZgN1W9KfMpBUEQBBMQYjUIAi9cAzy1vrIIA3hU0w4VofoXklC9vs0T\nDIIgCKZPiNUgCLxwGrCZiPxDbf17mwqLyHakCQHuAHZX1UBXc5MAAAEdSURBVOtaPr8gCIKgBWKA\nVRAELhCRRwO/Ah4DfJ41qaueBywALlPVFxZlNwcuInlcPwJc1VDlt1R1RQenHgRBEMyDyLMaBIEL\nVPU2Efk74JPAWwAl5VjdHfgFUBWeTwI2Lv59+IAqzwXC2xoEQWCc8KwGQeCaYrKAZcDnVfXg3OcT\nBEEQTJeIWQ2CwA0i8tCG1e8neVnP6Ph0giAIgg4Iz2oQBG4QkbOAa0nxqOsAewB7kaZh3UXjgRYE\nQdA7QqwGQeAGETkM2BfYAngYKcn/KcARqnp3xlMLgiAIWiLEahAEQRAEQWCWiFkNgiAIgiAIzBJi\nNQiCIAiCIDBLiNUgCIIgCILALCFWgyAIgiAIArOEWA2CIAiCIAjM8v8BMiX8fryMHSIAAAAASUVO\nRK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "v=arange(0,3.05,0.05);\n", + "contourf(g2_range,g1_range,log10(Chi_hist_diff.min(2)),200,linecolor='none'); \n", + "cb=plt.colorbar()\n", + "plt.xlabel('g2')\n", + "plt.ylabel('g1')\n", + "cb.set_label('log10(Diff_Chi^2)')\n", + "plt.rcParams.update({'font.size': 18})" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[,\n", + " ,\n", + " ]" + ] + }, + "execution_count": 61, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "v=arange(0.1,3.0,0.05);\n", + "contourf(g2_range,g1_range,Sig_hist.min(2),v,linecolor='none') \n", + "cb=colorbar()\n", + "cb.set_label('sigma')\n", + "plt.xlabel('g2',fontsize=18)\n", + "plt.ylabel('g1',fontsize=18)\n", + "plt.plot([g2_range.min(),g2_range.max()],[g1_best,g1_best],'--r')\n", + "plt.xlim([17,23])\n", + "plt.ylim([0.09,0.11])\n", + "plt.plot([g2_best,g2_best],[g1_range.min(),g1_range.max()],'--r')\n", + "#plt.text(g2_best*1.02,g1_best*1.02,'g1={:1.4g}\\ng2={:1.4g}'.format(g1_best,g2_best))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.11" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/CodeForLUX/Python/Run04_CH3T_NESTmodel/CH3T_S1Threshold.ipynb b/CodeForLUX/Python/Run04_CH3T_NESTmodel/CH3T_S1Threshold.ipynb new file mode 100644 index 0000000..5e07a32 --- /dev/null +++ b/CodeForLUX/Python/Run04_CH3T_NESTmodel/CH3T_S1Threshold.ipynb @@ -0,0 +1,839 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Populating the interactive namespace from numpy and matplotlib\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: pylab import has clobbered these variables: ['linalg', 'draw_if_interactive', 'random', 'power', 'info', 'fft']\n", + "`%matplotlib` prevents importing * from pylab and numpy\n" + ] + } + ], + "source": [ + "from __future__ import division\n", + "from pylab import * # includes numpy\n", + "import matplotlib.pyplot as plt # plotting libraries from matlab\n", + "import sys\n", + "sys.path.insert (2, '/global/homes/s/salsum/luxsalsum/libNESTgit/libNESTRun04/libNEST')\n", + "sys.path.insert(0,'/project/projectdirs/lux/Tools/LUXcode/Trunk/DataAnalysis/Python/' )\n", + "sys.path.insert(0,'/project/projectdirs/lux/Tools/LUXcode/Trunk/DataAnalysis/Python/aLib' )\n", + "sys.path.insert(2, '//global/project/projectdirs/lux/Tools/anaconda/lib/python2.7/site-packages/')\n", + "sys.path.insert(2, '/global/project/projectdirs/lux/Tools/anaconda/lib')\n", + "sys.path.insert(2, '//global/project/projectdirs/lux/data/')\n", + "import scipy \n", + "import scipy.interpolate as ip\n", + "import aLib\n", + "import scipy.io as sio\n", + "import pandas as pd\n", + "import libNEST\n", + "\n", + "%pylab inline\n", + "pylab.rcParams['figure.figsize'] = (10.0, 8.0) # set size of figures\"\n", + "plt.rcParams.update({'font.size': 18})" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Setup NEST

" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "Xe_density=2.863\n", + "PT=1 #ER Particle Type\n", + "En=10 #energy, doesn't matter here\n", + "\n", + "#Construct the NEST object\n", + "NEST=libNEST.NEST(PT,En,-1,Xe_density,-1) #PT, Energy, EField - Doesn't matter, density, dT\n", + "#Construcrt a detector object and start with LUX\n", + "myDet=libNEST.Detector()\n", + "myDet.LUXSettings()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Modify NEST Parameters

" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "#now modify your detector settings before passing it into NEST\n", + "\n", + "#General settings\n", + "myDet.g1=0.098 #phd per S1 photon in liquid at dtCntr (not phe)- From Kr2p20 Result\n", + "myDet.sp=0.37 #single phe resolution (Gaussian assumed)\n", + "myDet.eDriftSpeed=1.47 #mm/usec\n", + "myDet.liquidBorder=544.2198 #mm\n", + "myDet.af=6555 #field in V/cm between liquid/gas border and anode\n", + "myDet.nFold=1 #how many PMTs have to fire for an S1 to count\n", + "myDet.spEff = 0; #POD threshold in phe\n", + "myDet.spEff_direct = 1; #actual efficiency, used in lieu of POD threshold\n", + "myDet.dt_min=40 #minimum. Top of detector fiducial\n", + "myDet.dt_max=300 #maximum. Bottom of detector fiducial\n", + "r_max=18 #Not a NEST parameter. This is the radial cut used in the Kr chi2 code\n", + "myDet.s2_thr=0 #the S2 threshold in phd. Effects NR most\n", + "myDet.s2_rat=0.449 #S2 bottom/total ratio, not really used anymore\n", + "myDet.gasGap=0.56 #EL gap in cm, effecting both field and linear S2 term\n", + "myDet.elGain=0.140 #slope term for S2 photons per electron formula\n", + "myDet.elThld=0.474 #intercept term, setting minimum field to see S2\n", + "myDet.P_dphe=0.173 #chance 1 photon makes 2 phe instead of 1 in PMT\n", + "myDet.vuv1_1to1_2=1 #correction between different gain versions in LUX\n", + "myDet.coinWind=100000000000 #S1 concidence window in ns\n", + "myDet.ee=0.808 #extraction efficiency, overriding estimate from field, assumed unchanged from Sep2014\n", + "\n", + "\n", + "\n", + "#Sep 2015 specific settings\n", + "myDet.g1_gas=0.087 #phd per S2 photon in gas, used to get SE size\n", + "myDet.ff=1.2567 #Fano-like fudge factor for SE width\n", + "myDet.s1polA=1.1776 #S1 PDE quartic poly for function of z: s1polA + s1polB*z[mm] + s1polC*z^2+... (QE included, for binomial)\n", + "myDet.s1polB=-9.9730e-04\n", + "myDet.s1polC=7.7223e-07\n", + "myDet.s1polD=0\n", + "myDet.s1polE=0\n", + "myDet.dtCntr=163.4 #center of detector for S1 corrections, in usec.\n", + "myDet.e_life= 1400#Electron liftime in us\n", + "myDet.gasRho=17.8e-3 #gas density in g/cm^3 based on T and P of detector\n", + "myDet.numberPMTs1= 117 #in LUX, 122 minus 3 de-activated. For coincidence\n", + "myDet.numberPMTs= 117 #in LUX, 122 minus 3 de-activated. For coincidence\n", + "myDet.Xe_rho=2.863 #for slight adjustment NEST uses liquid density. g/cm^3\n", + "\n", + "\n", + "#Electric field polynomial values don't matter, since we are drawing from Lucie's Map\n", + "\n", + "\n", + "#pass the detector object into NEST.\n", + "NEST.SetDetectorParameters(myDet)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Get S1 S2 for tritium beta spectrum with LUX detector settings

" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

\n", + "Define a tritium beta spectrum, http://www.hindawi.com/journals/ahep/2013/293986/\n", + "

" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "c=1; # speed of light\n", + "C=1e-6; #constant infront of Fermi funciton. Arbitrary. Read Katrin paper if you care about super-allowed and allowed transitions... and nuclear matrix elements that don't matter\n", + "me = 511/c**2; # rest mass of our good friend the electron, in keV\n", + "Q=18.6 # endpoint of the tritium Beta decay keV. Maximum kinetic energy the electron.\n", + "mv=0 # neutrino mass=0. There may exist a 17 keV neutrino, maybe 7 keV!! Will we ever know??? Is it The Dark Matter?? Mystery...\n", + "step_T=0.1 #step energy by 0.1 keV\n", + "T=arange(0.01, 18.6,step_T) #sweep from 0.01 to the Q value in increments of step_T.\n", + "Z=1+1; #Tritium, after the beta decay Z'=1+1;\n", + "halflife = 12.32; # half life of the tritium beta decay in years\n", + "tau = 365*halflife/0.69; # Decay constant converted to days\n", + "n = 1e6; # Assume 1e6 atoms are decaying.\n", + "G=(T+me*c**2)/(me*c**2); #Gamma, Total energy(E+M^2) over M^2\n", + "B=sqrt((G**2-1)/G**2); # v/c of electron. Ratio of velocity to speed of light in vacuum.\n", + "x=(2*pi*Z/137)/B; # note: fine structure constant = 137. \n", + "F_Kat=x*(1/(1-exp(-x))); # Katrin paper... http://www.hindawi.com/journals/ahep/2013/293986/ (really the same thing)\n", + "KE=T; #(G-1).*me*c^2; % The kinetic energy, is equal to T\n", + "E=KE+me*c**2; # the total energy. KE + rest mass\n", + "P=sqrt(E**2-me**2*c**4)/c; # momentum of the electron\n", + "N=C*F_Kat*(KE+me)*sqrt((KE+me)**2-me**2)*(Q-KE)**2 # eqution 18 of Katrin paper. Set nutrino mass to zero... http://www.hindawi.com/journals/ahep/2013/293986/ (really the same thing)\n", + "s = sum(N[~isnan(N)])*step_T # Total Counts\n", + "N = N * (1/s * n/tau) # Decays/keV/day/1e6 atoms\n", + "\n", + "#plot to se beta spectrum for tritium \n", + "figure(0)\n", + "plt.plot(T,N,'r',linewidth=4)\n", + "plt.xlabel('Electron Kinetic Energy [keV] ',fontsize=18)\n", + "plt.ylabel('Count/keV/day/1e6 atoms',fontsize=18)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "mat = sio.loadmat('/global/homes/r/rknoche/Sep2015_3DFieldMap_ForPython_v1p0.mat')\n", + "x_bins=mat['x_bins'] #in cm\n", + "y_bins=mat['y_bins'] #in cm\n", + "z_bins=mat['z_bins'] #in mm with cathode at z=0\n", + "DriftTimeMap=mat['DriftTimeMap'] #in uSec\n", + "FieldMap=mat['FieldMap']/100 #in V/cm \n", + "FieldMap\n", + "\n", + "#Convert dT min/max to Z max/min (in mm) using Lucie's Map\n", + "#dTtoZ=0.001082343551729*dT**2 -1.836729127595990*dT + 482.0536 #2015 conversion based on Lucie's map -- From CC:\\Program Files\\MATLAB\\R2012a\\bin\\LUXCode\\Scratch\\RichardKnoche\\KrypCal_RD\\KrypCal_2p21\\TritiumMethod\\Run04_G1ZDep_Sep2015\n", + "#dTtoZ=0.001155011585870*dT**2 -1.855642880280688*dT + 482.6349 #2016 conversion based on Lucie's map -- From CC:\\Program Files\\MATLAB\\R2012a\\bin\\LUXCode\\Scratch\\RichardKnoche\\KrypCal_RD\\KrypCal_2p21\\TritiumMethod\\Run04_G1ZDep_Feb2016\n", + "\n", + "\n", + "z_max= 0.001082343551729*myDet.dt_min**2-1.836729127595990*myDet.dt_min+482.0536 #convert zmin in uSec to zmin in mm using Lucie's Map\n", + "z_min= 0.001082343551729*myDet.dt_max**2-1.836729127595990*myDet.dt_max+482.0536 #convert zmax in uSec to zmax in mm using Lucie's Map" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "x_bins=np.squeeze(x_bins)\n", + "y_bins=np.squeeze(y_bins)\n", + "z_bins=np.squeeze(z_bins)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "xyz_to_field=ip.RegularGridInterpolator((x_bins,y_bins,z_bins),FieldMap)\n", + "xyz_to_dT=ip.RegularGridInterpolator((x_bins,y_bins,z_bins),DriftTimeMap)\n", + "\n", + "#interp_val=fn((-15,15,400))" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/anaconda2/lib/python2.7/site-packages/IPython/kernel/__main__.py:6: DeprecationWarning: using a non-integer number instead of an integer will result in an error in the future\n", + "/anaconda2/lib/python2.7/site-packages/IPython/kernel/__main__.py:7: DeprecationWarning: using a non-integer number instead of an integer will result in an error in the future\n", + "/anaconda2/lib/python2.7/site-packages/IPython/kernel/__main__.py:8: DeprecationWarning: using a non-integer number instead of an integer will result in an error in the future\n", + "/anaconda2/lib/python2.7/site-packages/IPython/kernel/__main__.py:9: DeprecationWarning: using a non-integer number instead of an integer will result in an error in the future\n", + "/anaconda2/lib/python2.7/site-packages/IPython/kernel/__main__.py:10: DeprecationWarning: using a non-integer number instead of an integer will result in an error in the future\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185\n" + ] + } + ], + "source": [ + "#####\n", + "trial_m=500; # about 150k with trial_m = 100\n", + "trials=sum(ceil(N*trial_m)); #tritium dN/dE is fractional so multiply amplitute. \n", + "subtrials=np.zeros((T.size,1)); #Number of energy bins\n", + "\n", + "S1c=np.zeros((trials,1)); # Tritium gamma spectrum\n", + "S2c=np.zeros((trials,1)); # Tritium electron spectrum.\n", + "dTus=np.zeros((trials,1));\n", + "S2x=np.zeros((trials,1));\n", + "S2y=np.zeros((trials,1));\n", + "\n", + "kk=0; # kk will equal the total number of simulated tritium events\n", + "\n", + "for jj in range(0, T.size): #% sweep through each energy bin\n", + " print(jj),\n", + " subtrials[jj]=ceil(N[jj]*trial_m) #Number of events for the current energy bin\n", + " energy=T[jj]\n", + " NEST.SetEnergy(energy) \n", + " \n", + " for ii in range(0, subtrials[jj]-1):\n", + " #Assign XYZ position to the event\n", + " current_x=np.random.uniform(-r_max,r_max,1) #corrected_x\n", + " current_r=np.random.uniform(abs(current_x),r_max,1) #radius\n", + " current_ysign=np.random.randint(0,2,1) #sign of corrected_y\n", + " current_ysign=2*current_ysign-1 #changes from 0 or 1, to -1 or 1\n", + " current_y=current_ysign*sqrt(current_r**2-current_x**2) #corrected_y\n", + " current_z=np.random.uniform(z_min,z_max,1) #corrected_z in mm\n", + "\n", + " #Get electric field from Lucie's Map, given x,y,z\n", + " current_Efield=xyz_to_field((current_x,current_y,current_z))\n", + " NEST.SetElectricField(current_Efield[0])\n", + " \n", + " #Get drift time from Lucie's map, given x,y,z\n", + " current_dT=xyz_to_dT((current_x,current_y,current_z))\n", + " NEST.SetDriftLocation(current_dT[0])\n", + " \n", + " NEST.DetectorResponse() #throw the dice\n", + " #S1[kk]=NEST.GetS1()\n", + " #S2[kk]=NEST.GetS2() \n", + " S1c[kk]=NEST.GetS1c()\n", + " S2c[kk]=NEST.GetS2c()\n", + " dTus[kk]=current_z\n", + " S2x[kk]=current_x\n", + " S2y[kk]=current_y\n", + " #Energy[kk]=NEST.GetEnergy()\n", + " kk=kk+1" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "#Load the Dec 2013 tritium data.VUV corrected, spike count for S1. XYZ corrected rq with 83Kr. Cut from 35-305us. <20cm radius.\n", + "#tritium_data=np.loadtxt('//global/homes/r/rknoche/Run04_Sep2014_Kr2p14_CH3TData_TwoLineFloat.txt')\n", + "tritium_data=np.loadtxt('//global/homes/r/rknoche/Run04_Sep2015_Kr2p22_CH3TData_ZCorrOnly.txt')\n", + "s1_data=tritium_data[:,0]\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAogAAAH5CAYAAAAC389DAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xl4VNX9x/H3NxuQsEWCAi6gLYJF64KoqEgU3K1VK0Jd\nccOlomBVpC4ERRFxV1QUWxcEFXFDXH4uBEEtgloUK6jIUgVRUAIhQEhyfn/cCUzCTDKTzMzNTD6v\n57lPkrucfDPt8/jhnHvOMeccIiIiIiKV0vwuQEREREQaFgVEEREREalCAVFEREREqlBAFBEREZEq\nFBBFREREpIoMvwtIJWamKeEiIiKSNJxzFuq8ehBjzDmnI4JjxIgRvteQDIc+J31W+pz0OTX0Q59V\n8n5ONVFAFBEREZEqFBBFREREpAoFRPFFfn6+3yUkBX1OkdNnFRl9TpHR5xQ5fVaRSbbPyWobg5bI\nmZnT5ykiIiLJwMxwmqQiIiIiIpFQQBQRERGRKhQQRURERKQKBUQRERERqUIBUURERESqUEAUERER\nkSoUEEVERESkCgVEEREREalCAVFEREREqlBAFBEREZEqFBBFREREpAoFRBERERGpQgFRRERERKpQ\nQBQRERGRKhQQRURERKQKBUQRERERqUIBUURERESqUEAUERERkSoUEEVERESkCgVEEREREalCAVFE\nREREqlBAFBEREZEqFBBFREREpAoFRBERERGpQgFRRERERKpQQBQRERGRKhQQRURERKQKBUQRERER\nqUIBUURERESqUEAUERERkSoUEEVERESkCgVEEREREalCAVFEREREqsjwu4BGY8uW7c+ZQYb+JxAR\nEZGGRekkUTp3htLSqud69oSpU/2pR0RERCQMDTEnWno6pOljFxERkYZLSSXRvvsOXnjB7ypERERE\nwlJAFBEREZEqFBBFREREpAoFRBERERGpQgFRRERERKpQQBQRERGRKhQQRURERKQKBUQRERERqcLX\ngGhmaWY21MwWmtlGM1tuZneZWXYUbZxgZh+ZWbGZrTGzF8ysU4j7TjSz18xsiZltMLNfzexTM7vK\nzJrUp20RERGRVOJ3D+K9wN3AAuAKYApwJTDNzKy2h83sNOB1oAlwDTAWOAL40MzaV7t9b2ALMAEY\nDNwEfBeoYVo92xYRERFJGb7txWxm3fCC2lTnXL+g80uAB4ABwOQans8EHgSWAb2ccyWB828CnwIF\n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\nQFER/PILVFQAsPHoozmtrIw1znFcXl7VDbm7d4eLLyatfXuuzMnh1bFjMTMKCgqYMWNG3eoUERGR\nlKGAGGf1Dog5OTBsGD1OPx2AeR07wrBhcNJJVe8bPhz23RfWrcM5x+VbtvDZb7+xR3o6k/bbr8ah\n42MOOYQbbriBiooKzjzzTFatWlW3WkVERCQlKCDGWWVArM87iAAHHnggAO+//37V5WlatIC8vCrH\nMxkZPDl5MtlNm/Jybi65y5fDmWfCiy+GbX/EiBH07t2bn376ibPOOovy8vJ61SsiIiLJSwExzion\nqdTnHUSAPn36kJuby0cffcQrr7yy7cKYMfDFF1uP7156ib8F3kF8aNgw/piZCevXQ2EhLF0atv2M\njAwmT57MjjvuyHvvvcftt99er3pFREQkeSkgxlksJqkA5ObmMmrUKACGDBmytd1gpaWlnHnmmRQX\nF9O/f38GDhkCzz67/fGXv4T8He3bt2fixIkA3HrrrXzzzTf1qllERESSkwJinMUqIAJccskl7Lff\nfixfvpw77rhju+sjRoxg7ty5dOzYkUcffRRr3RqOPHL7IzDhZat+/eB3v4M99uDo887j/OOOY8uW\nLVx19tm4L7+sd90iIiKSXBQQ4yxW7yACpKen89BDDwFw5513snjxYgCcc7z66quMGTOGtLQ0nn32\nWVq3bh15w6WlsHEjbNoEwOjPPqOVGW/Nncu03r1h7723HVOn1vvvEBERkYZNATHOYvUOYqXDDjuM\nc889l82bNzN48GAee+wxunfvzimnnIJzjptvvpnDDjssssaefx4WL/aOBQu8xbePPJKd+vbllhYt\nABiybh0b16yBX3/1js2bY/J3iIiISMNlVWbESr2Ymdv6ef7tbzBjBlf+9BMP/vYb97VsyVU5ObBk\nCTRpUq/f89NPP9GlSxfWrVu39VybNm24/PLLufnmm8nIqP/652UbNrB/jx4s+PprRg4bxs3r18PL\nL8Ndd3kzokVERCSpmRnOuZA9WOpBjJeSEli7lpLAsG2sehAB2rVrx1133QXA4YcfzsSJE/nhhx+4\n5ZZbYhIOATJycnjokUcAGH3//SxVz6GIiEijoYAYZyXduwOQM3YsfPUVZGXFpN2LL76YTZs2MWvW\nLM466yyaNm0ak3aD9e7dmwEDBrBp0yau+eCDmLcvIiIiDVPEAdHMjjCzHWu43tbMjohNWaljQ1kZ\n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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "s1_NEST = S1c;\n", + "\n", + "binwidth=1 # phd\n", + "n_NEST_S1, bin_edges_NEST_S1, patches = plt.hist(s1_NEST, bins=np.arange(0.05, 150 + binwidth, binwidth), normed=1, facecolor='none',edgecolor='red',linewidth=2, histtype='step', alpha=0.9)\n", + "plt.xlabel('S1 phd',fontsize=18)\n", + "plt.ylabel('normalized count',fontsize=18)\n", + "plt.xlim([0,100])\n", + "left,right = bin_edges_NEST_S1[:-1],bin_edges_NEST_S1[1:]\n", + "bin_center_NEST_S1=(right+left)/2\n", + "\n", + "s = ip.UnivariateSpline(bin_center_NEST_S1,n_NEST_S1)\n", + "s.set_smoothing_factor(1e-5)\n", + "plt.plot(bin_center_NEST_S1,s(bin_center_NEST_S1),'k',linewidth=2)\n", + "\n", + "plt.xlim([0,150]);\n", + "plt.ylim([0, 1.1*max(n_NEST_S1)]);" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "s2_NEST = S2c;\n", + "\n", + "binwidth=1 # phd\n", + "n_NEST_S2, bin_edges_NEST_S2, patches = plt.hist(s2_NEST, bins=np.arange(0.05, 15000 + binwidth, binwidth), normed=1, facecolor='none',edgecolor='red',linewidth=2, histtype='step', alpha=0.9)\n", + "plt.xlabel('S2 phd',fontsize=18)\n", + "plt.ylabel('normalized count',fontsize=18)\n", + "plt.xlim([0,10000])\n", + "left,right = bin_edges_NEST_S2[:-1],bin_edges_NEST_S2[1:]\n", + "bin_center_NEST_S2=(right+left)/2\n", + "\n", + "s = ip.UnivariateSpline(bin_center_NEST_S2,n_NEST_S2)\n", + "s.set_smoothing_factor(1e-5)\n", + "plt.plot(bin_center_NEST_S2,s(bin_center_NEST_S2),'k',linewidth=2)\n", + "\n", + "plt.xlim([0,10000]);\n", + "plt.ylim([0, 1.1*max(n_NEST_S2)]);" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nSwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "binwidth=1\n", + "num_data, num_data_bins, num_data_patches=plt.hist(s1_data,bins=np.arange(0.05, 150 + binwidth, binwidth));" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "S2radius=(S2x**2 + S2y**2)**(1/2)\n", + "num_sim, num_sim_bins, num_sim_patches= plt.hist(s1_NEST, bins=np.arange(0.05, 150 + binwidth, binwidth),normed=1);" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(0, 150)" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\nKCIiIiJJ/j+SGhqoV+DW7AAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "binwidth=1 #phd\n", + "\n", + "n_data, bin_edges_data, patches = plt.hist(s1_data, bins=np.arange(0.05, 150 + binwidth, binwidth), normed=1, facecolor='none',edgecolor='black',linewidth=2, histtype='step', alpha=0.9)\n", + "plt.xlabel('S1 phd',fontsize=18)\n", + "plt.ylabel('normalized count',fontsize=18)\n", + "\n", + "left,right = bin_edges_data[:-1],bin_edges_data[1:]\n", + "bin_center_data=(right+left)/2\n", + "\n", + "data_scale_factor=sum(n_data[bin_center_data>40])/sum(n_NEST_S1[bin_center_NEST_S1>40])\n", + "\n", + "plt.step(bin_center_NEST_S1,n_NEST_S1*data_scale_factor,'b',linewidth=2)\n", + "\n", + "plt.legend(('Beta w sigE','Data'))\n", + "plt.xlim([0,150])\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "SimToData_scale_factor=sum(num_data[bin_center_data>40])/sum(num_sim[bin_center_NEST_S1>40])\n", + "frac_res=(num_data-num_sim*SimToData_scale_factor)/sqrt(num_data)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "thresh=num_data/(num_sim*SimToData_scale_factor)\n", + "thresh_err=sqrt( (sqrt(num_data)/(num_sim*SimToData_scale_factor))**2 + (num_data/(num_sim*(SimToData_scale_factor**2)))**2)\n", + "no_nan_cut=np.logical_not(numpy.isnan(thresh))*np.logical_not(numpy.isinf(thresh))\n", + "thresh_nonan=thresh[no_nan_cut]\n", + "xbin_nonan=bin_center_NEST_S1[no_nan_cut]" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def func(x,mu,sig):\n", + " return (1/2)*scipy.special.erf((x-mu)/(sqrt(2)*sig))+(1/2)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 1.11003512, 2.16137779])" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "popt, pcov = scipy.optimize.curve_fit(func,xbin_nonan,thresh_nonan)\n", + "thresh_yval=(1/2)*scipy.special.erf((bin_center_NEST_S1-popt[0])/(sqrt(2)*popt[1]))+(1/2)\n", + "\n", + "popt" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from scipy import optimize\n", + "\n", + "def line( x, p):\n", + " return p[0]*x + p[1] \n", + "\n", + "def linef( x, p0, p1):\n", + " return p0*x + p1\n", + "\n", + "def erfit( x, p0, p1):\n", + " return (1/2)*scipy.special.erf((x-p0)/(sqrt(2)*p1))+(1/2)\n", + " \n", + "\n", + "\n", + "def fit_function(p0, datax, datay, function, **kwargs):\n", + "\n", + " errfunc = lambda p, x, y: function(x,p) - y\n", + "\n", + " ##################################################\n", + " ## 1. COMPUTE THE FIT AND FIT ERRORS USING leastsq\n", + " ##################################################\n", + "\n", + " # If using optimize.leastsq, the covariance returned is the \n", + " # reduced covariance or fractional covariance, as explained\n", + " # here :\n", + " # http://stackoverflow.com/questions/14854339/in-scipy-how-and-why-does-curve-fit-calculate-the-covariance-of-the-parameter-es\n", + " # One can multiply it by the reduced chi squared, s_sq, as \n", + " # it is done in the more recenly implemented scipy.curve_fit\n", + " # The errors in the parameters are then the square root of the \n", + " # diagonal elements. \n", + "\n", + " pfit, pcov, infodict, errmsg, success = \\\n", + " optimize.leastsq( errfunc, p0, args=(datax, datay), \\\n", + " full_output=1)\n", + "\n", + " if (len(datay) > len(p0)) and pcov is not None:\n", + " s_sq = (errfunc(pfit, datax, datay)**2).sum()/(len(datay)-len(p0))\n", + " pcov = pcov * s_sq\n", + " else:\n", + " pcov = inf\n", + "\n", + " error = [] \n", + " for i in range(len(pfit)):\n", + " try:\n", + " error.append( numpy.absolute(pcov[i][i])**0.5)\n", + " except:\n", + " error.append( 0.00 )\n", + " pfit_leastsq = pfit\n", + " perr_leastsq = numpy.array(error) \n", + "\n", + " ###################################################\n", + " ## 2. COMPUTE THE FIT AND FIT ERRORS USING curvefit\n", + " ###################################################\n", + "\n", + " # When you have an error associated with each dataY point you can use \n", + " # scipy.curve_fit to give relative weights in the least-squares problem. \n", + " datayerrors = kwargs.get('datayerrors', None)\n", + " curve_fit_function = kwargs.get('curve_fit_function', function)\n", + " if datayerrors is None:\n", + " pfit, pcov = \\\n", + " optimize.curve_fit(curve_fit_function,datax,datay,p0=p0)\n", + " else:\n", + " pfit, pcov = \\\n", + " optimize.curve_fit(curve_fit_function,datax,datay,p0=p0,\\\n", + " sigma=datayerrors)\n", + " error = [] \n", + " for i in range(len(pfit)):\n", + " try:\n", + " error.append( numpy.absolute(pcov[i][i])**0.5)\n", + " except:\n", + " error.append( 0.00 )\n", + " pfit_curvefit = pfit\n", + " perr_curvefit = numpy.array(error) \n", + "\n", + "\n", + " ####################################################\n", + " ## 3. COMPUTE THE FIT AND FIT ERRORS USING bootstrap\n", + " #################################################### \n", + "\n", + " # An issue arises with scipy.curve_fit when errors in the y data points\n", + " # are given. Only the relative errors are used as weights, so the fit\n", + " # parameter errors, determined from the covariance do not depended on the\n", + " # magnitude of the errors in the individual data points. This is clearly wrong. \n", + " # \n", + " # To circumvent this problem I have implemented a simple bootstraping \n", + " # routine that uses some Monte-Carlo to determine the errors in the fit\n", + " # parameters. This routines generates random datay points starting from\n", + " # the given datay plus a random variation. \n", + " #\n", + " # The random variation is determined from average standard deviation of y\n", + " # points in the case where no errors in the y data points are avaiable.\n", + " #\n", + " # If errors in the y data points are available, then the random variation \n", + " # in each point is determined from its given error. \n", + " # \n", + " # A large number of random data sets are produced, each one of the is fitted\n", + " # an in the end the variance of the large number of fit results is used as \n", + " # the error for the fit parameters. \n", + "\n", + " # Estimate the confidence interval of the fitted parameter using\n", + " # the bootstrap Monte-Carlo method\n", + " # http://phe.rockefeller.edu/LogletLab/whitepaper/node17.html\n", + " residuals = errfunc( pfit, datax, datay)\n", + " s_res = numpy.std(residuals)\n", + " ps = []\n", + " # 100 random data sets are generated and fitted\n", + " for i in range(100):\n", + " if datayerrors is None:\n", + " randomDelta = numpy.random.normal(0., s_res, len(datay))\n", + " randomdataY = datay + randomDelta\n", + " else:\n", + " randomDelta = numpy.array( [ \\\n", + " numpy.random.normal(0., derr,1)[0] \\\n", + " for derr in datayerrors ] ) \n", + " randomdataY = datay + randomDelta\n", + " randomfit, randomcov = \\\n", + " optimize.leastsq( errfunc, p0, args=(datax, randomdataY),\\\n", + " full_output=0)\n", + " ps.append( randomfit ) \n", + "\n", + " ps = numpy.array(ps)\n", + " mean_pfit = numpy.mean(ps,0)\n", + " Nsigma = 1. # 1sigma gets approximately the same as methods above\n", + " # 1sigma corresponds to 68.3% confidence interval\n", + " # 2sigma corresponds to 95.44% confidence interval\n", + " err_pfit = Nsigma * numpy.std(ps,0) \n", + "\n", + " pfit_bootstrap = mean_pfit\n", + " perr_bootstrap = err_pfit\n", + "\n", + "\n", + " # Print results \n", + " print \"\\nlestsq method :\"\n", + " print \"pfit = \", pfit_leastsq\n", + " print \"perr = \", perr_leastsq\n", + " print \"\\ncurvefit method :\"\n", + " print \"pfit = \", pfit_curvefit\n", + " print \"perr = \", perr_curvefit\n", + " print \"\\nbootstrap method :\"\n", + " print \"pfit = \", pfit_bootstrap\n", + " print \"perr = \", perr_bootstrap" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 46.23479525, -38.76904059],\n", + " [ -38.76904059, 132.13987955]])" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pcov" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 6.79961729, 11.49521116])" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "popt_err=np.sqrt(np.diag(pcov))\n", + "popt_err" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nL/93o3UHH/wPXHTRRRn0LB0nnvhm7rrrjxut23LLreIrjBuUx3HAAdGf3rfc8quN9qm1vpok+5ar\n9x7feOONnHrqhwD4yle+yiGHHLL+82vmfDfeeCOnn346a9ZEgyTTpk3nC1/4AoccckjL/c1SJ/7t\ndTLuys9v6tQ1XYkvjZ/vZjT6/Jo9X7Wf+1a0+15UrjvgAKuazHX97tXKF63dzXoE0d2sZ1bZ9nOi\nuetyeTfrLbe477qrO7j39LgfdZT75z/vvmyZ++rVm+6f5M6kJUuWZNPpHAg5NnfFV65bj2dqx/nn\nn7/J3Z7nnHNO3TtASXCHWy1J9i2XdKqQ0ufXzPnqfX6t9jdLnfi31+m4y8/XrfjS+PluRqP4mjlf\n1lPkJHkvKtcRytQkwPbAXkBP2bopRDc6LAc2L1v/SmAt8I0abdX9ELK0bp37V77ivtlm0aew337u\n995b/xhNVyITRfkvsKL+3NeaQqTaH2P1/kjrRDJXqw9pPFcz62QujwlhI91M5rqlU8lcq/0ol+Yf\nkBMqmQNOBM6MX38BnixbflfFvpcQXYU7tGL92+LE7Vbgn4F/jdt6GNihxnmb+CjS9/TT7m99a/Tu\ng/spp7iPjzc+rohXKESSSpIEJZWH/zgq16U1EXAW/U0jmasXn5K5MM+XpA95fC+UzLWezC2JE7R1\ncUK2tmz52op9vx1vf12Vdo4mmmvu2TghnA+8rM55G38SKfvLX9x32y1657fYwn3+/OaPTfoDFvJQ\nXcixuacXX16fIlIrvlb+40/yn0Gn/uOoNwzZbMLUjSuSzSaaSX8+s/w5TPszDfF3S/l71K34Ov1v\nr51+FHGYdRI54O6Hufuk+DU5fpWWD6/Y9+R4+3VV2vmpux/i7pu7+9bufpy7P9C5SBo75xy47z54\nxSvg1lvh2GObP1ZzM0kS1SYMzdvcZpWynPw2y3nUas2B5xv+cEws64mAm5HWczW7PRGwSBKFfJ5s\ntQxvorzo8JW55cvdp051N3O//fbW2khac7Nw4UIfGBhY/5e+TBxFHJZP2udmr/g0+kubGn8pV1Nt\n3yTHN9u3PH1+7cSXZhuV8nrlOW+yeO+L2Iek/cjq575Wu83sS56HWbv16vQP1sknR+/4CSek224n\nHlotxZOnZKBZSX5mk+zbSu1Xs79w00go0nrealbymMzl6f3JuzwkUnnoQ9J+KJkryKuTP1h33eU+\n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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "thresh=num_data/(num_sim*SimToData_scale_factor)\n", + "thresh_err=sqrt( (sqrt(num_data)/(num_sim*SimToData_scale_factor))**2 + (num_data/(num_sim*(SimToData_scale_factor**2)))**2)\n", + "plt.errorbar(bin_center_NEST_S1,thresh,yerr=thresh_err,xerr=None,ecolor='black',elinewidth=2,capsize=0,fmt=None)\n", + "plt.xlim([0,100])\n", + "plt.ylim([0,1.5])\n", + "plt.scatter(bin_center_NEST_S1,thresh,c='black',marker='o')\n", + "plt.plot(bin_center_NEST_S1,thresh_yval,linewidth=2)\n", + "plt.xticks(np.arange(0,100,10))\n", + "plt.yticks(np.arange(0,1.5,0.1))\n", + "plt.ylabel('Data/Theory',fontsize=22)\n", + "plt.xlabel('S1 (phd)',fontsize=22)\n", + "plt.legend((r'Fit=$\\frac{erf}{2}(\\frac{(x-\\mu)}{\\sqrt{2}\\sigma}) + \\frac{1}{2}$','Data'),loc='lower right')\n", + "\n", + "\n", + "ax=plt.gca()\n", + "ax.grid(True)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "rootnb", + "language": "python", + "name": "rootnb" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.11" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/CodeForLUX/Python/Run04_CH3T_NESTmodel/Sep2015_CH3T_Spectrum_Sim.ipynb b/CodeForLUX/Python/Run04_CH3T_NESTmodel/Sep2015_CH3T_Spectrum_Sim.ipynb new file mode 100644 index 0000000..5a76d54 --- /dev/null +++ b/CodeForLUX/Python/Run04_CH3T_NESTmodel/Sep2015_CH3T_Spectrum_Sim.ipynb @@ -0,0 +1,1141 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from __future__ import division\n", + "from pylab import * # includes numpy\n", + "import matplotlib.pyplot as plt # plotting libraries from matlab\n", + "import sys\n", + "sys.path.insert(2, '//global/project/projectdirs/lux/data')\n", + "sys.path.insert(2,'/global/project/projectdirs/lux/Tools/anaconda/lib/python2.7/site-packages')\n", + "import scipy \n", + "import scipy.interpolate as ip\n", + "import aLib\n", + "import scipy.io as sio\n", + "import pandas as pd\n", + "import libNEST\n", + "\n", + "%pylab inline\n", + "pylab.rcParams['figure.figsize'] = (10.0, 8.0) # set size of figures\"\n", + "plt.rcParams.update({'font.size': 18})" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Setup NEST

" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "Xe_density=2.863\n", + "PT=1 #ER Particle Type\n", + "En=10 #energy, doesn't matter here\n", + "\n", + "#Construct the NEST object\n", + "NEST=libNEST.NEST(PT,En,-1,Xe_density,-1) #PT, Energy, EField - Doesn't matter, density, dT\n", + "#Construcrt a detector object and start with LUX\n", + "myDet=libNEST.Detector()\n", + "myDet.LUXSettings()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Modify NEST Parameters

" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "#now modify your detector settings before passing it into NEST\n", + "\n", + "#General settings\n", + "myDet.g1=0.098 #phd per S1 photon in liquid at dtCntr (not phe)- From Kr2p20 Result\n", + "myDet.sp=0.37 #single phe resolution (Gaussian assumed)\n", + "myDet.eDriftSpeed=1.47 #mm/usec\n", + "myDet.liquidBorder=544.2198 #mm\n", + "myDet.af=6555 #field in V/cm between liquid/gas border and anode\n", + "myDet.nFold=2 #how many PMTs have to fire for an S1 to count\n", + "myDet.spEff = 0.3; #POD threshold in phe\n", + "myDet.spEff_direct = 1; #actual efficiency, used in lieu of POD threshold\n", + "myDet.dt_min=40 #minimum. Top of detector fiducial\n", + "myDet.dt_max=300 #maximum. Bottom of detector fiducial\n", + "r_max=18 #Not a NEST parameter. This is the radial cut used in the Kr chi2 code\n", + "myDet.s2_thr=150 #the S2 threshold in phd. Effects NR most\n", + "myDet.s2_rat=0.449 #S2 bottom/total ratio, not really used anymore\n", + "myDet.gasGap=0.56 #EL gap in cm, effecting both field and linear S2 term\n", + "myDet.elGain=0.140 #slope term for S2 photons per electron formula\n", + "myDet.elThld=0.474 #intercept term, setting minimum field to see S2\n", + "myDet.P_dphe=0.173 #chance 1 photon makes 2 phe instead of 1 in PMT\n", + "myDet.vuv1_1to1_2=1 #correction between different gain versions in LUX\n", + "myDet.coinWind=100 #S1 concidence window in ns\n", + "myDet.ee=0.808 #extraction efficiency, overriding estimate from field, assumed unchanged from Sep2014\n", + "\n", + "\n", + "\n", + "#Sep 2015 specific settings\n", + "myDet.g1_gas=0.087 #phd per S2 photon in gas, used to get SE size\n", + "myDet.ff=1.2567 #Fano-like fudge factor for SE width\n", + "myDet.s1polA=1.1776 #S1 PDE quartic poly for function of z: s1polA + s1polB*z[mm] + s1polC*z^2+... (QE included, for binomial)\n", + "myDet.s1polB=-9.9730e-04\n", + "myDet.s1polC=7.7223e-07\n", + "myDet.s1polD=0\n", + "myDet.s1polE=0\n", + "myDet.dtCntr=163.4 #center of detector for S1 corrections, in usec.\n", + "myDet.e_life= 1400#Electron liftime in us\n", + "myDet.gasRho=17.8e-3 #gas density in g/cm^3 based on T and P of detector\n", + "myDet.numberPMTs1= 117 #in LUX, 122 minus 3 de-activated. For coincidence\n", + "myDet.numberPMTs= 117 #in LUX, 122 minus 3 de-activated. For coincidence\n", + "myDet.Xe_rho=2.863 #for slight adjustment NEST uses liquid density. g/cm^3\n", + "\n", + "\n", + "#Electric field polynomial values don't matter, since we are drawing from Lucie's Map\n", + "\n", + "\n", + "#pass the detector object into NEST.\n", + "NEST.SetDetectorParameters(myDet)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Get S1 S2 for tritium beta spectrum with LUX detector settings

" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

\n", + "Define a tritium beta spectrum, http://www.hindawi.com/journals/ahep/2013/293986/\n", + "

" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\nG6NEAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "c=1; # speed of light\n", + "C=1e-6; #constant infront of Fermi funciton. Arbitrary. Read Katrin paper if you care about super-allowed and allowed transitions... and nuclear matrix elements that don't matter\n", + "me = 511/c**2; # rest mass of our good friend the electron, in keV\n", + "Q=18.6 # endpoint of the tritium Beta decay keV. Maximum kinetic energy the electron.\n", + "mv=0 # neutrino mass=0. There may exist a 17 keV neutrino, maybe 7 keV!! Will we ever know??? Is it The Dark Matter?? Mystery...\n", + "step_T=0.1 #step energy by 0.1 keV\n", + "T=arange(0.01, 18.6,step_T) #sweep from 0.01 to the Q value in increments of step_T.\n", + "Z=1+1; #Tritium, after the beta decay Z'=1+1;\n", + "halflife = 12.32; # half life of the tritium beta decay in years\n", + "tau = 365*halflife/0.69; # Decay constant converted to days\n", + "n = 1e6; # Assume 1e6 atoms are decaying.\n", + "G=(T+me*c**2)/(me*c**2); #Gamma, Total energy(E+M^2) over M^2\n", + "B=sqrt((G**2-1)/G**2); # v/c of electron. Ratio of velocity to speed of light in vacuum.\n", + "x=(2*pi*Z/137)/B; # note: fine structure constant = 137. \n", + "F_Kat=x*(1/(1-exp(-x))); # Katrin paper... http://www.hindawi.com/journals/ahep/2013/293986/ (really the same thing)\n", + "KE=T; #(G-1).*me*c^2; % The kinetic energy, is equal to T\n", + "E=KE+me*c**2; # the total energy. KE + rest mass\n", + "P=sqrt(E**2-me**2*c**4)/c; # momentum of the electron\n", + "N=C*F_Kat*(KE+me)*sqrt((KE+me)**2-me**2)*(Q-KE)**2 # eqution 18 of Katrin paper. Set nutrino mass to zero... http://www.hindawi.com/journals/ahep/2013/293986/ (really the same thing)\n", + "s = sum(N[~isnan(N)])*step_T # Total Counts\n", + "N = N * (1/s * n/tau) # Decays/keV/day/1e6 atoms\n", + "\n", + "#plot to se beta spectrum for tritium \n", + "figure(0)\n", + "plt.plot(T,N,'r',linewidth=4)\n", + "plt.xlabel('Electron Kinetic Energy [keV] ',fontsize=18)\n", + "plt.ylabel('Count/keV/day/1e6 atoms',fontsize=18)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Load Lucie's Sep2015 Field Map

" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "mat = sio.loadmat('/global/homes/r/rknoche/Sep2015_3DFieldMap_ForPython_v1p0.mat')\n", + "x_bins=mat['x_bins'] #in cm\n", + "y_bins=mat['y_bins'] #in cm\n", + "z_bins=mat['z_bins'] #in mm with cathode at z=0\n", + "DriftTimeMap=mat['DriftTimeMap'] #in uSec\n", + "FieldMap=mat['FieldMap']/100 #in V/cm \n", + "FieldMap\n", + "\n", + "#Convert dT min/max to Z max/min (in mm) using Lucie's Map\n", + "#dTtoZ=0.001082343551729*dT**2 -1.836729127595990*dT + 482.0536 #2015 conversion based on Lucie's map -- From CC:\\Program Files\\MATLAB\\R2012a\\bin\\LUXCode\\Scratch\\RichardKnoche\\KrypCal_RD\\KrypCal_2p21\\TritiumMethod\\Run04_G1ZDep_Sep2015\n", + "#dTtoZ=0.001155011585870*dT**2 -1.855642880280688*dT + 482.6349 #2016 conversion based on Lucie's map -- From CC:\\Program Files\\MATLAB\\R2012a\\bin\\LUXCode\\Scratch\\RichardKnoche\\KrypCal_RD\\KrypCal_2p21\\TritiumMethod\\Run04_G1ZDep_Feb2016\n", + "\n", + "\n", + "z_max= 0.001082343551729*myDet.dt_min**2-1.836729127595990*myDet.dt_min+482.0536 #convert zmin in uSec to zmin in mm using Lucie's Map\n", + "z_min= 0.001082343551729*myDet.dt_max**2-1.836729127595990*myDet.dt_max+482.0536 #convert zmax in uSec to zmax in mm using Lucie's Map" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "x_bins=np.squeeze(x_bins)\n", + "y_bins=np.squeeze(y_bins)\n", + "z_bins=np.squeeze(z_bins)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "xyz_to_field=ip.RegularGridInterpolator((x_bins,y_bins,z_bins),FieldMap)\n", + "xyz_to_dT=ip.RegularGridInterpolator((x_bins,y_bins,z_bins),DriftTimeMap)\n", + "\n", + "#interp_val=fn((-15,15,400))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Simulate, updating energy, dT, eField at each event

" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185\n" + ] + } + ], + "source": [ + "#####\n", + "trial_m=500; # about 150k with trial_m = 100\n", + "trials=sum(ceil(N*trial_m)); #tritium dN/dE is fractional so multiply amplitute. \n", + "subtrials=np.zeros((T.size,1)); #Number of energy bins\n", + "\n", + "S1c=np.zeros((trials,1)); # Tritium gamma spectrum\n", + "S2c=np.zeros((trials,1)); # Tritium electron spectrum.\n", + "dTus=np.zeros((trials,1));\n", + "S2x=np.zeros((trials,1));\n", + "S2y=np.zeros((trials,1));\n", + "\n", + "kk=0; # kk will equal the total number of simulated tritium events\n", + "\n", + "for jj in range(0, T.size): #% sweep through each energy bin\n", + " print(jj),\n", + " subtrials[jj]=ceil(N[jj]*trial_m) #Number of events for the current energy bin\n", + " energy=T[jj]\n", + " NEST.SetEnergy(energy) \n", + " \n", + " for ii in range(0, subtrials[jj]-1):\n", + " #Assign XYZ position to the event\n", + " current_x=np.random.uniform(-r_max,r_max,1) #corrected_x\n", + " current_r=np.random.uniform(abs(current_x),r_max,1) #radius\n", + " current_ysign=np.random.randint(0,2,1) #sign of corrected_y\n", + " current_ysign=2*current_ysign-1 #changes from 0 or 1, to -1 or 1\n", + " current_y=current_ysign*sqrt(current_r**2-current_x**2) #corrected_y\n", + " current_z=np.random.uniform(z_min,z_max,1) #corrected_z in mm\n", + "\n", + " #Get electric field from Lucie's Map, given x,y,z\n", + " current_Efield=xyz_to_field((current_x,current_y,current_z))\n", + " NEST.SetElectricField(current_Efield[0])\n", + " \n", + " #Get drift time from Lucie's map, given x,y,z\n", + " current_dT=xyz_to_dT((current_x,current_y,current_z))\n", + " NEST.SetDriftLocation(current_dT[0])\n", + " \n", + " NEST.DetectorResponse() #throw the dice\n", + " #S1[kk]=NEST.GetS1()\n", + " #S2[kk]=NEST.GetS2() \n", + " S1c[kk]=NEST.GetS1c()\n", + " S2c[kk]=NEST.GetS2c()\n", + " dTus[kk]=current_z\n", + " S2x[kk]=current_x\n", + " S2y[kk]=current_y\n", + " #Energy[kk]=NEST.GetEnergy()\n", + " kk=kk+1" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "767307" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "S1c.size" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "g1=myDet.g1\n", + "g2=25.8536*myDet.ee\n", + "cut=(S1c>0) & (S2c>100)\n", + "sim_energy=(1/73)*(S1c[cut]/g1+S2c[cut]/g2)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "670529" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sim_energy.size" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Make the non-thresholded Energy Spectrum To Calculate Sim Threshold of NEST

" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "c=1; # speed of light\n", + "C=1e-6; #constant infront of Fermi funciton. Arbitrary. Read Katrin paper if you care about super-allowed and allowed transitions... and nuclear matrix elements that don't matter\n", + "me = 511/c**2; # rest mass of our good friend the electron, in keV\n", + "Q=18.6 # endpoint of the tritium Beta decay keV. Maximum kinetic energy the electron.\n", + "mv=0 # neutrino mass=0. There may exist a 17 keV neutrino, maybe 7 keV!! Will we ever know??? Is it The Dark Matter?? Mystery...\n", + "step_T=0.1 #step energy by 0.1 keV\n", + "T=arange(0.01, 18.6,step_T) #sweep from 0.01 to the Q value in increments of step_T.\n", + "Z=1+1; #Tritium, after the beta decay Z'=1+1;\n", + "halflife = 12.32; # half life of the tritium beta decay in years\n", + "tau = 365*halflife/0.69; # Decay constant converted to days\n", + "n = 1e6; # Assume 1e6 atoms are decaying.\n", + "# Fermi Function. Coulomb correction for the charge of the nucleas\n", + "G=(T+me*c**2)/(me*c**2); #Gamma, Total energy(E+M^2) over M^2\n", + "B=sqrt((G**2-1)/G**2); # v/c of electron. Ratio of velocity to speed of light in vacuum.\n", + "x=(2*pi*Z/137)/B; # note: fine structure constant = 137. \n", + "F = x*(1/(1-exp(-x)))*(1.002037-0.001427*(B)); # from http://journals.aps.org/prl/abstract/10.1103/PhysRevLett.54.1891. Measured to 1/1000\n", + "F_Kat=x*(1/(1-exp(-x))); # Katrin paper... http://www.hindawi.com/journals/ahep/2013/293986/ (really the same thing)\n", + "KE=T; #(G-1).*me*c^2; % The kinetic energy, is equal to T\n", + "E=KE+me*c**2; # the total energy. KE + rest mass\n", + "P=sqrt(E**2-me**2*c**4)/c; # momentum of the electron\n", + "N=C*P*E*(Q+me-E)*sqrt((Q+me-E)**2-mv**2)*F # in terms of total energy. E=m0+KE. Or where Q means Q+m0\n", + "N_Kat=C*F_Kat*(KE+me)*sqrt((KE+me)**2-me**2)*(Q-KE)**2 # eqution 18 of Katrin paper. Set nutrino mass to zero... http://www.hindawi.com/journals/ahep/2013/293986/ (really the same thing)\n", + "s = sum(N[~isnan(N)])*step_T # Total Counts\n", + "s_Kat = sum(N_Kat[~isnan(N_Kat)])*step_T # Total Counts (for the Katrin paper case)\n", + "\n", + "N = N * (1/s * n/tau) # Decays/keV/day/1e6 atoms\n", + "N_Kat = N_Kat * (1/s * n/tau) # Decays/keV/day/1e6 atoms\n", + "tritium_beta_spectrum=array([T,N])\n", + "\n", + "#NEED TO GET NEW DATA FOR RUN04!!\n", + "#Load NEST LY,QY [2 3] -> Doke-Tritium LY,QY [4 5] -> and Tritium_Beta LY,QY [6 7]\n", + "tritium_beta=np.loadtxt('//global/homes/r/rknoche/Tritium_Spec_LYQY_paper.txt')\n", + "tritium_beta[:,0]=T\n", + "tritium_beta[:,1]=N" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Look at S1 histogram from NEST

" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "num_sim_s1, num_sim_bins_s1, num_sim_patches_s1 = plt.hist(S1c, bins=np.arange(0.05, 100, 10),normed=0);" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "#calculate ER band of the SIM\n", + "cut=(S1c>0) & (S2c>0)\n", + "S1=S1c=S1c[cut]\n", + "S2=S2c=S2c[cut]\n", + "S2x=S2x[cut]\n", + "S2y=S2y[cut]\n", + "dTus=dTus[cut]" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "g1_Doke=0.098 \n", + "Eeff_Doke=0.808\n", + "Eeff_Beta=0.808\n", + "SE_WS=25.55\n", + "sigma_SE=5.45; #From LUG\n", + "g2_Doke= SE_WS*Eeff_Doke \n", + "\n", + "\n", + "g1_Beta=g1_Doke \n", + "g2_Beta=g2_Doke \n", + "\n", + "E_Doke=1/73*(S1/g1_Doke + S2/g2_Doke)\n", + "E_Beta=1/73*(S1/g1_Beta + S2/g2_Beta)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185\n" + ] + } + ], + "source": [ + "# Setup constants...\n", + "ex_to_ion_alpha=0.20; #exciton to ion ratio ... alpha\n", + "\n", + "sigma_PE=0.50; # resolution of 1 photon. We are using spike count, so this should be 0\n", + "\n", + "inst_s1=6; #measured from Doke 6 ... seems to turn off below ~200 keV ?\n", + "inst_s2=8; #measured from Doke 8 ... seems turn off below ~200 keV ?\n", + "#using 0.85 as average extraction factor for a 1000 us electron lifetime\n", + "#and 320 us drift length.\n", + "\n", + "g1=g1_Doke #From Doke plot\n", + "Eeff=Eeff_Doke #From Doke plot #### Please NOTE: using 0.48 makes NO FREAKING DIFFERENCE!!! try for yourself :) \n", + "SE_size = SE_WS # For December tritium data.... use 24.66 in Aug 2013, same as W.S.\n", + "\n", + "#######################################################################################################\n", + "coeff_ng_sig_stat=sqrt((1-g1+sigma_PE**2)/g1);\n", + "coeff_ne_sig_stat=sqrt(((1-Eeff)*Eeff*SE_size**2+Eeff*sigma_SE**2)*0.85/(Eeff*SE_size)**2+0.155);\n", + "\n", + "trial_m=1000; # about 150k with trial_m = 100\n", + "trials=sum(ceil(tritium_beta[:,1]*trial_m)); #tritium dN/dE is fractional so multiply amplitute. \n", + "subtrials=np.ones((tritium_beta[:,1].size,1));\n", + "\n", + "gamma_T=np.ones((trials,1)); # Tritium gamma spectrum\n", + "e_T=np.ones((trials,1)); # Tritium electron spectrum.\n", + "\n", + "\n", + "kk=1; # kk will equal the total number of simulated tritium events\n", + "\n", + "for jj in range(0, tritium_beta[:,0].size): #% sweep through each energy bin\n", + " print(jj),\n", + " subtrials[jj]=ceil(tritium_beta[jj,1]*trial_m)\n", + " mean_gamma_T=tritium_beta[jj,2] # 2 for NESTv98 LY, 5 is with first fit to tritium.\n", + " mean_e_T=tritium_beta[jj,3] # 3 for NESTv98 QY, 6 is with first fit to tritium.\n", + "\n", + " n_ion_T=(mean_gamma_T+mean_e_T)/(1+ex_to_ion_alpha);\n", + " r_T=(mean_gamma_T/mean_e_T-ex_to_ion_alpha)/(mean_gamma_T/mean_e_T+1) #mean recombination fraction\n", + "\n", + " #Add functional form of recombination variance.%%%%%%%%%%%%%%%%%%% Cancels out in E space\n", + " Recomb_V_T=(0.07*n_ion_T)**2;\n", + " Fano_V=0; \n", + "\n", + " for ii in range(0, subtrials[jj]-1): #% one energy bin, test for recombination and stat\n", + " \n", + " recomb_fluc = np.random.normal(0,sqrt(Recomb_V_T),1) #mu, sigma , 1\n", + " Fano_fluc= 0; #normrnd(0,sqrt(Fano_V));\n", + " #Add functional form of S1 and S2 smearing%%%%%%%%%%%%%%%%\n", + " sigma_stat_gamma_R= sqrt(abs((coeff_ng_sig_stat*sqrt(abs(mean_gamma_T+recomb_fluc+r_T*Fano_fluc)))**2+(inst_s1/100*(mean_gamma_T+recomb_fluc+r_T*Fano_fluc) )**2 ));\n", + " sigma_stat_e_R= sqrt(abs((coeff_ne_sig_stat*sqrt(abs(mean_e_T-recomb_fluc+(1-r_T)*Fano_fluc)))**2 + (inst_s2/100*(mean_e_T-recomb_fluc+(1-r_T)*Fano_fluc) )**2 )); \n", + "\n", + " gamma_T[kk]=np.random.normal(mean_gamma_T+recomb_fluc+r_T*Fano_fluc,sigma_stat_gamma_R,1) #recomb + photons and - electrons\n", + " e_T[kk]= np.random.normal(mean_e_T-recomb_fluc+(1-r_T)*Fano_fluc,sigma_stat_e_R,1) #%recomb - photons and + electrons\n", + " kk=kk+1;\n", + "\n", + "#photon spectrum: gamma_T\n", + "#electron spectrum: e_T\n", + "# Energy...-> now smeared with detector resultion.\n", + "E_com_Tsim_NEST_MAX=1/73*(gamma_T+e_T); " + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(0, 0.11489403159172487)" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\nIiJZ5P8AsJ9IOVavMCYAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "binwidth=0.25 # keV\n", + "n_NEST_MAX, bin_edges_NEST_MAX, patches = plt.hist(E_com_Tsim_NEST_MAX, bins=np.arange(0.05, 25 + binwidth, binwidth), normed=1, facecolor='none',edgecolor='red',linewidth=2, histtype='step', alpha=0.9)\n", + "plt.xlabel('Energy KeVee',fontsize=18)\n", + "plt.ylabel('normalized count',fontsize=18)\n", + "plt.xlim([0,25])\n", + "left,right = bin_edges_NEST_MAX[:-1],bin_edges_NEST_MAX[1:]\n", + "bin_center_NEST_MAX=(right+left)/2\n", + "\n", + "s = ip.UnivariateSpline(bin_center_NEST_MAX,n_NEST_MAX)\n", + "s.set_smoothing_factor(1e-5)\n", + "plt.plot(bin_center_NEST_MAX,s(bin_center_NEST_MAX),'k',linewidth=2)\n", + "\n", + "scale_factor=sum(N)*0.1/(sum(n_NEST_MAX)*binwidth)\n", + "plt.plot(T,N/scale_factor,'m',linewidth=2)\n", + "\n", + "plt.xlim([0,22]);\n", + "plt.ylim([0, 1.1*max(n_NEST_MAX)]);\n", + "\n", + "#plt.yscale('log')" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(0, 22)" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\nmZmZdZB/AYurqDKmV77WAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "binwidth=0.25 # keV\n", + "\n", + "n_data, bin_edges_data, patches = plt.hist(E_Doke, bins=np.arange(0.05, 25 + binwidth, binwidth), normed=1, facecolor='none',edgecolor='black',linewidth=2, histtype='step', alpha=0.9)\n", + "plt.xlabel('Energy KeVee',fontsize=18)\n", + "plt.ylabel('normalized count',fontsize=18)\n", + "\n", + "left,right = bin_edges_data[:-1],bin_edges_data[1:]\n", + "bin_center_data=(right+left)/2\n", + "\n", + "\n", + "data_scale_factor=sum(n_data[bin_center_data>3])/sum(n_NEST_MAX[bin_center_NEST_MAX>3])\n", + "\n", + "plt.step(bin_center_NEST_MAX,n_NEST_MAX*data_scale_factor,'b',linewidth=2)\n", + "#plt.plot(T,N/scale_factor*data_scale_factor,'m',linewidth=2)\n", + "\n", + "plt.legend(('Beta w sigE','Beta','Data','Data with Beta values'))\n", + "plt.xlim([0,22])\n", + "#plt.yscale('log')" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAoUAAAHrCAYAAAC5P+djAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3X+s5lV9J/D3BwfuXKDWbTFjGW0JptjBYliLVvxDB3U3\nhMYmTVxrWNLsVplsBa00u+napjLbH6lpqSC73dhq63YXVyDistq6bdbAiGvFoNY6tSQaLbILGRrU\nFmV+CMzZP77PlWe+89yZe+88P+59ntcrefLMPd/zPZz5+vXy5nzP95xqrQUAgMV22qw7AADA7AmF\nAAAIhQAACIUAAEQoBAAgQiEAABEKAQDIGkNhVf1oVf16VX26qv6+qh6rqr+qql+pqjNH1L+gqu6s\nqm9W1Xeq6p6qumyVtquqrquq+6vqUFU9WFU3jGp30m0DACyqWsvi1VX120nenOQjSe5N8kSSy5L8\nbJK/TvKy1tqRQd3zk9yX5LtJbkzyWJKrk1yU5PLW2l29tt+d5C1J7kjy50l2JXlrkntaa6/p1Z1Y\n2wAAi2ytofDFSb7SWvt2r/w3kvxKkre01v7zoOz2JD+T5MWttf2DsrOSfCnJodbarqHzL0yyP8kd\nrbXXD5Vfm+TmJFe21m4dKp9Y2wAAi2xNj49ba5/vB8KB25JUkh9PksFj2dcmuXsltA3OfzzJ+5Jc\nUFWXDJ1/5eD7pl67701yMMlVKwWTbBsAYNGd6osmzxt8Hxh8vyjJUrpHzH33pguQLxkquyTJ0XSP\nhL9n8Cj6C726k2wbAGChbTgUVtVpSX4t3fzCDw6Kzx18PzTilJWynUNl5yZ5tLX2xCr1z6mqbVNo\nGwBgoZ3KSOG7k/xkkl9rrX1lULbyVu+REfUP9+qs/HlU3VH1J9k2AMBC29BI2eAFk2uSvKe19jtD\nhw4OvpdGnLa9V2flz89e5R/Trz/Jto9RVSd/+wYAYJNordWptrHuUFhVe5P8apI/aq29uXf44cH3\nzhxvpWz48e/DSXZV1ekjHvPuTPf498kptH2ccVxc1q6q9rbW9s66H4vENZ8+13z6XPPpc82nb1yD\nWet6fDwIhO9I8v7W2tUjquxP98j20hHHLk3Sknx2qOy+QR9e2vvnLCW5OMe+JDLJtgEAFtqaQ2FV\nvSNdIPyT1tobR9UZLA/z0SS7q+qioXPPTvKmJF9urQ2HsdsG32/rNbUnyXKSD0yjbQCARbemx8dV\ndU2SvUm+nuSuqvqXvSqPtNY+Pvjz25O8Ksn/rqqVXUf2JPmhJFcMn9Ra+5uq+v0k11TVHUk+luTC\ndLuQ7GutfTDHmmTbW07V8oHk8I5jS7c/0tqh58ymR6dk36w7sID2zboDC2jfrDuwgPbNugMLaN+s\nO8DGrHVHk/cn+bkTVPlEa+1VQ/VfkOSdSV6Z5Iwkn0uyt7V294i2K91o3p4k5yV5NMmtSa5vrR33\nIsgk2x46r22FOYXdHIL+/35lPiQALJBx5ZY1hcJFIxQCAFvFuHLLqe5owqazlKpqx36WD5z8PABg\nkQmFW0jV8oHhsDe61pF0o4fDn/68QwCAYwmFW8rhHceGvbXqjx4uP2U0EQAYZu/fhbAyeriiThsx\nF9FoIgAsMCOFAAAIhQAACIUAAEQoBAAgQiEAABEK+Z6Ri14/ZdkaAFgMlqRhoL9sTXL80jWWrQGA\neWWkEAAAoRAAAKEQAIAIhQAARCgEACBC4aZVtXygv0TMrPsEAMwvS9JsWod3jFgiZiY9AQDmn5FC\nAACEQgAAhEIAACIUAgAQoRAAgAiFrMtS+svkVC0fmHWvAIBTJxSyDkfSLZNzzGeHoAgAW591CjlF\nK0FxWO2YRU8AgI0zUggAgFDIJPTnHnqcDACbncfHTED/kbLHyQCw2RkpBABAKAQAQCgEACBCIVNh\n0WsA2Oy8aMIUWMsQADY7I4UAAAiFAAAIhQAARCgEACBCIQAAEQoBAIhQCABAhEIAACIUAgAQoRAA\ngAiFAABEKGRmllJV7djP8oFZ9woAFtW2WXeARXUkSeuV1Y5Z9AQAMFIIAECEQgAAIhSyqfTnGZpj\nCADTYk4hm0h/nqE5hgAwLUYKAQAQCgEAEAoBAIhQCABAhEIAACIUAgAQoZBNzf7IADAt1ilkE7M/\nMgBMi5FCAACEQgAAhEIAACIUAgAQoZAtxxvJADAJ3j5mi/FGMgBMgpFCAACEQgAAhMJNo2r5wPA8\nuVn3BwBYLOYUbhqHdxw7V65m1hMAYPEYKQQAQCgEAEAoBAAgQiEAABEKAQCIUAgAQIRCAAAiFAIA\nEKEQAIAIhQAARCgEACBCIQAAEQqZC0upqvb0Z/nArHsEAFvNtll3AE7dkSRt6OfaMaueAMBWZaQQ\nAAChEAAAoZC51J9jaJ4hAJyMOYXMof4cw8Q8QwA4MSOFAAAIhQAACIUAAEQoBAAgQiELwxvJAHAi\n3j5mQXgjGQBOxEghAABCIQAAQiEAABEKAQCIUAgAQNYYCqvq7VV1e1V9taqOVtXXTlD3+kGd/uep\nqvqlEfWrqq6rqvur6lBVPVhVN1TVmau0f0FV3VlV36yq71TVPVV12Sp119U2AMCiWuuSNL+V5BtJ\nPp/kWWuo35K8bXDOsM+NqHtTkrckuSPJDUl2JXlrkouTvGa4YlWdn+TTSb6b5J1JHktydZK/qKrL\nW2t3bbRtAIBFttZQeH5r7YEkqar9Sc5awzn/s7X24IkqVNWFSa5N8qHW2uuHyh9IcnNVvaG1duvQ\nKe9M8swkL26t7R/U/W9JvpTk99OFvo22DQCwsNb0+HglEK5TVdX3VdUzTlDnysH3Tb3y9yY5mOSq\nocbOTPLaJHevBMJB3x5P8r4kF1TVJRtpGwBg0U3qRZNK8sUk/5jkcFV9qqouH1HvkiRHk9w3XNha\nO5LkC0leMlT8oiRLSe4d0c69g3/mcP31tM1C6m99Z9s7ABbXJELhPyT5g3SPbn86yb9P8sNJ/qyq\nfq5X99wkj7bWnhjRzkNJzqmqbUN1V8pH1U2SnRtsm4W0svXdyuewbe8AWFhjD0WttXf3iv60qv44\n3by/G6vqQ621g4NjZ6b7N/Moh4fqPDb4zir1h+tm6M9rbRsAYKFNZaSstfatqnpPkuuTvDzJxweH\nDiZ59iqnbR+qM/y9tIa66237OFW1d+jHfa21favVBQCYlqranWT3uNud5uPTBwbf5wyVPZxkV1Wd\nPuIx7850j3+fHKq7Ut63Ujb8aHk9bR+ntbZ3tWMAALMyGKjat/JzVV0/jnanuaPJBYPvR4bK7hv0\n4aXDFatqKd1agsMviexP9zj40hFtX5puUthnN9g2AMBCG2sorKpnVNUzR5Q/L8kvJHk0yV8OHbpt\n8P223il7kiwn+cBKwWDpmY8m2V1VFw21fXaSNyX5cmttOOituW0AgEVXrbWTV6q6KsmPpFv25dok\npyd51+Dw11trtwzqfX+Sv0tyZ5L7k3wryY8leWO6Ba/f0Fr7cK/tm5NcMzjnY0kuTLcLySdba6/u\n1X1+ks8keTLJjeleEtmT5IVJrmitfbxXf81t985rrbU66YUZo6pq3WDn90py7M+jytZSx3nrOW/a\n/7sDwKkaV25Zayi8O8krVjn8idbaqwb1zkjyn5L8ZJLnJjk73ejg/0nyO62147a5q6pKN5q3J8l5\ng/q3Jrl+6C3l4fovSLezySuTnJFu67y9rbW7T7XtofOEwgU9TygEYKuZaihcNELhop63PcevYrT9\nkdYOPScAsEmNK7dYvBm+Z2Ux62FlQWsAFsI03z4GAGCTEgoBABAKAQAQCgEAiFAIAECEQgAAIhQC\nABChEACACIUAAEQoBAAgQiEAABEK4SSWUlXt6c/ygVn3CAAmYdusOwCb25Ekbejn2jGrngDAJBkp\nBABAKAQAQCgEACBCIQAAEQphnfpvI3sjGYD54O1jWJf+28iJN5IBmAdGCgEAEAoBABAKAQCIUAgA\nQIRCAAAiFAIAEKEQAIAIhQAARCgEACBCIQAAEQoBAIhQCGOwlKpqx36WD8y6VwCwHttm3QHY+o4k\nab2y2jGLngDARhkpBABAKAQAQCgEACBCIQAAEQoBAIhQCABAhEIAACIUAgAQoRAmpL/LiR1OANjc\n7GgCE9Hf5cQOJwBsbkYKAQAQCgEAEAoBAIhQCABAhEIAACIUwpT0l6ixTA0Am4slaWAq+kvUJJap\nAWAzMVIIAIBQCACAUAgAQIRCAAAiFAIAEKFwJqqWD/SXJ5l1nwCAxWZJmpk4vGPE8iQz6QkAQGKk\nEGbIgtYAbB5GCmFmLGgNwOZhpBAAAKEQAAChEACACIUAAEQoBAAgQiEAABEKAQCIUAgAQIRCAAAi\nFAIAEKEQAIAIhbDJLKWq2tOf5QOz7hEAi2HbrDsADDuSpA39XDtm1RMAFouRQgAAhEIAAIRCAAAi\nFAIAEKEQAIAIhQAARCgEACBCIQAAEQphk+vvcGKXEwAmw44msKn1dzhJ7HICwCQYKQQAQCgEAEAo\nBAAgQiEAABEKAQCIUAgAQIRCAAAiFAIAEKEQAIAIhQAARCgEACBCIWxBS6mqduxn+cCsewXA1rZt\n1h0A1utIktYrqx2z6AkA88NIIQAAQiEAAGsMhVX19qq6vaq+WlVHq+prJ6l/QVXdWVXfrKrvVNU9\nVXXZKnWrqq6rqvur6lBVPVhVN1TVmdNuGwBgUVVr/blJIypVHU3yjSSfT3JJkn9srZ2/St3zk9yX\n5LtJbkzyWJKrk1yU5PLW2l29+u9O8pYkdyT58yS7krw1yT2ttddMq+3eea21Vie+KhtXVW3EnLAc\nW9b/eaN1nDfe8zZjn7qySd6zAGxe48otaw2F57XWHhj8eX+Ss04QCm9P8jNJXtxa2z8oOyvJl5Ic\naq3tGqp7YZL9Se5orb1+qPzaJDcnubK1dus02u79HYRC522hPnVlQiHAYhpXblnT4+OVQHgyg8ey\nr01y90poG5z/eJL3Jbmgqi4ZOuXKwfdNvabem+Rgkqum0TYAwKIb94smL0qylOTeEcfuTTfE8ZKh\nskuSHE33SPh7WmtHknyhV3eSbQMALLRxh8JzB98PjTi2UrazV//R1toTq9Q/p6q2DdWdVNsAAAtt\n3KFw5a3eIyOOHe7VWfnzqLqj6k+ybdji+ruc2OEEgPUZdyg8OPheGnFse6/Oyp9H1R1Vf5Jtwxa3\nssvJyuewHU4AWJdxPz59ePC9c8SxlbLhx78PJ9lVVaePeMy7M93j3yen0PZxqmrv0I/7Wmv7VqsL\nADAtVbU7ye5xtzvuULg/3ZDFpSOOXZpuCOOzQ2X3JflnSV6a5FMrhVW1lOTiJPum1PZxWmt7T3Qc\nAGAWBgNV+1Z+rqrrx9HuWB8fD5aH+WiS3VV10Up5VZ2d5E1JvtxaG34b+LbB99t6Te1JspzkA9No\nGwBg0a118eqrkvxIumVfrk1yepJ3DQ5/vbV2y1Dd5yf5TJIn8/SuI3uSvDDJFa21j/favjnJNUnu\nTPKxJBem24Xkk621V/fqTqzt3nkWr3beFurT6PMsZg2wGKa9o8ndSV6xyuFPtNZe1av/giTvTPLK\nJGck+VySva21u0e0XelG8/YkOS/Jo0luTXJ9a+24F0Em2fbQeUKh87ZQn0afJxQCLIaphsJFIxQ6\nb2v1afR5QiHAYpjqNnfAVtNft9DahQCcmB09YC6trFs4rKxdCMCqjBQCACAUAgAgFAIAEKEQAIAI\nhQAARCgEACBCISwQaxcCsDrrFMLCsHYhAKszUggAgFAIAIBQCABAhEIAACIUAgAQoRAAgAiFAABE\nKAQAIEIhAAARCmHB9be+s+0dwKKyzR0stP7Wd7a9A1hURgoBABAKAQAQCgEAiFAIAECEQgAAIhQC\nABChEACACIUAAEQoBAAgQiEAABEKAQCIUAgAQIRCAAAiFALHWEpVtWM/ywdm3SsAJm/brDsAbCZH\nkrReWe2YRU8AmC4jhQAACIUAAAiFwEmZZwiwCMwpBE7CPEOARWCkEAAAoRAAAKEQAIAIhQAARCgE\nACBCIQAAEQoBAIhQCABAhEIAACIUAgAQoRAAgAiFwIYspara05/lA7PuEQCnZtusOwBsRUeStKGf\na8esegLAeBgpBABAKJy0quUDxz5mq3byswAApsvj44k7vOPYx2xJUjPpCQDAaowUAgAgFAIAIBQC\nABChEACACIUAAEQoBAAgQiEAABEKAQCIUAgAQIRCAAAiFAIAEKEQGIulVFU79rN8YNa9AmDtts26\nA8A8OJKk9cpqxyx6AsDGGCkEAEAoBABAKAQmxjxDgK3EnEJgQswzBNhKjBQCACAUAgAgFAJT1Z9n\naI4hwGZhTiEwRf15huYYAmwWRgoBABAKAQAQCgEAiFAIAECEQgAAIhQCABChEACACIUAAEQoBGaq\nv8OJXU4AZsWOJsAM9Xc4SexyAjAbRgoBABAKAQAQCgEAiFAIAECEQgAAIhQCABChEACACIXAptNf\n0Npi1gDTYPFqYJPpL2htMWuAaTBSCACAUAgAwIRCYVUdXeXz2Ii6F1TVnVX1zar6TlXdU1WXrdJu\nVdV1VXV/VR2qqger6oaqOnOV+mtuGwBgkU1yTuE9Sf6wV/bE8A9VdX6STyf5bpJ3JnksydVJ/qKq\nLm+t3dU7/6Ykb0lyR5IbkuxK8tYkFyd5zSm2DQCwsKq1dvJa62206miS/9Ja+/mT1Ls9yc8keXFr\nbf+g7KwkX0pyqLW2a6juhUn2J7mjtfb6ofJrk9yc5MrW2q0baXtEv1prrdb51161rWMnzSdJ5eRl\n46rjvPGetxn7NO/nVcb1/0eAeTSu3DLROYVVdfogiI06dmaS1ya5eyW0JUlr7fEk70tyQVVdMnTK\nlYPvm3pNvTfJwSRXnULbAAALbZKh8HXpwtq3q+qRqrq5qp45dPxFSZaS3Dvi3HvTDRe8ZKjskiRH\nk9w3XLG1diTJF3p119s2AMBCm9Scws8kuT3JV5M8M8kVSa5N8oqqenlr7WCScwd1Hxpx/krZzqGy\nc5M82lp7YpX6l1bVttbakxtoGwBgoU0kFLbWLu0V3VJV+5P8VpJfTPLbSVbeGD4yoonDg+/ht4rP\nXKVuv/5jG2gb2LSWBnNzh21/pLVDz5lNfwDm0zR3NPndJNcn+al0ofDgoHxpRN3tg++DQ2UHkzx7\nlbb79dfb9nGqau/Qj/taa/tOVB+YlP4OJ4ldToBFVlW7k+wed7tTC4WttSer6uEk5wyKHh58j3qM\nu1I2/Pj34SS7qur0EY+Qd6Z7tPzkBtse1d+9JzoOADALg4GqfSs/V9X142h3ajuaVNVSkucmeWRQ\ntD/dEED/UXMGZS3JZ4fK7kvX35eOaPfiHPsCynrbBgBYaGMPhVX1A6sc+s0kz0jykeR7y8N8NMnu\nqrpo6Pyzk7wpyZdba8NB77bB99t67e5JspzkAysFG2gbAGChjX3x6qp6V5KXJbk7yYNJzk739vFl\n6XYYedVgGZlU1fPTvan8ZJIb070ksifJC5Nc0Vr7eK/tm5Nck+TOJB9LcmG6HU4+2Vp7da/uutru\nnWvxaudtoT7N+3mj61jQGqAzrtwyiVD400l+IcmPJ/nBJE8l+Uq6kb4bW2vf7dV/Qbpt6F6Z5Iwk\nn0uyt7V294i2K91I4Z4k5yV5NMmtSa4fLHPTr7/mtnvnCYXO20J9mvfzhEKAE9m0oXAeCIXO21p9\nmvfzRtXZnuNXnLJMDbCYxpVbprkkDcCYWKYGYNym9vYxAACbl1AIAIBQCACAUAgAQIRCAAAiFAJz\nYylV1Z7+LB+YdY8AthJL0gBzor9MjSVqANbDSCEAAEIhAABCIQAAEQoBAIhQCABAhEIAACIUAgAQ\noRCYW/3FrC1oDXAiFq8G5lR/MevEgtYAqzNSCACAUAgAgFAIAECEQgAAIhQCABChEACACIXAQrF2\nIcBqrFMILBBrFwKsxkghAABCIbDo+o+UPU4GFpPHx8CC6z9S9jgZWExGCgEAEAoBABAKAQCIUAgA\nQIRCAAAiFAIAEKEQAIAIhQA99kcGFpPFqwGOYX9kYDEZKRyzquUDwyMMs+4PAMBaGCkcu8M7eltm\nzawnAABrZaQQAAChEAAAoRBgDbyRDMw/cwoBTsobycD8M1IIAIBQCACAUAgAQIRCAAAiFAIAEKEQ\nYIP6y9RYogbY2ixJA7Ah/WVqLFEDbG1GCgEAEAoBABAKAQCIUAgAQIRCAAAiFAKMSX+JGsvUAFuL\nJWkAxqK/RE1imRpgKzFSCACAUAgAgFAIAECEQoAJ8vIJsHV40QRgYrx8AmwdRgoBABAKAQAQCgEA\niFAIAECEQoAp67+R7G1kYHPw9jHAVPXfSPY2MrA5GCkEAEAoBABAKAQAIEIhwIzZCg/YHLxoAjBT\ntsIDNgcjhQAACIUAAAiFAJuQeYbA9JlTCLDpmGcITJ+RQgAAhEIAAIRCgC2iP8/QHENgvMwpBNgS\n+vMMzTEExstIIQAAQiEAAEIhwBZlLUNgvMwpBNiSrGUIjJeRQgAAhEIAAITCU1K1fKA/p2fWfQIW\nmXmGwMaZU3hKDu8YMadnJj0BMM8QOBVGCgEAEAoB5pvt8YC18fgYYK7ZHg9YGyOFAAvFyyjAaEYK\nARaKl1GA0YwUAgAgFALgZRTA42MAvIwCxEghAMfxMgosorkOhdW5rqrur6pDVfVgVd1QVWfOum8A\nm9fKyOExnx2CIsy3uQ6FSW5K8ntJ/ibJtUluT/LWJB+ZZacAtp5RQfGwx8wwR+Z2TmFVXZguCH6o\ntfb6ofIHktxcVW9ord06q/4BbH3dY+anf97+SGuHnjO7/gCnYp5HCq8cfN/UK39vkoNJrppudzix\nfbPuwALaN+sOLKB9s+7AmB03erjpHjFX1e5Z/vMXkWu+dc1zKLwkydEk9w0XttaOJPlCkpfMolOs\nZt+sO7CA9s26Awto36w7MGGbci7i7in+s+jsnnUH2Jh5DoXnJnm0tfbEiGMPJTmnqtb8+Lxq+UD/\nF9vYegowt9YSFJef2mwjjLCI5nZOYZIz0/02GuXwUJ3HRlUYHfqO2xpqg10DWGTHrYt42vG/X7fv\nOP738PajyeHTVv95dFnV8r8x1xFOrlqbzwGvqvpikme31n5oxLHbkrwuyVJr7ckRx+fzogAAc6m1\ndsojVfM8Uvhwkl1VdfqIR8g70z1aPi4QJuO5sAAAW8k8zym8L93f76XDhVW1lOTi9F5AAQBYZPMc\nCm8bfL+tV74nyXKSD0y3OwAAm9fczilMkqq6Ock1Se5M8rEkFyZ5S5JPttZePcu+AQBsJvMeCivd\nSOGeJOcleTTJrUmub60dnGHXAAA2lXl+fJzWubG1tqu1ttxae15r7d/1A2F1rquq+6vqUFU9WFU3\nVNWZs+r7vKuqo6t8Ri4RxNpV1dur6vaq+urgmn7tJPUvqKo7q+qbVfWdqrqnqi6bVn/nwXqueVVd\nv8q9/1RV/dI0+72VVdWPVtWvV9Wnq+rvq+qxqvqrqvqVUb+73eenbj3X3H0+HoP79paq+tuq+oeq\nenyQVX6vqo5bZulU7/N5fvt4PW5K91j5jiQ3JNmV5K3pXkh5zQz7Ne/uSfKHvbJRi42zPr+V5BtJ\nPp/kWSeqWFXnJ/l0ku8meWe6dTuvTvIXVXV5a+2uCfd1Xqz5mg+0dE8xvtEr/9yY+zXPfj7Jm5N8\nJMkt6X53XJbkN5P8i6p62WAHK/f5+Kz5mg+4z0/dc5M8J8mHk/y/JE8muSjdE9CfraqLW2uPJmO6\nz1trC/1JN8/wqSS398qvTbdN3htm3cd5/Ayu7R/Puh/z+Ely3tCf9yf52gnq3p7uF/tFQ2VnJXkg\nyf2z/rtslc86r/n1g985Pzzrfm/lT5IXJ/m+EeW/Mbi+bx4qc59P/5q7zyf7v8XrBv8e/bdDZad8\nn8/14+M1unLwfVOv/L1JDia5arrdWSxVdXpVnTXrfsyT1toDa6k3eNzz2iR3t9b2D53/eJL3Jbmg\nqi6ZSCfnzFqveU9V1fdV1TPG3Z9F0Fr7fGvt2yMO3ZZuu6kfT9zn47TWa97jPp+MBwff/yQZ330u\nFCaXpEvbx6xb2Loh8C8kecksOrUgXpcueH+7qh6pqpur6pmz7tQCeVGSpST3jjh2b7pf8u7/yagk\nX0zyj0kOV9WnquryGfdpXjxv8L2yd7L7fPJWrvkjvXL3+ZhU1VJV/WBV7ayqf57kPekez39sUGUs\n97k5hcm56XY3GTWX7aEkl1bVtrbK7ids2GfSDXV/Nckzk1yR7pH9K6rq5c3b4dNw7uD7oRHHVsp2\nTqkvi+QfkvxBkr9M8q0kL0g37+rPqupft9b+6yw7t5VV1WlJfi3dI7QPDord5xPUu+b/feiQ+3y8\n3pTkPw79/HdJrmqtfWrw81juc6EwOTPd7uyjHB6q463YMWqtXdoruqWq9qebsP+LSX57+r1aOCtv\nC466/w/36jAmrbV394r+tKr+OMmXktxYVR/yH0Ub9u4kP5nk7a21rwzK3OeTNeqau8/H738kuT/J\n2Un+aZKfTnLO0PGx3OceH3ePL5dWObZ9qA6T97vp3pr6qVl3ZEGs3Nej7n/3/hS11r6V7nHQs5K8\nfMbd2ZKq6jfSbVbwB6213xk65D6fkBNc85Hc5xvXWnu4tXZXa+0jrbX/kORfJfndqvrlQZWx3OdC\nYfJwknOq6vQRx3ame7Ts0fEUDK7zwzn2v36YnIcH36MeKayUjXoUwWQ8MPh2/69TVe1N8qtJ/qi1\n9ubeYff5BJzkmp/IA4Nv9/kpGLxM8lfplghKxnSfC4XdCyanJXnpcGFVLaVbp/C+UScxfoNr/twc\nP1mZydif7lFD/1F+BmUtyWen2qPFdsHg2/2/DoNw8o4k72+tXT2iivt8zNZwzU/EfT4+y0l+YPDn\nsdznQmH3Kn3STYAdtifdBf/AdLsz/6rqB1Y59JtJnpFuYVQmbLBUwUeT7K6qi1bKq+rsdJOav9xa\n8x9FY1RVzxj1hn1VPS/JL6TbivMvp96xLaqq3pEunPxJa+2No+q4z8drLdfcfT4+VbVjlfLL0i0B\n9OlkfPe4dT1YAAABjElEQVT5XO99vFZVdXO6eRF3pnu9+8J0O5x8srX26ln2bR5V1buSvCzJ3enW\nWjo73dvHl6W7wV/Vjl0Vn3WoqquS/Ei6JQiuTXJ6kncNDn+9tXbLUN3np3sT/MkkN6Z7oWpPkhcm\nuaK19vEpdn3LWus1r6rvT/fW4J3pJo1/K8mPJXljukVm39Ba+/B0e781VdU16d7G/Hq6kHK0V+WR\nlfvXfT4ea73m7vPxqaoPJ/mhJHelu+7bk/xEkjck+U6Sy1prXxzUPfX7fNarcm+GT7pf5Nelu3kP\nJfm/6V56OHPWfZvHT7q3pv7X4DofTPLtdNuD/XKSM2bdv63+SRe2n1rlc9eI+i9I92bbNwe/ZD4x\n+EUz87/LVvms9ZonOSPd1o5/nW7rryPp5vncluQnZv332EqfJO8/wTU/7l53n0/vmrvPx3rNX5fu\n6dnXB/++fDzJ36bbcOO5I+qf0n1upBAAAHMKAQAQCgEAiFAIAECEQgAAIhQCABChEACACIUAAEQo\nBAAgQiEAAEn+P/9bFieovXriAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "num_data, num_data_bins, num_data_patches=plt.hist(E_Doke,bins=np.arange(0.05, 25 + binwidth, binwidth));" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "num_sim, num_sim_bins, num_sim_patches= plt.hist(E_com_Tsim_NEST_MAX, bins=np.arange(0.05, 25 + binwidth, binwidth),normed=1);" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "SimToData_scale_factor=sum(num_data[bin_center_data>3])/sum(num_sim[bin_center_NEST_MAX>3])\n", + "frac_res=(num_data-num_sim*SimToData_scale_factor)/sqrt(num_data)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nnXPOOedcy/4/r2XV45vwAVIAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from matplotlib import gridspec\n", + "\n", + "fig = plt.Figure(figsize=(8,6))\n", + "gs = gridspec.GridSpec(2, 1, height_ratios=[10,5])\n", + "ax1 = plt.subplot(gs[0])\n", + "ax2 = plt.subplot(gs[1])\n", + "\n", + "ax1.hist(E_Doke,bins=np.arange(0.05, 25 + binwidth, binwidth),facecolor='none',edgecolor='black',linewidth=2, histtype='step', alpha=0.9);\n", + "ax1.plot(bin_center_NEST_MAX,num_sim*SimToData_scale_factor,linewidth=2,color='blue')\n", + "ax1.set_xlim([0,22])\n", + "ax1.grid(True)\n", + "ax1.set_ylabel(r'Count',fontsize=20)\n", + "for tick in ax1.xaxis.get_major_ticks():\n", + " tick.label.set_fontsize(18) \n", + "for tick in ax1.yaxis.get_major_ticks():\n", + " tick.label.set_fontsize(18) \n", + "\n", + "\n", + "ax2.plot(bin_center_NEST_MAX,frac_res,'ko',linewidth=2)\n", + "ax2.plot([0,22],[0,0],'k')\n", + "ax2.grid(True)\n", + "ax2.set_xticks(np.arange(0,22,2))\n", + "ax2.set_xlim([0,22])\n", + "ax2.set_ylim([-4,4])\n", + "ax2.set_ylabel(r'Frac Res ($\\sigma$)',fontsize=20)\n", + "ax2.set_xlabel('Combined Energy (keV)',fontsize=20)\n", + "for tick in ax2.xaxis.get_major_ticks():\n", + " tick.label.set_fontsize(18) \n", + "for tick in ax2.yaxis.get_major_ticks():\n", + " tick.label.set_fontsize(18) " + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "thresh=num_data/(num_sim*SimToData_scale_factor)\n", + "thresh_err=sqrt( (sqrt(num_data)/(num_sim*SimToData_scale_factor))**2 + (num_data/(num_sim*(SimToData_scale_factor**2)))**2)\n", + "no_nan_cut=np.logical_not(numpy.isnan(thresh))*np.logical_not(numpy.isinf(thresh))\n", + "thresh_nonan=thresh[no_nan_cut]\n", + "xbin_nonan=bin_center_NEST_MAX[no_nan_cut]" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import scipy\n", + "from scipy import optimize\n", + "\n", + "def func(x,mu,sig):\n", + " return (1/2)*scipy.special.erf((x-mu)/(sqrt(2)*sig))+(1/2)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 1.29117609, 0.370948 ])" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "popt, pcov = scipy.optimize.curve_fit(func,xbin_nonan,thresh_nonan)\n", + "thresh_yval=(1/2)*scipy.special.erf((bin_center_NEST_MAX-popt[0])/(sqrt(2)*popt[1]))+(1/2)\n", + "\n", + "popt" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 0.20191194, 0.28554841])" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "popt_err=np.sqrt(np.diag(pcov))\n", + "popt_err" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "//anaconda/lib/python2.7/site-packages/matplotlib/axes/_axes.py:2790: MatplotlibDeprecationWarning: Use of None object as fmt keyword argument to suppress plotting of data values is deprecated since 1.4; use the string \"none\" instead.\n", + " warnings.warn(msg, mplDeprecation, stacklevel=1)\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "thresh=num_data/(num_sim*SimToData_scale_factor)\n", + "thresh_err=sqrt( (sqrt(num_data)/(num_sim*SimToData_scale_factor))**2 + (num_data/(num_sim*(SimToData_scale_factor**2)))**2)\n", + "plt.errorbar(bin_center_NEST_MAX,thresh,yerr=thresh_err,xerr=None,ecolor='black',elinewidth=2,capsize=0,fmt=None)\n", + "plt.xlim([0,20])\n", + "plt.ylim([0,1.4])\n", + "plt.scatter(bin_center_NEST_MAX,thresh,c='black',marker='o')\n", + "plt.plot(bin_center_NEST_MAX,thresh_yval,linewidth=2)\n", + "plt.xticks(np.arange(0,22,2))\n", + "plt.yticks(np.arange(0,1.4,0.1))\n", + "plt.ylabel('Data/Theory',fontsize=22)\n", + "plt.xlabel('Combined Energy (keV)',fontsize=22)\n", + "plt.legend((r'Fit=$\\frac{erf}{2}(\\frac{(x-\\mu)}{\\sqrt{2}\\sigma}) + \\frac{1}{2}$','Data'),loc='lower right')\n", + "\n", + "\n", + "ax=plt.gca()\n", + "ax.grid(True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Calculate ER Band

" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "s2s1_sim=log10(S2c/S1c)\n", + "\n", + "S2S1_er_mean=[]\n", + "S2S1_er_sig=[]\n", + "\n", + "S1_er_cen=np.arange(1.5,80.5,1)\n", + "for s1_bins in S1_er_cen:\n", + " S2S1_er_mean.append(mean(s2s1_sim[(S1c>(s1_bins-0.5))&(S1c<(s1_bins+0.5))]))\n", + " S2S1_er_sig.append(std(s2s1_sim[(S1c>(s1_bins-0.5))&(S1c<(s1_bins+0.5))]))\n", + "S2S1_er_mean=np.array(S2S1_er_mean)\n", + "S2S1_er_sig=np.array(S2S1_er_sig)" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\nyIBpAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.scatter(S1c,s2s1_sim,alpha=0.1,color='c',s=1)\n", + "xlabel('S1c')\n", + "ylabel('log10(S2c/S1c)')\n", + "ylim([1,3.5])\n", + "xlim([0,50])\n", + "#plot SIM fit\n", + "ax2=plt.plot(S1_er_cen,S2S1_er_mean,'-r',linewidth=3)\n", + "\n", + "#plot bands\n", + "plt.plot(S1_er_cen,S2S1_er_mean-1.28*S2S1_er_sig,'--r',linewidth=2)\n", + "plt.plot(S1_er_cen,S2S1_er_mean+1.28*S2S1_er_sig,'--r',linewidth=2)\n", + "\n", + "plt.title('Sep 2015 CH3T SIM fastNEST')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Print out Data for Matlab ER Band

" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 8.36030049e-02, 9.15206842e-02, 9.54571426e-02,\n", + " 9.79822688e-02, 1.01049810e-01, 1.01118270e-01,\n", + " 1.03714490e-01, 1.04449120e-01, 1.03946201e-01,\n", + " 1.03459081e-01, 1.03561771e-01, 1.03087816e-01,\n", + " 1.03135211e-01, 1.02050381e-01, 1.00428403e-01,\n", + " 9.89064808e-02, 9.72265741e-02, 9.70527907e-02,\n", + " 9.43012194e-02, 9.25370541e-02, 9.08334496e-02,\n", + " 9.00435249e-02, 8.67363731e-02, 8.61333972e-02,\n", + " 8.30790214e-02, 8.09567569e-02, 7.95875539e-02,\n", + " 7.64989481e-02, 7.50191557e-02, 7.16435438e-02,\n", + " 6.99531048e-02, 6.77755455e-02, 6.52214554e-02,\n", + " 6.26357683e-02, 5.99868872e-02, 5.78040618e-02,\n", + " 5.55606754e-02, 5.31066425e-02, 5.07052712e-02,\n", + " 4.87515239e-02, 4.67135180e-02, 4.34511287e-02,\n", + " 4.17870205e-02, 3.86747169e-02, 3.74108372e-02,\n", + " 3.52253787e-02, 3.34506810e-02, 3.14969338e-02,\n", + " 2.86953339e-02, 2.70917866e-02, 2.57726123e-02,\n", + " 2.35134274e-02, 2.14122275e-02, 2.04695839e-02,\n", + " 1.84315780e-02, 1.70149796e-02, 1.51244263e-02,\n", + " 1.38737121e-02, 1.21964385e-02, 1.09694220e-02,\n", + " 9.68711080e-03, 8.81819355e-03, 7.72283120e-03,\n", + " 6.65643275e-03, 5.80858016e-03, 5.09501478e-03,\n", + " 4.26559377e-03, 3.57045997e-03, 2.94115324e-03,\n", + " 2.36977432e-03, 1.93004953e-03, 1.66147511e-03,\n", + " 1.41396534e-03, 1.10062852e-03, 8.29421011e-04,\n", + " 7.24097708e-04, 5.52947341e-04, 4.18660130e-04,\n", + " 3.23869157e-04, 2.02747358e-04, 1.39553377e-04,\n", + " 1.34287211e-04, 5.79278167e-05, 7.10932296e-05,\n", + " 3.42300735e-05, 2.36977432e-05, 1.84315780e-05,\n", + " 1.31654129e-05, 5.26616515e-06, 2.63308258e-06,\n", + " 7.89924773e-06, 2.63308258e-06, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,\n", + " 0.00000000e+00])" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "n_NEST_MAX" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 0.175, 0.425, 0.675, 0.925, 1.175, 1.425, 1.675,\n", + " 1.925, 2.175, 2.425, 2.675, 2.925, 3.175, 3.425,\n", + " 3.675, 3.925, 4.175, 4.425, 4.675, 4.925, 5.175,\n", + " 5.425, 5.675, 5.925, 6.175, 6.425, 6.675, 6.925,\n", + " 7.175, 7.425, 7.675, 7.925, 8.175, 8.425, 8.675,\n", + " 8.925, 9.175, 9.425, 9.675, 9.925, 10.175, 10.425,\n", + " 10.675, 10.925, 11.175, 11.425, 11.675, 11.925, 12.175,\n", + " 12.425, 12.675, 12.925, 13.175, 13.425, 13.675, 13.925,\n", + " 14.175, 14.425, 14.675, 14.925, 15.175, 15.425, 15.675,\n", + " 15.925, 16.175, 16.425, 16.675, 16.925, 17.175, 17.425,\n", + " 17.675, 17.925, 18.175, 18.425, 18.675, 18.925, 19.175,\n", + " 19.425, 19.675, 19.925, 20.175, 20.425, 20.675, 20.925,\n", + " 21.175, 21.425, 21.675, 21.925, 22.175, 22.425, 22.675,\n", + " 22.925, 23.175, 23.425, 23.675, 23.925, 24.175, 24.425,\n", + " 24.675, 24.925])" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bin_center_NEST_MAX" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "savetxt('/global/homes/r/rknoche/iPyNb/Analysis_Code/Run04_KrypCal2p22_NESTmodel/LibNEST_ERData_S1c.txt',S1c)" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "savetxt('/global/homes/r/rknoche/iPyNb/Analysis_Code/Run04_KrypCal2p22_NESTmodel/LibNEST_ERData_S2c.txt',S2c)" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "savetxt('/global/homes/r/rknoche/iPyNb/Analysis_Code/Run04_KrypCal2p22_NESTmodel/LibNEST_ERData_dT.txt',dTus)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "savetxt('/global/homes/r/rknoche/iPyNb/Analysis_Code/Run04_KrypCal2p22_NESTmodel/LibNEST_ERData_s2x_c.txt',S2x)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "savetxt('/global/homes/r/rknoche/iPyNb/Analysis_Code/Run04_KrypCal2p22_NESTmodel/LibNEST_ERData_s2y_c.txt',S2y)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "rootnb", + "language": "python", + "name": "rootnb" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.11" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +}