From 228d1e648e05f4edc952dd0c55e96b5deffcc0dc Mon Sep 17 00:00:00 2001 From: clark2668 Date: Thu, 12 Dec 2019 11:32:51 -0500 Subject: [PATCH 01/53] fix all the tabbing issues in Settings class to prepare for adding new settings --- Settings.cc | 1129 +++++++++++++++++++++++++-------------------------- Settings.h | 256 ++++++------ 2 files changed, 684 insertions(+), 701 deletions(-) diff --git a/Settings.cc b/Settings.cc index d65d4494..8a1f91d4 100644 --- a/Settings.cc +++ b/Settings.cc @@ -18,149 +18,146 @@ using namespace std; Settings::Settings() { Initialize(); -// ReadFile(); - + // ReadFile(); } Settings::~Settings() { - //default destructor + //default destructor } void Settings::Initialize() { + // below : values from icemc Settings class + NDISCONES_PASS=3; -// below : values from icemc Settings class - NDISCONES_PASS=3; - - DEBUG=false; // debugging option -outputdir="outputs"; // directory where outputs go - FREQ_LOW_SEAVEYS=200.E6; - FREQ_HIGH_SEAVEYS=1200.E6; - BW_SEAVEYS=FREQ_HIGH_SEAVEYS-FREQ_LOW_SEAVEYS; - SIGMAPARAM=1; // Connolly et al. 2011 default cross section parametrization - SIGMA_FACTOR=1.; // default sigma factor : 1 - YPARAM=1; // 1: Connolly et al. 2011 default y parametrization, 2: Set ELAST_Y yourself - ELAST_Y = 0.0; - UNBIASED_SELECTION=1.; // (0) pick neutrino interaction in the ice and neutrino from any direction or (1) choose neutrino interaction point in the horizon on the balloon in the ice and neutrino direction on the cerenkov cone + DEBUG=false; // debugging option + outputdir="outputs"; // directory where outputs go + FREQ_LOW_SEAVEYS=200.E6; + FREQ_HIGH_SEAVEYS=1200.E6; + BW_SEAVEYS=FREQ_HIGH_SEAVEYS-FREQ_LOW_SEAVEYS; + SIGMAPARAM=1; // Connolly et al. 2011 default cross section parametrization + SIGMA_FACTOR=1.; // default sigma factor : 1 + YPARAM=1; // 1: Connolly et al. 2011 default y parametrization, 2: Set ELAST_Y yourself + ELAST_Y = 0.0; + UNBIASED_SELECTION=1.; // (0) pick neutrino interaction in the ice and neutrino from any direction or (1) choose neutrino interaction point in the horizon on the balloon in the ice and neutrino direction on the cerenkov cone - SIGMA_SELECT=0; // when in SIGMAPARAM=1 case, 0 : (default) use mean value, 1 : use upper bound, 2 : use lower bound + SIGMA_SELECT=0; // when in SIGMAPARAM=1 case, 0 : (default) use mean value, 1 : use upper bound, 2 : use lower bound -// end of values from icemc + // end of values from icemc - ARASIM_VERSION_MAJOR = ARASIM_MAJOR; - ARASIM_VERSION_MINOR = ARASIM_MINOR; - ARASIM_VERSION_SUBMINOR = ARASIM_SUBMINOR; - ARASIM_VERSION = (double)ARASIM_VERSION_MAJOR + (double)ARASIM_VERSION_MINOR * 0.001 + (double)ARASIM_VERSION_SUBMINOR * 0.000001; + ARASIM_VERSION_MAJOR = ARASIM_MAJOR; + ARASIM_VERSION_MINOR = ARASIM_MINOR; + ARASIM_VERSION_SUBMINOR = ARASIM_SUBMINOR; + ARASIM_VERSION = (double)ARASIM_VERSION_MAJOR + (double)ARASIM_VERSION_MINOR * 0.001 + (double)ARASIM_VERSION_SUBMINOR * 0.000001; - ARAROOT_VERSION = 0.; + ARAROOT_VERSION = 0.; - ARAUTIL_EXISTS = false; -#ifdef ARA_UTIL_EXISTS - ARAUTIL_EXISTS = true; - ARAROOT_VERSION = (double)ARA_ROOT_MAJOR + (double)ARA_ROOT_MINOR * 0.01; -#endif - + ARAUTIL_EXISTS = false; + #ifdef ARA_UTIL_EXISTS + ARAUTIL_EXISTS = true; + ARAROOT_VERSION = (double)ARA_ROOT_MAJOR + (double)ARA_ROOT_MINOR * 0.01; + #endif + + NNU=100; + + // NEED TO FIGURE OUT A GOOD WAY TO READ THIS IN AND STORE THEM. + // INPUT FILE AGAIN? SOMETHING ELSE? + //These were moved here from IceModel under the new compilation scheme + ICE_MODEL=0; //Select ice model to be used. 0 = Crust 2.0 , 1 = BEDMAP. + NOFZ=1; // 1=depth dependent index of refraction,0=off + CONSTANTCRUST=0; // set crust density and thickness to constant values. + CONSTANTICETHICKNESS=0; // set ice thickness to constant value + FIXEDELEVATION=0; // fix the elevation to the thickness of ice. + MOOREBAY=0; //1=use Moore's Bay measured ice field attenuation length for the west land, otherwise use South Pole data + USE_ARA_ICEATTENU=1; // use ARA measured ice attenuation value + + EXPONENT=19.; // 10^19 eV neutrinos only - NNU=100; + DETECTOR=1; //ARA layout with small number of stations - // NEED TO FIGURE OUT A GOOD WAY TO READ THIS IN AND STORE THEM. - // INPUT FILE AGAIN? SOMETHING ELSE? - //These were moved here from IceModel under the new compilation scheme - ICE_MODEL=0; //Select ice model to be used. 0 = Crust 2.0 , 1 = BEDMAP. - NOFZ=1; // 1=depth dependent index of refraction,0=off - CONSTANTCRUST=0; // set crust density and thickness to constant values. - CONSTANTICETHICKNESS=0; // set ice thickness to constant value - FIXEDELEVATION=0; // fix the elevation to the thickness of ice. - MOOREBAY=0; //1=use Moore's Bay measured ice field attenuation length for the west land, otherwise use South Pole data - USE_ARA_ICEATTENU=1; // use ARA measured ice attenuation value - - EXPONENT=19.; // 10^19 eV neutrinos only + INTERACTION_MODE=1; //PickNear mode (0: Aeff mode using sphere surface around station, 1: Veff mode using cylinder volume around station) - DETECTOR=1; //ARA layout with small number of stations + POSNU_RADIUS=3000; //radius for PickNear method - INTERACTION_MODE=1; //PickNear mode (0: Aeff mode using sphere surface around station, 1: Veff mode using cylinder volume around station) + WHICHPARAMETERIZATION=0; // - POSNU_RADIUS=3000; //radius for PickNear method + SIMULATION_MODE=1; // default freq domain simulation - WHICHPARAMETERIZATION=0; // + EVENT_TYPE=0; // default neutrino only events - SIMULATION_MODE=1; // default freq domain simulation + WAVE_TYPE=0; // default wave type : plane wave (inside the ice) - EVENT_TYPE=0; // default neutrino only events + LPM=1; //default : enable LPM effect - WAVE_TYPE=0; // default wave type : plane wave (inside the ice) + SECONDARIES=1; //default : enable secondary interactions - LPM=1; //default : enable LPM effect + TAUDECAY=1; //default : let taudecay as secondary interactions - SECONDARIES=1; //default : enable secondary interactions + TIMESTEP=(0.625)*1.E-9; // default, in sec (old default: 0.5E-9, new default 0.625E-9 - TAUDECAY=1; //default : let taudecay as secondary interactions + PHASE=90.; // default : 90 deg phase (it means all imaginary values) - TIMESTEP=(0.625)*1.E-9; // default, in sec (old default: 0.5E-9, new default 0.625E-9 + NFOUR=1024; // default : 1024, same as in icemc + + NOISE=0; // degault : 0, flat thermal noise, 1 : for TestBed (DETECTOR=3), use Rayleigh distribution fitted for borehole channels - PHASE=90.; // default : 90 deg phase (it means all imaginary values) + ATMOSPHERE=1; // default : 1, include atmosphere - NFOUR=1024; // default : 1024, same as in icemc + TRIG_SCAN_MODE=0; // default 0 (old mode) 1: new mode (faster) 2: scan all Pthresh values 3: scan also all N out of 8 - NOISE=0; // degault : 0, flat thermal noise, 1 : for TestBed (DETECTOR=3), use Rayleigh distribution fitted for borehole channels - - ATMOSPHERE=1; // default : 1, include atmosphere - - TRIG_SCAN_MODE=0; // default 0 (old mode) 1: new mode (faster) 2: scan all Pthresh values 3: scan also all N out of 8 - - POWERTHRESHOLD=-6.06; // old default : -6.15, new default: -6.06 + POWERTHRESHOLD=-6.06; // old default : -6.15, new default: -6.06 - MAXT_DIODE=70.E-9; // default : 70 ns + MAXT_DIODE=70.E-9; // default : 70 ns - IDELAYBEFOREPEAK_DIODE=(int)(13.E-9 / TIMESTEP); // default : 13.e-9/TIMESTEP = 33 + IDELAYBEFOREPEAK_DIODE=(int)(13.E-9 / TIMESTEP); // default : 13.e-9/TIMESTEP = 33 - IWINDOW_DIODE=(int)(4.E-9 / TIMESTEP); // default : 4.e-9 / TIMESTEP = 10 + IWINDOW_DIODE=(int)(4.E-9 / TIMESTEP); // default : 4.e-9 / TIMESTEP = 10 - DATA_BIN_SIZE=16384; // default : 16384 + DATA_BIN_SIZE=16384; // default : 16384 - NOISE_TEMP=325.; // default : 325 K + NOISE_TEMP=325.; // default : 325 K - TRIG_ANALYSIS_MODE=0; // default : 0, signal + noise + TRIG_ANALYSIS_MODE=0; // default : 0, signal + noise - TRIG_TIMEOUT=1.E-6; // default : 1us + TRIG_TIMEOUT=1.E-6; // default : 1us - TRIG_WINDOW=1.7E-7; // old default : 110 ns, new default: 170 ns + TRIG_WINDOW=1.7E-7; // old default : 110 ns, new default: 170 ns - NOISE_EVENTS=16; // default : 16 events + NOISE_EVENTS=16; // default : 16 events - DATA_SAVE_MODE=0; // default : 0 (full mode) + DATA_SAVE_MODE=0; // default : 0 (full mode) - N_TRIG=3; // default : 3 (3 out of all channels in a station) + N_TRIG=3; // default : 3 (3 out of all channels in a station) - RANDOM_MODE=1; // default : 1 (seed is unique in time/space) + RANDOM_MODE=1; // default : 1 (seed is unique in time/space) - SEED=1; // default: 1, only applies if RANDOM_MODE=0, provides base seed value and run number taken from arguments is added to this value in order to submit multiple repeatable runs instead of only one single long repeatable run - - BORE_HOLE_ANTENNA_LAYOUT=0; // default : 0 (VHVH) + SEED=1; // default: 1, only applies if RANDOM_MODE=0, provides base seed value and run number taken from arguments is added to this value in order to submit multiple repeatable runs instead of only one single long repeatable run + + BORE_HOLE_ANTENNA_LAYOUT=0; // default : 0 (VHVH) - DATA_LIKE_OUTPUT=1; //default : 0 (doesn't write out data-like events) - - RAYSOL_RANGE=5000; // default : 5000 m + DATA_LIKE_OUTPUT=1; //default : 0 (doesn't write out data-like events) + + RAYSOL_RANGE=5000; // default : 5000 m - PICK_POSNU_DEPTH=0; //default : 0 pick posnu depth from 0 to ice depth + PICK_POSNU_DEPTH=0; //default : 0 pick posnu depth from 0 to ice depth - MAX_POSNU_DEPTH=200.; // default : 200m depth max + MAX_POSNU_DEPTH=200.; // default : 200m depth max - NNU_THIS_THETA=0; // default 0: nnu angle pure random, 1: set a specific theta + NNU_THIS_THETA=0; // default 0: nnu angle pure random, 1: set a specific theta - NNU_THETA=0.785; // default : nnu theta : 45 deg + NNU_THETA=0.785; // default : nnu theta : 45 deg - NNU_D_THETA=0.0873; // default : nnu d_theta : 5 deg + NNU_D_THETA=0.0873; // default : nnu d_theta : 5 deg - NNU_THIS_PHI=0;//default 0: random phi, 1: a specific phi + NNU_THIS_PHI=0;//default 0: random phi, 1: a specific phi - NNU_PHI=0.785;// default : nnu phi : 45 deg + NNU_PHI=0.785;// default : nnu phi : 45 deg - NNU_D_PHI=0.0873;// default : nnu_d_phi : 5 deg + NNU_D_PHI=0.0873;// default : nnu_d_phi : 5 deg - + CALPULSER_ON=0; // default : calpulsers off TESTBED_ON=0; // default : 0 stations[0] is ARA1 not Testbed @@ -168,9 +165,9 @@ outputdir="outputs"; // directory where outputs go READGEOM=0; // default : 0 : use idealized geometry and do not read in from sqlite database V_MIMIC_MODE = 0; // default : 0 - write out all chs where global triggered bin is center of the window - // 1 - same as above 0 mode but apply TestBed ch delay - average BH ch delay - // 2 - same as above 0 mode but apply TestBed ch delay - average BH ch delay + additional delay to match with actual TestBed data waveforms - + // 1 - same as above 0 mode but apply TestBed ch delay - average BH ch delay + // 2 - same as above 0 mode but apply TestBed ch delay - average BH ch delay + additional delay to match with actual TestBed data waveforms + USE_INSTALLED_TRIGGER_SETTINGS = 0; // default : 0 - use idealized settings for the trigger NUM_INSTALLED_STATIONS = 4; @@ -194,7 +191,7 @@ outputdir="outputs"; // directory where outputs go CONST_RMSDIODE = 1.346e-13; // also from one run USE_MANUAL_GAINOFFSET = 0; //if use gain offset file to read values or just use constant gain offset from setup file (default 0 : use file) - + MANUAL_GAINOFFSET_VALUE = 1.; // gain offset value NOISE_WAVEFORM_GENERATE_MODE = 0; // mode 0 (default) will generate noise waveforms newly for each events. other values will use first generated noise waveforms for later events (huge mem usage) @@ -286,9 +283,8 @@ outputdir="outputs"; // directory where outputs go CUSTOM_ELECTRONICS=0; //default: 0 -- don't use custom electronics, load regular "ARA_Electronics_TotalGain_TwoFilter.tst" - /* -//arrays for saving read in event features in EVENT_GENERATION_MODE=1 + //arrays for saving read in event features in EVENT_GENERATION_MODE=1 EVID[100] = {0}; NUFLAVORINT[100] = {0}; NUBAR[100] = {0}; @@ -304,368 +300,363 @@ outputdir="outputs"; // directory where outputs go void Settings::ReadFile(string setupfile) { - ifstream setFile (setupfile.c_str()); - - string line, label; - - if ( setFile.is_open() ) { - while (setFile.good() ) { - getline (setFile,line); - - if (line[0] != "/"[0]) { - label = line.substr(0, line.find_first_of("=")); - - if (label == "NNU") { - NNU = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "ICE_MODEL") { - ICE_MODEL = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "NOFZ") { - NOFZ = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "CONSTANTCRUST") { - CONSTANTCRUST = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "CONSTANTICETHICKNESS") { - CONSTANTICETHICKNESS = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "FIXEDELEVATION") { - FIXEDELEVATION = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "MOOREBAY") { - MOOREBAY = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "EXPONENT") { - EXPONENT = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "DETECTOR") { - DETECTOR = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "DETECTOR_STATION") { - DETECTOR_STATION = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "INTERACTION_MODE") { - INTERACTION_MODE = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "POSNU_RADIUS") { - POSNU_RADIUS = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "WHICHPARAMETERIZATION") { - WHICHPARAMETERIZATION = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "SIMULATION_MODE") { - SIMULATION_MODE = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "EVENT_TYPE") { - EVENT_TYPE = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "WAVE_TYPE") { - WAVE_TYPE = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "LPM") { - LPM = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "SECONDARIES") { - SECONDARIES = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "TAUDECAY") { - TAUDECAY = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "TIMESTEP") { - TIMESTEP = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "PHASE") { - PHASE = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "NFOUR") { - NFOUR = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "NOISE") { - NOISE = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "ATMOSPHERE") { - ATMOSPHERE = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if(label == "TRIG_SCAN_MODE"){ - TRIG_SCAN_MODE = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "POWERTHRESHOLD") { - POWERTHRESHOLD = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "DATA_BIN_SIZE") { - DATA_BIN_SIZE = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "NOISE_TEMP") { - NOISE_TEMP = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "TRIG_ANALYSIS_MODE") { - TRIG_ANALYSIS_MODE = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "TRIG_TIMEOUT") { - TRIG_TIMEOUT = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "TRIG_WINDOW") { - TRIG_WINDOW = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "NOISE_EVENTS") { - NOISE_EVENTS = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "DATA_SAVE_MODE") { - DATA_SAVE_MODE = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "N_TRIG") { - N_TRIG = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "RANDOM_MODE") { - RANDOM_MODE = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "SEED") { - SEED = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "BORE_HOLE_ANTENNA_LAYOUT") { - BORE_HOLE_ANTENNA_LAYOUT = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "RAYSOL_RANGE") { - RAYSOL_RANGE = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "CALPULSER_ON") { - CALPULSER_ON = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "TESTBED_ON") { - TESTBED_ON = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "READGEOM") { - cout << "Read in READGEOM" << endl; - READGEOM = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "PICK_POSNU_DEPTH") { - PICK_POSNU_DEPTH = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "MAX_POSNU_DEPTH") { - MAX_POSNU_DEPTH = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "NNU_THIS_THETA") { - NNU_THIS_THETA = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "NNU_THETA") { - NNU_THETA = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "NNU_D_THETA") { - NNU_D_THETA = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "NNU_THIS_PHI") { - NNU_THIS_PHI = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "NNU_PHI") { - NNU_PHI = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "NNU_D_PHI") { - NNU_D_PHI = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - - else if (label == "DATA_LIKE_OUTPUT") { - DATA_LIKE_OUTPUT = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "V_MIMIC_MODE") { - V_MIMIC_MODE = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "USE_INSTALLED_TRIGGER_SETTINGS") { - USE_INSTALLED_TRIGGER_SETTINGS = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "NUM_INSTALLED_STATIONS") { - NUM_INSTALLED_STATIONS = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "CALPUL_OFFCONE_ANGLE") { - CALPUL_OFFCONE_ANGLE = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "CALPUL_AMP") { - CALPUL_AMP = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "TRIG_ONLY_BH_ON") { - TRIG_ONLY_BH_ON = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "TRIG_THRES_MODE") { - TRIG_THRES_MODE = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "NOISE_CHANNEL_MODE") { - NOISE_CHANNEL_MODE = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "CONST_MEANDIODE") { - CONST_MEANDIODE = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "CONST_RMSDIODE") { - CONST_RMSDIODE = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "USE_TESTBED_RFCM_ON") { - USE_TESTBED_RFCM_ON = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "RFCM_OFFSET") { - RFCM_OFFSET = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "USE_MANUAL_GAINOFFSET") { - USE_MANUAL_GAINOFFSET = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "MANUAL_GAINOFFSET_VALUE") { - MANUAL_GAINOFFSET_VALUE = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "NOISE_WAVEFORM_GENERATE_MODE") { - NOISE_WAVEFORM_GENERATE_MODE = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "USE_CH_GAINOFFSET") { - USE_CH_GAINOFFSET = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - //else if (label == "GETCHORD_MODE") { - //GETCHORD_MODE = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - //} - else if (label == "taumodes") { - taumodes = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "BH_ANT_SEP_DIST_ON") { - BH_ANT_SEP_DIST_ON = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "TRIG_MODE") { - TRIG_MODE = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "N_TRIG_V") { - N_TRIG_V = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "N_TRIG_H") { - N_TRIG_H = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "FILL_TREE_MODE") { - FILL_TREE_MODE = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "ONLY_PASSED_EVENTS") { - ONLY_PASSED_EVENTS = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "NNU_PASSED") { - NNU_PASSED = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "PICKNEARUNBIASED_R") { - PICKNEARUNBIASED_R = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "SHOWER_MODE") { - SHOWER_MODE = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "SHOWER_STEP") { - SHOWER_STEP = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "SHOWER_PARAM_MODEL") { - SHOWER_PARAM_MODEL = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "ALL_ANT_V_ON") { - ALL_ANT_V_ON = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "PHASE_SKIP_MODE") { - PHASE_SKIP_MODE = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "DEBUG_MODE_ON") { - DEBUG_MODE_ON = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "DEBUG_SKIP_EVT") { - DEBUG_SKIP_EVT = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "V_SATURATION") { - V_SATURATION = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "OFFCONE_LIMIT") { - OFFCONE_LIMIT = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "ADDITIONAL_DEPTH_ON") { - ADDITIONAL_DEPTH_ON = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "ADDITIONAL_DEPTH") { - ADDITIONAL_DEPTH = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "TRIG_ONLY_LOW_CH_ON") { - TRIG_ONLY_LOW_CH_ON = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "USE_ARA_ICEATTENU") { - USE_ARA_ICEATTENU = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "SIGMA_SELECT") { - SIGMA_SELECT = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "SIGMAPARAM") { - SIGMAPARAM = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "SIGMA_FACTOR") { - SIGMA_FACTOR = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "YPARAM") { - YPARAM = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "ELAST_Y") { - ELAST_Y = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "NU_NUBAR_SELECT_MODE") { - NU_NUBAR_SELECT_MODE = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "SELECT_FLAVOR") { - SELECT_FLAVOR = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "SELECT_CURRENT") { - SELECT_CURRENT = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "OUTPUT_TDR_GRAPH") { - OUTPUT_TDR_GRAPH = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "AVZ_NORM_FACTOR_MODE") { - AVZ_NORM_FACTOR_MODE = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "number_of_stations") { - number_of_stations = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "RAY_TRACE_ICE_MODEL_PARAMS") { - RAY_TRACE_ICE_MODEL_PARAMS = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "WAVEFORM_LENGTH") { - WAVEFORM_LENGTH = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "WAVEFORM_CENTER") { - WAVEFORM_CENTER = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "POSNU_R") { - POSNU_R = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "POSNU_THETA") { - POSNU_THETA = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "POSNU_PHI") { - POSNU_PHI = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "ARBITRARY_EVENT_ATTENUATION") { - ARBITRARY_EVENT_ATTENUATION = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "PICK_ABOVE_HEIGHT") { - PICK_ABOVE_HEIGHT = atof( line.substr(line.find_first_of("=") + 1).c_str() ); - } - else if (label == "EVENT_GENERATION_MODE"){ - EVENT_GENERATION_MODE = atoi(line.substr(line.find_first_of("=") + 1).c_str()); - } - // else if (label == "EVENT_NUM"){ - // EVENT_NUM = atoi(line.substr(line.find_first_of("=") + 1).c_str()); - // } - else if (label == "ANTENNA_MODE"){ - ANTENNA_MODE = atoi(line.substr(line.find_first_of("=") + 1).c_str()); - } - else if (label == "APPLY_NOISE_FIGURE"){ - APPLY_NOISE_FIGURE = atoi(line.substr(line.find_first_of("=") + 1).c_str()); - } - else if (label == "CUSTOM_ELECTRONICS"){ - CUSTOM_ELECTRONICS = atoi(line.substr(line.find_first_of("=") + 1).c_str()); - } - - - - - } - } - setFile.close(); - } - else cout<<"Unable to open "<> a >> b >> c >> d >> e >> f >> g >> h >> i >> j >> k)) break; -/* EVID[i] = atoi(a.c_str()); + + /* + EVID[i] = atoi(a.c_str()); NUFLAVORINT[i] = atoi(b.c_str()); NUBAR[i] = atoi(c.c_str()); PNU[i] = atof(d.c_str()); @@ -693,8 +686,8 @@ void Settings::ReadEvtFile(string evtfile){ Z[i] = atof(h.c_str()); THETA[i] = atof(i.c_str()); PHI[i] = atof(j.c_str()); -*/ -/* + */ + /* EVID[l] = a; NUFLAVORINT[l] = b; NUBAR[l] = c; @@ -705,7 +698,7 @@ void Settings::ReadEvtFile(string evtfile){ IND_POSNU_PHI[l] = h; IND_NNU_THETA[l] = i; IND_NNU_PHI[l] = j; -*/ + */ EVID.push_back(a); NUFLAVORINT.push_back(b); NUBAR.push_back(c); @@ -723,11 +716,10 @@ void Settings::ReadEvtFile(string evtfile){ } } evtFile.close(); - if (NNU == 0 || NNU > EVID.size()){ - // EVENT_NUM = EVID.size(); - NNU = EVID.size(); - } - + if (NNU == 0 || NNU > EVID.size()){ + // EVENT_NUM = EVID.size(); + NNU = EVID.size(); + } } else cout << "Unable to open " << evtfile << " file!" << endl; @@ -741,215 +733,210 @@ int Settings::CheckCompatibilities(Detector *detector) { // if there's something not going to work, count thoes settings if (DETECTOR==1 && READGEOM==1 && detector->params.number_of_stations>1) { // currently only ARA1a one station is possible - cerr<<"DETECTOR=1, READGEOM=1 is currently only availble with number_of_stations=1 in ARA_N_info.txt file!"<params.number_of_antennas) { // this is too low number of events! - if (NOISE_EVENTS < detector->max_number_of_antennas_station) { // this is too low number of events! - cerr<<"NOISE_EVENTS too less! At least use "<max_number_of_antennas_station<<"!"<params.number_of_antennas) { // this is too low number of events! + if (NOISE_EVENTS < detector->max_number_of_antennas_station) { // this is too low number of events! + cerr<<"NOISE_EVENTS too less! At least use "<max_number_of_antennas_station<<"!"< 1) { // this case 1 waveform is enough for each channels - cerr<<"NOISE_EVENTS too many! With NOISE_WAVEFORM_GENERATE_MODE==0 and NOISE_CHANNEL_MODE==1, just use NOISE_EVENTS=1"< 1) { // this case 1 waveform is enough for each channels + cerr<<"NOISE_EVENTS too many! With NOISE_WAVEFORM_GENERATE_MODE==0 and NOISE_CHANNEL_MODE==1, just use NOISE_EVENTS=1"<params.number_of_antennas) { // this is too low number of events! - if (NOISE_EVENTS < detector->max_number_of_antennas_station) { // this is too low number of events! - cerr<<"NOISE_EVENTS too less! At least use "<max_number_of_antennas_station<<"!"<params.number_of_antennas) { // this is too low number of events! + if (NOISE_EVENTS < detector->max_number_of_antennas_station) { // this is too low number of events! + cerr<<"NOISE_EVENTS too less! At least use "<max_number_of_antennas_station<<"!"<params.number_of_antennas > (int)(detector->Temp_TB_ch.size())) ) { - cout << detector->params.number_of_antennas << " : " <<(int)(detector->Temp_TB_ch.size()) << endl; - cerr<<"System temperature values are not enough for all channels! Check number of channels you are using and numbers in data/system_temperature.csv"<params.number_of_antennas > (int)(detector->Temp_TB_ch.size())) ) { + cout << detector->params.number_of_antennas << " : " <<(int)(detector->Temp_TB_ch.size()) << endl; + cerr<<"System temperature values are not enough for all channels! Check number of channels you are using and numbers in data/system_temperature.csv"<3)) { - cerr<<"DATA_LIKE_OUTPUT=1,2 doesn't work with DETECTOR_STATION>3"<3"<= NUM_INSTALLED_STATIONS){ - cerr << "DETECTOR_STATION is not set to a valid station number" << endl; - num_err++; - } - - } - } + if (ARAUTIL_EXISTS == false){ + cerr << "DETECTOR=4 only works with an installation of AraRoot" << endl; + num_err++; + } else { + cerr << "DETECTOR is set to 4" << endl; + cerr << "Setting READGEOM to 1" << endl; + READGEOM=1; - return num_err; + cerr << "Setting number_of_stations to 1" << endl; + number_of_stations = 1; + if (DETECTOR_STATION <0 || DETECTOR_STATION >= NUM_INSTALLED_STATIONS){ + cerr << "DETECTOR_STATION is not set to a valid station number" << endl; + num_err++; + } + } + } + + return num_err; } diff --git a/Settings.h b/Settings.h index 9941c08f..eddf39a1 100644 --- a/Settings.h +++ b/Settings.h @@ -25,18 +25,18 @@ class Settings int CheckCompatibilities(Detector *detector);// check if settings are not compatible to each other - int ARASIM_VERSION_MAJOR; + int ARASIM_VERSION_MAJOR; int ARASIM_VERSION_MINOR; int ARASIM_VERSION_SUBMINOR; double ARASIM_VERSION; double ARAROOT_VERSION; - bool ARAUTIL_EXISTS; + bool ARAUTIL_EXISTS; int NNU; - // NEED TO FIGURE OUT A GOOD WAY TO READ THIS IN AND STORE THEM. - // INPUT FILE AGAIN? SOMETHING ELSE? - //These were moved here from IceModel under the new compilation scheme + // NEED TO FIGURE OUT A GOOD WAY TO READ THIS IN AND STORE THEM. + // INPUT FILE AGAIN? SOMETHING ELSE? + //These were moved here from IceModel under the new compilation scheme int ICE_MODEL; //Select ice model to be used. 0 = Crust 2.0 , 1 = BEDMAP. int NOFZ; // 1=depth dependent index of refraction,0=off int CONSTANTCRUST; // set crust density and thickness to constant values. @@ -49,10 +49,10 @@ class Settings int DETECTOR; // choose detector layout - int DETECTOR_STATION; // for DETECTOR=4, indicates the single station to be simulated - // 0 = testbed, 1 = A1, 2 = A2, 3 = A3 + int DETECTOR_STATION; // for DETECTOR=4, indicates the single station to be simulated + // 0 = testbed, 1 = A1, 2 = A2, 3 = A3 - int number_of_stations; // the number of stations to be used in the simulation + int number_of_stations; // the number of stations to be used in the simulation int INTERACTION_MODE; // method to choose interaction point posnu. 0 : PickUnbiased, 1 : PickNear, 2 : PickExact, 3 : PickAboveIce @@ -114,7 +114,7 @@ class Settings int BORE_HOLE_ANTENNA_LAYOUT; // 0 = (V-H-V-H), 1 = (V-H-V), 2 = (V-H-V-V), 3 = (V-H-H-H), 4 = (V-H-H) default : 0 int DATA_LIKE_OUTPUT; // Formerly WRITE_ALL_EVENTS, the mode numbering has changed as well - // 0 - don't write any information to the data-like output tree + // 0 - don't write any information to the data-like output tree // 1 - only write globally triggered events, // 2 - Write all event events including events that are not globally triggered // Note: NNU is the number of neutrinos that have been thrown in total, not just globally triggered events @@ -199,8 +199,8 @@ class Settings int FILL_TREE_MODE; // default 0 : fill tree for all events, 1 : fill tree only usable posnu events, 2 : fill tree only trigger passed events - int ONLY_PASSED_EVENTS; // 0: NNU represents the number of neutrinos total thrown in the simulation, 1: NNU represents the number of globally triggered neutrinos desired in the output file in the end - int NNU_PASSED; // Number of neutrinos allowed to pass the trigger - for ONLY_PASSE_EVENTS, loop until this is reached, otherwise just a storage value + int ONLY_PASSED_EVENTS; // 0: NNU represents the number of neutrinos total thrown in the simulation, 1: NNU represents the number of globally triggered neutrinos desired in the output file in the end + int NNU_PASSED; // Number of neutrinos allowed to pass the trigger - for ONLY_PASSE_EVENTS, loop until this is reached, otherwise just a storage value double PICKNEARUNBIASED_R; // radius of the sphere surrounding the detector for INTERACTION_MODE=3, current default value is 5000 m @@ -241,9 +241,9 @@ class Settings double ACCUM_TRIG_SEARCH_BINS_STATION0; // not actually setting value but gives us how much trigger searched bins there were in the run - int OUTPUT_TDR_GRAPH;// saves a few example graphs of the tunnel diode response for a triggered event - - + int OUTPUT_TDR_GRAPH;// saves a few example graphs of the tunnel diode response for a triggered event + + int NU_NUBAR_SELECT_MODE; // default : 3 = random nu_nubar based on arXiv:1108.3163, section 3, 0 = just nu, 1 = just nubar @@ -255,42 +255,42 @@ class Settings int AVZ_NORM_FACTOR_MODE; // default : 1 : don't apply sqrt(2) (actually applied but cancel that) as realft assume Hn as double-sided spectrum (invFFT normalization factor 2/N) and also remove dF binning factor in MakeArraysforFFT function, 0 : use normalization factors like in old version - int RAY_TRACE_ICE_MODEL_PARAMS; // which parameter set is used for the exponential ice model (defined in RayTrace_IceModel.cc) - //0 : default, South Pole model (fitted from RICE data - //1 : South Pole model fitted from RICE #2 - //2 : South Pole (Eisen (2003)) - //3 : South Pole (Gow) - //10 : Moore's Bay Model 1 - //11 : Moore's Bay Model 2 - //20 : Byrd (Ebimuna (1983)) - //30 : Mizuho (Ebimuna (1983)) + int RAY_TRACE_ICE_MODEL_PARAMS; // which parameter set is used for the exponential ice model (defined in RayTrace_IceModel.cc) + //0 : default, South Pole model (fitted from RICE data + //1 : South Pole model fitted from RICE #2 + //2 : South Pole (Eisen (2003)) + //3 : South Pole (Gow) + //10 : Moore's Bay Model 1 + //11 : Moore's Bay Model 2 + //20 : Byrd (Ebimuna (1983)) + //30 : Mizuho (Ebimuna (1983)) - int WAVEFORM_LENGTH; // the number of samples in the waveform length for V_mimic and UsefulAtriStationEvent, default: 64/2*20 = 640 + int WAVEFORM_LENGTH; // the number of samples in the waveform length for V_mimic and UsefulAtriStationEvent, default: 64/2*20 = 640 - int WAVEFORM_CENTER; // the relative location of the center of the write-out window with respect to the last triggered bin (which is laced at the center of the window by default), this effectively provides a global delay in the write-out window across all channels: positive values shift the write-out window to later times in the waveform, negative values shift the window to earlier times, default: 0 + int WAVEFORM_CENTER; // the relative location of the center of the write-out window with respect to the last triggered bin (which is laced at the center of the window by default), this effectively provides a global delay in the write-out window across all channels: positive values shift the write-out window to later times in the waveform, negative values shift the window to earlier times, default: 0 - double POSNU_R; // default: 1000; meters from station center - double POSNU_THETA; // default: -PI/4; elevation angle from station center coordinates - double POSNU_PHI; // default: 0; azimuth angle from station center coordinates - // Only using INTERACTION_MODE = 2, these values set the position of the interaction point; can be used in EVENT_TYPE = 0 and 10 + double POSNU_R; // default: 1000; meters from station center + double POSNU_THETA; // default: -PI/4; elevation angle from station center coordinates + double POSNU_PHI; // default: 0; azimuth angle from station center coordinates + // Only using INTERACTION_MODE = 2, these values set the position of the interaction point; can be used in EVENT_TYPE = 0 and 10 - double ARBITRARY_EVENT_ATTENUATION; // attenuation of the waveform intensity for arbitrary event waveforms - double PICK_ABOVE_HEIGHT; + double ARBITRARY_EVENT_ATTENUATION; // attenuation of the waveform intensity for arbitrary event waveforms + double PICK_ABOVE_HEIGHT; int EVENT_GENERATION_MODE;//default: 0: not event mode, 1: event mode - // int EVENT_NUM;//number of events to read in, using EVENT_GENERATION_MODE=1, default initial 0: read in the number of events in the input file, resets to total number of events read in + // int EVENT_NUM;//number of events to read in, using EVENT_GENERATION_MODE=1, default initial 0: read in the number of events in the input file, resets to total number of events read in - int ANTENNA_MODE; // 0: old default antenna models bicone/rotated dipole - // 1: using different antenna response for the top Vpol antennas, otherwise same as old default + int ANTENNA_MODE; // 0: old default antenna models bicone/rotated dipole + // 1: using different antenna response for the top Vpol antennas, otherwise same as old default - int APPLY_NOISE_FIGURE; // 0: do not apply new noise figure from Thomas Meures 2016 - // 1: apply new noise figure to data + int APPLY_NOISE_FIGURE; // 0: do not apply new noise figure from Thomas Meures 2016 + // 1: apply new noise figure to data - int CUSTOM_ELECTRONICS; //0 (default): use the regular "ARA_Electronics_TotalGain_TwoFilter.txt" file - //1 : load a custom electronics file, stored as "custom_electronics.txt" in the `data` directory + int CUSTOM_ELECTRONICS; //0 (default): use the regular "ARA_Electronics_TotalGain_TwoFilter.txt" file + //1 : load a custom electronics file, stored as "custom_electronics.txt" in the `data` directory -//arrays for saving read in event features in EVENT_GENERATION_MODE=1 + //arrays for saving read in event features in EVENT_GENERATION_MODE=1 vector EVID; vector NUFLAVORINT; vector NUBAR; @@ -305,123 +305,119 @@ class Settings - // below : values from icemc - - - int UNBIASED_SELECTION; - int WHICH; // which payload to use 0=Anita-lite,1=Ross,2=Smex,3=make your own - int CYLINDRICALSYMMETRY; // is it cylindrically symmetric =1 if which=1,2, =0 if which=0 - // if which=3 then 0 or 1 - double SIGMA_FACTOR; // factor to multiply cross section by for error analysis - int SIGMAPARAM; // 0=Reno, 1=Connolly et al. 2011 for cross section parametrization - int YPARAM; // 0=Reno, 1=Connolly et al. 2011 for cross section parametrization, 2 = a specific elast_y - double ELAST_Y; - - int SIGMA_SELECT; // when in SIGMAPARAM=1 case, 0 : (default) use mean value, 1 : use upper bound, 2 : use lower bound - - int SIGNAL_FLUCT; // 1=add noise fluctuation to signal or 0=do not - int TRIGGERSCHEME; // frequency domain voltage, frequency domain energy, time domain diode integration - int ZEROSIGNAL; // zero the signal to see how many of our hits are noise hits - int REMOVEPOLARIZATION; //Disable polarizations - - int EVENTSMAP;//whether draw the events distribution map + // below : values from icemc - int WHICHRAYS; // how many rays to look at (1) direct only (2) direct and down-going. - -// trigger -int LCPRCP; // 1 for circular polarization trigger, 0 for V and H -int JUSTVPOL; // 0 for both polarizations, 1 for just V polarization -// doesn't allow for both LCPRCP=1 and JUSTVPOL=1 -//int FIFTHBAND; // 1 to include 0.2-1.2 GHz as a frequency band if JUSTVPOL==1 -//int NFOLD=3; // how many channels must pass the trigger - in old mechanism - only used for anita-lite -int NFOLD; // how many channels must pass the trigger - in old mechanism - only used for anita-lite - - -//int CHMASKING=1; // whether or not to include channel masking -//int PHIMASKING=1; // whether or not to include phi masking -int CHMASKING; // whether or not to include channel masking -int PHIMASKING; // whether or not to include phi masking + int UNBIASED_SELECTION; + int WHICH; // which payload to use 0=Anita-lite,1=Ross,2=Smex,3=make your own + int CYLINDRICALSYMMETRY; // is it cylindrically symmetric =1 if which=1,2, =0 if which=0 + // if which=3 then 0 or 1 + double SIGMA_FACTOR; // factor to multiply cross section by for error analysis + int SIGMAPARAM; // 0=Reno, 1=Connolly et al. 2011 for cross section parametrization + int YPARAM; // 0=Reno, 1=Connolly et al. 2011 for cross section parametrization, 2 = a specific elast_y + double ELAST_Y; + + int SIGMA_SELECT; // when in SIGMAPARAM=1 case, 0 : (default) use mean value, 1 : use upper bound, 2 : use lower bound + + int SIGNAL_FLUCT; // 1=add noise fluctuation to signal or 0=do not + int TRIGGERSCHEME; // frequency domain voltage, frequency domain energy, time domain diode integration + int ZEROSIGNAL; // zero the signal to see how many of our hits are noise hits + int REMOVEPOLARIZATION; //Disable polarizations + + int EVENTSMAP;//whether draw the events distribution map + + int WHICHRAYS; // how many rays to look at (1) direct only (2) direct and down-going. -//int NLAYERS=0; -//int NANTENNAS=0; + // trigger + int LCPRCP; // 1 for circular polarization trigger, 0 for V and H + int JUSTVPOL; // 0 for both polarizations, 1 for just V polarization + // doesn't allow for both LCPRCP=1 and JUSTVPOL=1 + //int FIFTHBAND; // 1 to include 0.2-1.2 GHz as a frequency band if JUSTVPOL==1 + //int NFOLD=3; // how many channels must pass the trigger - in old mechanism - only used for anita-lite + int NFOLD; // how many channels must pass the trigger - in old mechanism - only used for anita-lite -int NLAYERS; -int NANTENNAS; -/* int ONLYFINAL=1; // only write to final histogram */ -/* int HIST_MAX_ENTRIES=10000; //maximum number of events to put in histograms */ -/* int HIST=1; //write to histograms */ + //int CHMASKING=1; // whether or not to include channel masking + //int PHIMASKING=1; // whether or not to include phi masking + int CHMASKING; // whether or not to include channel masking + int PHIMASKING; // whether or not to include phi masking -int ONLYFINAL; // only write to final histogram -int HIST_MAX_ENTRIES; //maximum number of events to put in histograms -int HIST; //write to histograms -double BW; // BANDWIDTH -//int DISCONES=1; // whether or not to use discones -int DISCONES; // whether or not to use discones + //int NLAYERS=0; + //int NANTENNAS=0; -//double NDISCONES_PASS=3; // number of discones needed to pass -double NDISCONES_PASS; // number of discones needed to pass + int NLAYERS; + int NANTENNAS; -int BORESIGHTS; // whether to loop over boresights -int SLAC; // whether or not we are simulating the slac run -double SLACSLOPE; // slope of the ice -double SLACICELENGTH; // length of the block of ice -double SLAC_HORIZDIST; // horizontal distance from interaction to center of payload at slac beam test -double SLAC_DEPTH; // vertical depth of interaction at slac beam test -double SLAC_HORIZ_DEPTH; // horizontal depth of interaction at slac + /* int ONLYFINAL=1; // only write to final histogram */ + /* int HIST_MAX_ENTRIES=10000; //maximum number of events to put in histograms */ + /* int HIST=1; //write to histograms */ -int ROUGHNESS; // include effects of surface roughness -int FIRN; // whether or not to include the firn + int ONLYFINAL; // only write to final histogram + int HIST_MAX_ENTRIES; //maximum number of events to put in histograms + int HIST; //write to histograms + double BW; // BANDWIDTH + //int DISCONES=1; // whether or not to use discones + int DISCONES; // whether or not to use discones -//int SLOPEY=1; // 1=slopeyness on, 0=slopeyness off -//double SLOPEYSIZE=0.012; // This determines size of the slopeyness (0.10=5.4, 0.20=7.4 deg mean) + //double NDISCONES_PASS=3; // number of discones needed to pass + double NDISCONES_PASS; // number of discones needed to pass -int SLOPEY; // 1=slopeyness on, 0=slopeyness off -double SLOPEYSIZE; // This determines size of the slopeyness (0.10=5.4, 0.20=7.4 deg mean) + int BORESIGHTS; // whether to loop over boresights + int SLAC; // whether or not we are simulating the slac run + double SLACSLOPE; // slope of the ice + double SLACICELENGTH; // length of the block of ice + double SLAC_HORIZDIST; // horizontal distance from interaction to center of payload at slac beam test + double SLAC_DEPTH; // vertical depth of interaction at slac beam test + double SLAC_HORIZ_DEPTH; // horizontal depth of interaction at slac - bool DEBUG; -string outputdir; // directory where outputs go + int ROUGHNESS; // include effects of surface roughness + int FIRN; // whether or not to include the firn -//double THERMALNOISE_FACTOR=1.0; // factor to multiply thermal noise for error analysis -double THERMALNOISE_FACTOR; // factor to multiply thermal noise for error analysis + //int SLOPEY=1; // 1=slopeyness on, 0=slopeyness off + //double SLOPEYSIZE=0.012; // This determines size of the slopeyness (0.10=5.4, 0.20=7.4 deg mean) -//double FREQ_LOW_SEAVEYS=200.E6; // min frequency for seaveys -//const double FREQ_HIGH_SEAVEYS=1200.E6; // max frequency for seaveys + int SLOPEY; // 1=slopeyness on, 0=slopeyness off + double SLOPEYSIZE; // This determines size of the slopeyness (0.10=5.4, 0.20=7.4 deg mean) -double FREQ_LOW_SEAVEYS; // min frequency for seaveys -double FREQ_HIGH_SEAVEYS; // max frequency for seaveys - double BW_SEAVEYS; - //int FORSECKEL=1; // Make array of strength of signal across frequencies for different viewing angles. -int FORSECKEL; // Make array of strength of signal across frequencies for different viewing angles. + bool DEBUG; + string outputdir; // directory where outputs go -double ROUGHSIZE; // roughness size + //double THERMALNOISE_FACTOR=1.0; // factor to multiply thermal noise for error analysis + double THERMALNOISE_FACTOR; // factor to multiply thermal noise for error analysis + //double FREQ_LOW_SEAVEYS=200.E6; // min frequency for seaveys + //const double FREQ_HIGH_SEAVEYS=1200.E6; // max frequency for seaveys -/* int ICE_MODEL=0; //Select ice model to be used. 0 = Crust 2.0 , 1 = BEDMAP. */ -/* int NOFZ=1; // 1=depth dependent index of refraction,0=off */ -/* int CONSTANTCRUST=0; // set crust density and thickness to constant values. */ -/* int CONSTANTICETHICKNESS=0; // set ice thickness to constant value */ -/* int FIXEDELEVATION=0; // fix the elevation to the thickness of ice. */ -/* int MOOREBAY=0; //1=use Moore's Bay measured ice field attenuation length for the west land, otherwise use South Pole data */ -/* int USEPOSITIONWEIGHTS=1;// whether or not to restrict the neutrino position so it is within the horizon of the balloon */ -/* int WRITE_FILE=0; //Select whether or not to write a new input file for CreateHorizons */ + double FREQ_LOW_SEAVEYS; // min frequency for seaveys + double FREQ_HIGH_SEAVEYS; // max frequency for seaveys + double BW_SEAVEYS; + //int FORSECKEL=1; // Make array of strength of signal across frequencies for different viewing angles. + int FORSECKEL; // Make array of strength of signal across frequencies for different viewing angles. -int USEPOSITIONWEIGHTS;// whether or not to restrict the neutrino position so it is within the horizon of the balloon -int WRITE_FILE; //Select whether or not to write a new input file for CreateHorizons + double ROUGHSIZE; // roughness size -int MINRAY; -int MAXRAY; -int horizontal_banana_points; - int vertical_banana_points; + /* int ICE_MODEL=0; //Select ice model to be used. 0 = Crust 2.0 , 1 = BEDMAP. */ + /* int NOFZ=1; // 1=depth dependent index of refraction,0=off */ + /* int CONSTANTCRUST=0; // set crust density and thickness to constant values. */ + /* int CONSTANTICETHICKNESS=0; // set ice thickness to constant value */ + /* int FIXEDELEVATION=0; // fix the elevation to the thickness of ice. */ + /* int MOOREBAY=0; //1=use Moore's Bay measured ice field attenuation length for the west land, otherwise use South Pole data */ + /* int USEPOSITIONWEIGHTS=1;// whether or not to restrict the neutrino position so it is within the horizon of the balloon */ + /* int WRITE_FILE=0; //Select whether or not to write a new input file for CreateHorizons */ + int USEPOSITIONWEIGHTS;// whether or not to restrict the neutrino position so it is within the horizon of the balloon + int WRITE_FILE; //Select whether or not to write a new input file for CreateHorizons + int MINRAY; + int MAXRAY; + int horizontal_banana_points; + int vertical_banana_points; - // end of values from icemc + // end of values from icemc - ClassDef(Settings,1); + ClassDef(Settings,1); }; From 65af138e975cd82350a97098af41dc540648e3cc Mon Sep 17 00:00:00 2001 From: clark2668 Date: Thu, 12 Dec 2019 11:37:02 -0500 Subject: [PATCH 02/53] fix yet more tabbing issues --- Settings.cc | 138 ++++++++++++++++++++++++++-------------------------- 1 file changed, 68 insertions(+), 70 deletions(-) diff --git a/Settings.cc b/Settings.cc index 8a1f91d4..fc534ea5 100644 --- a/Settings.cc +++ b/Settings.cc @@ -43,8 +43,6 @@ void Settings::Initialize() { UNBIASED_SELECTION=1.; // (0) pick neutrino interaction in the ice and neutrino from any direction or (1) choose neutrino interaction point in the horizon on the balloon in the ice and neutrino direction on the cerenkov cone SIGMA_SELECT=0; // when in SIGMAPARAM=1 case, 0 : (default) use mean value, 1 : use upper bound, 2 : use lower bound - - // end of values from icemc ARASIM_VERSION_MAJOR = ARASIM_MAJOR; @@ -733,48 +731,48 @@ int Settings::CheckCompatibilities(Detector *detector) { // if there's something not going to work, count thoes settings if (DETECTOR==1 && READGEOM==1 && detector->params.number_of_stations>1) { // currently only ARA1a one station is possible - cerr<<"DETECTOR=1, READGEOM=1 is currently only availble with number_of_stations=1 in ARA_N_info.txt file!"<params.number_of_antennas) { // this is too low number of events! - if (NOISE_EVENTS < detector->max_number_of_antennas_station) { // this is too low number of events! - cerr<<"NOISE_EVENTS too less! At least use "<max_number_of_antennas_station<<"!"<params.number_of_antennas) { // this is too low number of events! + if (NOISE_EVENTS < detector->max_number_of_antennas_station) { // this is too low number of events! + cerr<<"NOISE_EVENTS too less! At least use "<max_number_of_antennas_station<<"!"< 1) { // this case 1 waveform is enough for each channels - cerr<<"NOISE_EVENTS too many! With NOISE_WAVEFORM_GENERATE_MODE==0 and NOISE_CHANNEL_MODE==1, just use NOISE_EVENTS=1"< 1) { // this case 1 waveform is enough for each channels + cerr<<"NOISE_EVENTS too many! With NOISE_WAVEFORM_GENERATE_MODE==0 and NOISE_CHANNEL_MODE==1, just use NOISE_EVENTS=1"<params.number_of_antennas) { // this is too low number of events! - if (NOISE_EVENTS < detector->max_number_of_antennas_station) { // this is too low number of events! - cerr<<"NOISE_EVENTS too less! At least use "<max_number_of_antennas_station<<"!"<params.number_of_antennas) { // this is too low number of events! + if (NOISE_EVENTS < detector->max_number_of_antennas_station) { // this is too low number of events! + cerr<<"NOISE_EVENTS too less! At least use "<max_number_of_antennas_station<<"!"<params.number_of_antennas > (int)(detector->Temp_TB_ch.size())) ) { - cout << detector->params.number_of_antennas << " : " <<(int)(detector->Temp_TB_ch.size()) << endl; - cerr<<"System temperature values are not enough for all channels! Check number of channels you are using and numbers in data/system_temperature.csv"<params.number_of_antennas << " : " <<(int)(detector->Temp_TB_ch.size()) << endl; + cerr<<"System temperature values are not enough for all channels! Check number of channels you are using and numbers in data/system_temperature.csv"<3)) { - cerr<<"DATA_LIKE_OUTPUT=1,2 doesn't work with DETECTOR_STATION>3"<3"< Date: Thu, 12 Dec 2019 13:47:50 -0500 Subject: [PATCH 03/53] add DETECTOR_STATION_LIVETIME_CONFIG to settings class in preparation for further work --- Settings.cc | 17 +++++++++++++++++ Settings.h | 3 +++ log.txt | 12 ++++++++++++ 3 files changed, 32 insertions(+) diff --git a/Settings.cc b/Settings.cc index fc534ea5..2dcb035c 100644 --- a/Settings.cc +++ b/Settings.cc @@ -339,6 +339,9 @@ void Settings::ReadFile(string setupfile) { else if (label == "DETECTOR_STATION") { DETECTOR_STATION = atof( line.substr(line.find_first_of("=") + 1).c_str() ); } + else if (label == "DETECTOR_STATION_LIVETIME_CONFIG") { + DETECTOR_STATION_LIVETIME_CONFIG = atof( line.substr(line.find_first_of("=") + 1).c_str() ); + } else if (label == "INTERACTION_MODE") { INTERACTION_MODE = atof( line.substr(line.find_first_of("=") + 1).c_str() ); } @@ -933,6 +936,20 @@ int Settings::CheckCompatibilities(Detector *detector) { cerr << "DETECTOR_STATION is not set to a valid station number" << endl; num_err++; } + if(DETECTOR_STATION_LIVETIME_CONFIG>0){ + if((int)DETECTOR_STATION==2 || (int)DETECTOR_STATION==3){ + cerr<<"DETECTOR_STATION_LIVETIME_CONFIG is set to "<5){ + cerr<<" DETECTOR_STATION_LIVETIME_CONFIG is set to "<5 is not supported currently and will throw an error + will also throw an error if attempt to use for stations besides 2 and 3 From e953206449b5ecf1ea02c46bed8b8ff63f7b746d Mon Sep 17 00:00:00 2001 From: clark2668 Date: Thu, 12 Dec 2019 13:55:17 -0500 Subject: [PATCH 04/53] fix tabs in report to prepare for adding delay variables --- Report.h | 443 +++++++++++++++++++++++++++---------------------------- 1 file changed, 221 insertions(+), 222 deletions(-) diff --git a/Report.h b/Report.h index 31553e5f..d27d9095 100644 --- a/Report.h +++ b/Report.h @@ -38,336 +38,335 @@ class FFTWComplex; using namespace std; class Surface_antenna_r { - public: + public: - ClassDef(Surface_antenna_r,1); + ClassDef(Surface_antenna_r,1); }; class Antenna_r { - public: + public: - // one dimention for number of solutions, (if there,) another dimention for array of information - // + // one dimention for number of solutions, (if there,) another dimention for array of information + // - int ray_sol_cnt; // number of RaySolver solutions + int ray_sol_cnt; // number of RaySolver solutions - //vector trg; // if antenna recieved any signal or not. 0 : no signal, 1 : yes signal + //vector trg; // if antenna recieved any signal or not. 0 : no signal, 1 : yes signal - vector view_ang; //viewing angle - vector launch_ang; //launch angle - vector rec_ang; //receiving angle - vector reflect_ang; // surface reflection angle (if 100 : no reflection case) - vector Dist; //Distance between posnu and antenna - vector L_att; //Attenuation factor - vector arrival_time; //time from posnu to antenna (t:0 at posnu) - vector reflection; // non-reflected : 0, reflected : 1 - vector Pol_vector; // polarization vector at the antenna - //vector n_H; // normalized vector for H pol - //vector n_V; // normalized vector for V pol + vector view_ang; //viewing angle + vector launch_ang; //launch angle + vector rec_ang; //receiving angle + vector reflect_ang; // surface reflection angle (if 100 : no reflection case) + vector Dist; //Distance between posnu and antenna + vector L_att; //Attenuation factor + vector arrival_time; //time from posnu to antenna (t:0 at posnu) + vector reflection; // non-reflected : 0, reflected : 1 + vector Pol_vector; // polarization vector at the antenna + //vector n_H; // normalized vector for H pol + //vector n_V; // normalized vector for V pol - // below freq domain simulation output - vector < vector > vmmhz; // signal V/m/MHz for each freq bin - // - vector < vector > Heff; // effective height for each freq bin - vector Mag; // magnification factor - vector Fresnel; // Fresnel factor - vector Pol_factor; // Polarization factor - - vector < vector > Vm_zoom; // E field before ant T-domain - vector < vector > Vm_zoom_T; // E field before ant T-domain time - //vector < vector > Vm_wo_antfactor; // before applying ApplyAntFactors - //vector < vector > VHz_antfactor; // after applying ApplyAntFactors to vmmhz above ( 1/sqrt2 * 1/dt * 0.5 * heff * pol_factor ) - //vector < vector > VHz_filter; // after applying ApplyAntFactors above and then apply filter gain from detector->GetFilterGain - // - int skip_bins[2]; // for two ray sols + // below freq domain simulation output + vector < vector > vmmhz; // signal V/m/MHz for each freq bin + // + vector < vector > Heff; // effective height for each freq bin + vector Mag; // magnification factor + vector Fresnel; // Fresnel factor + vector Pol_factor; // Polarization factor + + vector < vector > Vm_zoom; // E field before ant T-domain + vector < vector > Vm_zoom_T; // E field before ant T-domain time + //vector < vector > Vm_wo_antfactor; // before applying ApplyAntFactors + //vector < vector > VHz_antfactor; // after applying ApplyAntFactors to vmmhz above ( 1/sqrt2 * 1/dt * 0.5 * heff * pol_factor ) + //vector < vector > VHz_filter; // after applying ApplyAntFactors above and then apply filter gain from detector->GetFilterGain + // + int skip_bins[2]; // for two ray sols - int Nnew[2]; // new number of bins for V_fotfft array + int Nnew[2]; // new number of bins for V_fotfft array - vector < vector > Vfft; // signal V preparing for FFT - vector < vector > Vfft_noise; // noise V preparing for FFT + vector < vector > Vfft; // signal V preparing for FFT + vector < vector > Vfft_noise; // noise V preparing for FFT - // below time domain simulation output - vector time; // time of time domain Askaryan radiation - vector time_mimic; // time of time domain Askaryan radiation (same time range with data) - vector V_mimic; // signal + noise waveform which mimics the data (size : NFOUR/2 bin) + // below time domain simulation output + vector time; // time of time domain Askaryan radiation + vector time_mimic; // time of time domain Askaryan radiation (same time range with data) + vector V_mimic; // signal + noise waveform which mimics the data (size : NFOUR/2 bin) - int global_trig_bin; // from V_mimic [0, NFOUR/2] bins, where global trigger occured + int global_trig_bin; // from V_mimic [0, NFOUR/2] bins, where global trigger occured - vector < vector > Ax; // vector potential x component - vector < vector > Ay; - vector < vector > Az; - vector < vector > V; // volt signal with all factors applied (as far as we can) (from fft) + vector < vector > Ax; // vector potential x component + vector < vector > Ay; + vector < vector > Az; + vector < vector > V; // volt signal with all factors applied (as far as we can) (from fft) - vector SignalExt; // flag if actual signal exist for the ray trace solution + vector SignalExt; // flag if actual signal exist for the ray trace solution - vector SignalBin; // the bin number where the center of signal located. we can compare this value to Trig_Pass value to have likely triggered ray trace solution + vector SignalBin; // the bin number where the center of signal located. we can compare this value to Trig_Pass value to have likely triggered ray trace solution - vector noise_ID; // information about which pure noise waveform is used for trigger analysis + vector noise_ID; // information about which pure noise waveform is used for trigger analysis - //vector < vector > V_noise; // volt noise signal (with all factors applied as far as we can) (from thermal noise + fft) + //vector < vector > V_noise; // volt noise signal (with all factors applied as far as we can) (from thermal noise + fft) - //vector < vector > V_total; // volt signal + noise with all factors applied as far as we can + //vector < vector > V_total; // volt signal + noise with all factors applied as far as we can - //vector < vector > V_total_diode; // volt signal + noise with all factors (as far as we can) and convlution with diode (time domain) + //vector < vector > V_total_diode; // volt signal + noise with all factors (as far as we can) and convlution with diode (time domain) - //vector < vector > V_total_timedelay; // volt signal + noise with all factors applied and time delay between antennas - // - // - vector PeakV; // peak voltage in time domain - vector Rank; // rank of peak voltage between antennas (Rank = 0 for 0 signal) + //vector < vector > V_total_timedelay; // volt signal + noise with all factors applied and time delay between antennas + // + // + vector PeakV; // peak voltage in time domain + vector Rank; // rank of peak voltage between antennas (Rank = 0 for 0 signal) - // vector PeakV_fromFullWaveform; // peak voltage in time domain taken from full waveform, including noise at the time of signal insertion - // vector Rank_fromFullWaveform; // rank of peak voltage between antennas (Rank = 0 for 0 signal) + // vector PeakV_fromFullWaveform; // peak voltage in time domain taken from full waveform, including noise at the time of signal insertion + // vector Rank_fromFullWaveform; // rank of peak voltage between antennas (Rank = 0 for 0 signal) - int Trig_Pass; // 0 if not passed the trigger, 1 if passed the trigger - //vector Trig_Pass; // 0 if not passed the trigger, 1 if passed the trigger + int Trig_Pass; // 0 if not passed the trigger, 1 if passed the trigger + //vector Trig_Pass; // 0 if not passed the trigger, 1 if passed the trigger - int Likely_Sol; // comparing Trig_Pass and SignalBin value, this value returns which ray trace solution has been triggered (not perfect but most likely) + int Likely_Sol; // comparing Trig_Pass and SignalBin value, this value returns which ray trace solution has been triggered (not perfect but most likely) - int SingleChannelTriggers; // how many bins passed the threshold in this channel (should be equal to size of SCT_threshold_pass). - vector SCT_threshold_pass; // for each bin that passed, what was the threshold value at which it passed (for TRIG_SCAN_MODE only). + int SingleChannelTriggers; // how many bins passed the threshold in this channel (should be equal to size of SCT_threshold_pass). + vector SCT_threshold_pass; // for each bin that passed, what was the threshold value at which it passed (for TRIG_SCAN_MODE only). - long TotalBinsScannedPerChannel; + long TotalBinsScannedPerChannel; - vector TooMuch_Tdelay; // 0 is PeakV is located inside the DATA_BIN_SIZE array, 1 is when PeakV is located outside the DATA_BIN_SIZE so that we can't correctly check if it is triggered or not + vector TooMuch_Tdelay; // 0 is PeakV is located inside the DATA_BIN_SIZE array, 1 is when PeakV is located outside the DATA_BIN_SIZE so that we can't correctly check if it is triggered or not - - void clear (); // clear all vector format information for next event - void clear_useless ( Settings *settings1 ); // clear all vector information which are useless + + void clear (); // clear all vector format information for next event + void clear_useless ( Settings *settings1 ); // clear all vector information which are useless - ClassDef(Antenna_r,1); + ClassDef(Antenna_r,1); }; class String_r { - public: - //int trg; // if any antenna trigg in the event. 0 : no antenna in the string trg - // 1 : 1 or more antenna trg + public: + //int trg; // if any antenna trigg in the event. 0 : no antenna in the string trg + // 1 : 1 or more antenna trg - vector antennas; + vector antennas; - ClassDef(String_r,1); + ClassDef(String_r,1); }; class Station_r { - public: - //int trg; // if any antenna trigg in the event. 0 : no antenna trg - // 1: 1 or more antenna trg - vector strings; - vector surfaces; - - double min_arrival_time; // for each station, minimum arrival time (include all ray_solves). this will be used for time delay between antennas. - double max_arrival_time; // for each station, maximum arrival time (include all ray_solves). this will be used for time delay between antennas. - double max_PeakV; // for each station, maximum PeakV value (include all ray_solves). this will also be used for time delay plot (to set same vertical scale) - int Total_ray_sol; // total number of ray_sols in the stations. If there is 0 Total_ray_sol, we don't need to do trigger check while there is any Total_ray_sol, we do trigger check. - int Global_Pass; // if global trigger passed or not: 0 = not passed, >0 passed, number indicates the first bin in the triggered window of the waveform at which the global trigger passed - - int total_trig_search_bin; // total number of bins for searching trigger. - -// int numChan; -// int numChanVpol; -// int numChanHpol; - - // TDR is for Tunnel Diode Response i.e. the value on which the trigger happened - vector TDR_all; - vector TDR_all_sorted; - vector TDR_Hpol_sorted; - vector TDR_Vpol_sorted; - - ClassDef(Station_r,3); + public: + //int trg; // if any antenna trigg in the event. 0 : no antenna trg + // 1: 1 or more antenna trg + vector strings; + vector surfaces; + + double min_arrival_time; // for each station, minimum arrival time (include all ray_solves). this will be used for time delay between antennas. + double max_arrival_time; // for each station, maximum arrival time (include all ray_solves). this will be used for time delay between antennas. + double max_PeakV; // for each station, maximum PeakV value (include all ray_solves). this will also be used for time delay plot (to set same vertical scale) + int Total_ray_sol; // total number of ray_sols in the stations. If there is 0 Total_ray_sol, we don't need to do trigger check while there is any Total_ray_sol, we do trigger check. + int Global_Pass; // if global trigger passed or not: 0 = not passed, >0 passed, number indicates the first bin in the triggered window of the waveform at which the global trigger passed + + int total_trig_search_bin; // total number of bins for searching trigger. + + // int numChan; + // int numChanVpol; + // int numChanHpol; + + // TDR is for Tunnel Diode Response i.e. the value on which the trigger happened + vector TDR_all; + vector TDR_all_sorted; + vector TDR_Hpol_sorted; + vector TDR_Vpol_sorted; + + ClassDef(Station_r,3); }; class Report { - private: - vector noise_phase; // random noise phase generated in GetNoisePhase() - - - // variables we need for trigger - // test selecting noise waveform - - int noise_pass_nogo; // index for checking if any same noise_ID is used in different chs. - int N_noise; // needed number of noise waveforms (most cases, we will need only 1) - int noise_ID[5]; // selected noise waveform ID (we should not need 5 noise waveforms, but just in case) - int ch_ID; // channel ID - //double Full_window[detector->params.number_of_strings_station * detector->params.number_of_antennas_string][settings1->DATA_BIN_SIZE]; // entire window for trigger check (diode convlv results for all antennas in a station) - //vector < vector > Full_window; // entire window for trigger check (diode convlv results for all antennas in a station) - int max_total_bin; // to save time, use only necessary number of bins - int remain_bin; // the bin number for not using entire DATA_BIN_SIZE array - vector signal_bin; // the center of bin where signal should locate - vector signal_dbin; // the bin difference between signal bins - vector connect_signals; // if ray_sol time delay is small enough to connect each other - - int triggerCheckLoop(Settings *settings1, Detector *detector, Event *event, Trigger *trigger, int stationID, int trig_search_init, int max_total_bin, int trig_window_bin, int scan_mode=1); -// int triggerCheckLoopScan(); -// int triggerCheckLoopScanNumbers(); + private: + vector noise_phase; // random noise phase generated in GetNoisePhase() + + + // variables we need for trigger + // test selecting noise waveform + + int noise_pass_nogo; // index for checking if any same noise_ID is used in different chs. + int N_noise; // needed number of noise waveforms (most cases, we will need only 1) + int noise_ID[5]; // selected noise waveform ID (we should not need 5 noise waveforms, but just in case) + int ch_ID; // channel ID + //double Full_window[detector->params.number_of_strings_station * detector->params.number_of_antennas_string][settings1->DATA_BIN_SIZE]; // entire window for trigger check (diode convlv results for all antennas in a station) + //vector < vector > Full_window; // entire window for trigger check (diode convlv results for all antennas in a station) + int max_total_bin; // to save time, use only necessary number of bins + int remain_bin; // the bin number for not using entire DATA_BIN_SIZE array + vector signal_bin; // the center of bin where signal should locate + vector signal_dbin; // the bin difference between signal bins + vector connect_signals; // if ray_sol time delay is small enough to connect each other + + int triggerCheckLoop(Settings *settings1, Detector *detector, Event *event, Trigger *trigger, int stationID, int trig_search_init, int max_total_bin, int trig_window_bin, int scan_mode=1); + // int triggerCheckLoopScan(); + // int triggerCheckLoopScanNumbers(); - int saveTriggeredEvent(Settings *settings1, Detector *detector, Event *event, Trigger *trigger, int stationID, int trig_search_init, int max_total_bin, int trig_window_bin, int last_trig_bin); + int saveTriggeredEvent(Settings *settings1, Detector *detector, Event *event, Trigger *trigger, int stationID, int trig_search_init, int max_total_bin, int trig_window_bin, int last_trig_bin); - vector < vector < vector > > RayStep; + vector < vector < vector > > RayStep; - public: - /* - double Full_window[16][16384]; // test with array, not vector, diode response - double Full_window_V[16][16384]; // test with array, not vector, voltage waveform - */ - vector Passed_chs; - //int trg; // if any antenna in entire detectors trg. 0 : no antenna trg - // 1 : 1 or more antenna trg + public: + /* + double Full_window[16][16384]; // test with array, not vector, diode response + double Full_window_V[16][16384]; // test with array, not vector, voltage waveform + */ + vector Passed_chs; + //int trg; // if any antenna in entire detectors trg. 0 : no antenna trg + // 1 : 1 or more antenna trg - Report (); - Report (Detector *detector, Settings *settings1); - ~Report (); - //make the UsefulIcrrStationEvent for use with AraRoot - //UsefulIcrrStationEvent theUsefulEvent; + Report (); + Report (Detector *detector, Settings *settings1); + ~Report (); + //make the UsefulIcrrStationEvent for use with AraRoot + //UsefulIcrrStationEvent theUsefulEvent; - - void Initialize (Detector *detector, Settings *settings1); - - //void Connect_Interaction_Detector (Event *event, Detector *detector, RaySolver *raysolver, Signal *signal, IceModel *icemodel, Settings *settings1, Trigger *trigger); - //void Connect_Interaction_Detector (Event *event, Detector *detector, RaySolver *raysolver, Signal *signal, IceModel *icemodel, Settings *settings1, Trigger *trigger, UsefulIcrrStationEvent *theUsefulEvent); + + void Initialize (Detector *detector, Settings *settings1); + //void Connect_Interaction_Detector (Event *event, Detector *detector, RaySolver *raysolver, Signal *signal, IceModel *icemodel, Settings *settings1, Trigger *trigger); + //void Connect_Interaction_Detector (Event *event, Detector *detector, RaySolver *raysolver, Signal *signal, IceModel *icemodel, Settings *settings1, Trigger *trigger, UsefulIcrrStationEvent *theUsefulEvent); -// void Connect_Interaction_Detector (Event *event, Detector *detector, RaySolver *raysolver, Signal *signal, IceModel *icemodel, Settings *settings1, Trigger *trigger, UsefulIcrrStationEvent *theUsefulEvent); - -// void Connect_Interaction_Detector (Event *event, Detector *detector, RaySolver *raysolver, Signal *signal, IceModel *icemodel, Settings *settings1, Trigger *trigger); - - void Connect_Interaction_Detector (Event *event, Detector *detector, RaySolver *raysolver, Signal *signal, IceModel *icemodel, Settings *settings1, Trigger *trigger, int evt); - - -#ifdef ARA_UTIL_EXISTS - void MakeUsefulEvent(Detector *detector, Settings *settings1, Trigger *trigger, int stationID, int stationIndex, UsefulIcrrStationEvent *theUsefulEvent); - void MakeUsefulEvent(Detector *detector, Settings *settings1, Trigger *trigger, int stationID, int stationIndex, UsefulAtriStationEvent *theUsefulEvent); -#endif - - void ClearUselessfromConnect(Detector *detector, Settings *settings1, Trigger *trigger); + // void Connect_Interaction_Detector (Event *event, Detector *detector, RaySolver *raysolver, Signal *signal, IceModel *icemodel, Settings *settings1, Trigger *trigger, UsefulIcrrStationEvent *theUsefulEvent); + + // void Connect_Interaction_Detector (Event *event, Detector *detector, RaySolver *raysolver, Signal *signal, IceModel *icemodel, Settings *settings1, Trigger *trigger); + + void Connect_Interaction_Detector (Event *event, Detector *detector, RaySolver *raysolver, Signal *signal, IceModel *icemodel, Settings *settings1, Trigger *trigger, int evt); + + + #ifdef ARA_UTIL_EXISTS + void MakeUsefulEvent(Detector *detector, Settings *settings1, Trigger *trigger, int stationID, int stationIndex, UsefulIcrrStationEvent *theUsefulEvent); + void MakeUsefulEvent(Detector *detector, Settings *settings1, Trigger *trigger, int stationID, int stationIndex, UsefulAtriStationEvent *theUsefulEvent); + #endif + + void ClearUselessfromConnect(Detector *detector, Settings *settings1, Trigger *trigger); - - void Select_Wave_Convlv_Exchange(Settings *settings1, Trigger *trigger, Detector *detector, int signalbin, vector &V, int *noise_ID, int ID, int StationIndex); // literally get noise waveform from trigger class and add signal voltage "V" and do convlv. convlv result will replace the value in Full_window array - - void Select_Wave_Convlv_Exchange(Settings *settings1, Trigger *trigger, Detector *detector, int signalbin_1, int signalbin_2, vector &V1, vector &V2, int *noise_ID, int ID, int StationIndex); // literally get noise waveform from trigger class and add signal voltage "V" and do convlv. convlv result will replace the value in Full_window array + + void Select_Wave_Convlv_Exchange(Settings *settings1, Trigger *trigger, Detector *detector, int signalbin, vector &V, int *noise_ID, int ID, int StationIndex); // literally get noise waveform from trigger class and add signal voltage "V" and do convlv. convlv result will replace the value in Full_window array + + void Select_Wave_Convlv_Exchange(Settings *settings1, Trigger *trigger, Detector *detector, int signalbin_1, int signalbin_2, vector &V1, vector &V2, int *noise_ID, int ID, int StationIndex); // literally get noise waveform from trigger class and add signal voltage "V" and do convlv. convlv result will replace the value in Full_window array - void Select_Wave_Convlv_Exchange(Settings *settings1, Trigger *trigger, Detector *detector, int signalbin_0, int signalbin_1, int signalbin_2, vector &V0, vector &V1, vector &V2, int *noise_ID, int ID, int StationIndex); // literally get noise waveform from trigger class and add signal voltage "V" and do convlv. convlv result will replace the value in Full_window array + void Select_Wave_Convlv_Exchange(Settings *settings1, Trigger *trigger, Detector *detector, int signalbin_0, int signalbin_1, int signalbin_2, vector &V0, vector &V1, vector &V2, int *noise_ID, int ID, int StationIndex); // literally get noise waveform from trigger class and add signal voltage "V" and do convlv. convlv result will replace the value in Full_window array - void Apply_Gain_Offset(Settings *settings1, Trigger *trigger, Detector *detector, int ID, int StationIndex); // we need to apply a gain offset to the basic waveforms. + void Apply_Gain_Offset(Settings *settings1, Trigger *trigger, Detector *detector, int ID, int StationIndex); // we need to apply a gain offset to the basic waveforms. - int GetChNumFromArbChID( Detector *detector, int ID, int StationIndex, Settings *settings1);// get actual ch number from arb chID + int GetChNumFromArbChID( Detector *detector, int ID, int StationIndex, Settings *settings1);// get actual ch number from arb chID - Vector GetPolarization (Vector &nnu, Vector &launch_vector); + Vector GetPolarization (Vector &nnu, Vector &launch_vector); - void GetParameters (Position &src, Position &trg, Vector &nnu, double &viewangle, double receive_angle, Vector &launch_vector, Vector &receive_vector, Vector &n_trg_slappy, Vector &n_trg_pokey ); // get viewangle, launch, receive vectors (it reads launch angle as a viewangle and returns actual viewangle) + void GetParameters (Position &src, Position &trg, Vector &nnu, double &viewangle, double receive_angle, Vector &launch_vector, Vector &receive_vector, Vector &n_trg_slappy, Vector &n_trg_pokey ); // get viewangle, launch, receive vectors (it reads launch angle as a viewangle and returns actual viewangle) - double GaintoHeight(double gain, double freq, double n_medium); + double GaintoHeight(double gain, double freq, double n_medium); - void ApplyAntFactors(double heff, Vector &n_trg_pokey, Vector &n_trg_slappy, Vector &Pol_vector, int ant_type, double &pol_factor, double &vmmhz); + void ApplyAntFactors(double heff, Vector &n_trg_pokey, Vector &n_trg_slappy, Vector &Pol_vector, int ant_type, double &pol_factor, double &vmmhz); - void ApplyAntFactors_Tdomain(double AntPhase, double heff, Vector &n_trg_pokey, Vector &n_trg_slappy, Vector &Pol_vector, int ant_type, double &pol_factor, double &vm_real, double &vm_img, Settings *settings1); + void ApplyAntFactors_Tdomain(double AntPhase, double heff, Vector &n_trg_pokey, Vector &n_trg_slappy, Vector &Pol_vector, int ant_type, double &pol_factor, double &vm_real, double &vm_img, Settings *settings1); - void ApplyAntFactors_Tdomain_Transmitter(double AntPhase, double heff, Vector &n_trg_pokey, Vector &n_trg_slappy, Vector &Pol_vector, int ant_type, double &pol_factor, double &vm_real, double &vm_img, Settings *settings1); + void ApplyAntFactors_Tdomain_Transmitter(double AntPhase, double heff, Vector &n_trg_pokey, Vector &n_trg_slappy, Vector &Pol_vector, int ant_type, double &pol_factor, double &vm_real, double &vm_img, Settings *settings1); - void ApplyAntFactors_Tdomain_FirstTwo ( double heff, double heff_lastbin, Vector &n_trg_pokey, Vector &n_trg_slappy, Vector &Pol_vector, int ant_type, double &pol_factor, double &vm_bin0, double &vm_bin1); + void ApplyAntFactors_Tdomain_FirstTwo ( double heff, double heff_lastbin, Vector &n_trg_pokey, Vector &n_trg_slappy, Vector &Pol_vector, int ant_type, double &pol_factor, double &vm_bin0, double &vm_bin1); - void ApplyElect_Tdomain(double freq, Detector *detector, double &vm_real, double &vm_img, Settings *settings1); + void ApplyElect_Tdomain(double freq, Detector *detector, double &vm_real, double &vm_img, Settings *settings1); - void ApplyElect_Tdomain_FirstTwo(double freq0, double freq1, Detector *detector, double &vm_bin0, double &vm_bin1); + void ApplyElect_Tdomain_FirstTwo(double freq0, double freq1, Detector *detector, double &vm_bin0, double &vm_bin1); - void ApplyFilter(int bin_n, Detector *detector, double &vmmhz); - void ApplyFilter_databin(int bin_n, Detector *detector, double &vmmhz); - void ApplyFilter_NFOUR(int bin_n, Detector *detector, double &vmmhz); - void ApplyFilter_OutZero (double freq, Detector *detector, double &vmmhz); + void ApplyFilter(int bin_n, Detector *detector, double &vmmhz); + void ApplyFilter_databin(int bin_n, Detector *detector, double &vmmhz); + void ApplyFilter_NFOUR(int bin_n, Detector *detector, double &vmmhz); + void ApplyFilter_OutZero (double freq, Detector *detector, double &vmmhz); - // apply gain in Preamp - void ApplyPreamp(int bin_n, Detector *detector, double &vmmhz); - void ApplyPreamp_databin(int bin_n, Detector *detector, double &vmmhz); - void ApplyPreamp_NFOUR(int bin_n, Detector *detector, double &vmmhz); - void ApplyPreamp_OutZero (double freq, Detector *detector, double &vmmhz); + // apply gain in Preamp + void ApplyPreamp(int bin_n, Detector *detector, double &vmmhz); + void ApplyPreamp_databin(int bin_n, Detector *detector, double &vmmhz); + void ApplyPreamp_NFOUR(int bin_n, Detector *detector, double &vmmhz); + void ApplyPreamp_OutZero (double freq, Detector *detector, double &vmmhz); - void ApplyNoiseFig_databin(int ch, int bin_n, Detector *detector, double &vmmhz, Settings *settings1); + void ApplyNoiseFig_databin(int ch, int bin_n, Detector *detector, double &vmmhz, Settings *settings1); - // apply gain in FOAM - void ApplyFOAM(int bin_n, Detector *detector, double &vmmhz); - void ApplyFOAM_databin(int bin_n, Detector *detector, double &vmmhz); - void ApplyFOAM_NFOUR(int bin_n, Detector *detector, double &vmmhz); - void ApplyFOAM_OutZero (double freq, Detector *detector, double &vmmhz); + // apply gain in FOAM + void ApplyFOAM(int bin_n, Detector *detector, double &vmmhz); + void ApplyFOAM_databin(int bin_n, Detector *detector, double &vmmhz); + void ApplyFOAM_NFOUR(int bin_n, Detector *detector, double &vmmhz); + void ApplyFOAM_OutZero (double freq, Detector *detector, double &vmmhz); - // apply RFCM gain - void ApplyRFCM(int ch, int bin_n, Detector *detector, double &vmmhz, double RFCM_OFFSET); - void ApplyRFCM_databin(int ch, int bin_n, Detector *detector, double &vmmhz, double RFCM_OFFSET); + // apply RFCM gain + void ApplyRFCM(int ch, int bin_n, Detector *detector, double &vmmhz, double RFCM_OFFSET); + void ApplyRFCM_databin(int ch, int bin_n, Detector *detector, double &vmmhz, double RFCM_OFFSET); - void GetAngleAnt(Vector &rec_vector, Position &antenna, double &ant_theta, double &ant_phi); + void GetAngleAnt(Vector &rec_vector, Position &antenna, double &ant_theta, double &ant_phi); - void GetNoiseWaveforms(Settings *settings1, Detector *detector, double vhz_noise, double *vnoise); - void GetNoiseWaveforms_ch(Settings *settings1, Detector *detector, double vhz_noise, double *vnoise, int ch); + void GetNoiseWaveforms(Settings *settings1, Detector *detector, double vhz_noise, double *vnoise); + void GetNoiseWaveforms_ch(Settings *settings1, Detector *detector, double vhz_noise, double *vnoise, int ch); - void GetNoisePhase(Settings *settings1); + void GetNoisePhase(Settings *settings1); - void MakeArraysforFFT(Settings *settings1, Detector *detector, int StationIndex, vector &vsignal_array, double *vsignal_forfft); - void MakeArraysforFFT(Settings *settings1, Detector *detector, int StationIndex, double *vsignal_array, double *vsignal_forfft); + void MakeArraysforFFT(Settings *settings1, Detector *detector, int StationIndex, vector &vsignal_array, double *vsignal_forfft); + void MakeArraysforFFT(Settings *settings1, Detector *detector, int StationIndex, double *vsignal_array, double *vsignal_forfft); - void MakeArraysforFFT_noise(Settings *settings1, Detector *detector, int StationIndex, vector &vsignal_array, double *vsignal_forfft); + void MakeArraysforFFT_noise(Settings *settings1, Detector *detector, int StationIndex, vector &vsignal_array, double *vsignal_forfft); - double FindPeak (double *waveform, int n); // same with icemc; trigger->AntTrigger::FindPeak + double FindPeak (double *waveform, int n); // same with icemc; trigger->AntTrigger::FindPeak - void SetRank(Detector *detector); // set rank (rank of strength of signal at each antenna) + void SetRank(Detector *detector); // set rank (rank of strength of signal at each antenna) - int GetChannelNum8_LowAnt(int string_num, int antenna_num); // just return ch numbers 1-8 for antenna 0-1 (bottom antennas) and higher ch numbers for antenna 2-3 (top antennas) this is used for only TRIG_ONLY_LOW_CH_ON=1 mode with + int GetChannelNum8_LowAnt(int string_num, int antenna_num); // just return ch numbers 1-8 for antenna 0-1 (bottom antennas) and higher ch numbers for antenna 2-3 (top antennas) this is used for only TRIG_ONLY_LOW_CH_ON=1 mode with - TGraph *getWaveform(Detector *detector, int ch, int station_i=0, int event_num=0, int run_num=0); + TGraph *getWaveform(Detector *detector, int ch, int station_i=0, int event_num=0, int run_num=0); - vector getWaveformVector(Detector *detector, int station_i=0, int event_num=0, int run_num=0); - vector getWaveformVectorVpol(Detector *detector, int station_i=0, int event_num=0, int run_num=0); - vector getWaveformVectorHpol(Detector *detector, int station_i=0, int event_num=0, int run_num=0); + vector getWaveformVector(Detector *detector, int station_i=0, int event_num=0, int run_num=0); + vector getWaveformVectorVpol(Detector *detector, int station_i=0, int event_num=0, int run_num=0); + vector getWaveformVectorHpol(Detector *detector, int station_i=0, int event_num=0, int run_num=0); - vector getHitTimesVector(Detector *detector, int station_i=0, int polarization=-1);// -1 for all pol, 0 for Vpol, 1: for Hpol - vector getHitTimesVectorVpol(Detector *detector, int station_i=0); - vector getHitTimesVectorHpol(Detector *detector, int station_i=0); + vector getHitTimesVector(Detector *detector, int station_i=0, int polarization=-1);// -1 for all pol, 0 for Vpol, 1: for Hpol + vector getHitTimesVectorVpol(Detector *detector, int station_i=0); + vector getHitTimesVectorHpol(Detector *detector, int station_i=0); - vector Vfft_noise_after; // noise Vfft after get_random_rician - vector Vfft_noise_before; // noise Vfft before get_random_rician - //vector V_noise_timedomain; // noise V timedomain after get_random_rician and inverse fft - double Vfft_noise_org; // V/Hz for thermal noise from Johnson-Nyquist + vector Vfft_noise_after; // noise Vfft after get_random_rician + vector Vfft_noise_before; // noise Vfft before get_random_rician + //vector V_noise_timedomain; // noise V timedomain after get_random_rician and inverse fft + double Vfft_noise_org; // V/Hz for thermal noise from Johnson-Nyquist - vector V_total_forconvlv; // vector array for pure signal diode convlv result + vector V_total_forconvlv; // vector array for pure signal diode convlv result - void clear_useless(Settings *settings1); // to reduce the size of output AraOut.root, remove some information + void clear_useless(Settings *settings1); // to reduce the size of output AraOut.root, remove some information - void delete_all(); // delete all informations test + void delete_all(); // delete all informations test - vector stations; - vector strings; + vector stations; + vector strings; - double RandomTshift; // for t-domain signal, a factor for random init time shift + double RandomTshift; // for t-domain signal, a factor for random init time shift - // test T domain waveform - //static const int outbin = 50; - static const int outbin = 64; - double Tarray[outbin]; - double Earray[outbin]; + // test T domain waveform + //static const int outbin = 50; + static const int outbin = 64; + double Tarray[outbin]; + double Earray[outbin]; - double init_T; // locate zero time at the middle and give random time shift (for interpolated waveforms) + double init_T; // locate zero time at the middle and give random time shift (for interpolated waveforms) - ClassDef(Report,1); + ClassDef(Report,1); }; From 386634d61cbfae48de191668b47a531d2b1cf99f Mon Sep 17 00:00:00 2001 From: clark2668 Date: Thu, 12 Dec 2019 14:33:32 -0500 Subject: [PATCH 05/53] add triggerDelay and mostDelay variables to Report, but do not use them yet --- Report.cc | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ Report.h | 5 +++++ log.txt | 3 +++ 3 files changed, 62 insertions(+) diff --git a/Report.cc b/Report.cc index 02d03e30..a26115d0 100644 --- a/Report.cc +++ b/Report.cc @@ -2220,6 +2220,60 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray if(settings1->TRIG_SCAN_MODE==0){// ******************** old mode left as-is ******************** + /* + We need to add some logic to deal with what happens when we are running in A2 and A3 mode + with config specific trigger delay settings + */ + + // these must always be set + for(int localchan=0; localchan<16; localchan++){ + triggerDelay[localchan]=0; + mostDelay=0; + } + + if(settings1->DETECTOR==4 && settings1->DETECTOR_STATION_LIVETIME_CONFIG>0){ // if emulating a real station, and we want config selection power + + if(settings1->DETECTOR_STATION==2){ // if station 2 + + if(settings1->DETECTOR_STATION_LIVETIME_CONFIG==2 || settings1->DETECTOR_STATION_LIVETIME_CONFIG==5){ // if config 5 or 5 in A2 + triggerDelay[4] = 81.4 + 100; + triggerDelay[5] = 73.2 + 100; + triggerDelay[6] = 15.4 + 100; + triggerDelay[7] = 7.2 + 100; + + // string 0 = D2, string 2 = D4, string3 = D1 + triggerDelay[0] = triggerDelay[8] = triggerDelay[12] = 81.4; + triggerDelay[1] = triggerDelay[9] = triggerDelay[13] = 73.2; + triggerDelay[2] = triggerDelay[10] = triggerDelay[14] = 15.4; + triggerDelay[3] = triggerDelay[11] = triggerDelay[15] = 7.2; + + mostDelay = triggerDelay[4]; + + } + } + + if(settings1->DETECTOR_STATION==3){ + + if(settings1->DETECTOR_STATION_LIVETIME_CONFIG==2 || settings1->DETECTOR_STATION_LIVETIME_CONFIG==4){ // if config 2 or 4 in A3 + + // string 0 = D2, order 0-3 BV-BH-TV-TH + triggerDelay[0] = 81.4 + 100; + triggerDelay[1] = 73.2 + 100; + triggerDelay[2] = 15.4 + 100; + triggerDelay[3] = 7.2 + 100; + + // string 1 = D3, string 2 = D4, string3 = D1 + triggerDelay[4] = triggerDelay[8] = triggerDelay[12] = 81.4; + triggerDelay[5] = triggerDelay[9] = triggerDelay[13] = 73.2; + triggerDelay[6] = triggerDelay[10] = triggerDelay[14] = 15.4; + triggerDelay[7] = triggerDelay[11] = triggerDelay[15] = 7.2; + + mostDelay = triggerDelay[0]; + + } + } + } + // avoid really long trig_window_bin case (change trig_window to check upto max_total_bin) if (max_total_bin - trig_window_bin <= trig_i) trig_window_bin = max_total_bin - trig_i -1; diff --git a/Report.h b/Report.h index d27d9095..ba8b3801 100644 --- a/Report.h +++ b/Report.h @@ -365,6 +365,11 @@ class Report { double init_T; // locate zero time at the middle and give random time shift (for interpolated waveforms) + // two parameters for controlling the trigger delay for each channel (only use in real station emulation mode) + // and a variable for setting which has the "most" delay + double triggerDelay[16]; + double mostDelay; + ClassDef(Report,1); diff --git a/log.txt b/log.txt index 8aecb4ca..9a14afee 100644 --- a/log.txt +++ b/log.txt @@ -1514,3 +1514,6 @@ Also clean-up tabs in Vector class =1,2,3,4,5 are the five configs from the A2/A3 4yr analysis >5 is not supported currently and will throw an error will also throw an error if attempt to use for stations besides 2 and 3 + +- in Report.h and Report.cc add triggerDelay and mostDelay variables, and fill them correctly, for when we need + to adjust triggering and readout parameters From 8afb844f1d13e8fe38f8dc60c7f993b9461eb78d Mon Sep 17 00:00:00 2001 From: clark2668 Date: Thu, 12 Dec 2019 16:34:50 -0500 Subject: [PATCH 06/53] slight reordering of parameters in addition, and, add offset to same noise mode triggering too --- Report.cc | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/Report.cc b/Report.cc index a26115d0..72c1e0fd 100644 --- a/Report.cc +++ b/Report.cc @@ -2292,6 +2292,13 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray trig_j = 0; while (trig_j < ch_ID ) { + int offset=0; + if(settings1->DETECTOR==4){ + // only try to calculate the offset of DETECTOR=4, and we can guarantee that there will be an entry for triggerDelay[trig_j] + // otherwise, if someone simulates an ideal station and changes the number of channels, this will segfault in a very hard to debug way + offset = int((mostDelay - triggerDelay[trig_j]) / (settings1->TIMESTEP * 1e9)); + } + int string_i = detector->getStringfromArbAntID( i, trig_j); int antenna_i = detector->getAntennafromArbAntID( i, trig_j); @@ -2310,7 +2317,7 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray if ( settings1->NOISE_CHANNEL_MODE==0) { // with threshold offset by chs - if ( trigger->Full_window[trig_j][trig_i+trig_bin] < (detector->GetThres(i, channel_num-1, settings1) * trigger->rmsdiode * detector->GetThresOffset( i, channel_num-1,settings1) ) ) { // if this channel passed the trigger! + if ( trigger->Full_window[trig_j][trig_i+trig_bin] < (detector->GetThres(i, channel_num-1, settings1) * trigger->rmsdiode * detector->GetThresOffset( i, channel_num-1,settings1) ) ) { // if this channel passed the trigger! //cout<<"trigger passed at bin "<NOISE_CHANNEL_MODE==0) { // with threshold offset by chs - if ( trigger->Full_window[trig_j][trig_i+trig_bin] < (detector->GetThres(i, channel_num-1, settings1) * trigger->rmsdiode * detector->GetThresOffset( i, channel_num-1,settings1) ) ) { // if this channel passed the trigger! + if( trig_i+offset+trig_bin >= settings1->DATA_BIN_SIZE ) break; //if trigger window hits wf end, cannot scan this channel further with this trig_i + if ( trigger->Full_window[trig_j][trig_i+trig_bin+offset] < (detector->GetThres(i, channel_num-1, settings1) * trigger->rmsdiode * detector->GetThresOffset( i, channel_num-1,settings1) ) ) { // if this channel passed the trigger! //cout<<"trigger passed at bin "<stations[i].strings[string_i].antennas[antenna_i].type == 0) { // Vpol N_pass_V++; @@ -2499,8 +2507,9 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray } else if ( settings1->NOISE_CHANNEL_MODE==1) { // with threshold offset by chs - if ( trigger->Full_window[trig_j][trig_i+trig_bin] < (detector->GetThres(i, channel_num-1, settings1) * trigger->rmsdiode_ch[channel_num-1] * detector->GetThresOffset( i, channel_num-1,settings1) ) ) { // if this channel passed the trigger! - stations[i].strings[string_i].antennas[antenna_i].Trig_Pass = trig_i+trig_bin; + if( trig_i+offset+trig_bin >= settings1->DATA_BIN_SIZE ) break; //if trigger window hits wf end, cannot scan this channel further with this trig_i + if ( trigger->Full_window[trig_j][trig_i+trig_bin+offset] < (detector->GetThres(i, channel_num-1, settings1) * trigger->rmsdiode_ch[channel_num-1] * detector->GetThresOffset( i, channel_num-1,settings1) ) ) { // if this channel passed the trigger! + stations[i].strings[string_i].antennas[antenna_i].Trig_Pass = trig_i+trig_bin+offset; N_pass++; if (detector->stations[i].strings[string_i].antennas[antenna_i].type == 0) { // Vpol N_pass_V++; From c2dd14110199ad6617a00010973dd98443eaf1c1 Mon Sep 17 00:00:00 2001 From: clark2668 Date: Thu, 12 Dec 2019 16:52:36 -0500 Subject: [PATCH 07/53] add masked trigger channel skipping for relevant config --- Report.cc | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Report.cc b/Report.cc index 72c1e0fd..cf50c29d 100644 --- a/Report.cc +++ b/Report.cc @@ -2292,6 +2292,18 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray trig_j = 0; while (trig_j < ch_ID ) { + + // need to mask out a trigger channel when necessary + // which is when emulating real station 2 in config 3-5 only + if(settings1->DETECTOR==4 && settings1->DETECTOR_STATION==2){ + if(settings1->DETECTOR_STATION_LIVETIME_CONFIG>2){ + if(trig_j==9){ + trig_j++; + continue; + } + } + } + int offset=0; if(settings1->DETECTOR==4){ // only try to calculate the offset of DETECTOR=4, and we can guarantee that there will be an entry for triggerDelay[trig_j] From 9f6beec3c9f4b2f7fa0c68ad13991c87229a77a4 Mon Sep 17 00:00:00 2001 From: clark2668 Date: Thu, 12 Dec 2019 16:54:22 -0500 Subject: [PATCH 08/53] add ability to mask relevant channels in specifica A2 configs --- log.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/log.txt b/log.txt index 9a14afee..cdd0a4ea 100644 --- a/log.txt +++ b/log.txt @@ -1517,3 +1517,5 @@ Also clean-up tabs in Vector class - in Report.h and Report.cc add triggerDelay and mostDelay variables, and fill them correctly, for when we need to adjust triggering and readout parameters + +- additionally, add trigger masking to Report.cc when in ==0 trig mode ("old" mode) for emulating station a2 in configs >2 From cbc32c497b14ed804d2701bd3fba355a197e1230 Mon Sep 17 00:00:00 2001 From: Ming-Yuan Lu Date: Thu, 19 Dec 2019 00:26:32 -0600 Subject: [PATCH 09/53] Implement Settings::USE_SIGNAL_CHAIN_LOWER_BOUND, Settings::SC_EFFICIENCY_ERROR_V, Settings::SC_EFFICIENCY_ERROR_H to switch on systematic uncertainty estimate from the signal chain measurements --- Settings.cc | 35 +++++++++++++++++++++++++++++------ Settings.h | 7 +++++++ 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/Settings.cc b/Settings.cc index 2dcb035c..966cc11f 100644 --- a/Settings.cc +++ b/Settings.cc @@ -294,6 +294,12 @@ void Settings::Initialize() { IND_NNU_THETA[100] = {0}; IND_NNU_PHI[100] = {0}; */ + + USE_SIGNAL_CHAIN_LOWER_BOUND = 0; // default: 0 -- don't replace signal chain efficiency with lower bound. 1: replace with lower bound + SC_EFFICIENCY_ERROR_V = 0.9; //Lower bound of Vpol signal chain efficiency + SC_EFFICIENCY_ERROR_H = 0.68; //Lower bound of Hpol signal chain efficiency + + } void Settings::ReadFile(string setupfile) { @@ -652,12 +658,22 @@ void Settings::ReadFile(string setupfile) { else if (label == "CUSTOM_ELECTRONICS"){ CUSTOM_ELECTRONICS = atoi(line.substr(line.find_first_of("=") + 1).c_str()); } - } - } - setFile.close(); - } - else cout<<"Unable to open "< 0){ + cerr<<"USE_SIGNAL_CHAIN_LOWER_BOUND>0 doesn't work with ANTENNA_MODE!=1"< Date: Thu, 19 Dec 2019 00:28:39 -0600 Subject: [PATCH 10/53] Implement the low-pass filter and the SC efficiency errors for USE_SIGNAL_CHAIN_LOWER_BOUND=1 --- Detector.cc | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/Detector.cc b/Detector.cc index 5d9d6ade..859751e8 100644 --- a/Detector.cc +++ b/Detector.cc @@ -2289,6 +2289,23 @@ inline void Detector::ReadVgain(string filename) { }// end ReadVgain inline void Detector::ReadVgain(string filename, Settings *settings1) { + + // Read 600MHz low-pass filter for uncertainty estimate + ifstream in; + in.open("filter7pole600MHz.txt", std::ifstream::in); + double filterValue[60]; + double filterFreq[60]; + double tempFilter, tempFilterFreq; + + if(in.good()){ + for(int i=0;i<60;i++){ + in >> tempFilterFreq >> tempFilter; + filterValue[i] = tempFilter; + filterFreq[i] = tempFilterFreq; + } + } + in.close(); + ifstream NecOut( filename.c_str() ); const int N = freq_step; double Transm[N]; @@ -2309,7 +2326,11 @@ inline void Detector::ReadVgain(string filename, Settings *settings1) { for (int j=0; jUSE_SIGNAL_CHAIN_LOWER_BOUND == 0){ //default + Vgain[i][j] = Transm[i] * atof( line.substr( 20, 33 ).c_str() ); // read gain (not dB) + } else { //systematic error estimate: 600MHz low-pass filter + SC effi. lower bound + Vgain[i][j] = Transm[i] * atof( line.substr( 20, 33 ).c_str() ) * filterValue[i] * settings1->SC_EFFICIENCY_ERROR_V; // read gain (not dB) + } Vphase[i][j] = atof( line.substr( 34 ).c_str() ); // read gain (not dB) //cout<<"VGain : "<> tempFilterFreq >> tempFilter; + filterValue[i] = tempFilter; + filterFreq[i] = tempFilterFreq; + } + } + in.close(); + + ifstream NecOut( filename.c_str() ); const int N = freq_step; @@ -2370,7 +2409,12 @@ inline void Detector::ReadVgainTop(string filename, Settings *settings1) { for (int j=0; jUSE_SIGNAL_CHAIN_LOWER_BOUND == 0){ VgainTop[i][j] = Transm[i]*atof( line.substr( 20, 33 ).c_str() ); + } else { //systematic error estimate: 600MHz low-pass filter + SC effi. lower bound + VgainTop[i][j] = Transm[i] * atof( line.substr( 20, 33 ).c_str() ) * filterValue[i] * settings1->SC_EFFICIENCY_ERROR_V; // read gain (not dB) + } + VphaseTop[i][j] = atof( line.substr( 34 ).c_str() ); // + 180.0/TMath::Pi()*TMath::ATan(-Freq[i]/500.0); // read gain (not dB) //cout<<"VGain : "<> tempFilterFreq >> tempFilter; + filterValue[i] = tempFilter; + filterFreq[i] = tempFilterFreq; + } + } + in.close(); + + ifstream NecOut( filename.c_str() ); string line; @@ -2473,7 +2535,12 @@ inline void Detector::ReadHgain(string filename, Settings *settings1) { getline (NecOut, line); //read data line //Hgain[i][j] = atof( line.substr( 20 ).c_str() ); // read gain (not dB) //Hgain[i][j] = atof( line.substr( 18, 25 ).c_str() ); // read gain (not dB) + if(settings1->USE_SIGNAL_CHAIN_LOWER_BOUND == 0){ Hgain[i][j] = Transm[i]*atof( line.substr( 20, 33 ).c_str() ); // read gain (not dB) + } else { //systematic error estimate: 600MHz low-pass filter + SC effi. lower bound + Hgain[i][j] = Transm[i] * atof( line.substr( 20, 33 ).c_str() ) * filterValue[i] * settings1->SC_EFFICIENCY_ERROR_H; // read gain (not dB) + } + Hphase[i][j] = atof( line.substr( 34 ).c_str() ); // read gain (not dB) //cout<<"HGain : "< Date: Thu, 19 Dec 2019 10:45:42 -0600 Subject: [PATCH 11/53] Added low-pass filter file --- filter7pole600MHz.txt | 60 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 filter7pole600MHz.txt diff --git a/filter7pole600MHz.txt b/filter7pole600MHz.txt new file mode 100644 index 00000000..6401c425 --- /dev/null +++ b/filter7pole600MHz.txt @@ -0,0 +1,60 @@ +83330000.000000 0.999531 +99990000.000000 0.999390 +116650000.000000 0.999234 +133310000.000000 0.999062 +149970000.000000 0.998873 +166630000.000000 0.998668 +183290000.000000 0.998443 +199950000.000000 0.998200 +216610000.000000 0.997936 +233270000.000000 0.997650 +249930000.000000 0.997338 +266590000.000000 0.996998 +283250000.000000 0.996621 +299910000.000000 0.996197 +316570000.000000 0.995704 +333230000.000000 0.995105 +349890000.000000 0.994336 +366550000.000000 0.993290 +383210000.000000 0.991792 +399870000.000000 0.989559 +416530000.000000 0.986147 +433190000.000000 0.980883 +449850000.000000 0.972766 +466510000.000000 0.960372 +483170000.000000 0.941786 +499830000.000000 0.914615 +516490000.000000 0.876203 +533150000.000000 0.824154 +549810000.000000 0.757243 +566470000.000000 0.676422 +583130000.000000 0.585408 +599790000.000000 0.490266 +616450000.000000 0.397892 +633110000.000000 0.314115 +649770000.000000 0.242475 +666430000.000000 0.184069 +683090000.000000 0.138138 +699750000.000000 0.102946 +716410000.000000 0.076457 +733070000.000000 0.056743 +749730000.000000 0.042161 +766390000.000000 0.031403 +783050000.000000 0.023470 +799710000.000000 0.017612 +816370000.000000 0.013273 +833030000.000000 0.010049 +849690000.000000 0.007643 +866350000.000000 0.005841 +883010000.000000 0.004484 +899670000.000000 0.003458 +916330000.000000 0.002679 +932990000.000000 0.002085 +949650000.000000 0.001629 +966310000.000000 0.001278 +982970000.000000 0.001007 +999630000.000000 0.000797 +1016290000.000000 0.000000 +1032950000.000000 0.000000 +1049610000.000000 0.000000 +1066270000.000000 0.000000 From 4055912fa03e6e9b66ae53e802c0456ce60cf953 Mon Sep 17 00:00:00 2001 From: Ming-Yuan Lu Date: Thu, 19 Dec 2019 11:38:12 -0600 Subject: [PATCH 12/53] Update log.txt --- log.txt | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/log.txt b/log.txt index cdd0a4ea..b421ec32 100644 --- a/log.txt +++ b/log.txt @@ -1519,3 +1519,19 @@ Also clean-up tabs in Vector class to adjust triggering and readout parameters - additionally, add trigger masking to Report.cc when in ==0 trig mode ("old" mode) for emulating station a2 in configs >2 + +============================================================================ + +2019/12/19 + +In the a23_4yr_diffuse branch, added feature to estimate signal chain efficiency uncertainty. The uncertainty is represented as a scale-down of the antenna gains consisting of a 600MHz low-pass filter and a drop in gain values by 10% and 32% for Vpol and Hpol, respectively. + +Three Settings paramters are added: +- USE_SIGNAL_CHAIN_LOWER_BOUND: default 0 - pre-scaling antenna gains, the default AraSim values. 1 - scale the gains to produce lower bound values as described above. +- SC_EFFICIENCY_ERROR_V: default 0.9 - the gain drop for Vpol to be used when USE_SIGNAL_CHAIN_LOWER_BOUND=1 +- SC_EFFICIENCY_ERROR_H: default 0.68 - the gain drop for Vpol to be used when USE_SIGNAL_CHAIN_LOWER_BOUND=1 + +One data file is added: +- filter7pole600MHz.txt: 600MHz low-pass curve data (vs freq) + + From 904c0b1251795e05d7d2f37e27b338899a7f2811 Mon Sep 17 00:00:00 2001 From: Ming-Yuan Lu Date: Thu, 19 Dec 2019 14:21:16 -0600 Subject: [PATCH 13/53] Comment out unnecessary cout's --- Detector.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Detector.cc b/Detector.cc index 859751e8..805f5dee 100644 --- a/Detector.cc +++ b/Detector.cc @@ -1966,7 +1966,7 @@ Detector::Detector(Settings *settings1, IceModel *icesurface, string setupfile) // cout<<"total station_count : "<> tempFilterFreq >> tempFilter; filterValue[i] = tempFilter; + //cout<<"filterValue: "<SC_EFFICIENCY_ERROR_H; // read gain (not dB) + //cout<<"SC effi low H: "<SC_EFFICIENCY_ERROR_H< Date: Thu, 19 Dec 2019 14:29:30 -0600 Subject: [PATCH 14/53] Check USE_SIGNAL_CHAIN_LOWER_BOUND against DETECTOR!=4 and TestBed --- Settings.cc | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Settings.cc b/Settings.cc index 966cc11f..2210f006 100644 --- a/Settings.cc +++ b/Settings.cc @@ -975,6 +975,18 @@ int Settings::CheckCompatibilities(Detector *detector) { num_err++; } + //Signal chain uncertainty estimate is only compatible with simulating with actual installed stations + if (DETECTOR != 4 && USE_SIGNAL_CHAIN_LOWER_BOUND > 0){ + cerr<<"USE_SIGNAL_CHAIN_LOWER_BOUND>0 doesn't work with DETECTOR!=4."< 0){ + cerr<<"USE_SIGNAL_CHAIN_LOWER_BOUND>0 doesn't work with DETECTOR_STATION==0. The signal chain measurements are done with ARA deep stations."< Date: Mon, 13 Jan 2020 12:40:12 -0500 Subject: [PATCH 15/53] Adding files for fig. 23 of TB paper: Attenuation lenght models, upper and lower limits --- data/atten_TB_paper_avg.txt | 34 ++++++++++++++++++++++++++++++++++ data/atten_TB_paper_lower.txt | 31 +++++++++++++++++++++++++++++++ data/atten_TB_paper_upper.txt | 29 +++++++++++++++++++++++++++++ 3 files changed, 94 insertions(+) create mode 100644 data/atten_TB_paper_avg.txt create mode 100644 data/atten_TB_paper_lower.txt create mode 100644 data/atten_TB_paper_upper.txt diff --git a/data/atten_TB_paper_avg.txt b/data/atten_TB_paper_avg.txt new file mode 100644 index 00000000..d6f49c48 --- /dev/null +++ b/data/atten_TB_paper_avg.txt @@ -0,0 +1,34 @@ +#Attenuation model in ice from https://arxiv.org/pdf/1105.2854.pdf, fig 23. Average attenuation length (blue line) +2.76e+2, 2.61e+3 +3.25e+2, 2.53e+3 +3.76e+2, 2.45e+3 +4.32e+2, 2.36e+3 +4.93e+2, 2.28e+3 +5.58e+2, 2.20e+3 +6.24e+2, 2.12e+3 +6.92e+2, 2.04e+3 +7.64e+2, 1.95e+3 +8.38e+2, 1.87e+3 +9.11e+2, 1.79e+3 +9.84e+2, 1.71e+3 +1.06e+3, 1.63e+3 +1.13e+3, 1.55e+3 +1.20e+3, 1.47e+3 +1.27e+3, 1.38e+3 +1.33e+3, 1.30e+3 +1.40e+3, 1.22e+3 +1.46e+3, 1.14e+3 +1.51e+3, 1.06e+3 +1.56e+3, 9.78e+2 +1.61e+3, 8.96e+2 +1.66e+3, 8.13e+2 +1.71e+3, 7.31e+2 +1.75e+3, 6.50e+2 +1.78e+3, 5.70e+2 +1.82e+3, 4.87e+2 +1.86e+3, 4.04e+2 +1.89e+3, 3.20e+2 +1.92e+3, 2.39e+2 +1.96e+3, 1.56e+2 +1.99e+3, 7.24e+1 +2.02e+3, 7.66e+0 diff --git a/data/atten_TB_paper_lower.txt b/data/atten_TB_paper_lower.txt new file mode 100644 index 00000000..17779608 --- /dev/null +++ b/data/atten_TB_paper_lower.txt @@ -0,0 +1,31 @@ +#Attenuation model in ice from https://arxiv.org/pdf/1105.2854.pdf, fig 23. Lower limit attenuation length +3.28e+2, 2.60e+3 +3.91e+2, 2.51e+3 +4.55e+2, 2.42e+3 +5.15e+2, 2.35e+3 +6.01e+2, 2.25e+3 +6.94e+2, 2.14e+3 +7.71e+2, 2.07e+3 +8.46e+2, 1.99e+3 +9.46e+2, 1.89e+3 +1.03e+3, 1.82e+3 +1.11e+3, 1.74e+3 +1.18e+3, 1.67e+3 +1.26e+3, 1.59e+3 +1.36e+3, 1.49e+3 +1.45e+3, 1.39e+3 +1.55e+3, 1.29e+3 +1.63e+3, 1.19e+3 +1.71e+3, 1.10e+3 +1.79e+3, 9.96e+2 +1.87e+3, 8.87e+2 +1.92e+3, 8.02e+2 +1.98e+3, 7.12e+2 +2.03e+3, 6.25e+2 +2.07e+3, 5.37e+2 +2.12e+3, 4.43e+2 +2.16e+3, 3.55e+2 +2.20e+3, 2.81e+2 +2.25e+3, 1.67e+2 +2.29e+3, 8.31e+1 +2.33e+3, 5.23e+0 diff --git a/data/atten_TB_paper_upper.txt b/data/atten_TB_paper_upper.txt new file mode 100644 index 00000000..8c0dbbe6 --- /dev/null +++ b/data/atten_TB_paper_upper.txt @@ -0,0 +1,29 @@ +#Attenuation model in ice from https://arxiv.org/pdf/1105.2854.pdf, fig 23. Upper limit attenuation length +2.60e+2, 2.60e+3 +3.13e+2, 2.51e+3 +3.70e+2, 2.41e+3 +4.42e+2, 2.30e+3 +5.10e+2, 2.21e+3 +5.85e+2, 2.11e+3 +6.70e+2, 2.00e+3 +7.55e+2, 1.90e+3 +8.34e+2, 1.80e+3 +9.21e+2, 1.70e+3 +9.98e+2, 1.60e+3 +1.08e+3, 1.50e+3 +1.16e+3, 1.40e+3 +1.24e+3, 1.29e+3 +1.31e+3, 1.20e+3 +1.37e+3, 1.11e+3 +1.43e+3, 1.02e+3 +1.47e+3, 9.41e+2 +1.52e+3, 8.56e+2 +1.57e+3, 7.54e+2 +1.60e+3, 6.86e+2 +1.64e+3, 5.98e+2 +1.68e+3, 4.98e+2 +1.72e+3, 3.96e+2 +1.76e+3, 2.82e+2 +1.80e+3, 1.84e+2 +1.84e+3, 8.81e+1 +1.87e+3, 5.81e+0 From 616f2573b61a04cbdcb448c5622c868d6b294ead Mon Sep 17 00:00:00 2001 From: Jorge Torres Date: Tue, 14 Jan 2020 10:58:01 -0500 Subject: [PATCH 16/53] Added lower and upper bounds for the attenuation length model in ice --- IceModel.cc | 434 +++++++++++++++++++++++++++++----------------------- 1 file changed, 241 insertions(+), 193 deletions(-) diff --git a/IceModel.cc b/IceModel.cc index 309cc012..eb2167a3 100644 --- a/IceModel.cc +++ b/IceModel.cc @@ -30,7 +30,7 @@ using namespace std; int nCols_ice=1200; //number of columns in data, set by header file (should be 1200) int nRows_ice=1000; //number of rows in data, set by header file (should be 1000) int cellSize=5000; //in meters, set by header file (should be 5000) - same for both files -int xLowerLeft_ice=-3000000; +int xLowerLeft_ice=-3000000; int yLowerLeft_ice=-2500000; int nCols_ground=1068; int nRows_ground=869; @@ -74,7 +74,7 @@ IceModel::~IceModel () { void IceModel::setUpIceModel(int model) { - + DEPTH_DEPENDENT_N = (int) (model / 10); model -= DEPTH_DEPENDENT_N * 10; ice_model=model; @@ -96,21 +96,21 @@ void IceModel::setUpIceModel(int model) { cerr << "Failed to open icesheet_attenlength_up.txt" << endl; exit(1); } - + i=0; while(sheetup>>d_sheetup[i]>>l_sheetup[i]) { i++; } sheetup.close(); - + ifstream shelfup("data/iceshelf_attenlength_up.txt"); if(shelfup.fail()) { cerr << "Failed to open iceshelf_attenlength_up.txt" << endl; exit(1); } - + i=0; while(shelfup>>d_shelfup[i]>>l_shelfup[i]) { @@ -129,7 +129,7 @@ void IceModel::setUpIceModel(int model) { i++; } westlandup.close(); - + //read in attenuation length for downgoing signals ifstream sheetdown("data/icesheet_attenlength_down.txt"); if(sheetdown.fail()) @@ -137,7 +137,7 @@ void IceModel::setUpIceModel(int model) { cerr << "Failed to open icesheet_attenlength_down.txt" << endl; exit(1); } - + i=0; while(sheetdown>>d_sheetdown[i]>>l_sheetdown[i]) { @@ -152,14 +152,14 @@ void IceModel::setUpIceModel(int model) { cerr << "Failed to open iceshelf_attenlength_down.txt" << endl; exit(1); } - + i=0; while(shelfdown>>d_shelfdown[i]>>l_shelfdown[i]) { i++; } shelfdown.close(); - + ifstream westlanddown("data/westland_attenlength_down.txt"); if(westlanddown.fail()) {cerr << "Failed to open westland_attenlength_down.txt"; @@ -189,14 +189,14 @@ void IceModel::setUpIceModel(int model) { if ( file.is_open() ) { while (file.good() ) { - + if ( first_time == 1 ) { for (int sl=0; slPickAnyDirection(); // first pick the neutrino direction -// +// // double mincos=cos(COASTLINE*RADDEG); // double maxcos=cos(0.); // double minphi=0.; @@ -289,14 +337,14 @@ Position IceModel::PickBalloonPosition() const { // double thisphi,thiscos,thissin; // double theta=0.; // double phi=0.; -// -// int ilon,ilat; +// +// int ilon,ilat; // int e_coord,n_coord; // double vol_thisbin=0.; // double lon=0.; // double lat=0.; -// -// +// +// // thisphi=gRandom->Rndm()*(maxphi-minphi)+minphi; // thiscos=gRandom->Rndm()*(maxcos-mincos)+mincos; // thissin=sqrt(1.-thiscos*thiscos); @@ -312,7 +360,7 @@ Position IceModel::PickBalloonPosition() const { // interaction1->wheredoesitenterice_err=0; // interaction1->toohigh=0; // interaction1->toolow=0; -// +// // thisr_in.SetXYZ(R_EARTH*thissin*cos(thisphi),R_EARTH*thissin*sin(thisphi),R_EARTH*thiscos); // if (thisr_in.Dot(interaction1->nnu)>0) // interaction1->nnu=-1.*interaction1->nnu; @@ -320,15 +368,15 @@ Position IceModel::PickBalloonPosition() const { // //cout << "lat, coastline, cos are " << thisr_in.Lat() << " " << COASTLINE << " " << cos(interaction1->nnu.Theta()) << "\n"; // if (thisr_in.Lat()>COASTLINE && cos(interaction1->nnu.Theta())<0) { // interaction1->noway=1; -// +// // interaction1->pickunbiased=0; // return 0; // there is no way it's going through the ice // } -// +// // int count1=0; // int count2=0; -// -// +// +// // if (Ray::WhereDoesItLeave(0,thisr_in,interaction1->nnu,antarctica,thisnuexitearth)) { // where does it leave Earth // // really want to find where it leaves ice // int err; @@ -339,7 +387,7 @@ Position IceModel::PickBalloonPosition() const { // thisnuexitice=thisnuexitearth; // thisr_exitice=thisnuexitearth; // if (thisnuexitice.Mag()>Surface(thisnuexitice)) { // if the exit point is above the surface -// if ((thisnuexitice.Mag()-Surface(thisnuexitice))/cos(interaction1->nnu.Theta())>5.E3) { +// if ((thisnuexitice.Mag()-Surface(thisnuexitice))/cos(interaction1->nnu.Theta())>5.E3) { // WhereDoesItExitIce(inu,thisnuexitearth,interaction1->nnu,5.E3, // then back up and find it more precisely // thisr_exitice); // thisnuexitice=(5000.)*interaction1->nnu; @@ -347,7 +395,7 @@ Position IceModel::PickBalloonPosition() const { // count1++; // } // if ((thisnuexitice.Mag()-Surface(thisnuexitice))/cos(interaction1->nnu.Theta())>5.E2) { -// +// // WhereDoesItExitIce(inu,thisnuexitice,interaction1->nnu,5.E2, // then back up and find it more precisely // thisr_exitice); // thisnuexitice=5.E2*interaction1->nnu; @@ -355,7 +403,7 @@ Position IceModel::PickBalloonPosition() const { // count1++; // } // if ((thisnuexitice.Mag()-Surface(thisnuexitice))/cos(interaction1->nnu.Theta())>50.) { -// +// // WhereDoesItExitIce(inu,thisnuexitice,interaction1->nnu,50., // then back up and find it more precisely // thisr_exitice); // count1++; @@ -364,10 +412,10 @@ Position IceModel::PickBalloonPosition() const { // } // if the exit point overshoots // else // thisnuexitice=thisnuexitearth; -// +// // // should also correct for undershooting // if (count1>10) -// cout << "count1 is " << count1 << "\n"; +// cout << "count1 is " << count1 << "\n"; // } // if it's an Antarctic ice bin // else { // it leaves a rock bin so back up and find where it leaves ice // //cout << "inu is " << inu << " it's in rock.\n"; @@ -375,11 +423,11 @@ Position IceModel::PickBalloonPosition() const { // count2++; // if (WhereDoesItExitIce(inu,thisnuexitearth,interaction1->nnu,5.E4, // then back up and find it more precisely // thisr_exitice)) { -// +// // thisnuexitice=(5.E4)*interaction1->nnu; // thisnuexitice+=thisr_exitice; // //cout << "inu is " << inu << " I'm here 1.\n"; -// +// // } // else { // interaction1->neverseesice=1; @@ -394,8 +442,8 @@ Position IceModel::PickBalloonPosition() const { // // thisnuexit=5.E4*interaction1->nnu; // // thisnuexit+=thisr_exitice; // if (thisr_in.Distance(thisnuexitice)>5.E3) { -// -// +// +// // if (WhereDoesItExitIce(inu,thisnuexitice,interaction1->nnu,5.E3, // then back up and find it more precisely // thisr_exitice)) { // count2++; @@ -404,27 +452,27 @@ Position IceModel::PickBalloonPosition() const { // thisnuexitice+=thisr_exitice; // //cout << "inu is " << inu << " I'm here 2\n"; // //return 0; -// +// // } // } // if (thisr_in.Distance(thisnuexitice)>5.E2) { -// -// +// +// // if (WhereDoesItExitIce(inu,thisnuexitice,interaction1->nnu,5.E2, // then back up and find it more precisely // thisr_exitice)) { // count2++; // //interaction1->neverseesice=1; -// +// // thisnuexitice=5.E2*interaction1->nnu; // thisnuexitice+=thisr_exitice; // //cout << "inu is " << inu << " I'm here 3\n"; // //return 0; // } -// +// // } // if (thisr_in.Distance(thisnuexitice)>50.) { -// -// +// +// // if (WhereDoesItExitIce(inu,thisnuexitice,interaction1->nnu,50., // then back up and find it more precisely // thisr_exitice)) { // //interaction1->neverseesice=1; @@ -445,14 +493,14 @@ Position IceModel::PickBalloonPosition() const { // return 0; // } // // end finding where it leaves ice -// +// // // if (thisnuexit.Mag()nnu,20., // then find it more finely // // thisr_exitice); // // thisnuexit=thisr_enterice; // // // then back up and find it more precisely // // } -// +// // if (WhereDoesItEnterIce(thisnuexitearth,interaction1->nnu,5.E3, // first pass with sort of course binning // thisr_enterice)) { // thisr_enterice_tmp=thisr_enterice+5.E3*interaction1->nnu; @@ -479,7 +527,7 @@ Position IceModel::PickBalloonPosition() const { // } // interaction1->nuexitice=thisnuexitice; // interaction1->r_enterice=thisr_enterice; -// +// // if (interaction1->posnu.Mag()-Surface(interaction1->posnu)>0) { // interaction1->toohigh=1; // //cout << "inu, toohigh is " << inu << " " << interaction1->toohigh << "\n"; @@ -491,25 +539,25 @@ Position IceModel::PickBalloonPosition() const { // //cout << "inu, toolow is " << inu << " " << interaction1->toolow << "\n"; // interaction1->pickunbiased = 0; // return 0; -// } +// } // interaction1->pickunbiased = 1; // return 1; -// +// // } -//-------------------------------------------------- +//-------------------------------------------------- //-------------------------------------------------- // int IceModel::PickNear() { // } -//-------------------------------------------------- +//-------------------------------------------------- Vector IceModel::GetSurfaceNormal(const Position &r_out) const { Vector n_surf = r_out.Unit(); - if (FLATSURFACE) + if (FLATSURFACE) return n_surf; if (ice_model==0) { @@ -517,29 +565,29 @@ Vector IceModel::GetSurfaceNormal(const Position &r_out) const { int ilon,ilat; GetILonILat(r_out,ilon,ilat); - + int ilon_previous=ilon-1; if (ilon_previous<0) ilon_previous=NLON-1; - + int ilon_next=ilon+1; if (ilon_next==NLON) ilon_next=0; - + double r=(geoid[ilat]+surfacer[ilon][ilat])*sin(theta); - + double slope_phi=(surfacer[ilon_next][ilat]-surfacer[ilon_previous][ilat])/(r*2*phistep); - + int ilat_previous=ilat-1; if (ilat_previous<0) ilat_previous=0; - + int ilat_next=ilat+1; if (ilat_next==NLAT) ilat_next=NLAT-1; - + double slope_costheta=(surfacer[ilon][ilat_next]-surfacer[ilon][ilat_previous])/((geoid[ilat]+surfacer[ilon][ilat])*2*thetastep); - + // first rotate n_surf according to tilt in costheta and position on continent - rotate around the y axis. double angle=atan(slope_costheta); @@ -547,7 +595,7 @@ Vector IceModel::GetSurfaceNormal(const Position &r_out) const { // now rotate n_surf according to tilt in phi - rotate around the z axis. angle=atan(slope_phi); - + n_surf = n_surf.RotateZ(angle); } //end if(Crust 2.0) else if (ice_model==1) { @@ -562,8 +610,8 @@ Vector IceModel::GetSurfaceNormal(const Position &r_out) const { lat_next = lat + dist_to_check * (180 / (local_surface_elevation * PI)); //the latitude 7.5 km south of the interaction lat_prev = lat - dist_to_check * (180 / (local_surface_elevation * PI)); //the latitude 7.5 km north of the interaction - lon_next = lon + dist_to_check * (180 / (sin(lat*RADDEG) * local_surface_elevation * PI)); - lon_prev = lon - dist_to_check * (180 / (sin(lat*RADDEG) * local_surface_elevation * PI)); + lon_next = lon + dist_to_check * (180 / (sin(lat*RADDEG) * local_surface_elevation * PI)); + lon_prev = lon - dist_to_check * (180 / (sin(lat*RADDEG) * local_surface_elevation * PI)); if (lat_next > 90) { //cout<<"lat_next is > 90"<COASTLINE) + if (lat>COASTLINE) left_edge=1; - + rock2=pow((local_surface - IceThickness(lon,lat) - WaterDepth(lon,lat)),2); - surface2=pow(local_surface,2); + surface2=pow(local_surface,2); if (ice_model==0) { if ((int)(lat)==COASTLINE && rock_previous2 < x2 && surface2 > x2) @@ -666,7 +714,7 @@ Position IceModel::WhereDoesItEnterIce(const Position &posnu, if ((x_previous2>rock_previous2 && x2surface2) || left_edge) { - + r_enterice = x; // this gets you out of the loop. distance=3*Geoid(lat); @@ -699,30 +747,30 @@ Position IceModel::WhereDoesItEnter(const Position &posnu,const Vector &nnu) con double p = posnu.Mag(); // radius of interaction double costheta = (nnu*posnu) / p; // theta of neutrino at interaction position double sintheta = sqrt(1-costheta*costheta); - + double lon = posnu.Lon(); double lat = posnu.Lat(); - + double a=0; // length of chord - + double R = Surface(lon,lat); double delta = R - p; // depth of the interaction // if interaction occurs below surface, as it should - + if (delta>-0.001) { a=p*costheta+sqrt(R*R*costheta*costheta+2*delta*R*sintheta*sintheta); // chord length if (a<0) { cout << "Negative chord length: " << a << "\n"; } //end if - } //end if (interaction below surface) + } //end if (interaction below surface) else if (delta<=-0.001) { - + //cout << "Error in interaction position. whichray is " << whichray << "\n"; // cout << "lon, lat from WhereDoesItEnter is " << " " << lon << " " << lat << "\n"; // cout << "geoid, surface, p, surface-p are " << Geoid(lat) << " " << Surface(lon,lat) << ", " << p << " , "<<(Surface(lon,lat)-p)<<"\n"; - + } //else if: error: interaction takes place above the surface - + // first approx Position r_in = posnu - a*nnu; @@ -732,7 +780,7 @@ Position IceModel::WhereDoesItEnter(const Position &posnu,const Vector &nnu) con // delta = r_in.Mag() - Surface( r_in ); // r_in = r_in + (delta * nnu); //} - + delta = r_in.Mag() - Surface( r_in ); while ( fabs(delta) >= 0.1 ) { r_in = r_in + (delta * nnu); @@ -745,12 +793,12 @@ Position IceModel::WhereDoesItEnter(const Position &posnu,const Vector &nnu) con } } - + //lon = r_in.Lon(); //lat = r_in.Lat(); - + //r_in = Surface(lon,lat) * r_in.Unit(); - + return r_in; } //method WhereDoesItEnter @@ -764,16 +812,16 @@ int IceModel::WhereDoesItEnter_sphere(const Position &sphere_in, const Vector &n double p = sphere_in.Mag(); // radius of interaction double costheta = (nnu*sphere_in) / p; // theta of neutrino at interaction position double sintheta = sqrt(1-costheta*costheta); - + double lon = sphere_in.Lon(); double lat = sphere_in.Lat(); - + double a=0; // length of chord - + double R = Surface(lon,lat); double delta = R - p; // depth of the interaction // if interaction occurs below surface, as it should - + // if sphere_in is inside the earth @@ -787,17 +835,17 @@ int IceModel::WhereDoesItEnter_sphere(const Position &sphere_in, const Vector &n // first approx r_in = sphere_in - a*nnu; - } //end if (sphere_in below surface) + } //end if (sphere_in below surface) // if sphere_in is outside the earth else if (delta<=-0.001) { - + // D : shortest distance between earth center and neutrino trajectory Position D = sphere_in + (p*costheta)*nnu; // neutrino pass through the earth if ( D.Mag() < Surface(D) ) { - + // first approx r_in = sphere_in - (sqrt(R*R-D.Mag()*D.Mag())+costheta*p)*nnu; } @@ -805,9 +853,9 @@ int IceModel::WhereDoesItEnter_sphere(const Position &sphere_in, const Vector &n else { return 0; } - + } //else if (sphere_in above surface) - + int iter = 0; // now do correction 3 times @@ -815,7 +863,7 @@ int IceModel::WhereDoesItEnter_sphere(const Position &sphere_in, const Vector &n // delta = r_in.Mag() - Surface( r_in ); // r_in = r_in + (delta * nnu); //} - + delta = r_in.Mag() - Surface( r_in ); while ( fabs(delta) >= 0.1 ) { r_in = r_in + (delta * nnu); @@ -845,37 +893,37 @@ Position IceModel::WhereDoesItLeave(const Position &posnu,const Vector &nnu) con double p = posnu.Mag(); // radius of interaction double costheta = (nnu*posnu) / p; // theta of neutrino at interaction position double sintheta = sqrt(1-costheta*costheta); - + double lon = posnu.Lon(); double lat = posnu.Lat(); - + double a=0; // length of chord - + double R = Surface(lon,lat); double delta = R - p; // depth of the interaction // if interaction occurs below surface, as it should - + if (delta>-0.001) { a=sqrt(R*R*costheta*costheta+2*delta*R*sintheta*sintheta) - p*costheta; // chord length if (a<0) { cout << "Negative chord length: " << a << "\n"; } //end if - } //end if (interaction below surface) + } //end if (interaction below surface) else if (delta<=-0.001) { - + //cout << "Error in interaction position. whichray is " << whichray << "\n"; // cout << "lon, lat from WhereDoesItLeave is " << " " << lon << " " << lat << "\n"; // cout << "geoid, surface, p, surface-p are " << Geoid(lat) << " " << Surface(lon,lat) << " " << p << " , "<<(Surface(lon,lat)-p)<<"\n"; - + } //else if: error: interaction takes place above the surface - + Position r_in = posnu + a*nnu; - + lon = r_in.Lon(); lat = r_in.Lat(); - + r_in = Surface(lon,lat) * r_in.Unit(); - + return r_in; } //method WhereDoesItLeave @@ -893,56 +941,56 @@ Position IceModel::WhereDoesItLeave(const Position &posnu,const Vector &nnu) con // // see my geometry notes. // // parameterize the neutrino trajectory and just see where it // // crosses the earth radius. -// +// // // Position r_enterice; // double distance=0; // int left_edge=0; // Position x = posnu; // double x2; -// +// // Position x_previous = posnu; -// +// // double x_previous2= x_previous * x_previous; // x2=x_previous2; -// +// // double lon = x.Lon(),lat = x.Lat(); // double lon_old = lon,lat_old = lat; // double local_surface = Surface(lon,lat); // double rock_previous2= pow((local_surface - IceThickness(lon,lat) - WaterDepth(lon,lat)),2); // double surface_previous2=pow(local_surface,2); -// +// // double rock2=rock_previous2; // double surface2=surface_previous2; // int foundit=0; // keeps track of whether you found an ice entrance point -// +// // // cout << "lon, lat are " << posnu.Lon() << " " << posnu.Lat() << "\n"; // //cout << "x2 at start is " << x2 << "\n"; // while (distance<2*local_surface+1000) { -// +// // distance+=stepsize; -// +// // x -= stepsize*nnu; // x2=x*x; // //cout << "x2 is " << x2 << "\n"; // lon = x.Lon(); // lat = x.Lat(); -// +// // double ice_thickness=IceThickness(lon,lat); // if (lon!=lon_old || lat!=lat_old) { // local_surface = Surface(lon,lat); -// -// //if (lat>COASTLINE) +// +// //if (lat>COASTLINE) // //left_edge=1; -// +// // rock2=pow((local_surface - IceThickness(lon,lat) - WaterDepth(lon,lat)),2); -// surface2=pow(local_surface,2); -// +// surface2=pow(local_surface,2); +// // if (ice_model==0) { // if ((int)(lat)==COASTLINE && rock_previous2 < x2 && surface2 > x2) // left_edge=1; // } //if (Crust 2.0) // } //if (neutrino has stepped into new lon/lat bin) -// +// // if ((((x_previous2>rock_previous2 && x2surface2)) && ice_thickness>0 && latCOASTLINE) +// +// //if (lat>COASTLINE) // //left_edge=1; -// +// // rock2=pow((local_surface - IceThickness(lon,lat) - WaterDepth(lon,lat)),2); -// surface2=pow(local_surface,2); -// +// surface2=pow(local_surface,2); +// // if (ice_model==0) { // if ((int)(lat)==COASTLINE && rock_previous2 < x2 && surface2 > x2) // left_edge=1; // } //if (Crust 2.0) // } //if (neutrino has stepped into new lon/lat bin) -// +// // if (inu==1491 && nsteps<10) // cout << "inu, x_previous2, rock_previous2, x2, rock2 are " << inu << " " << x_previous2 << " " << rock_previous2 << " " << x2 << " " << rock2 << "\n"; -// +// // if ((((x_previous2rock2) // crosses rock boundary from above // || (x_previous2>surface_previous2 && x20 && lat=174&&ilat>=4&&ilat<=5) return 1; - else + else return 0; } @@ -1262,9 +1310,9 @@ double IceModel::GetN(double altitude) const { double b1=0.0140157; double n=0; - if (altitude < FIRNDEPTH) + if (altitude < FIRNDEPTH) n=NICE; - else if (altitude >= FIRNDEPTH && altitude <=0 && DEPTH_DEPENDENT_N) + else if (altitude >= FIRNDEPTH && altitude <=0 && DEPTH_DEPENDENT_N) // N_DEPTH=NFIRN-(4.6198+13.62*(altitude_int/1000.))* //(altitude_int/1000.); // Besson's equation for n(z) n=NFIRN+a1*(1.0-exp(b1*altitude)); // Peter's equation for n(z) @@ -1283,25 +1331,25 @@ double IceModel::GetN(const Position &pos) const{ double IceModel::EffectiveAttenuationLength(const Position &pos,const int &whichray) const { double localmaxdepth = IceThickness(pos); double depth = Surface(pos) - pos.Mag(); - + int depth_index=0; double attenuation_length=0.0; // if (inu<10) { // cout << "pos is ";pos.Print(); // cout << "surface is " << Surface(pos) << "\n"; // } - if(WestLand(pos) && !CONSTANTICETHICKNESS) + if(WestLand(pos) && !CONSTANTICETHICKNESS) { depth_index=int(depth*419.9/localmaxdepth);//use 420 m ice shelf attenuation length data as the standard, squeeze or stretch if localmaxdepth is longer or shorter than 420m. - if(RossIceShelf(pos) || RonneIceShelf(pos)) - { + if(RossIceShelf(pos) || RonneIceShelf(pos)) + { if(whichray==0) attenuation_length=l_shelfup[depth_index]; else if(whichray==1) attenuation_length=l_shelfdown[depth_index]; else cerr << " wrong attenuation length " <MOOREBAY)//if use Moore's Bay measured data for the west land attenuation_length*=1.717557; //about 450 m (field attenuation length) for one whole way when assuming -3dB for the power loss at the bottom } else //in east antarctica or constant ice thickness - { + { // if (inu<10) { // cout << "localmaxdepth is " << localmaxdepth << "\n"; // cout << "depth is " << depth << "\n"; @@ -1413,7 +1461,7 @@ double IceModel::EffectiveAttenuationLength(Settings *settings1, const Position double IceModel::Area(double latitude) const { - //Returns the area of one square of the BEDMAP data at a given latitude. + //Returns the area of one square of the BEDMAP data at a given latitude. double lat_rad = (90 - latitude) * RADDEG; return (pow(cellSize* ((1 + sin(71*RADDEG)) / (1 + sin(lat_rad))),2)); @@ -1501,7 +1549,7 @@ void IceModel::ENtoLonLat(int e_coord, int n_coord, double xLowerLeft, double yL // if (lon>160 && lon<165) //cout << "e_coord, n_coord, easting, northing, lon are " << e_coord << " " << n_coord << " " << easting << " " << northing << " " << lon << "\n"; return; - + } //method ENtoLonLat void IceModel::IceENtoLonLat(int e, int n, double& lon, double& lat) const { @@ -1538,11 +1586,11 @@ void IceModel::ReadIceThickness() { string tempBuf5; string tempBuf6; int temp1,temp2,temp3,temp4,temp5,temp6; - - IceThicknessFile >> tempBuf1 >> temp1 >> tempBuf2 >> temp2 - >> tempBuf3 >> temp3 >> tempBuf4 >> temp4 + + IceThicknessFile >> tempBuf1 >> temp1 >> tempBuf2 >> temp2 + >> tempBuf3 >> temp3 >> tempBuf4 >> temp4 >> tempBuf5 >> temp5 >> tempBuf6 >> temp6; - + if(tempBuf1 == string("ncols")) { nCols_ice=temp1; } @@ -1563,7 +1611,7 @@ void IceModel::ReadIceThickness() { } //cout<<"nCols_ice, nRows_ice "<> tempBuf1 >> temp1 >> tempBuf2 >> temp2 - >> tempBuf3 >> temp3 >> tempBuf4 >> temp4 + + GroundBedFile >> tempBuf1 >> temp1 >> tempBuf2 >> temp2 + >> tempBuf3 >> temp3 >> tempBuf4 >> temp4 >> tempBuf5 >> temp5 >> tempBuf6 >> temp6; - + if(tempBuf1 == string("ncols")) { nCols_ground=temp1; } @@ -1621,12 +1669,12 @@ void IceModel::ReadGroundBed() { //cout<<"nCols_ground, nRows_ground "<> theValue; - + if(theValue==NODATA) theValue=0; //Set elevation to 0 where we have no data. ground_elevation[colNum][rowNum] = double(theValue); @@ -1634,7 +1682,7 @@ void IceModel::ReadGroundBed() { //cout<<"ground_elevation: "<> tempBuf1 >> temp1 >> tempBuf2 >> temp2 - >> tempBuf3 >> temp3 >> tempBuf4 >> temp4 + + WaterDepthFile >> tempBuf1 >> temp1 >> tempBuf2 >> temp2 + >> tempBuf3 >> temp3 >> tempBuf4 >> temp4 >> tempBuf5 >> temp5 >> tempBuf6 >> temp6; - + if(tempBuf1 == string("ncols")) { nCols_water=temp1; } @@ -1682,18 +1730,18 @@ void IceModel::ReadWaterDepth() { //cout<<"nCols_water, nRows_water "<> theValue; - + if(theValue==NODATA) theValue=0; //Set depth to 0 where we have no data. water_depth[colNum][rowNum] = double(theValue); }//for }//for - + WaterDepthFile.close(); return; } //method ReadWaterDepth @@ -1809,7 +1857,7 @@ void IceModel::GetFresnel ( //void IceModel::FillArraysforTree(double icethck[1200][1000],double elev[1068][869],double lon_ground[1068][869],double lat_ground[1068][869],double lon_ice[1200][1000],double lat_ice[1200][1000],double h20_depth[1200][1000],double lon_water[1200][1000],double lat_water[1200][1000]) { // void IceModel::FillArraysforTree(double lon_ground[1068][869],double lat_ground[1068][869],double lon_ice[1200][1000],double lat_ice[1200][1000],double lon_water[1200][1000],double lat_water[1200][1000]) { - + // for (int rowNum=0;rowNumIceENtoLonLat(i,j,test1,test2); //Recall that the e / n coordinates in horizon were picked from the ground bed array. // //icethck[colNum][rowNum]=IceThickness(lon_ice[colNum][rowNum],lat_ice[colNum][rowNum]); - + // // WaterENtoLonLat(colNum,rowNum,lon_water[colNum][rowNum],lat_water[colNum][rowNum]); // //h20_depth[colNum][rowNum]=WaterDepth(lon_water[colNum][rowNum],lat_water[colNum][rowNum]); From 0af9a1f83df982954190b66ffcda3091e232c67a Mon Sep 17 00:00:00 2001 From: Jorge Torres Date: Tue, 14 Jan 2020 11:04:04 -0500 Subject: [PATCH 17/53] gitignore --- .gitignore | 1 + IceModel.cc | 48 ------------------------------------------------ 2 files changed, 1 insertion(+), 48 deletions(-) diff --git a/.gitignore b/.gitignore index 33c69fad..77fa84c2 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ eventSimDict.C eventSimDict.h AraSim +*.ipynb \ No newline at end of file diff --git a/IceModel.cc b/IceModel.cc index eb2167a3..daeae704 100644 --- a/IceModel.cc +++ b/IceModel.cc @@ -224,58 +224,10 @@ if ( file.is_open() ) { // done reading ARA ice attenuation info */ - //Average line, refer to http://ara.physics.wisc.edu/docs/0010/001034/001/AraSimBugFix_Systematics_update.pdf, p.23 double ARA_IceAtten_Depth_tmp[53] = { 72.7412, 76.5697, 80.3982, 91.8836, 95.7121, 107.198, 118.683, 133.997, 153.139, 179.939, 206.738, 245.023, 298.622, 356.049, 405.819, 470.904, 516.845, 566.616, 616.386, 669.985, 727.412, 784.839, 838.438, 899.694, 949.464, 1003.06, 1060.49, 1121.75, 1179.17, 1236.6, 1297.86, 1347.63, 1405.05, 1466.31, 1516.08, 1565.85, 1611.79, 1657.73, 1699.85, 1745.79, 1791.73, 1833.84, 1883.61, 1929.56, 1990.81, 2052.07, 2109.49, 2170.75, 2232.01, 2304.75, 2362.17, 2431.09, 2496.17 }; double ARA_IceAtten_Length_tmp[53] = { 1994.67, 1952, 1896, 1842.67, 1797.33, 1733.33, 1680, 1632, 1586.67, 1552, 1522.67, 1501.33, 1474.67, 1458.67, 1437.33, 1416, 1392, 1365.33, 1344, 1312, 1274.67, 1242.67, 1205.33, 1168, 1128, 1090.67, 1048, 1008, 965.333, 920, 874.667, 834.667, 797.333, 752, 714.667, 677.333, 648, 616, 589.333, 557.333, 530.667, 506.667, 477.333, 453.333, 418.667, 389.333, 362.667, 333.333, 309.333, 285.333, 264, 242.667, 221.333 }; - //Lower bound (in the plot sense) - //if lower bound, then - double ARA_IceAtten_Depth_tmp[53] = - { 171. , 189. , 258.44, 358.67, 455.76, 572.28, 635.86, - 687.97, 746.55, 795.13, 839.62, 871.98, 898.61, 914.15, - 934.88, 960.2 , 991.4 , 1025.34, 1049.71, 1086.29, 1125.33, - 1157.33, 1194.67, 1232. , 1272. , 1310.88, 1360.67, 1411.97, - 1464.5 , 1512.58, 1561.93, 1603.87, 1640. , 1693.15, 1739.18, - 1792.38, 1829.23, 1858.77, 1885.91, 1937.53, 1980.5 , 2016.73, - 2061.24, 2105.99, 2170.81, 2242.16, 2299.54, 2358.97, 2405.13, - 2450. , 2450. , 2450. , 2450. } - - double ARA_IceAtten_Length_tmp[53] = - { 1994.67 , 1952. , 1896. , 1842.67 , 1797.33 , 1733.33 , - 1680. , 1632. , 1586.67 , 1552. , 1522.67 , 1501.33 , - 1474.67 , 1458.67 , 1437.33 , 1416. , 1392. , 1365.33 , - 1344. , 1312. , 1274.67 , 1242.67 , 1205.33 , 1168. , - 1128. , 1090.67 , 1048. , 1008. , 965.333, 920. , - 874.667, 834.667, 797.333, 752. , 714.667, 677.333, - 648. , 616. , 589.333, 557.333, 530.667, 506.667, - 477.333, 453.333, 418.667, 389.333, 362.667, 333.333, - 309.333, 285.333, 264. , 242.667, 221.333 } - - //Upper bound - //if upper bound, then - - double ARA_IceAtten_Depth_tmp[53] = - { 79.9 , 81.78, 85.3 , 87.97, 91.87, 97.73, 101.95, - 109.4 , 123. , 132.93, 141.24, 146.53, 153.01, 156.89, - 168.5 , 184.5 , 202.5 , 245.45, 281.28, 362.2 , 471.68, - 543.39, 616.38, 690.4 , 774.4 , 844.08, 915.73, 978.51, - 1040.76, 1110.94, 1179.05, 1236.19, 1291.15, 1359.48, 1417.41, - 1473.23, 1517.01, 1557.5 , 1591.21, 1649.39, 1697.74, 1740.59, - 1792.54, 1829.06, 1892.58, 1959.24, 2017.25, 2082.31, 2137.69, - 2194.45, 2245.24, 2302.73, 2369.08} - - double ARA_IceAtten_Length_tmp[53] = - { 1994.67 , 1952. , 1896. , 1842.67 , 1797.33 , 1733.33 , - 1680. , 1632. , 1586.67 , 1552. , 1522.67 , 1501.33 , - 1474.67 , 1458.67 , 1437.33 , 1416. , 1392. , 1365.33 , - 1344. , 1312. , 1274.67 , 1242.67 , 1205.33 , 1168. , - 1128. , 1090.67 , 1048. , 1008. , 965.333, 920. , - 874.667, 834.667, 797.333, 752. , 714.667, 677.333, - 648. , 616. , 589.333, 557.333, 530.667, 506.667, - 477.333, 453.333, 418.667, 389.333, 362.667, 333.333, - 309.333, 285.333, 264. , 242.667, 221.333 } - ARA_IceAtten_bin = 53; for (int bin=0; bin Date: Tue, 14 Jan 2020 11:15:39 -0500 Subject: [PATCH 18/53] Added upper/lower bounds for ice attenuation model --- IceModel.cc | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 51 insertions(+), 3 deletions(-) diff --git a/IceModel.cc b/IceModel.cc index 54084a34..87a004bb 100644 --- a/IceModel.cc +++ b/IceModel.cc @@ -225,9 +225,57 @@ if ( file.is_open() ) { */ //The following hardcoded numbers correspond to a model derived by Eugene Hong, based on ice attenuation measurements (c.f. TestBed paper). This is the default mode usedf by AraSim. //More details can be found on Eugene's Thesis: http://radiorm.physics.ohio-state.edu/elog/Write-Ups/170504_105713/Thesis_-_Eugene_Hong.pdf, p. 54 and 132. - double ARA_IceAtten_Depth_tmp[53] = { 72.7412, 76.5697, 80.3982, 91.8836, 95.7121, 107.198, 118.683, 133.997, 153.139, 179.939, 206.738, 245.023, 298.622, 356.049, 405.819, 470.904, 516.845, 566.616, 616.386, 669.985, 727.412, 784.839, 838.438, 899.694, 949.464, 1003.06, 1060.49, 1121.75, 1179.17, 1236.6, 1297.86, 1347.63, 1405.05, 1466.31, 1516.08, 1565.85, 1611.79, 1657.73, 1699.85, 1745.79, 1791.73, 1833.84, 1883.61, 1929.56, 1990.81, 2052.07, 2109.49, 2170.75, 2232.01, 2304.75, 2362.17, 2431.09, 2496.17 }; - - double ARA_IceAtten_Length_tmp[53] = { 1994.67, 1952, 1896, 1842.67, 1797.33, 1733.33, 1680, 1632, 1586.67, 1552, 1522.67, 1501.33, 1474.67, 1458.67, 1437.33, 1416, 1392, 1365.33, 1344, 1312, 1274.67, 1242.67, 1205.33, 1168, 1128, 1090.67, 1048, 1008, 965.333, 920, 874.667, 834.667, 797.333, 752, 714.667, 677.333, 648, 616, 589.333, 557.333, 530.667, 506.667, 477.333, 453.333, 418.667, 389.333, 362.667, 333.333, 309.333, 285.333, 264, 242.667, 221.333 }; + double ARA_IceAtten_Depth_tmp[53] = { 72.7412, 76.5697, 80.3982, 91.8836, 95.7121, 107.198, 118.683, 133.997, 153.139, 179.939, 206.738, 245.023, 298.622, 356.049, 405.819, 470.904, 516.845, 566.616, 616.386, 669.985, 727.412, 784.839, 838.438, 899.694, 949.464, 1003.06, 1060.49, 1121.75, 1179.17, 1236.6, 1297.86, 1347.63, 1405.05, 1466.31, 1516.08, 1565.85, 1611.79, 1657.73, 1699.85, 1745.79, 1791.73, 1833.84, 1883.61, 1929.56, 1990.81, 2052.07, 2109.49, 2170.75, 2232.01, 2304.75, 2362.17, 2431.09, 2496.17 }; + + double ARA_IceAtten_Length_tmp[53] = { 1994.67, 1952, 1896, 1842.67, 1797.33, 1733.33, 1680, 1632, 1586.67, 1552, 1522.67, 1501.33, 1474.67, 1458.67, 1437.33, 1416, 1392, 1365.33, 1344, 1312, 1274.67, 1242.67, 1205.33, 1168, 1128, 1090.67, 1048, 1008, 965.333, 920, 874.667, 834.667, 797.333, 752, 714.667, 677.333, 648, 616, 589.333, 557.333, 530.667, 506.667, 477.333, 453.333, 418.667, 389.333, 362.667, 333.333, 309.333, 285.333, 264, 242.667, 221.333 }; + + + //Lower bound (in the plot sense) + //if lower bound, then + double ARA_IceAtten_Depth_tmp[53] = + { 171. , 189. , 258.44, 358.67, 455.76, 572.28, 635.86, + 687.97, 746.55, 795.13, 839.62, 871.98, 898.61, 914.15, + 934.88, 960.2 , 991.4 , 1025.34, 1049.71, 1086.29, 1125.33, + 1157.33, 1194.67, 1232. , 1272. , 1310.88, 1360.67, 1411.97, + 1464.5 , 1512.58, 1561.93, 1603.87, 1640. , 1693.15, 1739.18, + 1792.38, 1829.23, 1858.77, 1885.91, 1937.53, 1980.5 , 2016.73, + 2061.24, 2105.99, 2170.81, 2242.16, 2299.54, 2358.97, 2405.13, + 2450. , 2450. , 2450. , 2450. } + + double ARA_IceAtten_Length_tmp[53] = + { 1994.67 , 1952. , 1896. , 1842.67 , 1797.33 , 1733.33 , + 1680. , 1632. , 1586.67 , 1552. , 1522.67 , 1501.33 , + 1474.67 , 1458.67 , 1437.33 , 1416. , 1392. , 1365.33 , + 1344. , 1312. , 1274.67 , 1242.67 , 1205.33 , 1168. , + 1128. , 1090.67 , 1048. , 1008. , 965.333, 920. , + 874.667, 834.667, 797.333, 752. , 714.667, 677.333, + 648. , 616. , 589.333, 557.333, 530.667, 506.667, + 477.333, 453.333, 418.667, 389.333, 362.667, 333.333, + 309.333, 285.333, 264. , 242.667, 221.333 } + + //Upper bound + //if upper bound, then + + double ARA_IceAtten_Depth_tmp[53] = + { 79.9 , 81.78, 85.3 , 87.97, 91.87, 97.73, 101.95, + 109.4 , 123. , 132.93, 141.24, 146.53, 153.01, 156.89, + 168.5 , 184.5 , 202.5 , 245.45, 281.28, 362.2 , 471.68, + 543.39, 616.38, 690.4 , 774.4 , 844.08, 915.73, 978.51, + 1040.76, 1110.94, 1179.05, 1236.19, 1291.15, 1359.48, 1417.41, + 1473.23, 1517.01, 1557.5 , 1591.21, 1649.39, 1697.74, 1740.59, + 1792.54, 1829.06, 1892.58, 1959.24, 2017.25, 2082.31, 2137.69, + 2194.45, 2245.24, 2302.73, 2369.08} + + double ARA_IceAtten_Length_tmp[53] = + { 1994.67 , 1952. , 1896. , 1842.67 , 1797.33 , 1733.33 , + 1680. , 1632. , 1586.67 , 1552. , 1522.67 , 1501.33 , + 1474.67 , 1458.67 , 1437.33 , 1416. , 1392. , 1365.33 , + 1344. , 1312. , 1274.67 , 1242.67 , 1205.33 , 1168. , + 1128. , 1090.67 , 1048. , 1008. , 965.333, 920. , + 874.667, 834.667, 797.333, 752. , 714.667, 677.333, + 648. , 616. , 589.333, 557.333, 530.667, 506.667, + 477.333, 453.333, 418.667, 389.333, 362.667, 333.333, + 309.333, 285.333, 264. , 242.667, 221.333 } ARA_IceAtten_bin = 53; From 8ac9f3f9818b75d21bd60c678b7a87158df287a9 Mon Sep 17 00:00:00 2001 From: Jorge Torres Date: Tue, 14 Jan 2020 17:26:19 -0500 Subject: [PATCH 19/53] Finished adding upper and lower uncertainties for the attenuation length model --- #AraSim.cc# | 829 ++++++++++++++++++++++++++++++++++++++++++++++++++++ IceModel.cc | 92 +++--- IceModel.h | 56 ++-- Settings.cc | 73 ++--- Settings.h | 64 ++-- log.txt | 77 ++--- 6 files changed, 1016 insertions(+), 175 deletions(-) create mode 100644 #AraSim.cc# diff --git a/#AraSim.cc# b/#AraSim.cc# new file mode 100644 index 00000000..17e9f62a --- /dev/null +++ b/#AraSim.cc# @@ -0,0 +1,829 @@ +// ROOT includes +#include "TFile.h" +#include "TRandom3.h" +#include "TTree.h" + +// AraSim includes +//vector and position must be first +#include "Vector.h" +#include "Position.h" + +#include "Constants.h" +#include "counting.hh" +#include "Detector.h" +#include "EarthModel.h" +#include "Efficiencies.h" +#include "Event.h" +#include "IceModel.h" +#include "Primaries.h" +#include "Ray.h" +#include "Report.h" +#include "RaySolver.h" +#include "secondaries.hh" +#include "Settingsude "signal.hh" +#include "Spectra.h" +#include "Tools.h" +#include "Trigger.h" + +using namespace std; + +#ifdef ARA_UTIL_EXISTS + #include "UsefulIcrrStationEvent.h" + ClassImp(UsefulIcrrStationEvent); + #include "UsefulAtriStationEvent.h" + ClassImp(UsefulAtriStationEvent); +#endif + +class EarthModel; //class + +void test(); + +string outputdir="outputs"; + +int main(int argc, char **argv) { // read setup.txt file + + Settings *settings1 = new Settings(); + + cout<<"\n\tDefault values!"<NNU<ICE_MODEL<NOFZ<CONSTANTICETHICKNESS<FIXEDELEVATION<MOOREBAY<EXPONENT<DETECTOR< 1) { // read file!! + setupfile = string( argv[1] ); + cout<<"setupfile : "< 2) { // read file!! + run_no = string( argv[2] ); + cout<<"run number : "< 3) { // read file!! + outputdir = string( argv[3] ); + if(outputdir[outputdir.size()-1]=='/') outputdir=outputdir.substr(0,outputdir.size()-1); // make sure outputdir doesn't have a / at the end + cout<<"outputdir : "< 2! + // cout<<"too many info! just use default setup.txt file!"<ReadFile(setupfile); + cout<<"Read "<NNU<ICE_MODEL<NOFZ<CONSTANTICETHICKNESS<FIXEDELEVATION<MOOREBAY<EXPONENT<DETECTOR<POSNU_RADIUS<EVENT_GENERATION_MODE << endl; + // cout << "EVENT_NUM: " << settings1->EVENT_NUM << endl; + + if (settings1->EVENT_GENERATION_MODE == 1){ + // string evtfile = "eventReadIn.txt"; + string evtfile = string(argv[argc - 1]); + settings1->ReadEvtFile(evtfile); + cout<<"Read "<< evtfile <<" file!"<NNU; i++){ + cout << settings1->EVID[i] << " " << settings1->NUFLAVORINT[i] << " " << settings1->NUBAR[i] << " " << settings1->PNU[i] << " " << settings1->CURRENTINT[i] << " " << settings1->IND_POSNU_R[i] << " " << settings1->IND_POSNU_THETA[i] << " " << settings1->IND_POSNU_PHI[i] << " " << settings1->IND_NNU_THETA[i] << " " << settings1->IND_NNU_PHI[i] << " " << settings1->ELAST[i] << endl; + } + } + // set gRandom as TRandom3 when settings1->RANDOM_MODE = 1 + if (settings1->RANDOM_MODE == 1) { + // test TRandom3 + TRandom3 *test_randm3 = new TRandom3 (0); + gRandom = test_randm3; + } else { + gRandom->SetSeed(settings1->SEED + atoi(run_no.c_str() ) ); + + } + //cout<<"first random from TRandom3 : "<Rndm()<<"\n"; + cout<<"first random : "<Rndm()<<"\n"; + + // IceModel *icemodel=new IceModel(ICE_MODEL + NOFZ*10,CONSTANTICETHICKNESS * 1000 + CONSTANTCRUST * 100 + FIXEDELEVATION * 10 + 0,MOOREBAY);// creates Antarctica ice model + IceModel *icemodel=new IceModel(settings1->ICE_MODEL + settings1->NOFZ*10,settings1->CONSTANTICETHICKNESS * 1000 + settings1->CONSTANTCRUST * 100 + settings1->FIXEDELEVATION * 10 + 0,settings1->MOOREBAY);// creates Antarctica ice model + // IceModel inherits from EarthModel + + cout<Surface(0., 0.)<SurfaceAboveGeoid(0., 0.)<DETECTOR); // builds antenna array, 0 for testbed + + Trigger *trigger=new Trigger(detector, settings1); // builds the trigger + // Efficiencies *efficiencies=new Efficiencies(detector->getnRx(),outputdir); // keeps track of efficiencies at each stage of the simulation + Efficiencies *efficiencies=new Efficiencies(100,outputdir); // keeps track of efficiencies at each stage of the simulation + cout<<"called Efficiencies"<EXPONENT); // gets library (or whatever) of neutrino spectra + cout<<"called Spectra"< 2) { + AraFile=new TFile((outputdir+"/AraOut."+setupfile.substr(setupfile.find_last_of("/")+1)+".run"+run_no+".root").c_str(),"RECREATE","ara"); + } + else { + AraFile=new TFile((outputdir+"/AraOut.root").c_str(),"RECREATE","ara"); + } + + TTree *AraTree=new TTree("AraTree","AraTree"); // for single entry + TTree *AraTree2=new TTree("AraTree2","AraTree2"); //for many entries + cout<<"assign AraFile, AraTrees"<Branch("detector",&detector); + cout<<"branch detector"<Branch("icemodel",&icemodel); + cout<<"branch icemodel"<Branch("trigger",&trigger); + cout<<"branch trigger"<Branch("settings",&settings1); + cout<<"branch settings"<Branch("spectra",&spectra); + cout<<"branch spectra"<Branch("event",&event); + cout<<"branch Evt"<Branch("report",&report); + cout<<"branch report"<Branch("UsefulIcrrStationEvent", &theIcrrEvent); + eventTree->Branch("UsefulAtriStationEvent",&theAtriEvent); + eventTree->Branch("weight", &weight); + + /* + UsefulIcrrStationEvent *theIcrrEventArray[3]; + for (int i = 0; i < 3; i++){ + theIcrrEvent[i] = 0; + } + UsefulAtriStationEvent *theAtriEventArray[38]; + for (int i = 0; i < 38; i++){ + theAtriEvent[i] = 0; + } + */ + + + /* + TTree *eventTree0; + eventTree0 = new TTree("eventTree0","Tree of Station 0 ARA Events"); + eventTree0->Branch("UsefulIcrrStationEvent",&theIcrrEventArray[0]); + TTree *eventTree1; + eventTree1 = new TTree("eventTree1","Tree of Station 1 ARA Events"); + eventTree1->Branch("UsefulAtriStationEvent",&theAtriEventArray[1]); + TTree *eventTree2; + eventTree2 = new TTree("eventTree2","Tree of Station 2 ARA Events"); + eventTree2->Branch("UsefulAtriStationEvent",&theAtriEventArray[2]); + TTree *eventTree3; + eventTree3 = new TTree("eventTree3","Tree of Station 3 ARA Events"); + eventTree3->Branch("UsefulAtriStationEvent",&theAtriEventArray[3]); + */ + #endif + + + cout<<"will call secondaries"<SetMedium(0); // set medium as ice + cout<<"finish calling secondaries and signal"<SetMeanRmsDiode(settings1, detector, report); + + if (settings1->NOISE_WAVEFORM_GENERATE_MODE == 0) {// noise waveforms will be generated for each evts + trigger->ClearNoiseWaveforms(); + } + + // now in Trigger class, there will be meandiode, rmsdiode values for noise (we need this for trigger later) + + double max_dt = 0.; // max arrival time difference + + int Total_Global_Pass = 0; // total global trigger passed number + double Total_Weight = 0.; + double Total_Probability = 0.; + + + /* + + TCanvas *cFull_window = new TCanvas("cFull_window","A Simple Graph Example",200,10,10000,11200); + cFull_window->Divide(1,16); + + TGraph *g_Full_window; + + TGraph *G_V_threshold_diode; + G_V_threshold_diode = new TGraph(2, threshold_x, threshold_y); + + TCanvas *cFull_window_V = new TCanvas("cFull_window_V","A Simple Graph Example",200,10,3200,2400); + cFull_window_V->Divide(4,4); + + TGraph *g_Full_window_V; + + */ + + double x_V[settings1->NFOUR/2]; + double y_V[settings1->NFOUR/2]; + + + + double xbin[settings1->DATA_BIN_SIZE]; + for (int i=0; iDATA_BIN_SIZE; i++) { + xbin[i] = i; + } + + double threshold_y[2]; + double threshold_x[2]; + + threshold_x[0] = 0.; + threshold_x[1] = (double)settings1->DATA_BIN_SIZE-1.; + threshold_y[0] = (trigger->rmsdiode) * (trigger->powerthreshold); + threshold_y[1] = (trigger->rmsdiode) * (trigger->powerthreshold); + + cout<<"powerthreshold : "<powerthreshold<TRIG_WINDOW = TRIG_WINDOW_Size; + + Total_Global_Pass = 0; + cout<<"begin looping events!!"<CALPULSER_ON << endl; + + // test Detector set correctly + cout<<"number of stations : "<params.number_of_stations << endl; + cout<<"total number of antennas : "<params.number_of_antennas << endl; + int ch_count = 0; + for (int i=0; iparams.number_of_stations; i++) { + for (int j=0; jstations[i].strings.size(); j++) { + for (int k=0; kstations[i].strings[j].antennas.size(); k++) { + ch_count++; + cout<<"station["<CheckCompatibilities(detector); + if (settings_compatibility_error > 0) { + cerr<<"There are "<< settings_compatibility_error<<" errors from settings. Check error messages."<DETECTOR == 3 && settings1->READGEOM == 1){ + cerr << "ERROR::InstalledStation geometry not available without AraRoot installation!" << endl; + return -1; + } + #endif + + + // test autoflush + // AraTree2->SetAutoFlush(0); + + // reset accumulative trig search bin info + settings1->ACCUM_TRIG_SEARCH_BINS_STATION0 = 0.; + + int nuLimit =0; + if (settings1->EVENT_GENERATION_MODE == 1){ //event mode read in different single events + nuLimit = settings1->NNU; + } + else if (settings1->ONLY_PASSED_EVENTS == 1){ + nuLimit = settings1->NNU_PASSED; + } + else { + nuLimit = settings1->NNU; + } + // cout << "nuLimit: " << nuLimit << endl; + int inu = 0; + int Events_Thrown = 0; + int Events_Passed = 0; + // for (int inu=0;inuNNU;inu++) { // loop over neutrinos + while (inu < nuLimit){ + // cout << "inu: " << inu << endl; + check_station_DC = 0; + check_station_DC = 0; + if ( settings1->DEBUG_MODE_ON==0 ) { + std::cerr<<"*"; + if ( Events_Thrown%100 == 0 ) + cout<<"Thrown "<inu_passed = -1; + + report = new Report(detector, settings1); + + #ifdef ARA_UTIL_EXISTS + theIcrrEvent = new UsefulIcrrStationEvent(); + theAtriEvent = new UsefulAtriStationEvent(); + #endif + + + // go further only if we picked up usable posnu + if (event->Nu_Interaction[0].pickposnu>0) { + + /* + if (settings1->NOISE_WAVEFORM_GENERATE_MODE == 0) {// noise waveforms will be generated for each evts + trigger->GetNewNoiseWaveforms(settings1, detector, report); + } + */ + + + //-------------------------------------------------- + // cout<<"inu : "<pnu : "<pnu<Nu_Interaction[0].posnu.Print(); + // cout<<"nnu : "; + // event->Nu_Interaction[0].nnu.Print(); + // cout<<"event->n_interactions : "<n_interactions<nuflavor<Nu_Interaction[0].vmmhz1m[0] : "<Nu_Interaction[0].vmmhz1m[0]<Nu_Interaction[0].pickposnu<Connect_Interaction_Detector (event, detector, raysolver, signal, icemodel, settings1, trigger); + + //report->Connect_Interaction_Detector (event, detector, raysolver, signal, icemodel, settings1, trigger, theEvent); + report->Connect_Interaction_Detector (event, detector, raysolver, signal, icemodel, settings1, trigger, Events_Thrown); + //report->Connect_Interaction_Detector (event, detector, raysolver, signal, icemodel, settings1, trigger, theEvent, Events_Thrown); + + #ifdef ARA_UTIL_EXISTS + if (settings1->DATA_LIKE_OUTPUT !=0){ + int stationID; + int stationIndex; + if (settings1->DETECTOR == 4){ + stationID = settings1->DETECTOR_STATION; + stationIndex = 0; + } else { + stationID = 0; + stationIndex = 0; + } + + if (report->stations[stationIndex].Global_Pass) { + // report->MakeUsefulEvent(detector, settings1, trigger, stationID, stationIndex, theIcrrEvent); + cout << endl << "Making useful event" << endl; + report->MakeUsefulEvent(detector, settings1, trigger, stationID, stationIndex, theAtriEvent); + /* + for (int i_chan = 0; i_chan< 16; i_chan++){ + int elecChan = AraGeomTool::Instance()->getElecChanFromRFChan(i_chan, stationID); + int string_i = detector->getStringfromArbAntID( stationIndex, i_chan); + int antenna_i = detector->getAntennafromArbAntID( stationIndex, i_chan); + cout << "Output: " << elecChan << " : " << theAtriEvent->fTimes[elecChan][1] << " : " << report->stations[stationIndex].strings[string_i].antennas[antenna_i].time_mimic[1] << endl; + } + */ + } + weight = event->Nu_Interaction[0].weight; + } + // cout << "weight: " << weight <ClearUselessfromConnect(detector, settings1, trigger); + for(int i=0;iNu_Interaction.size(); i++) + event->Nu_Interaction[i].clear_useless(settings1); + + // test if posnu is exactly same in calpulser mode + if (settings1->CALPULSER_ON == 1) { + cur_posnu_x = event->Nu_Interaction[0].posnu.GetX(); + cur_posnu_y = event->Nu_Interaction[0].posnu.GetY(); + cur_posnu_z = event->Nu_Interaction[0].posnu.GetZ(); + // cout<<"posnu x:"<0) { + if (pre_posnu_x==cur_posnu_x && pre_posnu_y==cur_posnu_y && pre_posnu_z==cur_posnu_z) { + } + else cout<<"posnu location changed!"<Nu_Interaction[0].posnu.GetX(); + pre_posnu_y = event->Nu_Interaction[0].posnu.GetY(); + pre_posnu_z = event->Nu_Interaction[0].posnu.GetZ(); + } + + for (int i=0; iparams.number_of_stations; i++) { + #ifdef ARA_UTIL_EXISTS + if (settings1->DATA_LIKE_OUTPUT != 0){ + if (settings1->DETECTOR == 3 && i == 0) + { theIcrrEvent->numRFChans = 14; } + else if (settings1->DETECTOR == 4 && settings1->DETECTOR_STATION == 0) + { theIcrrEvent->numRFChans = 14; } + else { + theAtriEvent->fNumChannels = 20; + theIcrrEvent->numRFChans = 16; + } + } + #endif + + if (max_dt < report->stations[i].max_arrival_time - report->stations[i].min_arrival_time) + max_dt = report->stations[i].max_arrival_time - report->stations[i].min_arrival_time; + // check the total global trigger passed + if (report->stations[i].Global_Pass) { + cout<<"\nGlobal_Pass : "<stations[i].Global_Pass<<" evt : "<Nu_Interaction[0].weight<Nu_Interaction[0].weight; + Total_Probability += event->Nu_Interaction[0].probability; + + // test increment weight + if (settings1->INTERACTION_MODE==1) { + count1->incrementEventsFound( event->Nu_Interaction[0].weight, event ); + } + else if (settings1->INTERACTION_MODE==0) { + count1->incrementEventsFound( event->Nu_Interaction[0].probability, event ); + } + else if (settings1->INTERACTION_MODE==3) { + count1->incrementEventsFound( event->Nu_Interaction[0].probability, event ); + } + else if (settings1->INTERACTION_MODE==4) { + count1->incrementEventsFound( event->Nu_Interaction[0].weight, event ); + } + } + check_station_DC++; + event->inu_passed = Events_Passed; + } + } + + /* + AraTree2->Fill(); //fill interaction every events + // for 1, save all events whether passed trigger or not + if (settings1->DATA_LIKE_OUTPUT==2) { + //theEvent = &report->theUsefulEvent; + eventTree->Fill(); + } + // for 0, save events which passed trigger + else if (settings1->DATA_LIKE_OUTPUT==1) { + //if ( Global_Pass_Flag == 1 ) { + if ( check_station_DC > 0 ) { + //theEvent = &report->theUsefulEvent; + eventTree->Fill(); + } + } + theEvent = NULL; + + delete theEvent; + */ + + settings1->ACCUM_TRIG_SEARCH_BINS_STATION0 += report->stations[0].total_trig_search_bin; + } // if pickposnu > 0 + else { + //cout<<"pickposnu : "<Nu_Interaction[0].pickposnu<delete_all(); + event->delete_all(); + } + + + // test FILL_TREE_MODE + if (settings1->FILL_TREE_MODE==0) { // fill event event + AraTree2->Fill(); //fill interaction every events + #ifdef ARA_UTIL_EXISTS + // for 1, save all events whether passed trigger or not + if (settings1->DATA_LIKE_OUTPUT==2) { + // theEvent = &report->theUsefulEvent; + eventTree->Fill(); + } + // for 0, save events which passed trigger + else if (settings1->DATA_LIKE_OUTPUT==1) { + if ( check_station_DC > 0 ) { + // theEvent = &report->theUsefulEvent; + eventTree->Fill(); + } + } + #endif + } + else if (settings1->FILL_TREE_MODE==1) { // fill only usable posnu event + if (event->Nu_Interaction[0].pickposnu>0) { + AraTree2->Fill(); //fill interaction every events + #ifdef ARA_UTIL_EXISTS + // for 1, save all events whether passed trigger or not + if (settings1->DATA_LIKE_OUTPUT==2) { + // theEvent = &report->theUsefulEvent; + eventTree->Fill(); + } + // for 0, save events which passed trigger + else if (settings1->DATA_LIKE_OUTPUT==1) { + if ( check_station_DC > 0 ) { + //theEvent = &report->theUsefulEvent; + eventTree->Fill(); + } + } + #endif + } + } + else if (settings1->FILL_TREE_MODE==2) { // fill only triggered event + if (check_station_DC>0) { + AraTree2->Fill(); //fill interaction every events + #ifdef ARA_UTIL_EXISTS + // for 1, save all events whether passed trigger or not + if (settings1->DATA_LIKE_OUTPUT==2) { + //theEvent = &report->theUsefulEvent; + eventTree->Fill(); + } + // for 0, save events which passed trigger + else if (settings1->DATA_LIKE_OUTPUT==1) { + if ( check_station_DC > 0 ) { + //theEvent = &report->theUsefulEvent; + eventTree->Fill(); + } + } + #endif + } + } + if (settings1->EVENT_GENERATION_MODE == 1){ + inu++; + } + else if (settings1->ONLY_PASSED_EVENTS == 1){ + if (check_station_DC > 0){ + inu++; + } + } + else { + inu++; + } + if (check_station_DC > 0){ + Events_Passed++; + } + Events_Thrown++; + + + //theEvent = NULL; + + /* + if (settings1->NOISE_WAVEFORM_GENERATE_MODE == 0) {// noise waveforms will be generated for each evts + // remove noise waveforms for next evt + rigger->ClearNoiseWaveforms(); + } + */ + + // if(inu==nuLimit){ + // cout<Print("test_V_mimic.pdf"); + //-------------------------------------------------- + + ofstream weight_file; + //weight_file.open(("./weight_output/weight_"+setupfile).c_str()); + if (argc == 3) { + weight_file.open(("./weight_output/weight_"+setupfile+".run"+run_no).c_str()); + } + else if (argc >3 ){ // add the subdirectory for outputs + weight_file.open((outputdir+"/weight_output/weight_"+setupfile+".run"+run_no).c_str()); + } + else { + weight_file.open(("./weight_output/weight_"+setupfile).c_str()); + } + + + cout<<" end loop"<NNU << endl; + cout << "Total Events Thrown: " << Events_Thrown << endl; + cout<<"Total_Global_Pass : "<INTERACTION_MODE==1) { + weight_file << "Total_Weight="<INTERACTION_MODE==0) { + weight_file << "Total_Probability="<NBINS-1; i++) { + cout<eventsfound_binned[i]<<", "; + weight_file << count1->eventsfound_binned[i]<<" "; + } + cout<eventsfound_binned[count1->NBINS-1]; + weight_file << count1->eventsfound_binned[count1->NBINS-1]<<"\n"; + weight_file.close(); + cout<<"\n\n"; + + + // if using picknear_cylinder method + if (settings1->INTERACTION_MODE==1) { + double IceVolume; + IceVolume = PI * (settings1->POSNU_RADIUS) * (settings1->POSNU_RADIUS) * icemodel->IceThickness( detector->stations[0] ); + cout << "Radius: " << settings1->POSNU_RADIUS << " [m]" << endl; + cout<<"IceVolume : "<eventsfound_binned, error_plus, error_minus ); + + /* + Veff_test = IceVolume * 4. * PI * signal->RHOICE / signal->RHOH20 * Total_Weight / (double)(settings1->NNU); + + // account all factors to error + error_plus = IceVolume * 4. * PI * signal->RHOICE / signal->RHOH20 * error_plus / (double)(settings1->NNU); + error_minus = IceVolume * 4. * PI * signal->RHOICE / signal->RHOH20 * error_minus / (double)(settings1->NNU); + */ + + Veff_test_we = IceVolume * 4. * PI * signal->RHOICE / signal->RHOH20 * Total_Weight / (double)(settings1->NNU); + Veff_test = IceVolume * 4. * PI * Total_Weight / (double)(settings1->NNU); + error_plus = IceVolume * 4. * PI * signal->RHOICE / signal->RHOH20 * error_plus / (double)(settings1->NNU); + error_minus = IceVolume * 4. * PI * signal->RHOICE / signal->RHOH20 * error_minus / (double)(settings1->NNU); + + cout<<"test Veff(ice) : "<INTERACTION_MODE==0) { + + double IceArea; + IceArea = PI * (settings1->POSNU_RADIUS) * (settings1->POSNU_RADIUS); + cout << endl; + cout<<"IceArea : "<< IceArea <NNU); + cout << "Aeff : " << Aeff << " [m^2]" << endl; + + + // error bar for weight + double error_plus = 0; + double error_minus = 0; + Counting::findErrorOnSumWeights( count1->eventsfound_binned, error_plus, error_minus ); + + // account all factors to error + error_plus = IceArea * error_plus / (double)(settings1->NNU); + error_minus = IceArea * error_minus / (double)(settings1->NNU); + + cout<<"And Aeff error plus : "<NNU<<", PickUnbiased passed NNU : "<DATA_SAVE_MODE != 0) { + trigger->v_noise_timedomain.clear(); + trigger->v_noise_timedomain_diode.clear(); + } + if (settings1->DATA_SAVE_MODE == 2) {// in DATA_SAVE_MODE==2, remove noise spectrum before Rayleigh dist. + trigger->Vfft_noise_before.clear(); + } + + AraTree->Fill(); // fill tree for one entry + AraFile->Write(); + // AraFile->Close(); + + efficiencies->summarize(); // summarize the results in an output file + + double freq[detector->GetFreqBin()], Filter[detector->GetFreqBin()]; + double Filter_E[detector->GetFreqBin()]; + + for (int i=0; iGetFreqBin(); i++) { + freq[i] = detector->GetFreq(i); // in Hz + Filter[i] = detector->GetFilterGain(i); // in dB + Filter_E[i] = pow(10., (detector->GetFilterGain(i))/20.); + } + + cout<<"max_dt : "<SYSTEMATICS_IceAtten; +// //Parameters of the BEDMAP ice model. (See http://www.antarctica.ac.uk/aedc/bedmap/download/) int nCols_ice=1200; //number of columns in data, set by header file (should be 1200) int nRows_ice=1000; //number of rows in data, set by header file (should be 1000) @@ -41,7 +44,6 @@ int nRows_water=1000; int xLowerLeft_water=-3000000; int yLowerLeft_water=-2500000; int NODATA=-9999; - //Variables for conversion between BEDMAP polar stereographic coordinates and lat/lon. Conversion equations from ftp://164.214.2.65/pub/gig/tm8358.2/TM8358_2.pdf const double scale_factor=0.97276901289; //scale factor at pole corresponding to 71 deg S latitude of true scale (used in BEDMAP) const double ellipsoid_inv_f = 298.257223563; //of Earth @@ -232,51 +234,53 @@ if ( file.is_open() ) { //Lower bound (in the plot sense) //if lower bound, then - double ARA_IceAtten_Depth_tmp[53] = - { 171. , 189. , 258.44, 358.67, 455.76, 572.28, 635.86, - 687.97, 746.55, 795.13, 839.62, 871.98, 898.61, 914.15, - 934.88, 960.2 , 991.4 , 1025.34, 1049.71, 1086.29, 1125.33, - 1157.33, 1194.67, 1232. , 1272. , 1310.88, 1360.67, 1411.97, - 1464.5 , 1512.58, 1561.93, 1603.87, 1640. , 1693.15, 1739.18, - 1792.38, 1829.23, 1858.77, 1885.91, 1937.53, 1980.5 , 2016.73, - 2061.24, 2105.99, 2170.81, 2242.16, 2299.54, 2358.97, 2405.13, - 2450. , 2450. , 2450. , 2450. } - - double ARA_IceAtten_Length_tmp[53] = - { 1994.67 , 1952. , 1896. , 1842.67 , 1797.33 , 1733.33 , - 1680. , 1632. , 1586.67 , 1552. , 1522.67 , 1501.33 , - 1474.67 , 1458.67 , 1437.33 , 1416. , 1392. , 1365.33 , - 1344. , 1312. , 1274.67 , 1242.67 , 1205.33 , 1168. , - 1128. , 1090.67 , 1048. , 1008. , 965.333, 920. , - 874.667, 834.667, 797.333, 752. , 714.667, 677.333, - 648. , 616. , 589.333, 557.333, 530.667, 506.667, - 477.333, 453.333, 418.667, 389.333, 362.667, 333.333, - 309.333, 285.333, 264. , 242.667, 221.333 } + if(SYSTEMAT_IceAtten == 1){ + double ARA_IceAtten_Depth_tmp[53] = + { 171. , 189. , 258.44, 358.67, 455.76, 572.28, 635.86, + 687.97, 746.55, 795.13, 839.62, 871.98, 898.61, 914.15, + 934.88, 960.2 , 991.4 , 1025.34, 1049.71, 1086.29, 1125.33, + 1157.33, 1194.67, 1232. , 1272. , 1310.88, 1360.67, 1411.97, + 1464.5 , 1512.58, 1561.93, 1603.87, 1640. , 1693.15, 1739.18, + 1792.38, 1829.23, 1858.77, 1885.91, 1937.53, 1980.5 , 2016.73, + 2061.24, 2105.99, 2170.81, 2242.16, 2299.54, 2358.97, 2405.13, + 2450. , 2450. , 2450. , 2450. }; + + double ARA_IceAtten_Length_tmp[53] = + { 1994.67 , 1952. , 1896. , 1842.67 , 1797.33 , 1733.33 , + 1680. , 1632. , 1586.67 , 1552. , 1522.67 , 1501.33 , + 1474.67 , 1458.67 , 1437.33 , 1416. , 1392. , 1365.33 , + 1344. , 1312. , 1274.67 , 1242.67 , 1205.33 , 1168. , + 1128. , 1090.67 , 1048. , 1008. , 965.333, 920. , + 874.667, 834.667, 797.333, 752. , 714.667, 677.333, + 648. , 616. , 589.333, 557.333, 530.667, 506.667, + 477.333, 453.333, 418.667, 389.333, 362.667, 333.333, + 309.333, 285.333, 264. , 242.667, 221.333 }; + } //Upper bound //if upper bound, then - - double ARA_IceAtten_Depth_tmp[53] = - { 79.9 , 81.78, 85.3 , 87.97, 91.87, 97.73, 101.95, - 109.4 , 123. , 132.93, 141.24, 146.53, 153.01, 156.89, - 168.5 , 184.5 , 202.5 , 245.45, 281.28, 362.2 , 471.68, - 543.39, 616.38, 690.4 , 774.4 , 844.08, 915.73, 978.51, - 1040.76, 1110.94, 1179.05, 1236.19, 1291.15, 1359.48, 1417.41, - 1473.23, 1517.01, 1557.5 , 1591.21, 1649.39, 1697.74, 1740.59, - 1792.54, 1829.06, 1892.58, 1959.24, 2017.25, 2082.31, 2137.69, - 2194.45, 2245.24, 2302.73, 2369.08} - - double ARA_IceAtten_Length_tmp[53] = - { 1994.67 , 1952. , 1896. , 1842.67 , 1797.33 , 1733.33 , - 1680. , 1632. , 1586.67 , 1552. , 1522.67 , 1501.33 , - 1474.67 , 1458.67 , 1437.33 , 1416. , 1392. , 1365.33 , - 1344. , 1312. , 1274.67 , 1242.67 , 1205.33 , 1168. , - 1128. , 1090.67 , 1048. , 1008. , 965.333, 920. , - 874.667, 834.667, 797.333, 752. , 714.667, 677.333, - 648. , 616. , 589.333, 557.333, 530.667, 506.667, - 477.333, 453.333, 418.667, 389.333, 362.667, 333.333, - 309.333, 285.333, 264. , 242.667, 221.333 } - + if(SYSTEMAT_IceAtten == 2){ + double ARA_IceAtten_Depth_tmp[53] = + { 79.9 , 81.78, 85.3 , 87.97, 91.87, 97.73, 101.95, + 109.4 , 123. , 132.93, 141.24, 146.53, 153.01, 156.89, + 168.5 , 184.5 , 202.5 , 245.45, 281.28, 362.2 , 471.68, + 543.39, 616.38, 690.4 , 774.4 , 844.08, 915.73, 978.51, + 1040.76, 1110.94, 1179.05, 1236.19, 1291.15, 1359.48, 1417.41, + 1473.23, 1517.01, 1557.5 , 1591.21, 1649.39, 1697.74, 1740.59, + 1792.54, 1829.06, 1892.58, 1959.24, 2017.25, 2082.31, 2137.69, + 2194.45, 2245.24, 2302.73, 2369.08}; + + double ARA_IceAtten_Length_tmp[53] = + { 1994.67 , 1952. , 1896. , 1842.67 , 1797.33 , 1733.33 , + 1680. , 1632. , 1586.67 , 1552. , 1522.67 , 1501.33 , + 1474.67 , 1458.67 , 1437.33 , 1416. , 1392. , 1365.33 , + 1344. , 1312. , 1274.67 , 1242.67 , 1205.33 , 1168. , + 1128. , 1090.67 , 1048. , 1008. , 965.333, 920. , + 874.667, 834.667, 797.333, 752. , 714.667, 677.333, + 648. , 616. , 589.333, 557.333, 530.667, 506.667, + 477.333, 453.333, 418.667, 389.333, 362.667, 333.333, + 309.333, 285.333, 264. , 242.667, 221.333}; + } ARA_IceAtten_bin = 53; for (int bin=0; bin ilon_inhorizon[NBNPOSITIONS_MAX]; // indices in lon and lat for bins in horizon for NPHI balloon positions along 80 deg latitude line. // vector ilat_inhorizon[NBNPOSITIONS_MAX]; // vector easting_inhorizon[NBNPOSITIONS_MAX]; //indicies in easting and northing for bins in horizon for NPHI balloon positions along 80 deg latitude line. // vector northing_inhorizon[NBNPOSITIONS_MAX]; -// double maxvol_inhorizon[NBNPOSITIONS_MAX]; // maximum volume of ice for a bin +// double maxvol_inhorizon[NBNPOSITIONS_MAX]; // maximum volume of ice for a bin //BEDMAP utility methods double Area(double latitude) const; -void ENtoLonLat(int e_coord, +void ENtoLonLat(int e_coord, int n_coord, double xLowerLeft, double yLowerLeft, - - double& lon, + + double& lon, double& lat) const; void WaterENtoLonLat(int e, int n, - + double& lon, double& lat) const; - void LonLattoEN(double lon, + void LonLattoEN(double lon, double lat, double xLowerLeft, double yLowerLeft, - - int& e_coord, + + int& e_coord, int& n_coord) const; - - void GroundLonLattoEN(double lon, + + void GroundLonLattoEN(double lon, double lat, - - int& e_coord, + + int& e_coord, int& n_coord) const; void WaterLonLattoEN(double lon, double lat, - + int& e_coord, int& n_coord) const; @@ -107,17 +107,17 @@ void ENtoLonLat(int e_coord, void IceENtoLonLat(int e, int n, - + double& lon, - double& lat) const; + double& lat) const; void GroundENtoLonLat(int e, int n, - + double& lon, double& lat) const; // const static int NBNPOSITIONS_MAX=26000; - //double volume_inhorizon[NBNPOSITIONS_MAX]; // volume of ice within horizon for each balloon phi position + //double volume_inhorizon[NBNPOSITIONS_MAX]; // volume of ice within horizon for each balloon phi position // IceModel(); //default constructor IceModel(int model=0,int earth_model=0,int mooreBay=0); ~IceModel(); @@ -134,12 +134,12 @@ void ENtoLonLat(int e_coord, Position PickBalloonPosition() const; //void GetMAXHORIZON(double bn_altitude); // get upper limit on the horizon wrt the balloon. - int RossIceShelf(const Position &position) const; + int RossIceShelf(const Position &position) const; int IceOnWater(const Position &postition) const; int RossExcept(const Position &position) const; int RonneIceShelf(const Position &position) const; - int WestLand(const Position &pos) const; - int AcceptableRfexit(const Vector &nsurf_rfexit,const Position &rfexit,const Vector &n_exit2rx) const; + int WestLand(const Position &pos) const; + int AcceptableRfexit(const Vector &nsurf_rfexit,const Position &rfexit,const Vector &n_exit2rx) const; //double GetBalloonPositionWeight(int ibnpos) const; int OutsideAntarctica(const Position &pos) const; int OutsideAntarctica(double lat) const; @@ -160,11 +160,11 @@ void ENtoLonLat(int e_coord, double GetN(const Position &pos) const; double EffectiveAttenuationLength(const Position &pos, const int &whichray) const; double EffectiveAttenuationLength(Settings *settings1, const Position &pos, const int &whichray) const; - - void IceLonLattoEN(double lon, + + void IceLonLattoEN(double lon, double lat, - - int& e_coord, + + int& e_coord, int& n_coord) const; int Getice_model(); @@ -194,12 +194,12 @@ void GetFresnel ( // const Vector &nnu, // double stepsize, // Position &r_enterice); -// +// // int WhereDoesItExitIce(int inu,const Position &posnu, // const Vector &nnu, // double stepsize, // Position &r_enterice); -//-------------------------------------------------- +//-------------------------------------------------- // end three copied members from icemc icemodel. diff --git a/Settings.cc b/Settings.cc index 2210f006..92ee5527 100644 --- a/Settings.cc +++ b/Settings.cc @@ -49,7 +49,7 @@ void Settings::Initialize() { ARASIM_VERSION_MINOR = ARASIM_MINOR; ARASIM_VERSION_SUBMINOR = ARASIM_SUBMINOR; ARASIM_VERSION = (double)ARASIM_VERSION_MAJOR + (double)ARASIM_VERSION_MINOR * 0.001 + (double)ARASIM_VERSION_SUBMINOR * 0.000001; - + ARAROOT_VERSION = 0.; ARAUTIL_EXISTS = false; @@ -57,7 +57,7 @@ void Settings::Initialize() { ARAUTIL_EXISTS = true; ARAROOT_VERSION = (double)ARA_ROOT_MAJOR + (double)ARA_ROOT_MINOR * 0.01; #endif - + NNU=100; // NEED TO FIGURE OUT A GOOD WAY TO READ THIS IN AND STORE THEM. @@ -70,7 +70,7 @@ void Settings::Initialize() { FIXEDELEVATION=0; // fix the elevation to the thickness of ice. MOOREBAY=0; //1=use Moore's Bay measured ice field attenuation length for the west land, otherwise use South Pole data USE_ARA_ICEATTENU=1; // use ARA measured ice attenuation value - + EXPONENT=19.; // 10^19 eV neutrinos only DETECTOR=1; //ARA layout with small number of stations @@ -98,13 +98,13 @@ void Settings::Initialize() { PHASE=90.; // default : 90 deg phase (it means all imaginary values) NFOUR=1024; // default : 1024, same as in icemc - + NOISE=0; // degault : 0, flat thermal noise, 1 : for TestBed (DETECTOR=3), use Rayleigh distribution fitted for borehole channels ATMOSPHERE=1; // default : 1, include atmosphere - TRIG_SCAN_MODE=0; // default 0 (old mode) 1: new mode (faster) 2: scan all Pthresh values 3: scan also all N out of 8 - + TRIG_SCAN_MODE=0; // default 0 (old mode) 1: new mode (faster) 2: scan all Pthresh values 3: scan also all N out of 8 + POWERTHRESHOLD=-6.06; // old default : -6.15, new default: -6.06 MAXT_DIODE=70.E-9; // default : 70 ns @@ -132,11 +132,11 @@ void Settings::Initialize() { RANDOM_MODE=1; // default : 1 (seed is unique in time/space) SEED=1; // default: 1, only applies if RANDOM_MODE=0, provides base seed value and run number taken from arguments is added to this value in order to submit multiple repeatable runs instead of only one single long repeatable run - + BORE_HOLE_ANTENNA_LAYOUT=0; // default : 0 (VHVH) DATA_LIKE_OUTPUT=1; //default : 0 (doesn't write out data-like events) - + RAYSOL_RANGE=5000; // default : 5000 m PICK_POSNU_DEPTH=0; //default : 0 pick posnu depth from 0 to ice depth @@ -155,19 +155,19 @@ void Settings::Initialize() { NNU_D_PHI=0.0873;// default : nnu_d_phi : 5 deg - + CALPULSER_ON=0; // default : calpulsers off - + TESTBED_ON=0; // default : 0 stations[0] is ARA1 not Testbed - + READGEOM=0; // default : 0 : use idealized geometry and do not read in from sqlite database - + V_MIMIC_MODE = 0; // default : 0 - write out all chs where global triggered bin is center of the window // 1 - same as above 0 mode but apply TestBed ch delay - average BH ch delay // 2 - same as above 0 mode but apply TestBed ch delay - average BH ch delay + additional delay to match with actual TestBed data waveforms - + USE_INSTALLED_TRIGGER_SETTINGS = 0; // default : 0 - use idealized settings for the trigger - + NUM_INSTALLED_STATIONS = 4; CALPUL_OFFCONE_ANGLE = 35.; @@ -189,7 +189,7 @@ void Settings::Initialize() { CONST_RMSDIODE = 1.346e-13; // also from one run USE_MANUAL_GAINOFFSET = 0; //if use gain offset file to read values or just use constant gain offset from setup file (default 0 : use file) - + MANUAL_GAINOFFSET_VALUE = 1.; // gain offset value NOISE_WAVEFORM_GENERATE_MODE = 0; // mode 0 (default) will generate noise waveforms newly for each events. other values will use first generated noise waveforms for later events (huge mem usage) @@ -248,7 +248,7 @@ void Settings::Initialize() { ACCUM_TRIG_SEARCH_BINS_STATION0 = 0.; // not actually setting value but gives us how much trigger searched bins there were in the run for station0 - NU_NUBAR_SELECT_MODE = 3; // default : 3 = random nu_nubar based on arXiv:1108.3163, section 3, 0 = just nu, 1 = just nubar + NU_NUBAR_SELECT_MODE = 3; // default : 3 = random nu_nubar based on arXiv:1108.3163, section 3, 0 = just nu, 1 = just nubar SELECT_FLAVOR = 0; // default : 0 = randomly 1:1:1 ratio, 1 : el. 2 : mu, 3 : tau @@ -264,7 +264,7 @@ void Settings::Initialize() { RAY_TRACE_ICE_MODEL_PARAMS=0; // Default: South Pole values fitted from RICE data WAVEFORM_LENGTH = 64/2*20; // Default: 64 digitization samples per block / 2 samples per waveform value * 20 blocks (value used for 2013-2016) - + WAVEFORM_CENTER = 0; // Default: 0, no offset in waveform centering POSNU_R = 1000.; @@ -298,14 +298,14 @@ void Settings::Initialize() { USE_SIGNAL_CHAIN_LOWER_BOUND = 0; // default: 0 -- don't replace signal chain efficiency with lower bound. 1: replace with lower bound SC_EFFICIENCY_ERROR_V = 0.9; //Lower bound of Vpol signal chain efficiency SC_EFFICIENCY_ERROR_H = 0.68; //Lower bound of Hpol signal chain efficiency - + SYSTEMATICS_IceAtten = 0; //Default: Average value (red line) from Eugene's attenuation model (http://radiorm.physics.ohio-state.edu/elog/Write-Ups/170504_105713/Thesis_-_Eugene_Hong.pdf, p. 54), 1 = lower bound, 2 = upper bound } void Settings::ReadFile(string setupfile) { ifstream setFile (setupfile.c_str()); - + string line, label; if ( setFile.is_open() ) { @@ -477,7 +477,7 @@ void Settings::ReadFile(string setupfile) { } else if (label == "NUM_INSTALLED_STATIONS") { NUM_INSTALLED_STATIONS = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } + } else if (label == "CALPUL_OFFCONE_ANGLE") { CALPUL_OFFCONE_ANGLE = atof( line.substr(line.find_first_of("=") + 1).c_str() ); } @@ -486,10 +486,10 @@ void Settings::ReadFile(string setupfile) { } else if (label == "TRIG_ONLY_BH_ON") { TRIG_ONLY_BH_ON = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } + } else if (label == "TRIG_THRES_MODE") { TRIG_THRES_MODE = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } + } else if (label == "NOISE_CHANNEL_MODE") { NOISE_CHANNEL_MODE = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); } @@ -582,28 +582,28 @@ void Settings::ReadFile(string setupfile) { } else if (label == "TRIG_ONLY_LOW_CH_ON") { TRIG_ONLY_LOW_CH_ON = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } + } else if (label == "USE_ARA_ICEATTENU") { USE_ARA_ICEATTENU = atof( line.substr(line.find_first_of("=") + 1).c_str() ); } else if (label == "SIGMA_SELECT") { SIGMA_SELECT = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } + } else if (label == "SIGMAPARAM") { SIGMAPARAM = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } + } else if (label == "SIGMA_FACTOR") { SIGMA_FACTOR = atof( line.substr(line.find_first_of("=") + 1).c_str() ); } else if (label == "YPARAM") { YPARAM = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } + } else if (label == "ELAST_Y") { ELAST_Y = atof( line.substr(line.find_first_of("=") + 1).c_str() ); } else if (label == "NU_NUBAR_SELECT_MODE") { NU_NUBAR_SELECT_MODE = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } + } else if (label == "SELECT_FLAVOR") { SELECT_FLAVOR = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); } @@ -612,7 +612,7 @@ void Settings::ReadFile(string setupfile) { } else if (label == "OUTPUT_TDR_GRAPH") { OUTPUT_TDR_GRAPH = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); - } + } else if (label == "AVZ_NORM_FACTOR_MODE") { AVZ_NORM_FACTOR_MODE = atoi( line.substr(line.find_first_of("=") + 1).c_str() ); } @@ -667,6 +667,9 @@ void Settings::ReadFile(string setupfile) { else if (label == "SC_EFFICIENCY_ERROR_H"){ SC_EFFICIENCY_ERROR_H = atof(line.substr(line.find_first_of("=") + 1).c_str()); } + else if (label == "SYSTEMATICS_IceAtten"){ + SYSTEMATICS_IceAtten = atof(line.substr(line.find_first_of("=") + 1).c_str()); + } } } @@ -691,7 +694,7 @@ void Settings::ReadEvtFile(string evtfile){ double d, f, g, h, i, j, k; if (!(iss >> a >> b >> c >> d >> e >> f >> g >> h >> i >> j >> k)) break; - + /* EVID[i] = atoi(a.c_str()); NUFLAVORINT[i] = atoi(b.c_str()); @@ -798,13 +801,13 @@ int Settings::CheckCompatibilities(Detector *detector) { // if INTERACTION_MODE is 0 (sphere area and obtain Aeff), make sure using GETCHORD_MODE=1 if (INTERACTION_MODE==0) { // picknear_sphere mode if (GETCHORD_MODE==0) { // but use old getchord mode (not working!) - cerr<<"In INTERACTION_MODE=0, you have to use GETCHORD_MODE=1"< use freq_step, ang_step, freq_width, freq_init in Detector instead of same values in Parameters class (it causes returning wrong vales... and I don't understand why) -3) some other minor changes : +3) some other minor changes : Ray class : added WhereDoesItLeave function from icemc ray class EarthModel class : added TRandom3.h header file counting class : add from icemc (need for Primaries class) @@ -498,7 +498,7 @@ AraRoot like output data in AraOut.root file. For that, if your machine doesn't have AraRoot installed, AraSim may not compile or run correctly. In that case, try to add new environment variables and try again. -For example, you can add +For example, you can add export ARASIM_SYS=( the location where your AraSim is located ) export LD_LIBRARY_PATH=$ARASIM_SYS/lib:$LD_LIBRARY_PATH @@ -581,7 +581,7 @@ cout<Nu_Interaction[0].changle; Fixed few bugs. -1) fixed switched NC, CC mode. Previously in Primary class it recognized NC : 1 and CC : 0 index while the array (m_fsigma) to calculate the cross setion used opposite way. +1) fixed switched NC, CC mode. Previously in Primary class it recognized NC : 1 and CC : 0 index while the array (m_fsigma) to calculate the cross setion used opposite way. 2) When we calcuate the weight (probability to survive to posnu), so far AraSim used either NC or CC cross section (depending on which interaction it is at posnu). Now when we calcuate the weight, AraSim uses the total cross section (NC + CC). @@ -598,12 +598,12 @@ For example, noise_ID is a vector array as there could be more than 1 pure noise waveform used for trigger analysis (almost all cases it will be just one value, actually if there's more than one value, current AraSim can't handle that case correctly). - If above noise_ID value is 10, that means for that event, antenna, - + If above noise_ID value is 10, that means for that event, antenna, + trigger->v_noise_timedomain[ 10 ][ noise waveform data, size : settings->DATA_BIN_SIZE, default 16384 ] above pure noise waveform is used fot trigger analysis. - For the channels which passed the trigger (report->stations[i].strings[j].antennas[k].Trig_Pass is not 0), V_mimic waveform should used the pure noise waveform + For the channels which passed the trigger (report->stations[i].strings[j].antennas[k].Trig_Pass is not 0), V_mimic waveform should used the pure noise waveform trigger->v_noise_timedomain[ noise_ID ][ 512 bins where Trig_Pass bin value is located at the center ] @@ -741,7 +741,7 @@ By default, if you use different system temperature modes (NOISE_TEMP_MODE=1 or Additional to this difference, you can give an offset to the threshold to each channels. TRIG_THRES_MODE=0 will not give any threshold offset (default) TRIG_THRES_MODE=1 will read data/threshold_offset.csv file and apply those values to each channels. (ex. if the value for ch1 in csv file is 2, threshold will be rms_diode * powerthreshold * 2) -TRIG_THRES_MODE=2 will not read data/threshold_offset.csv file but use the gain offset for each channels as threshold offset. (ex. if gain offset for ch1 is 2, threshold will be rms_diode * powerthreshold * 2^2) +TRIG_THRES_MODE=2 will not read data/threshold_offset.csv file but use the gain offset for each channels as threshold offset. (ex. if gain offset for ch1 is 2, threshold will be rms_diode * powerthreshold * 2^2) =============================================================================== @@ -837,7 +837,7 @@ Added new NOISE mode. After obtaining the Rayleigh distribution fit from force t NOISE=0 uses just flat thermal noise spectrum from constant temperature and apply preamp, filter gains to them. NOISE=1 uses Rayleigh distribution bit value from TestBed data (distribution at different freq values) so don't use any preamp filter gain for noise waveforms. -Currently NOISE=1 mode is available with +Currently NOISE=1 mode is available with DETECTOR=3 READGEOM=1 NOISE_TEMP_MODE=1 or 2 @@ -970,7 +970,7 @@ Massive update 3) minor update : saturation in electronics chain is implemented. - + V_SATURATION in setup wil set the limit voltage in degitized waveform. Degitized waveform values which have outside the range +-V_SATURATION will be forced to + or - V_SATURATION value. By default V_SATURATION = 1.0 which is 1.0 V or 1000 mV @@ -1037,7 +1037,7 @@ Like old Calpulser mode, currently Calpulser mode will work only with DETECTOR=3 Added ability to define output directory for argc==4, at argv[3] added inverse exponential index of refraction model with NOFZ=2 added conditional dependence on AraRoot for AraRoot-like output - checks if ARA_UTIL_INSTALL_DIR exists and links against the libraries there to make a UsefulIcrrStationEvent + checks if ARA_UTIL_INSTALL_DIR exists and links against the libraries there to make a UsefulIcrrStationEvent =============================================================================== @@ -1122,22 +1122,22 @@ AraOut.setup.txt.run0.root instead of AraOut.setupdirectory/setup.txt.run0.root * can now add third parameter to AraSim for output directory: -./AraSim setup.txt 0 /path/to/output/dir/ +./AraSim setup.txt 0 /path/to/output/dir/ can add slash in the end or not * in Spectra.cc : added new EXPONENT values between 510 and 650 (including), so we can have non-integer energy values: -the formula is E=10^X with X=(EXPONENT-400)/10 +the formula is E=10^X with X=(EXPONENT-400)/10 so if you want 10^18.3eV use EXPONENT=400+18.3*10=583 -added a bash script to make a dynamic load library "library.sh" -run it and get "libSim.so" which is useful for loading all the simulation files you need to link with. +added a bash script to make a dynamic load library "library.sh" +run it and get "libSim.so" which is useful for loading all the simulation files you need to link with. -added the user guide in its own directory. +added the user guide in its own directory. -modified the StandardDefinitions.mk : commented out the parts where it calls ARA_UTIL_INSTALL_DIR +modified the StandardDefinitions.mk : commented out the parts where it calls ARA_UTIL_INSTALL_DIR (it messed up my installation and I think in general AraRoot conflicts with AraSim) @@ -1151,10 +1151,10 @@ Triggering upgrade: -in TRIG_SCAN_MODE=0 triggering works same as before (default) -in TRIG_SCAN_MODE=1 triggering is faster using circular buffer (10-15% for time domain, 40-50% for freq domain) --in TRIG_SCAN_MODE=2 choose low POWERTHRESHOLD, for each triggered event get above what Pthresh this would trigger (e.g. event can trigger if threshold was -5.7). --results for mode 2 saved in report->stations[].TDR_all and TDR_Hpol and TDR_Vpol and sorted from highest to lowest in TDR_Vpol_sorted etc. (TDR= Tunnel Diode Response). +-in TRIG_SCAN_MODE=2 choose low POWERTHRESHOLD, for each triggered event get above what Pthresh this would trigger (e.g. event can trigger if threshold was -5.7). +-results for mode 2 saved in report->stations[].TDR_all and TDR_Hpol and TDR_Vpol and sorted from highest to lowest in TDR_Vpol_sorted etc. (TDR= Tunnel Diode Response). -So for one run at TRIG_SCAN_MODE=2 and POWERTHRESHOLD=-4 and TRIG_MODE=1 (trigger on Hpol and Vpol seperately) and N_TRIG_H=N_TRIG_V=3 we will get for each event the maximum number of channels and maximum POWERTHRESHOLD combination on which it would trigger (e.g. it could trigger at -6.1 in 3 channels or -5.9 at 4 channels). Don't need to run different runs for different Pthresh or N_TRIG, can make the cuts out of the outputfile. +So for one run at TRIG_SCAN_MODE=2 and POWERTHRESHOLD=-4 and TRIG_MODE=1 (trigger on Hpol and Vpol seperately) and N_TRIG_H=N_TRIG_V=3 we will get for each event the maximum number of channels and maximum POWERTHRESHOLD combination on which it would trigger (e.g. it could trigger at -6.1 in 3 channels or -5.9 at 4 channels). Don't need to run different runs for different Pthresh or N_TRIG, can make the cuts out of the outputfile. ============================================================================ @@ -1169,7 +1169,7 @@ So for one run at TRIG_SCAN_MODE=2 and POWERTHRESHOLD=-4 and TRIG_MODE=1 (trigge 04/24/14 Eugene Hong; Added new ARA measured Ice Attenuation factor mode. -Settings, +Settings, USE_ARA_ICEATTENU=1 uses new ARA measured Ice Attenuation length (300MHz value across entire frequencies). Also it uses ray trace steps information to account different attenuation length as a function of depth. @@ -1185,9 +1185,9 @@ To go back to old method, use USE_ARA_ICEATTENU=0 Added new sigma (neutrino cross section) boundary values. When we use Connolly et al 2011 (http://arxiv.org/abs/1102.0691, Fig1, Fig2 plots and Table 3 and 4 for parameter values) cross section mode (SIGMAPARAM=1), -We can use mean cross section (by default) with -Settings, -SIGMA_SELECT=0 +We can use mean cross section (by default) with +Settings, +SIGMA_SELECT=0 and upper bound value by SIGMA_SELECT=1 @@ -1248,13 +1248,13 @@ So Veff/Aeff will be simply decided by INTERACTION_MODE=1 or 0. 06/23/14 Guy Nir: -Added SingleChannelTriggers to Antenna_r in Report class. Saves the total number of triggers in each channel. -Added SCT_threshold_pass Antenna_r in Report class. A vector of the Pthresh values for each single channel trigger. -Added TRIG_SCAN_MODE=3 to settings, that tells AraSim to fill SCT_threshold_pass with values. +Added SingleChannelTriggers to Antenna_r in Report class. Saves the total number of triggers in each channel. +Added SCT_threshold_pass Antenna_r in Report class. A vector of the Pthresh values for each single channel trigger. +Added TRIG_SCAN_MODE=3 to settings, that tells AraSim to fill SCT_threshold_pass with values. -Added OUTPUT_TDR_GRAPH to settings, which tells AraSim to save some tunnel diode output waveforms, for debugging. +Added OUTPUT_TDR_GRAPH to settings, which tells AraSim to save some tunnel diode output waveforms, for debugging. -Added TGraph *getWaveform(...) function to Report class, to get the waveforms from V_mimic and time_mimic vectors. +Added TGraph *getWaveform(...) function to Report class, to get the waveforms from V_mimic and time_mimic vectors. ============================================================================ @@ -1266,9 +1266,9 @@ I am still working to confirm the effective area mode is working properly. 07/08/14 Guy Nir: -Added Interaction::clear_useless() method to clear the shower profile vectors. +Added Interaction::clear_useless() method to clear the shower profile vectors. These vectors took a very large volume in the output files, especially when saving all events. -This only applies in DATA_SAVE_MODE>0. +This only applies in DATA_SAVE_MODE>0. ============================================================================ @@ -1410,11 +1410,11 @@ See Settings.h for more details 10/12/2017 Carl Pfendner: -Added APPLY_NOISE_FIGURE mode to settings to attempt to include the calibration information from Thomas +Added APPLY_NOISE_FIGURE mode to settings to attempt to include the calibration information from Thomas WARNING!!: this is incomplete as of this edit. The channel dependent noise figures do not work correctly yet. Added ANTENNA_MODE mode to settings to allow for new antenna models to -be imported +be imported The newest mode allows the use of a separate antenna model for the top VPol antennas in the layout. @@ -1495,9 +1495,9 @@ Added flexible antennas_per_string and strings_per_station to setup file read-in Cleanup tabs in the Tools class, including the removal of several deprecated functions which are not used anywhere else in AraSim currently -// static void SimpleLinearInterpolation_extend_180cut(int n1, double *x1, double *y1, int n2, double *x2, double *y2 ); -// static void SimpleLinearInterpolation_extend_PIcut(int n1, double *x1, double *y1, int n2, double *x2, double *y2 ); -// static void SimpleLinearInterpolation_OutZero_180cut(int n1, double *x1, double *y1, int n2, double *x2, double *y2 ); +// static void SimpleLinearInterpolation_extend_180cut(int n1, double *x1, double *y1, int n2, double *x2, double *y2 ); +// static void SimpleLinearInterpolation_extend_PIcut(int n1, double *x1, double *y1, int n2, double *x2, double *y2 ); +// static void SimpleLinearInterpolation_OutZero_180cut(int n1, double *x1, double *y1, int n2, double *x2, double *y2 ); // static void SimpleLinearInterpolation_OutZero_PIcut(int n1, double *x1, double *y1, int n2, double *x2, double *y2 ); @@ -1534,4 +1534,9 @@ Three Settings paramters are added: One data file is added: - filter7pole600MHz.txt: 600MHz low-pass curve data (vs freq) +============================================================================ + +2020/01/14 Jorge Torres +- Added the parameter SYSTEMATICS_IceAtten. The default value is zero, which uses Eugene's attenuation model (http://radiorm.physics.ohio-state.edu/elog/Write-Ups/170504_105713/Thesis_-_Eugene_Hong.pdf, p. 54), red line. +Values 1 and 2 are used for lower and upper bound, respectively. The values are hardcoded in the IceModel class. From 382b1e6c9d94eb4ef5f7b2649764cfbcf24314a5 Mon Sep 17 00:00:00 2001 From: Jorge Torres Date: Wed, 15 Jan 2020 12:20:28 -0500 Subject: [PATCH 20/53] Added a check in the settings file so that SYSTEMATICS_IceAtten=1,2 is incompatible with USE_ARA_ICEATTENU=0 --- Settings.cc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Settings.cc b/Settings.cc index 92ee5527..35f83e46 100644 --- a/Settings.cc +++ b/Settings.cc @@ -936,7 +936,11 @@ int Settings::CheckCompatibilities(Detector *detector) { num_err++; } */ - + if (SYSTEMATICS_IceAtten > 0 && (USE_ARA_ICEATTENU==0)) { + cerr<<"SYSTEMATICS_IceAtten=1,2 doesn't work with USE_ARA_ICEATTENU=0"< Date: Thu, 16 Jan 2020 16:32:34 -0500 Subject: [PATCH 21/53] Seems that I didn't commit log.txt --- log.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/log.txt b/log.txt index 3f98c5ca..99c73b0c 100644 --- a/log.txt +++ b/log.txt @@ -1538,5 +1538,7 @@ One data file is added: 2020/01/14 Jorge Torres +In the a23_4yr_diffuse branch, added feature to estimate signal chain efficiency uncertainty. The uncertainty is represented as a scale-down of the antenna gains consisting of a 600MHz low-pass filter and a drop in gain values by 10% and 32% for Vpol and Hpol, respectively. + - Added the parameter SYSTEMATICS_IceAtten. The default value is zero, which uses Eugene's attenuation model (http://radiorm.physics.ohio-state.edu/elog/Write-Ups/170504_105713/Thesis_-_Eugene_Hong.pdf, p. 54), red line. Values 1 and 2 are used for lower and upper bound, respectively. The values are hardcoded in the IceModel class. From a84f1874b31596eed4bade3dd43fa5edf80d5515 Mon Sep 17 00:00:00 2001 From: Jorge Torres Date: Thu, 23 Jan 2020 16:06:39 -0500 Subject: [PATCH 22/53] Added SYSTEMATICS_Askaryan in settings, to evaluate Askaryan model systematics. Default:askaryan signal is not changed at all. =1 scale up the askaryan signal by 12%, =2 scale down the askaryan signal by 12%. The 12% comes from Eugene's thesis, Fg. 5.12. --- Report.cc | 1589 ++++++++++++++++++++++++++------------------------- Settings.cc | 7 +- Settings.h | 1 + 3 files changed, 801 insertions(+), 796 deletions(-) diff --git a/Report.cc b/Report.cc index cf50c29d..071deac9 100644 --- a/Report.cc +++ b/Report.cc @@ -34,7 +34,7 @@ Report::Report(Detector *detector, Settings *settings1) { // Default constructor Initialize(detector, settings1); - + } @@ -71,7 +71,7 @@ void Report::delete_all() { } void Report::Initialize(Detector *detector, Settings *settings1) { - + // clear information stored in (but there shouldn't be. just to make sure) // //stations.clear(); @@ -102,23 +102,23 @@ void Report::Initialize(Detector *detector, Settings *settings1) { if(settings1->TRIG_SCAN_MODE>0){// scan Pthresh mode - int numChan=0; + int numChan=0; int numChanVpol=0; int numChanHpol=0; - + for(int j=0;jstations[i].strings.size(); j++){ - + for (int k=0;kstations[i].strings[j].antennas.size();k++) { - + int string_i = detector->getStringfromArbAntID( i, numChan); int antenna_i = detector->getAntennafromArbAntID( i, numChan); if (detector->stations[i].strings[string_i].antennas[antenna_i].type == 0) numChanVpol++; if (detector->stations[i].strings[string_i].antennas[antenna_i].type == 1) numChanHpol++; numChan++; }// for k - + }// for j - + stations[i].TDR_all.clear(); for(int ch=0;chTRIG_MODE==1) for(int ch=0;chDATA_SAVE_MODE == 1) { Heff.clear(); - + //VHz_antfactor.clear(); //VHz_filter.clear(); Vfft.clear(); @@ -237,8 +237,8 @@ void Antenna_r::clear_useless(Settings *settings1) { // to reduce the size of } else if (settings1->DATA_SAVE_MODE == 2) { - - + + Heff.clear(); //VHz_antfactor.clear(); //VHz_filter.clear(); @@ -264,7 +264,7 @@ void Antenna_r::clear_useless(Settings *settings1) { // to reduce the size of //Mag.clear(); //Fresnel.clear(); //Pol_factor.clear(); - + // clear global trigger waveform info also time.clear(); time_mimic.clear(); @@ -275,7 +275,7 @@ void Antenna_r::clear_useless(Settings *settings1) { // to reduce the size of //Vm_wo_antfactor.clear(); Vm_zoom.clear(); Vm_zoom_T.clear(); - + } @@ -300,7 +300,7 @@ void Report::clear_useless(Settings *settings1) { // to reduce the size of out //V_noise_timedomain.clear(); // done clear vector info in report head // - + V_total_forconvlv.clear(); RayStep.clear(); @@ -345,7 +345,7 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray int waveformLength = settings1->WAVEFORM_LENGTH; int waveformCenter = settings1->WAVEFORM_CENTER; - + //double dF_outbin; double dF_Nnew; @@ -378,63 +378,63 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray //else if ( settings1->DEBUG_MODE_ON == 1 && evt >= settings1->DEBUG_SKIP_EVT ) cout<<"After DEBUG_SKIP_EVT"<DEBUG_MODE_ON == 1 && evt >= settings1->DEBUG_SKIP_EVT ) cout<params.number_of_stations; i++) { - + min_arrival_time_tmp = 10.; // first min_arrival_time is unreasonably big value max_arrival_time_tmp = 0.; // first max_arrival_time is unreasonably small value max_PeakV_tmp = 0.; // first max_PeakV_tmp is 0. - + stations[i].Total_ray_sol=0; // initial Total_ray_sol value - - - + + + for (int j=0; j< detector->stations[i].strings.size(); j++) { - + for (int k=0; k< detector->stations[i].strings[j].antennas.size(); k++) { // cout << i << " : " << j << " : " << k << endl; - + stations[i].strings[j].antennas[k].clear(); // clear data in antenna which stored in previous event - + // run ray solver, see if solution exist // if not, skip (set something like Sol_No = 0; // if solution exist, calculate view angle and calculate TaperVmMHz - + // added one more condition to run raysolver ( direct distance is less than 3km ) // // cout << event->Nu_Interaction[0].posnu.GetX() << " : " << event->Nu_Interaction[0].posnu.GetY() << " : " << event->Nu_Interaction[0].posnu.GetZ() << endl; - // cout << event->Nu_Interaction[0].pickposnu << " : " << event->Nu_Interaction[0].posnu.Distance( detector->stations[i].strings[j].antennas[k] ) << " : " << settings1->RAYSOL_RANGE << endl; + // cout << event->Nu_Interaction[0].pickposnu << " : " << event->Nu_Interaction[0].posnu.Distance( detector->stations[i].strings[j].antennas[k] ) << " : " << settings1->RAYSOL_RANGE << endl; if (event->Nu_Interaction[0].pickposnu && event->Nu_Interaction[0].posnu.Distance( detector->stations[i].strings[j].antennas[k] ) <= settings1->RAYSOL_RANGE ) { // if posnu is selected inside the antarctic ic:"<Nu_Interaction[0].pickposnu && event->Nu_Interaction[0].posnu.Distance( detector->stations[i].strings[j].antennas[k] ) <= settings1->RAYSOL_RANGE && debugmode == 0 ) { // if posnu is selected inside the antarctic ic:"<Solve_Ray(event->Nu_Interaction[0].posnu, detector->stations[i].strings[j].antennas[k], icemodel, ray_output, settings1); // solve ray between source and antenna RayStep.clear(); // remove previous values raysolver->Solve_Ray(event->Nu_Interaction[0].posnu, detector->stations[i].strings[j].antennas[k], icemodel, ray_output, settings1, RayStep); // solve ray between source and antenna - + ray_sol_cnt = 0; - + if (raysolver->solution_toggle) { // if there are solution from raysolver //if (raysolver->solution_toggle && debugmode==0 ) { // if there are solution from raysolver - - + + while ( ray_sol_cnt < ray_output[0].size() ) { // for number of soultions (could be 1 or 2) - - + + stations[i].strings[j].antennas[k].arrival_time.push_back(ray_output[4][ray_sol_cnt]); - - + + // get ice attenuation factor // - double IceAttenFactor = 1.; + double IceAttenFactor = 1.; if ( settings1->USE_ARA_ICEATTENU==1 ) {// use new ARA measured ice attenuation values - + double dx, dz, dl; for (int steps=1; steps<(int)RayStep[ray_sol_cnt][0].size(); steps++) { @@ -448,7 +448,7 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray //cout<<"new iceattenfactor : "<EffectiveAttenuationLength(settings1, event->Nu_Interaction[0].posnu, 0))<USE_ARA_ICEATTENU==0 ) {// use old method - + IceAttenFactor = exp(-ray_output[0][ray_sol_cnt]/icemodel->EffectiveAttenuationLength(settings1, event->Nu_Interaction[0].posnu, 0)); } @@ -487,11 +487,11 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray stations[i].strings[j].antennas[k].L_att.push_back( icemodel->EffectiveAttenuationLength(settings1, event->Nu_Interaction[0].posnu, 0) ); //stations[i].strings[j].antennas[k].arrival_time.push_back(ray_output[4][ray_sol_cnt]); stations[i].strings[j].antennas[k].reflect_ang.push_back(ray_output[3][ray_sol_cnt]); - + stations[i].strings[j].antennas[k].vmmhz.resize(ray_sol_cnt+1); stations[i].strings[j].antennas[k].Heff.resize(ray_sol_cnt+1); - + stations[i].strings[j].antennas[k].Vm_zoom.resize(ray_sol_cnt+1); stations[i].strings[j].antennas[k].Vm_zoom_T.resize(ray_sol_cnt+1); @@ -547,7 +547,7 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray GetAngleAnt(receive_vector, detector->stations[i].strings[j].antennas[k], antenna_theta, antenna_phi); // get theta, phi for signal ray arrived at antenna - //cout<<"antenna theta : "<GetFreqBin(); l++) { // for detector freq bin numbers - + //cout<<"TaperVmMHz inputs VA:"<Nu_Interaction[0].d_theta_em[l]<<" th_had:"<Nu_Interaction[0].d_theta_had[l]<<" emfrac:"<Nu_Interaction[0].emfrac<<" hadfrac:"<Nu_Interaction[0].hadfrac<<" vmmhz1m:"<Nu_Interaction[0].vmmhz1m[l]<IsCalpulser){ // case 0: @@ -576,8 +576,8 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray vmmhz1m_tmp = event->Nu_Interaction[0].vmmhz1m[l]; signal->TaperVmMHz( viewangle, event->Nu_Interaction[0].d_theta_em[l], event->Nu_Interaction[0].d_theta_had[l], event->Nu_Interaction[0].emfrac, event->Nu_Interaction[0].hadfrac, vmmhz1m_tmp, vmmhz1m_em); } - - + + // break; // case 1: // vmmhz1m_tmp = 0; @@ -589,9 +589,9 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray // vmmhz1m_tmp = event->Nu_Interaction[0].vmmhz1m[l]; // break; // } - - - + + + // signal->TaperVmMHz( viewangle, event->Nu_Interaction[0].d_theta_em[l], event->Nu_Interaction[0].d_theta_had[l], event->Nu_Interaction[0].emfrac, event->Nu_Interaction[0].hadfrac, vmmhz1m_tmp, vmmhz1m_em); //cout<<"TaperVmMHz (1m at view angle) at "<stations[i].strings[j].antennas[k].GetG(detector, freq_tmp*1.E-6, // to MHz - antenna_theta, antenna_phi), + antenna_theta, antenna_phi), freq_tmp, icemodel->GetN(detector->stations[i].strings[j].antennas[k]) ); */ if ( settings1->ALL_ANT_V_ON==0 ) { if (settings1->ANTENNA_MODE == 0){ heff = GaintoHeight(detector->GetGain_1D_OutZero(freq_tmp*1.E-6, // to MHz - antenna_theta, antenna_phi, detector->stations[i].strings[j].antennas[k].type), + antenna_theta, antenna_phi, detector->stations[i].strings[j].antennas[k].type), freq_tmp, icemodel->GetN(detector->stations[i].strings[j].antennas[k]) ); } if (settings1->ANTENNA_MODE == 1){ heff = GaintoHeight(detector->GetGain_1D_OutZero(freq_tmp*1.E-6, // to MHz - antenna_theta, antenna_phi, detector->stations[i].strings[j].antennas[k].type, k), + antenna_theta, antenna_phi, detector->stations[i].strings[j].antennas[k].type, k), freq_tmp, icemodel->GetN(detector->stations[i].strings[j].antennas[k]) ); } } else if ( settings1->ALL_ANT_V_ON==1 ) { if (settings1->ANTENNA_MODE == 0){ heff = GaintoHeight(detector->GetGain_1D_OutZero(freq_tmp*1.E-6, // to MHz - antenna_theta, antenna_phi, 0), + antenna_theta, antenna_phi, 0), freq_tmp, icemodel->GetN(detector->stations[i].strings[j].antennas[k]) ); } if (settings1->ANTENNA_MODE == 1){ heff = GaintoHeight(detector->GetGain_1D_OutZero(freq_tmp*1.E-6, // to MHz - antenna_theta, antenna_phi, 0, k), + antenna_theta, antenna_phi, 0, k), freq_tmp, icemodel->GetN(detector->stations[i].strings[j].antennas[k]) ); } } @@ -665,7 +665,7 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray //cout<<"set signal pol as Vpol + Hpol for Calpulser2 evts"<stations[i].strings[j].antennas[k].type, Pol_factor, vmmhz1m_tmp); cout << "Check 2" << endl; @@ -687,7 +687,7 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray }// end for freq bin - + stations[i].strings[j].antennas[k].Pol_factor.push_back( Pol_factor ); @@ -712,13 +712,13 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray //cout<<"Finished getting V signal part!!"<NFOUR/2) ); // Vfft_noise_org is in fft freq bin!! // same unit with Vfft [V] but filter not applied - + Tools::NormalTimeOrdering(settings1->NFOUR/2, volts_forfft); //cout<<"finished NormalTimeOrdering!!"<IsCalpulser == 0){ @@ -758,7 +758,7 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray // initially give raysol has actual signal stations[i].strings[j].antennas[k].SignalExt[ray_sol_cnt] = 1; - + // let's make NFOUR/2 bin of time domain pure signal part for now // later once we understand how to apply antenna phase, total electronics with phase, apply those @@ -769,10 +769,13 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray // signal before the antenna (get signal at 1m and apply atten factor) signal->GetVm_FarField_Tarray( event, settings1, viewangle, atten_factor, outbin, Tarray, Earray, stations[i].strings[j].antennas[k].skip_bins[ray_sol_cnt] ); + if(settings1->SYSTEMATICS_Askaryan>0){ + if(settings1->SYSTEMATICS_Askaryan==1) for(int kk=0;kk<64;kk++){Earray[kk]*=1.12;} + if(settings1->SYSTEMATICS_Askaryan==2) for(int kk=0;kk<64;kk++){Earray[kk]*=0.88;} + } - dT_forfft = Tarray[1] - Tarray[0]; // step in ns int Ntmp = settings1->TIMESTEP*1.e9 / dT_forfft; @@ -814,7 +817,7 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray else V_forfft[n] = 0.; - + //stations[i].strings[j].antennas[k].Vm_wo_antfactor[ray_sol_cnt].push_back( V_forfft[n] ); @@ -856,37 +859,37 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray /* - // Get ant gain with 2-D interpolation (may have bug?) + // Get ant gain with 2-D interpolation (may have bug?) // heff_lastbin = GaintoHeight(detector->GetGain_1D_OutZero(freq_tmp*1.E-6, // to MHz - antenna_theta, antenna_phi, detector->stations[i].strings[j].antennas[k].type), + antenna_theta, antenna_phi, detector->stations[i].strings[j].antennas[k].type), freq_tmp, icemodel->GetN(detector->stations[i].strings[j].antennas[k]) ); */ if ( settings1->ALL_ANT_V_ON==0 ) { if (settings1->ANTENNA_MODE == 0){ heff_lastbin = GaintoHeight(detector->GetGain_1D_OutZero(freq_tmp*1.E-6, // to MHz - antenna_theta, antenna_phi, detector->stations[i].strings[j].antennas[k].type), + antenna_theta, antenna_phi, detector->stations[i].strings[j].antennas[k].type), freq_tmp, icemodel->GetN(detector->stations[i].strings[j].antennas[k]) ); } if (settings1->ANTENNA_MODE == 1){ heff_lastbin = GaintoHeight(detector->GetGain_1D_OutZero(freq_tmp*1.E-6, // to MHz - antenna_theta, antenna_phi, detector->stations[i].strings[j].antennas[k].type, k), + antenna_theta, antenna_phi, detector->stations[i].strings[j].antennas[k].type, k), freq_tmp, icemodel->GetN(detector->stations[i].strings[j].antennas[k]) ); } } else if ( settings1->ALL_ANT_V_ON==1 ) { - + if (settings1->ANTENNA_MODE == 0){ heff_lastbin = GaintoHeight(detector->GetGain_1D_OutZero(freq_tmp*1.E-6, // to MHz - antenna_theta, antenna_phi, 0), + antenna_theta, antenna_phi, 0), freq_tmp, icemodel->GetN(detector->stations[i].strings[j].antennas[k]) ); } if (settings1->ANTENNA_MODE == 1){ heff_lastbin = GaintoHeight(detector->GetGain_1D_OutZero(freq_tmp*1.E-6, // to MHz - antenna_theta, antenna_phi, 0, k), + antenna_theta, antenna_phi, 0, k), freq_tmp, icemodel->GetN(detector->stations[i].strings[j].antennas[k]) ); } - + } @@ -903,31 +906,31 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray /* heff = GaintoHeight(detector->GetGain_1D_OutZero(freq_tmp*1.E-6, // to MHz - antenna_theta, antenna_phi, detector->stations[i].strings[j].antennas[k].type), + antenna_theta, antenna_phi, detector->stations[i].strings[j].antennas[k].type), freq_tmp, icemodel->GetN(detector->stations[i].strings[j].antennas[k]) ); */ if ( settings1->ALL_ANT_V_ON==0 ) { if (settings1->ANTENNA_MODE == 0){ heff = GaintoHeight(detector->GetGain_1D_OutZero(freq_tmp*1.E-6, // to MHz - antenna_theta, antenna_phi, detector->stations[i].strings[j].antennas[k].type), + antenna_theta, antenna_phi, detector->stations[i].strings[j].antennas[k].type), freq_tmp, icemodel->GetN(detector->stations[i].strings[j].antennas[k]) ); } - + if (settings1->ANTENNA_MODE == 1){ heff = GaintoHeight(detector->GetGain_1D_OutZero(freq_tmp*1.E-6, // to MHz - antenna_theta, antenna_phi, detector->stations[i].strings[j].antennas[k].type, k), + antenna_theta, antenna_phi, detector->stations[i].strings[j].antennas[k].type, k), freq_tmp, icemodel->GetN(detector->stations[i].strings[j].antennas[k]) ); } } else if ( settings1->ALL_ANT_V_ON==1 ) { if (settings1->ANTENNA_MODE == 0){ heff = GaintoHeight(detector->GetGain_1D_OutZero(freq_tmp*1.E-6, // to MHz - antenna_theta, antenna_phi, 0), + antenna_theta, antenna_phi, 0), freq_tmp, icemodel->GetN(detector->stations[i].strings[j].antennas[k]) ); } if (settings1->ANTENNA_MODE == 1){ heff = GaintoHeight(detector->GetGain_1D_OutZero(freq_tmp*1.E-6, // to MHz - antenna_theta, antenna_phi, 0, k), + antenna_theta, antenna_phi, 0, k), freq_tmp, icemodel->GetN(detector->stations[i].strings[j].antennas[k]) ); } } @@ -945,7 +948,7 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray if ( n > 0 ) { if ( settings1->ALL_ANT_V_ON==0 ) { - + ApplyAntFactors_Tdomain( detector->GetAntPhase_1D( freq_tmp*1.e-6, antenna_theta, antenna_phi, detector->stations[i].strings[j].antennas[k].type ), heff, n_trg_pokey, n_trg_slappy, Pol_vector, detector->stations[i].strings[j].antennas[k].type, Pol_factor, V_forfft[2*n], V_forfft[2*n+1], settings1 ); } @@ -1045,11 +1048,11 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray // initially give raysol has actual signal stations[i].strings[j].antennas[k].SignalExt[ray_sol_cnt] = 1; - + int waveform_bin = (int)signal->ArbitraryWaveform_V.size(); // cout << waveform_bin << endl; - + //dT_forfft = Tarray[1] - Tarray[0]; // step in ns //dT_forfft = detector->CalPulserWF_ns[1] - detector->CalPulserWF_ns[0]; // step in ns dT_forfft = signal->ArbitraryWaveform_T[1]-signal->ArbitraryWaveform_T[0]; // step in ns @@ -1065,17 +1068,17 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray } stations[i].strings[j].antennas[k].Nnew[ray_sol_cnt] = stations[i].strings[j].antennas[k].Nnew[ray_sol_cnt] * settings1->NFOUR/2; // now new NFOUR for zero padding - - - + + + // now we have to make NFOUR/2 number of bins with random init time // // as a test, make first as it is and zero pad - - + + double V_forfft[ stations[i].strings[j].antennas[k].Nnew[ray_sol_cnt] ]; double T_forfft[ stations[i].strings[j].antennas[k].Nnew[ray_sol_cnt] ]; - + for (int n=0; nArbitraryWaveform_T[n] ); //cout << signal->ArbitraryWaveform_T[n] << " : " << signal->ArbitraryWaveform_V[n] << endl; } - + // make Tarray, Earray located at the center of Nnew array //T_forfft[n] = Tarray[outbin/2] - (dT_forfft*(double)(stations[i].strings[j].antennas[k].Nnew[ray_sol_cnt]/2)) + (double)n*dT_forfft; - + T_forfft[n] = signal->ArbitraryWaveform_T[waveform_bin/2] - (dT_forfft*(double)(stations[i].strings[j].antennas[k].Nnew[ray_sol_cnt]/2 - n)); - + if ( (n >= stations[i].strings[j].antennas[k].Nnew[ray_sol_cnt]/2 - waveform_bin/2) && (n < stations[i].strings[j].antennas[k].Nnew[ray_sol_cnt]/2 + waveform_bin/2) ) { V_forfft[n] = signal->ArbitraryWaveform_V[ n - (stations[i].strings[j].antennas[k].Nnew[ray_sol_cnt]/2 - waveform_bin/2) ]; - + } else V_forfft[n] = 0.; - - - + + + //stations[i].strings[j].antennas[k].Vm_wo_antfactor[ray_sol_cnt].push_back( V_forfft[n] ); - + } - - + + // just get peak from the array //stations[i].strings[j].antennas[k].PeakV.push_back( FindPeak(detector->CalPulserWF_V, CP_bin) ); stations[i].strings[j].antennas[k].PeakV.push_back( -1. );// just let -1. - - + + // get spectrum with zero padded WF //Tools::realft(volts_forfft,1,settings1->NFOUR/2); Tools::realft(V_forfft,1,stations[i].strings[j].antennas[k].Nnew[ray_sol_cnt]); - + //dF_outbin = 1./( (double)(outbin) * (Tarray[1]-Tarray[0])*1.e-9 ); // in Hz dF_Nnew = 1./( (double)(stations[i].strings[j].antennas[k].Nnew[ray_sol_cnt]) * (dT_forfft)*1.e-9 ); // in Hz - + //freq_tmp = dF_Nnew*((double)stations[i].strings[j].antennas[k].Nnew[ray_sol_cnt]/2.+1.+0.5);// in Hz 0.5 to place the middle of the bin and avoid zero freq freq_tmp = dF_Nnew*((double)stations[i].strings[j].antennas[k].Nnew[ray_sol_cnt]/2.+0.5);// in Hz 0.5 to place the middle of the bin and avoid zero freq - + freq_lastbin = freq_tmp; - - + + /* // heff last bin for transmitter ant double heff_lastbin_trans; @@ -1130,47 +1133,47 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray //cout<<"ant theta trans : "<ALL_ANT_V_ON==0 ) { heff_lastbin_trans = GaintoHeight(detector->GetGain_1D_OutZero(freq_tmp*1.E-6, // to MHz - ant_theta_trans, antenna_phi, detector->stations[i].strings[j].antennas[k].type), + ant_theta_trans, antenna_phi, detector->stations[i].strings[j].antennas[k].type), freq_tmp, icemodel->GetN(event->Nu_Interaction[0].posnu) ); } else if ( settings1->ALL_ANT_V_ON==1 ) { heff_lastbin_trans = GaintoHeight(detector->GetGain_1D_OutZero(freq_tmp*1.E-6, // to MHz - ant_theta_trans, antenna_phi, 0), + ant_theta_trans, antenna_phi, 0), freq_tmp, icemodel->GetN(event->Nu_Interaction[0].posnu) ); } - - - - + + + + // heff last bin for receiver ant /* - // Get ant gain with 2-D interpolation (may have bug?) + // Get ant gain with 2-D interpolation (may have bug?) // heff_lastbin = GaintoHeight(detector->GetGain_1D_OutZero(freq_tmp*1.E-6, // to MHz - antenna_theta, antenna_phi, detector->stations[i].strings[j].antennas[k].type), + antenna_theta, antenna_phi, detector->stations[i].strings[j].antennas[k].type), freq_tmp, icemodel->GetN(detector->stations[i].strings[j].antennas[k]) ); */ - /* + /* if ( settings1->ALL_ANT_V_ON==0 ) { heff_lastbin = GaintoHeight(detector->GetGain_1D_OutZero(freq_tmp*1.E-6, // to MHz - antenna_theta, antenna_phi, detector->stations[i].strings[j].antennas[k].type), + antenna_theta, antenna_phi, detector->stations[i].strings[j].antennas[k].type), freq_tmp, icemodel->GetN(detector->stations[i].strings[j].antennas[k]) ); } else if ( settings1->ALL_ANT_V_ON==1 ) { heff_lastbin = GaintoHeight(detector->GetGain_1D_OutZero(freq_tmp*1.E-6, // to MHz - antenna_theta, antenna_phi, 0), + antenna_theta, antenna_phi, 0), freq_tmp, icemodel->GetN(detector->stations[i].strings[j].antennas[k]) ); } - */ + */ // Pol_vector = n_trg_slappy; - Pol_vector = n_trg_pokey; - - + Pol_vector = n_trg_pokey; + + // // for (int n=0; nALL_ANT_V_ON==0 ) { heff = GaintoHeight(detector->GetGain_1D_OutZero(freq_tmp*1.E-6, // to MHz - ant_theta_trans, antenna_phi, detector->stations[i].strings[j].antennas[k].type), + ant_theta_trans, antenna_phi, detector->stations[i].strings[j].antennas[k].type), freq_tmp, icemodel->GetN(event->Nu_Interaction[0].posnu) ); } else if ( settings1->ALL_ANT_V_ON==1 ) { heff = GaintoHeight(detector->GetGain_1D_OutZero(freq_tmp*1.E-6, // to MHz - ant_theta_trans, antenna_phi, 0), + ant_theta_trans, antenna_phi, 0), freq_tmp, icemodel->GetN(event->Nu_Interaction[0].posnu) ); } // if ( n > 0 ) { - + if ( settings1->ALL_ANT_V_ON==0 ) { - + ApplyAntFactors_Tdomain_Transmitter( detector->GetAntPhase_1D( freq_tmp*1.e-6, ant_theta_trans, antenna_phi, detector->stations[i].strings[j].antennas[k].type ), heff, n_trg_pokey, n_trg_slappy, Pol_vector, detector->stations[i].strings[j].antennas[k].type, Pol_factor, V_forfft[2*n], V_forfft[2*n+1], settings1 ); } @@ -1198,32 +1201,32 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray ApplyAntFactors_Tdomain_Transmitter( detector->GetAntPhase_1D( freq_tmp*1.e-6, ant_theta_trans, antenna_phi, 0 ), heff, n_trg_pokey, n_trg_slappy, Pol_vector, detector->stations[i].strings[j].antennas[k].type, Pol_factor, V_forfft[2*n], V_forfft[2*n+1], settings1 ); } - - - + + + } else { ApplyAntFactors_Tdomain_FirstTwo( heff, heff_lastbin_trans, n_trg_pokey, n_trg_slappy, Pol_vector, detector->stations[i].strings[j].antennas[k].type, Pol_factor, V_forfft[2*n], V_forfft[2*n+1] ); } - + // // apply ant factors (receiver ant) // /* heff = GaintoHeight(detector->GetGain_1D_OutZero(freq_tmp*1.E-6, // to MHz - antenna_theta, antenna_phi, detector->stations[i].strings[j].antennas[k].type), + antenna_theta, antenna_phi, detector->stations[i].strings[j].antennas[k].type), freq_tmp, icemodel->GetN(detector->stations[i].strings[j].antennas[k]) ); */ - + if ( settings1->ALL_ANT_V_ON==0 ) { if (settings1->ANTENNA_MODE == 0){ heff = GaintoHeight(detector->GetGain_1D_OutZero(freq_tmp*1.E-6, // to MHz - antenna_theta, antenna_phi, detector->stations[i].strings[j].antennas[k].type), + antenna_theta, antenna_phi, detector->stations[i].strings[j].antennas[k].type), freq_tmp, icemodel->GetN(detector->stations[i].strings[j].antennas[k]) ); } if (settings1->ANTENNA_MODE == 1){ heff = GaintoHeight(detector->GetGain_1D_OutZero(freq_tmp*1.E-6, // to MHz - antenna_theta, antenna_phi, detector->stations[i].strings[j].antennas[k].type,k), + antenna_theta, antenna_phi, detector->stations[i].strings[j].antennas[k].type,k), freq_tmp, icemodel->GetN(detector->stations[i].strings[j].antennas[k]) ); } } @@ -1231,25 +1234,25 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray else if ( settings1->ALL_ANT_V_ON==1 ) { if (settings1->ANTENNA_MODE == 0){ heff = GaintoHeight(detector->GetGain_1D_OutZero(freq_tmp*1.E-6, // to MHz - antenna_theta, antenna_phi, 0), + antenna_theta, antenna_phi, 0), freq_tmp, icemodel->GetN(detector->stations[i].strings[j].antennas[k]) ); } if (settings1->ANTENNA_MODE == 1){ heff = GaintoHeight(detector->GetGain_1D_OutZero(freq_tmp*1.E-6, // to MHz - antenna_theta, antenna_phi, 0,k), + antenna_theta, antenna_phi, 0,k), freq_tmp, icemodel->GetN(detector->stations[i].strings[j].antennas[k]) ); - - } + + } } - + stations[i].strings[j].antennas[k].Heff[ray_sol_cnt].push_back( heff ); - - + + if ( n > 0 ) { - + if ( settings1->ALL_ANT_V_ON==0 ) { - + ApplyAntFactors_Tdomain( detector->GetAntPhase_1D( freq_tmp*1.e-6, antenna_theta, antenna_phi, detector->stations[i].strings[j].antennas[k].type ), heff, n_trg_pokey, n_trg_slappy, Pol_vector, detector->stations[i].strings[j].antennas[k].type, Pol_factor, V_forfft[2*n], V_forfft[2*n+1], settings1 ); } @@ -1257,14 +1260,14 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray ApplyAntFactors_Tdomain( detector->GetAntPhase_1D( freq_tmp*1.e-6, antenna_theta, antenna_phi, 0 ), heff, n_trg_pokey, n_trg_slappy, Pol_vector, detector->stations[i].strings[j].antennas[k].type, Pol_factor, V_forfft[2*n], V_forfft[2*n+1], settings1 ); } - - - + + + } else { ApplyAntFactors_Tdomain_FirstTwo( heff, heff_lastbin, n_trg_pokey, n_trg_slappy, Pol_vector, detector->stations[i].strings[j].antennas[k].type, Pol_factor, V_forfft[2*n], V_forfft[2*n+1] ); } - + // // apply entire elect chain gain, phase // @@ -1274,33 +1277,33 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray else { ApplyElect_Tdomain_FirstTwo( freq_tmp*1.e-6, freq_lastbin*1.e-6, detector, V_forfft[2*n], V_forfft[2*n+1] ); } - - - + + + }// end for freq bin - + // now get time domain waveform back by inv fft Tools::realft(V_forfft,-1,stations[i].strings[j].antennas[k].Nnew[ray_sol_cnt]); - - + + // we need to do normal time ordering as we did zero padding(?) // If signal is located at the center, we don't need to do NormalTimeOrdering??? //Tools::NormalTimeOrdering(stations[i].strings[j].antennas[k].Nnew[ray_sol_cnt], V_forfft); - - + + // skip linear interpolation for now Tools::SimpleLinearInterpolation_OutZero( stations[i].strings[j].antennas[k].Nnew[ray_sol_cnt], T_forfft, V_forfft, settings1->NFOUR/2, T_forint, volts_forint ); - + // check what we save as V[], volts_forint? or volts_forfft - - - - - + + + + + for (int n=0; nNFOUR/2; n++) { - + if (settings1->TRIG_ANALYSIS_MODE != 2) { // not pure noise mode (we need signal) //stations[i].strings[j].antennas[k].V[ray_sol_cnt].push_back( volts_forfft[n] ); //stations[i].strings[j].antennas[k].V[ray_sol_cnt].push_back( V_forfft[n] * 2./(double)(settings1->NFOUR/2) ); // 2/N for inverse FFT normalization factor @@ -1310,27 +1313,27 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray else if (settings1->TRIG_ANALYSIS_MODE == 2) { // pure noise mode (set signal to 0) stations[i].strings[j].antennas[k].V[ray_sol_cnt].push_back( 0. ); } - + } - + }// Arbitrary Events - + } // if not calpulser event - + // if calpulser event else if (event->IsCalpulser > 0){ // initially give raysol has actual signal stations[i].strings[j].antennas[k].SignalExt[ray_sol_cnt] = 1; - + int CP_bin = (int)detector->CalPulserWF_ns.size(); - - + + //dT_forfft = Tarray[1] - Tarray[0]; // step in ns dT_forfft = detector->CalPulserWF_ns[1] - detector->CalPulserWF_ns[0]; // step in ns - + int Ntmp = settings1->TIMESTEP*1.e9 / dT_forfft; stations[i].strings[j].antennas[k].Nnew[ray_sol_cnt] = 1; @@ -1340,65 +1343,65 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray } stations[i].strings[j].antennas[k].Nnew[ray_sol_cnt] = stations[i].strings[j].antennas[k].Nnew[ray_sol_cnt] * settings1->NFOUR/2; // now new NFOUR for zero padding - - - + + + // now we have to make NFOUR/2 number of bins with random init time // // as a test, make first as it is and zero pad - - + + double V_forfft[ stations[i].strings[j].antennas[k].Nnew[ray_sol_cnt] ]; double T_forfft[ stations[i].strings[j].antennas[k].Nnew[ray_sol_cnt] ]; - + for (int n=0; nCalPulserWF_V[n] ); stations[i].strings[j].antennas[k].Vm_zoom_T[ray_sol_cnt].push_back( detector->CalPulserWF_ns[n] ); - + } - + // make Tarray, Earray located at the center of Nnew array //T_forfft[n] = Tarray[outbin/2] - (dT_forfft*(double)(stations[i].strings[j].antennas[k].Nnew[ray_sol_cnt]/2)) + (double)n*dT_forfft; - + T_forfft[n] = detector->CalPulserWF_ns[CP_bin/2] - (dT_forfft*(double)(stations[i].strings[j].antennas[k].Nnew[ray_sol_cnt]/2 - n)); - + if ( (n >= stations[i].strings[j].antennas[k].Nnew[ray_sol_cnt]/2 - CP_bin/2) && (n < stations[i].strings[j].antennas[k].Nnew[ray_sol_cnt]/2 + CP_bin/2) ) { V_forfft[n] = detector->CalPulserWF_V[ n - (stations[i].strings[j].antennas[k].Nnew[ray_sol_cnt]/2 - CP_bin/2) ]; } else V_forfft[n] = 0.; - - - + + + //stations[i].strings[j].antennas[k].Vm_wo_antfactor[ray_sol_cnt].push_back( V_forfft[n] ); - + } - - - + + + // just get peak from the array //stations[i].strings[j].antennas[k].PeakV.push_back( FindPeak(detector->CalPulserWF_V, CP_bin) ); stations[i].strings[j].antennas[k].PeakV.push_back( -1. );// just let -1. - - + + // get spectrum with zero padded WF //Tools::realft(volts_forfft,1,settings1->NFOUR/2); Tools::realft(V_forfft,1,stations[i].strings[j].antennas[k].Nnew[ray_sol_cnt]); - + //dF_outbin = 1./( (double)(outbin) * (Tarray[1]-Tarray[0])*1.e-9 ); // in Hz dF_Nnew = 1./( (double)(stations[i].strings[j].antennas[k].Nnew[ray_sol_cnt]) * (dT_forfft)*1.e-9 ); // in Hz - + //freq_tmp = dF_Nnew*((double)stations[i].strings[j].antennas[k].Nnew[ray_sol_cnt]/2.+1.+0.5);// in Hz 0.5 to place the middle of the bin and avoid zero freq freq_tmp = dF_Nnew*((double)stations[i].strings[j].antennas[k].Nnew[ray_sol_cnt]/2.+0.5);// in Hz 0.5 to place the middle of the bin and avoid zero freq - + freq_lastbin = freq_tmp; - - - + + + // heff last bin for transmitter ant double heff_lastbin_trans; double ant_theta_trans = ray_output[1][ray_sol_cnt] * DEGRAD; // from 0 to 180 @@ -1406,67 +1409,67 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray if ( settings1->ALL_ANT_V_ON==0 ) { if (settings1->ANTENNA_MODE == 0){ heff_lastbin_trans = GaintoHeight(detector->GetGain_1D_OutZero(freq_tmp*1.E-6, // to MHz - ant_theta_trans, antenna_phi, detector->stations[i].strings[j].antennas[k].type), + ant_theta_trans, antenna_phi, detector->stations[i].strings[j].antennas[k].type), freq_tmp, icemodel->GetN(event->Nu_Interaction[0].posnu) ); } if (settings1->ANTENNA_MODE == 1){ heff_lastbin_trans = GaintoHeight(detector->GetGain_1D_OutZero(freq_tmp*1.E-6, // to MHz - ant_theta_trans, antenna_phi, detector->stations[i].strings[j].antennas[k].type, k), + ant_theta_trans, antenna_phi, detector->stations[i].strings[j].antennas[k].type, k), freq_tmp, icemodel->GetN(event->Nu_Interaction[0].posnu) ); } } else if ( settings1->ALL_ANT_V_ON==1 ) { if (settings1->ANTENNA_MODE == 0){ heff_lastbin_trans = GaintoHeight(detector->GetGain_1D_OutZero(freq_tmp*1.E-6, // to MHz - ant_theta_trans, antenna_phi, 0), + ant_theta_trans, antenna_phi, 0), freq_tmp, icemodel->GetN(event->Nu_Interaction[0].posnu) ); } if (settings1->ANTENNA_MODE == 1){ heff_lastbin_trans = GaintoHeight(detector->GetGain_1D_OutZero(freq_tmp*1.E-6, // to MHz - ant_theta_trans, antenna_phi, 0,k), + ant_theta_trans, antenna_phi, 0,k), freq_tmp, icemodel->GetN(event->Nu_Interaction[0].posnu) ); } } - - - - + + + + // heff last bin for receiver ant /* - // Get ant gain with 2-D interpolation (may have bug?) + // Get ant gain with 2-D interpolation (may have bug?) // heff_lastbin = GaintoHeight(detector->GetGain_1D_OutZero(freq_tmp*1.E-6, // to MHz - antenna_theta, antenna_phi, detector->stations[i].strings[j].antennas[k].type), + antenna_theta, antenna_phi, detector->stations[i].strings[j].antennas[k].type), freq_tmp, icemodel->GetN(detector->stations[i].strings[j].antennas[k]) ); */ if ( settings1->ALL_ANT_V_ON==0 ) { if (settings1->ANTENNA_MODE == 0){ heff_lastbin = GaintoHeight(detector->GetGain_1D_OutZero(freq_tmp*1.E-6, // to MHz - antenna_theta, antenna_phi, detector->stations[i].strings[j].antennas[k].type), + antenna_theta, antenna_phi, detector->stations[i].strings[j].antennas[k].type), freq_tmp, icemodel->GetN(detector->stations[i].strings[j].antennas[k]) ); } if (settings1->ANTENNA_MODE == 1){ heff_lastbin = GaintoHeight(detector->GetGain_1D_OutZero(freq_tmp*1.E-6, // to MHz - antenna_theta, antenna_phi, detector->stations[i].strings[j].antennas[k].type,k), + antenna_theta, antenna_phi, detector->stations[i].strings[j].antennas[k].type,k), freq_tmp, icemodel->GetN(detector->stations[i].strings[j].antennas[k]) ); } } else if ( settings1->ALL_ANT_V_ON==1 ) { if (settings1->ANTENNA_MODE == 0){ heff_lastbin = GaintoHeight(detector->GetGain_1D_OutZero(freq_tmp*1.E-6, // to MHz - antenna_theta, antenna_phi, 0), + antenna_theta, antenna_phi, 0), freq_tmp, icemodel->GetN(detector->stations[i].strings[j].antennas[k]) ); } if (settings1->ANTENNA_MODE == 1){ heff_lastbin = GaintoHeight(detector->GetGain_1D_OutZero(freq_tmp*1.E-6, // to MHz - antenna_theta, antenna_phi, 0, k), + antenna_theta, antenna_phi, 0, k), freq_tmp, icemodel->GetN(detector->stations[i].strings[j].antennas[k]) ); } } - - - - + + + + // apply calpulser waveform // apply pol factor, heff if (event->IsCalpulser == 1){ @@ -1485,51 +1488,51 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray //cout<<"set signal pol as Vpol + Hpol for Calpulser2 evts"<ALL_ANT_V_ON==0 ) { if (settings1->ANTENNA_MODE == 0){ heff = GaintoHeight(detector->GetGain_1D_OutZero(freq_tmp*1.E-6, // to MHz - ant_theta_trans, antenna_phi, detector->stations[i].strings[j].antennas[k].type), + ant_theta_trans, antenna_phi, detector->stations[i].strings[j].antennas[k].type), freq_tmp, icemodel->GetN(event->Nu_Interaction[0].posnu) ); } if (settings1->ANTENNA_MODE == 1){ heff = GaintoHeight(detector->GetGain_1D_OutZero(freq_tmp*1.E-6, // to MHz - ant_theta_trans, antenna_phi, detector->stations[i].strings[j].antennas[k].type, k), + ant_theta_trans, antenna_phi, detector->stations[i].strings[j].antennas[k].type, k), freq_tmp, icemodel->GetN(event->Nu_Interaction[0].posnu) ); } } else if ( settings1->ALL_ANT_V_ON==1 ) { if (settings1->ANTENNA_MODE == 0){ heff = GaintoHeight(detector->GetGain_1D_OutZero(freq_tmp*1.E-6, // to MHz - ant_theta_trans, antenna_phi, 0), + ant_theta_trans, antenna_phi, 0), freq_tmp, icemodel->GetN(event->Nu_Interaction[0].posnu) ); } if (settings1->ANTENNA_MODE == 1){ heff = GaintoHeight(detector->GetGain_1D_OutZero(freq_tmp*1.E-6, // to MHz - ant_theta_trans, antenna_phi, 0, k), + ant_theta_trans, antenna_phi, 0, k), freq_tmp, icemodel->GetN(event->Nu_Interaction[0].posnu) ); } } // if ( n > 0 ) { - + if ( settings1->ALL_ANT_V_ON==0 ) { - + ApplyAntFactors_Tdomain_Transmitter( detector->GetAntPhase_1D( freq_tmp*1.e-6, ant_theta_trans, antenna_phi, detector->stations[i].strings[j].antennas[k].type ), heff, n_trg_pokey, n_trg_slappy, Pol_vector, detector->stations[i].strings[j].antennas[k].type, Pol_factor, V_forfft[2*n], V_forfft[2*n+1], settings1 ); } @@ -1537,56 +1540,56 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray ApplyAntFactors_Tdomain_Transmitter( detector->GetAntPhase_1D( freq_tmp*1.e-6, ant_theta_trans, antenna_phi, 0 ), heff, n_trg_pokey, n_trg_slappy, Pol_vector, detector->stations[i].strings[j].antennas[k].type, Pol_factor, V_forfft[2*n], V_forfft[2*n+1], settings1 ); } - - - + + + } else { ApplyAntFactors_Tdomain_FirstTwo( heff, heff_lastbin_trans, n_trg_pokey, n_trg_slappy, Pol_vector, detector->stations[i].strings[j].antennas[k].type, Pol_factor, V_forfft[2*n], V_forfft[2*n+1] ); } - + // // apply ant factors (receiver ant) // /* heff = GaintoHeight(detector->GetGain_1D_OutZero(freq_tmp*1.E-6, // to MHz - antenna_theta, antenna_phi, detector->stations[i].strings[j].antennas[k].type), + antenna_theta, antenna_phi, detector->stations[i].strings[j].antennas[k].type), freq_tmp, icemodel->GetN(detector->stations[i].strings[j].antennas[k]) ); */ if ( settings1->ALL_ANT_V_ON==0 ) { if (settings1->ANTENNA_MODE==0){ heff = GaintoHeight(detector->GetGain_1D_OutZero(freq_tmp*1.E-6, // to MHz - antenna_theta, antenna_phi, detector->stations[i].strings[j].antennas[k].type), + antenna_theta, antenna_phi, detector->stations[i].strings[j].antennas[k].type), freq_tmp, icemodel->GetN(detector->stations[i].strings[j].antennas[k]) ); } if (settings1->ANTENNA_MODE==1){ heff = GaintoHeight(detector->GetGain_1D_OutZero(freq_tmp*1.E-6, // to MHz - antenna_theta, antenna_phi, detector->stations[i].strings[j].antennas[k].type, k), + antenna_theta, antenna_phi, detector->stations[i].strings[j].antennas[k].type, k), freq_tmp, icemodel->GetN(detector->stations[i].strings[j].antennas[k]) ); } } else if ( settings1->ALL_ANT_V_ON==1 ) { if (settings1->ANTENNA_MODE ==0){ heff = GaintoHeight(detector->GetGain_1D_OutZero(freq_tmp*1.E-6, // to MHz - antenna_theta, antenna_phi, 0), + antenna_theta, antenna_phi, 0), freq_tmp, icemodel->GetN(detector->stations[i].strings[j].antennas[k]) ); } if (settings1->ANTENNA_MODE ==1){ heff = GaintoHeight(detector->GetGain_1D_OutZero(freq_tmp*1.E-6, // to MHz - antenna_theta, antenna_phi, 0,k), + antenna_theta, antenna_phi, 0,k), freq_tmp, icemodel->GetN(detector->stations[i].strings[j].antennas[k]) ); } } - - + + stations[i].strings[j].antennas[k].Heff[ray_sol_cnt].push_back( heff ); - - + + if ( n > 0 ) { - + if ( settings1->ALL_ANT_V_ON==0 ) { - + ApplyAntFactors_Tdomain( detector->GetAntPhase_1D( freq_tmp*1.e-6, antenna_theta, antenna_phi, detector->stations[i].strings[j].antennas[k].type ), heff, n_trg_pokey, n_trg_slappy, Pol_vector, detector->stations[i].strings[j].antennas[k].type, Pol_factor, V_forfft[2*n], V_forfft[2*n+1], settings1 ); } @@ -1594,14 +1597,14 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray ApplyAntFactors_Tdomain( detector->GetAntPhase_1D( freq_tmp*1.e-6, antenna_theta, antenna_phi, 0 ), heff, n_trg_pokey, n_trg_slappy, Pol_vector, detector->stations[i].strings[j].antennas[k].type, Pol_factor, V_forfft[2*n], V_forfft[2*n+1], settings1 ); } - - - + + + } else { ApplyAntFactors_Tdomain_FirstTwo( heff, heff_lastbin, n_trg_pokey, n_trg_slappy, Pol_vector, detector->stations[i].strings[j].antennas[k].type, Pol_factor, V_forfft[2*n], V_forfft[2*n+1] ); } - + // // apply entire elect chain gain, phase // @@ -1611,33 +1614,33 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray else { ApplyElect_Tdomain_FirstTwo( freq_tmp*1.e-6, freq_lastbin*1.e-6, detector, V_forfft[2*n], V_forfft[2*n+1] ); } - - - + + + }// end for freq bin - - + + // now get time domain waveform back by inv fft Tools::realft(V_forfft,-1,stations[i].strings[j].antennas[k].Nnew[ray_sol_cnt]); - - + + // we need to do normal time ordering as we did zero padding(?) // If signal is located at the center, we don't need to do NormalTimeOrdering??? //Tools::NormalTimeOrdering(stations[i].strings[j].antennas[k].Nnew[ray_sol_cnt], V_forfft); - - + + // skip linear interpolation for now Tools::SimpleLinearInterpolation_OutZero( stations[i].strings[j].antennas[k].Nnew[ray_sol_cnt], T_forfft, V_forfft, settings1->NFOUR/2, T_forint, volts_forint ); - + // check what we save as V[], volts_forint? or volts_forfft - - - - - - + + + + + + for (int n=0; nNFOUR/2; n++) { - + if (settings1->TRIG_ANALYSIS_MODE != 2) { // not pure noise mode (we need signal) //stations[i].strings[j].antennas[k].V[ray_sol_cnt].push_back( volts_forfft[n] ); //stations[i].strings[j].antennas[k].V[ray_sol_cnt].push_back( V_forfft[n] * 2./(double)(settings1->NFOUR/2) ); // 2/N for inverse FFT normalization factor @@ -1647,9 +1650,9 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray else if (settings1->TRIG_ANALYSIS_MODE == 2) { // pure noise mode (set signal to 0) stations[i].strings[j].antennas[k].V[ray_sol_cnt].push_back( 0. ); } - + } - + }// Calpulser events } // if SIMULATION_MODE = 1 @@ -1682,17 +1685,17 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray ray_sol_cnt++; - + }// end while number of solutions - + }// end if solution exist else { - + //cout<<"station["<TRIG_ANALYSIS_MODE != 2) { // if there is any ray_sol (don't check trigger if there is no ray_sol at all) and TRIG_ANALYSIS_MODE is 0 (signal + noise mode) - + //cout<<"3"<NOISE==1 && settings1->DETECTOR==4) { // detector->ReadRayleigh_Station(settings1); // } - - + + // reset Trigger class noise temp values trigger->Reset_V_noise_freqbin(settings1, detector); @@ -1834,7 +1837,7 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray if ( debugmode == 1 ) N_noise = 1; // now, check if DATA_BIN_SIZE is enough for total time delay between antennas else { - + N_noise = (int)( max_total_bin / settings1->DATA_BIN_SIZE ) + 1; } //cout<<"N_noise : "< USE_MANUAL_GAINOFFSET == 1 ) Apply_Gain_Offset(settings1, trigger, detector, ch_ID, i ); // last i for stationID - - - + + + } // if it's not debugmode @@ -2175,7 +2178,7 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray } // for strings - + // do only if it's not in debugmode if ( debugmode == 0 ) { @@ -2187,7 +2190,7 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray // - + int trig_i, trig_j, trig_bin; int trig_search_init; @@ -2205,9 +2208,9 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray // global trigger mode // 0 for orginal N_TRIG out of 16 channels // 1 for new stations, N_TRIG_V out of Vpol channels or N_TRIG_H out of Hpol channels - + int check_ch; - + //trig_i = trigger->maxt_diode_bin; //trig_i = trigger->maxt_diode_bin + settings1->NFOUR; // give some time shift for mimicing force trig events trig_search_init = trigger->maxt_diode_bin + settings1->NFOUR; // give some time shift for mimicing force trig events @@ -2234,7 +2237,7 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray if(settings1->DETECTOR==4 && settings1->DETECTOR_STATION_LIVETIME_CONFIG>0){ // if emulating a real station, and we want config selection power if(settings1->DETECTOR_STATION==2){ // if station 2 - + if(settings1->DETECTOR_STATION_LIVETIME_CONFIG==2 || settings1->DETECTOR_STATION_LIVETIME_CONFIG==5){ // if config 5 or 5 in A2 triggerDelay[4] = 81.4 + 100; triggerDelay[5] = 73.2 + 100; @@ -2247,7 +2250,7 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray triggerDelay[2] = triggerDelay[10] = triggerDelay[14] = 15.4; triggerDelay[3] = triggerDelay[11] = triggerDelay[15] = 7.2; - mostDelay = triggerDelay[4]; + mostDelay = triggerDelay[4]; } } @@ -2268,7 +2271,7 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray triggerDelay[6] = triggerDelay[10] = triggerDelay[14] = 15.4; triggerDelay[7] = triggerDelay[11] = triggerDelay[15] = 7.2; - mostDelay = triggerDelay[0]; + mostDelay = triggerDelay[0]; } } @@ -2276,8 +2279,8 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray // avoid really long trig_window_bin case (change trig_window to check upto max_total_bin) if (max_total_bin - trig_window_bin <= trig_i) trig_window_bin = max_total_bin - trig_i -1; - - + + //while (trig_i < settings1->DATA_BIN_SIZE - trig_window_bin ) { while (trig_i < max_total_bin - trig_window_bin ) { @@ -2292,7 +2295,7 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray trig_j = 0; while (trig_j < ch_ID ) { - + // need to mask out a trigger channel when necessary // which is when emulating real station 2 in config 3-5 only if(settings1->DETECTOR==4 && settings1->DETECTOR_STATION==2){ @@ -2390,7 +2393,7 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray } } - + @@ -2620,7 +2623,7 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray if ( stations[i].strings[string_i].antennas[antenna_i].SignalExt[m] ) { dBin = abs( stations[i].strings[string_i].antennas[antenna_i].SignalBin[m] - stations[i].strings[string_i].antennas[antenna_i].Trig_Pass ); - + if ( dBin < mindBin ) { stations[i].strings[string_i].antennas[antenna_i].Likely_Sol = m; // store the ray sol number which is minimum difference between Trig_Pass bin mindBin = dBin; @@ -2631,7 +2634,7 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray } - + //skip this passed ch as it already has bin info //cout<<"trigger passed at bin "<Nu_Interaction[0].posnu.Distance( detector->stations[i].strings[(int)((ch_loop)/4)].antennas[(int)((ch_loop)%4)] )<stations[i].strings[string_i].antennas[antenna_i].type<<"type) Direct dist btw posnu : "<Nu_Interaction[0].posnu.Distance( detector->stations[i].strings[string_i].antennas[antenna_i] )<<" noiseID : "<NFOUR/4; // so that global trig is + //stations[i].strings[(int)((ch_loop)/4)].antennas[(int)((ch_loop)%4)].Trig_Pass = stations[i].Global_Pass + settings1->NFOUR/4; // so that global trig is //stations[i].strings[(int)((ch_loop)/4)].antennas[(int)((ch_loop)%4)].Trig_Pass = 0.; stations[i].strings[string_i].antennas[antenna_i].Trig_Pass = 0.; @@ -2806,18 +2809,18 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray } // while trig_i }// if TRIG_SCAN_MODE==0 - + else if(settings1->TRIG_SCAN_MODE>0) triggerCheckLoop(settings1, detector, event, trigger, i, trig_search_init, max_total_bin, trig_window_bin, settings1->TRIG_SCAN_MODE); - + // else if(settings1->TRIG_SCAN_MODE==2) triggerCheckLoopScan(); - + // else if(settings1->TRIG_SCAN_MODE==3) triggerCheckLoopScanNumbers(); - + } // if it's not debugmode - // delete noise waveforms + // delete noise waveforms if (settings1->NOISE_WAVEFORM_GENERATE_MODE == 0) {// noise waveforms will be generated for each evts // remove noise waveforms for next evt trigger->ClearNoiseWaveforms(); @@ -2849,9 +2852,9 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray } // end Connect_Interaction_Detector int Report::triggerCheckLoop(Settings *settings1, Detector *detector, Event *event, Trigger *trigger, int stationID, int trig_search_init, int max_total_bin, int trig_window_bin, int scan_mode ){ - + class CircularBuffer { - + public: int i; int mode; // in mode 1 only check number of values above threshold, in >1 check what the best value is too @@ -2864,59 +2867,59 @@ int Report::triggerCheckLoop(Settings *settings1, Detector *detector, Event *eve double epsilon; // best value needs to be this close to current last value double last_value; // value leaving buffer int addToNPass; // number of values above pthresh inside buffer - - - + + + CircularBuffer(int size, double threshold, int scan_mode) : N(size), pthresh(threshold), mode(scan_mode) {i=0; best_value=0; temp_value=0; last_value=0; addToNPass=0; epsilon=1e-6; buffer=new double[N]; for(int j=0;j1) last_value=buffer[i];// in mode 1 we don't care about the values, just about the addToNPass - + if(input_value1&&buffer[i]1&&std::fabs(last_value-best_value)1: return value is zero if no changes, and non-zero if there are changes to best_value (for mode==1 it's always zero); - - }// add + + }// add int fill(double input_value){// buffer is just filling, don't use last_value - + changelog=0; temp_value=best_value; - + if(input_value1&&buffer[i]POWERTHRESHOLD; - // this value is compared to POWERTHRESHOLD for local trigger. - + // this value is compared to POWERTHRESHOLD for local trigger. + int first_trigger=0; - + double Pthresh_value[numChan]; CircularBuffer **buffer=new CircularBuffer*[numChan]; for(int trig_j=0;trig_jgetStringfromArbAntID( i, trig_j); int antenna_i = detector->getAntennafromArbAntID( i, trig_j); - + stations[i].strings[string_i].antennas[antenna_i].SingleChannelTriggers=0; stations[i].strings[string_i].antennas[antenna_i].TotalBinsScannedPerChannel=0; - + // int string_i = detector->getStringfromArbAntID( i, trig_j); // int antenna_i = detector->getAntennafromArbAntID( i, trig_j); // stations[i].strings[string_i].antennas[antenna_i].Trig_Pass = 0.; - + }// for trig_j - + double *TDR_all_sorted_temp; double *TDR_Vpol_sorted_temp; double *TDR_Hpol_sorted_temp; - + if(scan_mode>1){ - + TDR_all_sorted_temp=new double[numChan]; TDR_Vpol_sorted_temp=new double[numChanVpol]; TDR_Hpol_sorted_temp=new double[numChanHpol]; - + // only need to initialize for scan_mode>1 for(int trig_j=0;trig_j1 int global_pass_bit=0; int check_TDR_configuration=0; // check if we need to reorder our TDR arrays - int SCTR_cluster_bit[numChan]; - + int SCTR_cluster_bit[numChan]; + for(int trig_j=0;trig_jgetStringfromArbAntID( i, trig_j); int antenna_i = detector->getAntennafromArbAntID( i, trig_j); - + if (settings1->TRIG_ONLY_BH_ON==0 - || + || (settings1->TRIG_ONLY_BH_ON==1 && settings1->DETECTOR==3 && detector->stations[i].strings[string_i].antennas[antenna_i].DAQchan==0) || (settings1->TRIG_ONLY_LOW_CH_ON==1 && settings1->DETECTOR!=3 && antenna_i<2 ) ){ // channel filter: choose if to use lower/borehole channels or not - + int channel_num = detector->GetChannelfromStringAntenna ( i, string_i, antenna_i, settings1 ); - // assign Pthresh a value + // assign Pthresh a value if(settings1->NOISE_CHANNEL_MODE==0) Pthresh_value[trig_j]=trigger->Full_window[trig_j][trig_i]/(trigger->rmsdiode * detector->GetThresOffset( i, channel_num-1,settings1) ); if(settings1->NOISE_CHANNEL_MODE==1) Pthresh_value[trig_j]=trigger->Full_window[trig_j][trig_i]/(trigger->rmsdiode_ch[channel_num-1] * detector->GetThresOffset( i, channel_num-1,settings1) ); if(settings1->NOISE_CHANNEL_MODE==2){ - + if(channel_num-1 < 8) Pthresh_value[trig_j]=trigger->Full_window[trig_j][trig_i]/(trigger->rmsdiode_ch[channel_num-1] * detector->GetThresOffset( i, channel_num-1,settings1) ); else Pthresh_value[trig_j]=trigger->Full_window[trig_j][trig_i]/(trigger->rmsdiode_ch[8] * detector->GetThresOffset( i, channel_num-1,settings1) ); - + } - // this is to count how many local trigger clusters there are + // this is to count how many local trigger clusters there are if(Pthresh_value[trig_j]TRIG_SCAN_MODE>2){ - + if(settings1->TRIG_SCAN_MODE>2){ + if(SCTR_cluster_bit[trig_j]==0){// if first trigger in cluster - + stations[i].strings[string_i].antennas[antenna_i].SCT_threshold_pass.push_back(Pthresh_value[trig_j]); - - + + } else{// choose the highest trigger value (most negative) in cluster - + if(Pthresh_value[trig_j] 2 - + SCTR_cluster_bit[trig_j]=1; - + }// if local trigger else SCTR_cluster_bit[trig_j]=0;// if no local trigger, set zero to start a new cluster at next local trigger - + // and how many bins scanned stations[i].strings[string_i].antennas[antenna_i].TotalBinsScannedPerChannel++; - - - + + + // fill the buffers (if any changes occur mark check_TDR_configuration as non-zero) if(trig_ifill(Pthresh_value[trig_j]); else check_TDR_configuration+=buffer[trig_j]->add(Pthresh_value[trig_j]); - + if(buffer[trig_j]->addToNPass>0){// if there is at least one value above threshold in the buffer, this is ++ - + N_pass++; if(detector->stations[i].strings[string_i].antennas[antenna_i].type == 0) N_pass_V++; if(detector->stations[i].strings[string_i].antennas[antenna_i].type == 1) N_pass_H++; - -// if(last_trig_bin0 - + }// non-testbed case (i.e. use all channels) - + }// for trig_j (channel scan) // check if global trigger... - - if( (settings1->TRIG_MODE==0&&( N_pass >= settings1->N_TRIG )) || - (settings1->TRIG_MODE==1&&( N_pass_V >= settings1->N_TRIG_V || + + if( (settings1->TRIG_MODE==0&&( N_pass >= settings1->N_TRIG )) || + (settings1->TRIG_MODE==1&&( N_pass_V >= settings1->N_TRIG_V || N_pass_H >= settings1->N_TRIG_H ) - ) + ) //|| (settings1->TRIG_MODE==2&&( N_pass_0 >= settings1->N_TRIG_0 || N_pass_1 >= settings1->N_TRIG_1 )) ){ // if there's a trigger ! - - global_pass_bit=1; + + global_pass_bit=1; if(first_trigger==0){ // if this is the first trigger, mark this position and save event first_trigger=1; for(int trig_j=0;trig_jgetStringfromArbAntID( i, trig_j); int antenna_i = detector->getAntennafromArbAntID( i, trig_j); // if(buffer[trig_j]->addToNPass>0) stations[i].strings[string_i].antennas[antenna_i].Trig_Pass = trig_i-buffer[trig_j]->numBinsToLatestTrigger(); // mark the bin on which we triggered... if(buffer[trig_j]->addToNPass>0) stations[i].strings[string_i].antennas[antenna_i].Trig_Pass = trig_i-buffer[trig_j]->numBinsToOldestTrigger(); // mark the bin on which we triggered... else stations[i].strings[string_i].antennas[antenna_i].Trig_Pass = 0.; - + }// for trig_j - + saveTriggeredEvent(settings1, detector, event, trigger, stationID, trig_search_init, max_total_bin, trig_window_bin, trig_i); // cout<<"\nPthresh value="; // if(scan_mode==1) for(int trig_j=0;trig_j1) for(int trig_j=0;trig_jbest_value; // cout<<"\n"; - + }// first trigger - + // if(scan_mode==1) return last_trig_bin; // if we aren't going to scan all the Pthresh values, just return if(scan_mode==1) return trig_i; // if we aren't going to scan all the Pthresh values, just return } else global_pass_bit=0;// no trigger - + if(scan_mode>1&&check_TDR_configuration&&global_pass_bit){// if there's a trigger and anything changes in the buffers, restock the TDR arrays - + for(int trig_j=0;trig_jbest_valuebest_value; }// for trig_j if(settings1->TRIG_MODE==0){ // for N out of 16 mode - + if(N_pass>=settings1->N_TRIG) for(int ii=0;iitemp_valuetemp_value; best_chan=trig_j;} - + buffer[best_chan]->temp_value=0; - + TDR_all_sorted_temp[ii]=best_thresh; - + }// for ii - - + + // debug output: if(TDR_all_sorted_temp[0]>TDR_all_sorted_temp[1]||TDR_all_sorted_temp[1]>TDR_all_sorted_temp[2]){ - + cout<<"\n"; for(int p=0;p<80;p++) cout<<"*"; cout<<"\n ordering problem: "<TRIG_MODE==1){ // for N out of either polarization @@ -3205,75 +3208,75 @@ int Report::triggerCheckLoop(Settings *settings1, Detector *detector, Event *eve double best_thresh=0; int best_chan=0; - + for(int trig_j=0;trig_jgetStringfromArbAntID( i, trig_j); - int antenna_i = detector->getAntennafromArbAntID( i, trig_j); + int antenna_i = detector->getAntennafromArbAntID( i, trig_j); - if(detector->stations[i].strings[string_i].antennas[antenna_i].type == 0&&buffer[trig_j]->temp_valuetemp_value; + if(detector->stations[i].strings[string_i].antennas[antenna_i].type == 0&&buffer[trig_j]->temp_valuetemp_value; best_chan=trig_j; - + }// if best }// for trig_j buffer[best_chan]->temp_value=0; - + TDR_Vpol_sorted_temp[ii]=best_thresh; - + }// for ii - + // debug output: // if(TDR_Vpol_sorted_temp[0]>TDR_Vpol_sorted_temp[1]||TDR_Vpol_sorted_temp[1]>TDR_Vpol_sorted_temp[2]){ -// +// // cout<<"\n"; // for(int p=0;p<80;p++) cout<<"*"; // cout<<"\n ordering problem, Vpol: "<=settings1->N_TRIG_H) for(int ii=0;iigetStringfromArbAntID( i, trig_j); int antenna_i = detector->getAntennafromArbAntID( i, trig_j); - - if(detector->stations[i].strings[string_i].antennas[antenna_i].type==1&&buffer[trig_j]->temp_valuetemp_value; + + if(detector->stations[i].strings[string_i].antennas[antenna_i].type==1&&buffer[trig_j]->temp_valuetemp_value; best_chan=trig_j; - + }// if best }// for trig_j - + buffer[best_chan]->temp_value=0; - + TDR_Hpol_sorted_temp[ii]=best_thresh; - - + + }// for ii - + // // debug output: // if(TDR_Hpol_sorted_temp[0]>TDR_Hpol_sorted_temp[1]||TDR_Hpol_sorted_temp[1]>TDR_Hpol_sorted_temp[2]){ -// +// // cout<<"\n"; // for(int p=0;p<80;p++) cout<<"*"; // cout<<"\n ordering problem, Hpol: "<TRIG_MODE==2){ // for N out of arbitrary sets of antennas // for Set 0 only: @@ -3281,167 +3284,167 @@ int Report::triggerCheckLoop(Settings *settings1, Detector *detector, Event *eve double best_thresh=0; int best_chan=0; - + for(int trig_j=0;trig_jgetStringfromArbAntID( i, trig_j); - int antenna_i = detector->getAntennafromArbAntID( i, trig_j); + int antenna_i = detector->getAntennafromArbAntID( i, trig_j); - if((antenna_i == 0 || antenna_i == 2 ) && buffer[trig_j]->temp_valuetemp_value; + if((antenna_i == 0 || antenna_i == 2 ) && buffer[trig_j]->temp_valuetemp_value; best_chan=trig_j; - + }// if best }// for trig_j buffer[best_chan]->temp_value=0; - + TDR_Vpol_sorted_temp[ii]=best_thresh; - + }// for ii - + // debug output: // if(TDR_Vpol_sorted_temp[0]>TDR_Vpol_sorted_temp[1]||TDR_Vpol_sorted_temp[1]>TDR_Vpol_sorted_temp[2]){ -// +// // cout<<"\n"; // for(int p=0;p<80;p++) cout<<"*"; // cout<<"\n ordering problem, Vpol: "<=settings1->N_TRIG_1) for(int ii=0;iigetStringfromArbAntID( i, trig_j); int antenna_i = detector->getAntennafromArbAntID( i, trig_j); - - if((antenna_i==1 || antenna_i == 3) && buffer[trig_j]->temp_valuetemp_value; + + if((antenna_i==1 || antenna_i == 3) && buffer[trig_j]->temp_valuetemp_value; best_chan=trig_j; - + }// if best }// for trig_j - + buffer[best_chan]->temp_value=0; - + TDR_Hpol_sorted_temp[ii]=best_thresh; - - + + }// for ii */ - + // check if temp TDR arrays improved, if so update TDR arrays: if(settings1->TRIG_MODE==0){ - + if(N_pass>=settings1->N_TRIG) for(int ii=0;iiTRIG_MODE==1){ - + if(N_pass_V>=settings1->N_TRIG_V) for(int ii=0;ii=settings1->N_TRIG_H) for(int ii=0;iiTRIG_MODE==2){ - + if(N_pass_0>=settings1->N_TRIG_0) for(int ii=0;ii=settings1->N_TRIG_1) for(int ii=0;ii1&&stations[i].Global_Pass){ - + if(settings1->TRIG_MODE==0){ - + cout<<"\nPthresh best: "; for(int ii=0;ii<3;ii++) cout<<" "<stations[i].TDR_all_sorted[1]||stations[i].TDR_all_sorted[1]>stations[i].TDR_all_sorted[2]){ - + cout<<"\n"; for(int p=0;p<80;p++) cout<<"*"; cout<<"\n ordering problem: "<TRIG_MODE==1){ cout<<"\nPthresh best: "; cout<<" Vpol: "; for(int ii=0;iistations[i].TDR_Vpol_sorted[1]||stations[i].TDR_Vpol_sorted[1]>stations[i].TDR_Vpol_sorted[2]){ - + cout<<"\n"; for(int p=0;p<80;p++) cout<<"*"; cout<<"\n ordering problem (final) Vpol: "<stations[i].TDR_Hpol_sorted[1]||stations[i].TDR_Hpol_sorted[1]>stations[i].TDR_Hpol_sorted[2]){ - + cout<<"\n"; for(int p=0;p<80;p++) cout<<"*"; cout<<"\n ordering problem (final), Hpol: "<1 and global pass - + for(int trig_j=0;trig_j1){ - + delete [] TDR_all_sorted_temp; delete [] TDR_Vpol_sorted_temp; delete [] TDR_Hpol_sorted_temp; } - - + + return stations[i].Global_Pass; - + } int Report::saveTriggeredEvent(Settings *settings1, Detector *detector, Event *event, Trigger *trigger, int stationID, int trig_search_init, int max_total_bin, int trig_window_bin, int last_trig_bin){ - + int i=stationID; int numChan=stations[i].TDR_all.size(); cout<<"saving event"<getStringfromArbAntID( i, trig_j); int antenna_i = detector->getAntennafromArbAntID( i, trig_j); - + if(stations[i].strings[string_i].antennas[antenna_i].Trig_Pass){// if this channel triggered - + stations[i].strings[string_i].antennas[antenna_i].Likely_Sol = -1; // no likely init - + int mindBin = 1.e9; // init big values int dBin = 0; - + for (int m=0; mTRIG_ONLY_LOW_CH_ON==0 ) { cout<stations[i].strings[string_i].antennas[antenna_i].type<<"type) Direct dist btw posnu : "<Nu_Interaction[0].posnu.Distance( detector->stations[i].strings[string_i].antennas[antenna_i] )<<" noiseID : "<TRIG_ONLY_LOW_CH_ON==1 ) { - + cout<stations[i].strings[string_i].antennas[antenna_i].type<<"type) Direct dist btw posnu : "<Nu_Interaction[0].posnu.Distance( detector->stations[i].strings[string_i].antennas[antenna_i] )<<" noiseID : "<V_MIMIC_MODE == 0) { // Global passed bin is the center of the window - + stations[i].strings[string_i].antennas[antenna_i].V_mimic.push_back( ( trigger->Full_window_V[trig_j][ last_trig_bin - waveformLength/2 + waveformCenter + mimicbin ] )*1.e3 );// save in mV stations[i].strings[string_i].antennas[antenna_i].time.push_back( last_trig_bin - waveformLength/2 + waveformCenter + mimicbin ); stations[i].strings[string_i].antennas[antenna_i].time_mimic.push_back( ( waveformLength/2 + waveformCenter + mimicbin) * settings1->TIMESTEP*1.e9 );// save in ns @@ -3526,20 +3529,20 @@ int Report::saveTriggeredEvent(Settings *settings1, Detector *detector, Event *e stations[i].strings[string_i].antennas[antenna_i].V_mimic.push_back( ( trigger->Full_window_V[trig_j][ last_trig_bin - (detector->params.TestBed_Ch_delay_bin[trig_j] - detector->params.TestBed_BH_Mean_delay_bin) - waveformLength/2 + waveformCenter + mimicbin ] )*1.e3 );// save in mV stations[i].strings[string_i].antennas[antenna_i].time.push_back( last_trig_bin - (detector->params.TestBed_Ch_delay_bin[trig_j] - detector->params.TestBed_BH_Mean_delay_bin) - waveformLength/2 + waveformCenter + mimicbin ); stations[i].strings[string_i].antennas[antenna_i].time_mimic.push_back( ( -(detector->params.TestBed_Ch_delay_bin[trig_j] - detector->params.TestBed_BH_Mean_delay_bin) - waveformLength/2 + waveformCenter + mimicbin) * settings1->TIMESTEP*1.e9 );// save in ns - + } - + else if (settings1->V_MIMIC_MODE == 2) { // Global passed bin is the center of the window + delay to each chs from araGeom + fitted by eye - + stations[i].strings[string_i].antennas[antenna_i].V_mimic.push_back( ( trigger->Full_window_V[trig_j][ last_trig_bin - (detector->params.TestBed_Ch_delay_bin[trig_j] - detector->params.TestBed_BH_Mean_delay_bin + detector->stations[i].strings[string_i].antennas[antenna_i].manual_delay_bin) - waveformLength/2 + waveformCenter + mimicbin ] )*1.e3 );// save in mV stations[i].strings[string_i].antennas[antenna_i].time.push_back( last_trig_bin - (detector->params.TestBed_Ch_delay_bin[trig_j] - detector->params.TestBed_BH_Mean_delay_bin + detector->stations[i].strings[string_i].antennas[antenna_i].manual_delay_bin) - waveformLength/2 + waveformCenter + mimicbin ); stations[i].strings[string_i].antennas[antenna_i].time_mimic.push_back( ( -(detector->params.TestBed_Ch_delay_bin[trig_j] - detector->params.TestBed_BH_Mean_delay_bin + detector->stations[i].strings[string_i].antennas[antenna_i].manual_delay_bin) - waveformLength/2 + waveformCenter + mimicbin) * settings1->TIMESTEP*1.e9 + detector->params.TestBed_WFtime_offset_ns );// save in ns - + } - + } - - + + // set global_trig_bin values if (settings1->V_MIMIC_MODE == 0) { // Global passed bin is the center of the window stations[i].strings[string_i].antennas[antenna_i].global_trig_bin = waveformLength/2 + waveformCenter ; @@ -3550,65 +3553,65 @@ int Report::saveTriggeredEvent(Settings *settings1, Detector *detector, Event *e else if (settings1->V_MIMIC_MODE == 2) { // Global passed bin is the center of the window + delay to each chs from araGeom + fitted by eye stations[i].strings[string_i].antennas[antenna_i].global_trig_bin = (detector->params.TestBed_Ch_delay_bin[trig_j] - detector->params.TestBed_BH_Mean_delay_bin + detector->stations[i].strings[string_i].antennas[antenna_i].manual_delay_bin) + waveformLength/2 + waveformCenter ; } - - + + double arrivtime = stations[i].strings[string_i].antennas[antenna_i].arrival_time[0]; double X = detector->stations[i].strings[string_i].antennas[antenna_i].GetX(); double Y = detector->stations[i].strings[string_i].antennas[antenna_i].GetY(); double Z = detector->stations[i].strings[string_i].antennas[antenna_i].GetZ(); - - + + stations[i].total_trig_search_bin = stations[i].Global_Pass + trig_window_bin - trig_search_init; - - - - - - - - + + + + + + + + }// for trig_j - - + + if(settings1->OUTPUT_TDR_GRAPH>0){ - + settings1->OUTPUT_TDR_GRAPH--; - + TGraph **gr=new TGraph*[numChan]; - + for(int trig_j=0;trig_jgetStringfromArbAntID( i, trig_j); int antenna_i = detector->getAntennafromArbAntID( i, trig_j); int channel_num = detector->GetChannelfromStringAntenna ( i, string_i, antenna_i, settings1 ); double thresh_value=0; - - // assign Pthresh a value + + // assign Pthresh a value if(settings1->NOISE_CHANNEL_MODE==0) thresh_value=detector->GetThres(i, channel_num-1, settings1) * trigger->rmsdiode * detector->GetThresOffset( i, channel_num-1,settings1); if(settings1->NOISE_CHANNEL_MODE==1) thresh_value=detector->GetThres(i, channel_num-1, settings1) * trigger->rmsdiode_ch[channel_num-1] * detector->GetThresOffset( i, channel_num-1,settings1); if(settings1->NOISE_CHANNEL_MODE==2){ - + if(channel_num-1 < 8) thresh_value=detector->GetThres(i, channel_num-1, settings1) * trigger->rmsdiode_ch[channel_num-1] * detector->GetThresOffset( i, channel_num-1,settings1); else thresh_value=detector->GetThres(i, channel_num-1, settings1) * trigger->rmsdiode_ch[8] * detector->GetThresOffset( i, channel_num-1,settings1); - + } - + gr[trig_j]=new TGraph(); for(int trig_i=0;trig_iDATA_BIN_SIZE/2;trig_i++) gr[trig_j]->SetPoint(trig_i, (trig_search_init+trig_i), trigger->Full_window[trig_j][trig_i]); gr[trig_j]->SetNameTitle(Form("TDR_waveform%dC%02d", settings1->OUTPUT_TDR_GRAPH, trig_j), Form("Tunnel diode response waveform %d, channel %02d, trig_pass= %d, P_{th}= %le; time bins; power after convolution with tunnel diode", settings1->OUTPUT_TDR_GRAPH, trig_j, stations[i].strings[string_i].antennas[antenna_i].Trig_Pass, thresh_value)); gr[trig_j]->Write(); delete gr[trig_j]; } - + delete [] gr; - - + + } - + return 1; - - - + + + }// saveTriggeredEvent #ifdef ARA_UTIL_EXISTS @@ -3628,11 +3631,11 @@ void Report::MakeUsefulEvent(Detector *detector, Settings *settings1, Trigger *t int antenna_i = detector->getAntennafromArbAntID( stationIndex, ch_loop); int AraRootChannel = 0; AraRootChannel = detector->GetChannelfromStringAntenna (i, string_i, antenna_i, settings1); - + int UsefulEventBin; if ( settings1->NFOUR/2 < EFFECTIVE_LAB3_SAMPLES*2) UsefulEventBin = settings1->NFOUR/2; else UsefulEventBin = EFFECTIVE_LAB3_SAMPLES*2; - + //for (int mimicbin=0; mimicbinNFOUR/2; mimicbin++) { for (int mimicbin=0; mimicbin 0){ @@ -3659,9 +3662,9 @@ void Report::MakeUsefulEvent(Detector *detector, Settings *settings1, Trigger *t cout << "StationID: " << stationID << endl; theUsefulEvent->fNumChannels = 32; theUsefulEvent->stationId = stationID; - + // cout << endl << stationID << endl; - + int ch_limit; if (stationID == 0){ ch_limit = 14; @@ -3670,7 +3673,7 @@ void Report::MakeUsefulEvent(Detector *detector, Settings *settings1, Trigger *t } int maxElecChans = 32; - + for (int ch_loop=0; ch_loop < ch_limit; ch_loop++) { // int elecChan = AraGeom->getElecChanFromRFChan(ch_loop, stationID); int elecChan = AraGeomTool::Instance()->getElecChanFromRFChan(ch_loop, stationID); @@ -3684,7 +3687,7 @@ void Report::MakeUsefulEvent(Detector *detector, Settings *settings1, Trigger *t // int antenna_i = detector->getAntennafromArbAntID( stationIndex, ch_loop); int AraRootChannel = 0; AraRootChannel = detector->GetChannelfromStringAntenna (stationID, string_i, antenna_i, settings1); - + int UsefulEventBin; // if ( settings1->NFOUR/2 < EFFECTIVE_LAB3_SAMPLES*2) UsefulEventBin = settings1->NFOUR/2; // else UsefulEventBin = EFFECTIVE_LAB3_SAMPLES*2; @@ -3699,15 +3702,15 @@ void Report::MakeUsefulEvent(Detector *detector, Settings *settings1, Trigger *t // theUsefulEvent->fVolts[AraRootChannel-1].resize(UsefulEventBin); // theUsefulEvent->fTimes[AraRootChannel-1].resize(UsefulEventBin); // cout << string_i << " : " << antenna_i << endl; - + //for (int mimicbin=0; mimicbinNFOUR/2; mimicbin++) { for (int mimicbin=0; mimicbin 0){ // cout << "Test 1" << endl; volts[mimicbin] = stations[stationIndex].strings[string_i].antennas[antenna_i].V_mimic[mimicbin]; times[mimicbin] = stations[stationIndex].strings[string_i].antennas[antenna_i].time_mimic[mimicbin]; - - + + } else { volts[mimicbin] = 0.; @@ -3731,7 +3734,7 @@ void Report::MakeUsefulEvent(Detector *detector, Settings *settings1, Trigger *t void Report::ClearUselessfromConnect(Detector *detector, Settings *settings1, Trigger *trigger){ - + for (int i = 0; i< detector->params.number_of_stations; i++) { // now remove all information which are useless for (int c_j=0; c_j< detector->stations[i].strings.size(); c_j++) { @@ -3755,15 +3758,15 @@ void Report::Select_Wave_Convlv_Exchange(Settings *settings1, Trigger *trigger, // int BINSIZE = detector->stations[StationIndex].NFOUR/2; int bin_value; //vector V_total_forconvlv; // total time domain waveform (noise + signal) - + V_total_forconvlv.clear(); - + // first, fill the noise values for (int bin=0; binNOISE_CHANNEL_MODE==0) { V_total_forconvlv.push_back( trigger->v_noise_timedomain[ noise_ID[ (int)( bin_value / settings1->DATA_BIN_SIZE) ] ][ (int)( bin_value % settings1->DATA_BIN_SIZE ) ] + V[bin] ); } @@ -3809,7 +3812,7 @@ void Report::Select_Wave_Convlv_Exchange(Settings *settings1, Trigger *trigger, -// this one is for two connected signals +// this one is for two connected signals void Report::Select_Wave_Convlv_Exchange(Settings *settings1, Trigger *trigger, Detector *detector, int signalbin1, int signalbin2, vector &V1, vector &V2, int *noise_ID, int ID, int StationIndex) { int BINSIZE = settings1->NFOUR/2; @@ -3822,9 +3825,9 @@ void Report::Select_Wave_Convlv_Exchange(Settings *settings1, Trigger *trigger, for(int bin_tmp=0; bin_tmp &V0, vector &V1, vector &V2, int *noise_ID, int ID, int StationIndex) { int BINSIZE = settings1->NFOUR/2; @@ -3901,9 +3904,9 @@ void Report::Select_Wave_Convlv_Exchange(Settings *settings1, Trigger *trigger, for(int bin_tmp=0; bin_tmpGetGainOffset( StationIndex, channel_num, settings1 )<<" applying"<DATA_BIN_SIZE; bin++) { // test for full window - + trigger->Full_window[ID][bin] = ( trigger->Full_window[ID][bin] * detector->GetGainOffset( StationIndex, channel_num-1, settings1 ) * detector->GetGainOffset( StationIndex, channel_num-1, settings1 ) ); // offset in voltage factor so we need power (V^2 factor to diode response) trigger->Full_window_V[ID][bin] = ( trigger->Full_window_V[ID][bin] * detector->GetGainOffset( StationIndex, channel_num-1, settings1 ) ); // gain in voltage factor } @@ -4002,13 +4005,13 @@ int Report::GetChNumFromArbChID( Detector *detector, int ID, int StationIndex, S int string_num = detector->getStringfromArbAntID( StationIndex, ID ); int ant_num = detector->getAntennafromArbAntID( StationIndex, ID ); - + int StationID = detector->stations[StationIndex].StationID; // cout << "Station ID: " << StationID << endl; // cout << "string_num: " << string_num << endl; // cout << "ant_num: " << ant_num << endl; // cout << StationID << " : " << string_num << " : " << ant_num << endl; - + //int channel_num = detector->GetChannelfromStringAntenna ( StationIndex, string_num, ant_num ); int channel_num = detector->GetChannelfromStringAntenna ( StationID, string_num, ant_num, settings1 ); @@ -4023,21 +4026,21 @@ Vector Report::GetPolarization (Vector &nnu, Vector &launch_vector) { // Want to find a unit vector in the same plane as // nnu and launch_vector, but perpendicular to launch_vector, pointing away // from nnu. - + // cross nnu with launch_vector to get the direction of the B field. Vector n_bfield = nnu.Cross(launch_vector); - + // cross b-field with nrf2_iceside to get the polarization vector. Vector n_pol = n_bfield.Cross(launch_vector); - + n_pol = n_pol.Unit(); - + // check and make sure E-field is pointing in the right direction. if (nnu*launch_vector>0 && n_pol*nnu>0) cout << "error in GetPolarization. \n"; - - - + + + return n_pol; } //GetPolarization @@ -4068,7 +4071,7 @@ double Report::GaintoHeight(double gain, double freq, double n_medium) { // from gain=4*pi*A_eff/lambda^2 // and h_eff=2*sqrt(A_eff*Z_rx/Z_air) // gain is unitless value - + return 2*sqrt(gain/4/PI*CLIGHT*CLIGHT/(freq*freq*n_medium*n_medium)*Zr/(Z0/n_medium)); // n_medium parts are changed from icemc(I believe this is correct one; E. Hong) } @@ -4415,35 +4418,35 @@ void Report::ApplyRFCM_databin(int ch, int bin_n, Detector *detector, double &vm void Report::ApplyNoiseFig_databin(int ch, int bin_n, Detector *detector, double &vmmhz, Settings *settings1) { // read noise figure and apply unitless gain to vmmhz //cout<<"Entered ApplyNoiseFig_databin "; //cout<<"vmmhz: "<GetNoiseFig_databin(ch,bin_n); // cout<<" 2: "<GetTransm_databin(ch, bin_n); // cout<<" 3: "<NOISE_TEMP; //FILE *fp = fopen("noiseTemp_NOISE_CHANNEL_MODE_0.txt","a+"); - if(detector->GetNoiseFig_databin(ch,bin_n)>1.0){vmmhz = TMath::Sqrt( tempNoise*(detector->GetTransm_databin(ch, bin_n)) + tempNoise/(settings1->NOISE_TEMP)*220.0*(detector->GetNoiseFig_databin(ch,bin_n) - 1.0) ) ; + if(detector->GetNoiseFig_databin(ch,bin_n)>1.0){vmmhz = TMath::Sqrt( tempNoise*(detector->GetTransm_databin(ch, bin_n)) + tempNoise/(settings1->NOISE_TEMP)*220.0*(detector->GetNoiseFig_databin(ch,bin_n) - 1.0) ) ; //cout<<" vmmhz "<GetFreq(bin_n) << " noise temp: " << 246.0*((detector->GetTransm_databin(ch, bin_n)) + 1.0/(settings1->NOISE_TEMP)*220.0*(detector->GetNoiseFig_databin(ch,bin_n) - 1.0) ) << endl; + //cout<<" bin: "<GetFreq(bin_n) << " noise temp: " << 246.0*((detector->GetTransm_databin(ch, bin_n)) + 1.0/(settings1->NOISE_TEMP)*220.0*(detector->GetNoiseFig_databin(ch,bin_n) - 1.0) ) << endl; //fprintf(fp, "%f ",246.0*((detector->GetTransm_databin(ch, bin_n)) + 1.0/(settings1->NOISE_TEMP)*220.0*(detector->GetNoiseFig_databin(ch,bin_n) - 1.0) )); } else{ vmmhz = vmmhz; //fprintf(fp, "%f ",246.0); } - + //fclose(fp); // if(ch==0 && bin_n==2050) cout << "Noise ch: "<< ch <<" "<< detector->GetNoiseFig_databin(ch,bin_n) << " " << detector->GetTransm_databin(ch, bin_n) // << " " << TMath::Sqrt( tempNoise ) << " " << vmmhz << endl; // if(ch==8 && bin_n==2050) cout << "Noise ch: "<< ch <<" "<< detector->GetNoiseFig_databin(ch,bin_n) << " " << detector->GetTransm_databin(ch, bin_n) // << " " << TMath::Sqrt( tempNoise ) << " " << vmmhz << endl; // if(ch==24 && bin_n==2000) cout << "Noise ch: "<< ch << " " << detector->GetNoiseFig_databin(ch,bin_n)*220.0/246.0 << " " << TMath::Sqrt(detector->GetTransm_databin(ch, bin_n) ) << endl; - + } -void Report::GetAngleAnt(Vector &rec_vector, Position &antenna, double &ant_theta, double &ant_phi) { //ant_theta and ant_phi is in degree +void Report::GetAngleAnt(Vector &rec_vector, Position &antenna, double &ant_theta, double &ant_phi) { //ant_theta and ant_phi is in degree // need to fix some parts. // currently phi is not correct. @@ -4472,7 +4475,7 @@ void Report::GetAngleAnt(Vector &rec_vector, Position &antenna, double &ant_thet void Report::GetNoiseWaveforms(Settings *settings1, Detector *detector, double v_noise, double *vnoise) { if (settings1->NOISE == 0) { // NOISE == 0 : flat thermal noise with Johnson-Nyquist noise - //V_noise_fft_bin = sqrt( (double)(NFOUR/2) * 50. * KBOLTZ * T_noise / (2. * TIMESTEP) ); + //V_noise_fft_bin = sqrt( (double)(NFOUR/2) * 50. * KBOLTZ * T_noise / (2. * TIMESTEP) ); Vfft_noise_after.clear(); // remove previous Vfft_noise values Vfft_noise_before.clear(); // remove previous Vfft_noise values @@ -4527,7 +4530,7 @@ void Report::GetNoiseWaveforms(Settings *settings1, Detector *detector, double v //vnoise[2 * k] = (V_tmp) * cos(noise_phase[k]); //vnoise[2 * k + 1] = (V_tmp) * sin(noise_phase[k]); - + Vfft_noise_after.push_back( vnoise[2*k] ); Vfft_noise_after.push_back( vnoise[2*k+1] ); @@ -4543,7 +4546,7 @@ void Report::GetNoiseWaveforms(Settings *settings1, Detector *detector, double v // now vnoise is time domain waveform Tools::realft( vnoise, -1, settings1->DATA_BIN_SIZE); - + // save timedomain noise to Report class /* for (int k=0; kDATA_BIN_SIZE; k++) { @@ -4597,7 +4600,7 @@ void Report::GetNoiseWaveforms_ch(Settings *settings1, Detector *detector, doubl Vfft_noise_before.push_back( V_tmp ); - + current_phase = noise_phase[k]; @@ -4626,7 +4629,7 @@ void Report::GetNoiseWaveforms_ch(Settings *settings1, Detector *detector, doubl // now vnoise is time domain waveform Tools::realft( vnoise, -1, settings1->DATA_BIN_SIZE); - + // save timedomain noise to Report class /* for (int k=0; kDATA_BIN_SIZE; k++) { @@ -4714,7 +4717,7 @@ void Report::GetNoiseWaveforms_ch(Settings *settings1, Detector *detector, doubl // now vnoise is time domain waveform Tools::realft( vnoise, -1, settings1->DATA_BIN_SIZE); - + // save timedomain noise to Report class /* for (int k=0; kDATA_BIN_SIZE; k++) { @@ -4745,7 +4748,7 @@ void Report::GetNoisePhase(Settings *settings1) { } - + void Report::MakeArraysforFFT(Settings *settings1, Detector *detector, int StationIndex, vector &vsignal_array, double *vsignal_forfft) { @@ -4758,7 +4761,7 @@ void Report::MakeArraysforFFT(Settings *settings1, Detector *detector, int Stati // int NFOUR = detector->stations[StationIndex].NFOUR; // int TIMESTEP = detector->stations[StationIndex].TIMESTEP; Tools::Zero(vsignal_forfft,NFOUR/2); - + if (settings1->AVZ_NORM_FACTOR_MODE == 0) { // use previous normalization factors @@ -4772,41 +4775,41 @@ void Report::MakeArraysforFFT(Settings *settings1, Detector *detector, int Stati int ilastnonzero=2000; //for (int i=0;iGetFreqBin();i++) { - + // freq_forfft has NFOUR/2 elements because it is meant to cover real and imaginary values // but there are only NFOUR/4 different values // it's the index among the NFOUR/4 that we're interested in int ifour=Tools::Getifreq(detector->GetFreq(i),detector->freq_forfft[0],detector->freq_forfft[NFOUR/2-1],NFOUR/4); - + if (ifour!=-1 && 2*ifour+1PHASE*PI/180.); vsignal_forfft[2*ifour+1]*=sin(settings1->PHASE*PI/180.); - + //-------------------------------------------------- // if (!PULSER) { - // + // // vsignal_forfft[2*ifour]*=cos(phase*PI/180.); // vsignal_forfft[2*ifour+1]*=sin(phase*PI/180.); - // - // + // + // // } // else { // vsignal_forfft[2*ifour]*=cos(v_phases[ifour]*PI/180.); // vsignal_forfft[2*ifour+1]*=sin(v_phases[ifour]*PI/180.); - // - // } - //-------------------------------------------------- - - + // + // } + //-------------------------------------------------- + + } } else if (settings1->AVZ_NORM_FACTOR_MODE == 1) { // use new (fixed) normalization factors - + double dF = 1. / ((double)(NFOUR/2) * TIMESTEP); // in Hz //cout<<"dF1 : "<GetFreq(1) - detector->GetFreq(0); // in Hz - + //double dF_factor = sqrt( dF_org / dF ); double dF_factor = 1.; //double dF_factor = sqrt( dF / dF_org ); - + int Norg = detector->GetFreqBin(); - + double FreqOrg[Norg+1]; double VmMHzOrg[Norg+1]; - + double FreqNFOUR[NFOUR/4+1]; // one more bin double VmMHzNFOUR[NFOUR/4+1]; // one more bin - + for (int i=0;iGetFreq(i-1); } - + } - + for (int ifour=0;ifourPHASE*PI/180.); vsignal_forfft[2*ifour+1]*=sin(settings1->PHASE*PI/180.); } - + // first and last freq bin read values to 0, 1 bin vsignal_forfft[0] = VmMHzNFOUR[0] * 2/((double)NFOUR/2) * dF_factor / TIMESTEP; vsignal_forfft[1] = VmMHzNFOUR[NFOUR/4] * 2/((double)NFOUR/2) * dF_factor / TIMESTEP; @@ -4915,7 +4918,7 @@ void Report::MakeArraysforFFT(Settings *settings1, Detector *detector, int Stati - + } @@ -4936,7 +4939,7 @@ void Report::MakeArraysforFFT(Settings *settings1, Detector *detector, int Stati if (settings1->AVZ_NORM_FACTOR_MODE == 0) { // use previous normalization factors - + double previous_value_e_even=0.; double previous_value_e_odd=0.; int count_nonzero=0; @@ -4945,41 +4948,41 @@ void Report::MakeArraysforFFT(Settings *settings1, Detector *detector, int Stati int ilastnonzero=2000; //for (int i=0;iGetFreqBin();i++) { - + // freq_forfft has NFOUR/2 elements because it is meant to cover real and imaginary values // but there are only NFOUR/4 different values // it's the index among the NFOUR/4 that we're interested in int ifour=Tools::Getifreq(detector->GetFreq(i),detector->freq_forfft[0],detector->freq_forfft[NFOUR/2-1],NFOUR/4); - + if (ifour!=-1 && 2*ifour+1PHASE*PI/180.); vsignal_forfft[2*ifour+1]*=sin(settings1->PHASE*PI/180.); - + //-------------------------------------------------- // if (!PULSER) { - // + // // vsignal_forfft[2*ifour]*=cos(phase*PI/180.); // vsignal_forfft[2*ifour+1]*=sin(phase*PI/180.); - // - // + // + // // } // else { // vsignal_forfft[2*ifour]*=cos(v_phases[ifour]*PI/180.); // vsignal_forfft[2*ifour+1]*=sin(v_phases[ifour]*PI/180.); - // - // } - //-------------------------------------------------- - - + // + // } + //-------------------------------------------------- + + } } else if (settings1->AVZ_NORM_FACTOR_MODE == 1) { // use new (fixed) normalization factors - + double dF = 1. / ((double)(NFOUR/2) * TIMESTEP); // in Hz //cout<<"dF1 : "<GetFreq(1) - detector->GetFreq(0); // in Hz - + //double dF_factor = sqrt( dF_org / dF ); double dF_factor = 1.; //double dF_factor = sqrt( dF / dF_org ); - + int Norg = detector->GetFreqBin(); - + double FreqOrg[Norg+1]; double VmMHzOrg[Norg+1]; - + double FreqNFOUR[NFOUR/4+1]; // one more bin double VmMHzNFOUR[NFOUR/4+1]; // one more bin - + for (int i=0;iGetFreq(i-1); } - + } - + for (int ifour=0;ifourPHASE*PI/180.); vsignal_forfft[2*ifour+1]*=sin(settings1->PHASE*PI/180.); } - + // first and last freq bin read values to 0, 1 bin vsignal_forfft[0] = VmMHzNFOUR[0] * 2/((double)NFOUR/2) * dF_factor / TIMESTEP; vsignal_forfft[1] = VmMHzNFOUR[NFOUR/4] * 2/((double)NFOUR/2) * dF_factor / TIMESTEP; @@ -5105,9 +5108,9 @@ void Report::MakeArraysforFFT_noise(Settings *settings1, Detector *detector, int // int NFOUR = detector->stations[StationIndex].NFOUR; // int TIMESTEP = detector->stations[StationIndex].TIMESTEP; - + Tools::Zero(vsignal_forfft,NFOUR/2); - + double previous_value_e_even=0.; double previous_value_e_odd=0.; int count_nonzero=0; @@ -5116,41 +5119,41 @@ void Report::MakeArraysforFFT_noise(Settings *settings1, Detector *detector, int int ilastnonzero=2000; //for (int i=0;iGetFreqBin();i++) { - + // freq_forfft has NFOUR/2 elements because it is meant to cover real and imaginary values // but there are only NFOUR/4 different values // it's the index among the NFOUR/4 that we're interested in int ifour=Tools::Getifreq(detector->GetFreq(i),detector->freq_forfft[0],detector->freq_forfft[NFOUR/2-1],NFOUR/4); - + if (ifour!=-1 && 2*ifour+1getStringfromArbAntID( station_i, ch); int antenna_i = detector->getAntennafromArbAntID( station_i, ch); - + TGraph *gr=new TGraph(); - + int N=stations[station_i].strings[string_i].antennas[antenna_i].V_mimic.size(); - + for(int i=0;iSetPoint(i,stations[station_i].strings[string_i].antennas[antenna_i].time_mimic[i], stations[station_i].strings[string_i].antennas[antenna_i].V_mimic[i]); - + }// for i - + gr->SetNameTitle(Form("WF%dS%02dC%02d", event_num, station_i, ch), Form("Simulated waveform %d, station %d, channel %d;time (ns); voltage (mV)", event_num, station_i, ch)); - + return gr; - + } vector Report::getWaveformVector(Detector *detector, int station_i, int event_num, int run_num){ vector waveforms; - + for(int ch=0;chstations[station_i].number_of_antennas; ch++){ - + int string_i = detector->getStringfromArbAntID( station_i, ch); int antenna_i = detector->getAntennafromArbAntID( station_i, ch); - + TGraph *gr=new TGraph(); - + int N=stations[station_i].strings[string_i].antennas[antenna_i].V_mimic.size(); - + for(int i=0;iSetPoint(i,stations[station_i].strings[string_i].antennas[antenna_i].time_mimic[i], stations[station_i].strings[string_i].antennas[antenna_i].V_mimic[i]); - + }// for i - + gr->SetNameTitle(Form("WF%dS%02dC%02d", event_num, station_i, ch), Form("Simulated waveform %d, station %d, channel %d;time (ns); voltage (mV)", event_num, station_i, ch)); - + waveforms.push_back(gr); - + }// for ch - + return waveforms; - + } vector Report::getWaveformVectorVpol(Detector *detector, int station_i, int event_num, int run_num){ - + vector waveforms; - + for(int ch=0;chstations[station_i].number_of_antennas; ch++){ - + int string_i = detector->getStringfromArbAntID( station_i, ch); int antenna_i = detector->getAntennafromArbAntID( station_i, ch); - + if(detector->stations[station_i].strings[string_i].antennas[antenna_i].type!=0) continue; // jump to next channel if this isn't Vpol - + TGraph *gr=new TGraph(); - + int N=stations[station_i].strings[string_i].antennas[antenna_i].V_mimic.size(); - + for(int i=0;iSetPoint(i,stations[station_i].strings[string_i].antennas[antenna_i].time_mimic[i], stations[station_i].strings[string_i].antennas[antenna_i].V_mimic[i]); - + }// for i - + gr->SetNameTitle(Form("WF%dS%02dC%02d", event_num, station_i, ch), Form("Simulated waveform %d, station %d, channel %d;time (ns); voltage (mV)", event_num, station_i, ch)); - + waveforms.push_back(gr); - + }// for ch - + return waveforms; - + } vector Report::getWaveformVectorHpol(Detector *detector, int station_i, int event_num, int run_num){ - + vector waveforms; - + for(int ch=0;chstations[station_i].number_of_antennas; ch++){ - + int string_i = detector->getStringfromArbAntID( station_i, ch); int antenna_i = detector->getAntennafromArbAntID( station_i, ch); - + if(detector->stations[station_i].strings[string_i].antennas[antenna_i].type!=1) continue; // jump to next channel if this isn't Hpol - + TGraph *gr=new TGraph(); - + int N=stations[station_i].strings[string_i].antennas[antenna_i].V_mimic.size(); - + for(int i=0;iSetPoint(i,stations[station_i].strings[string_i].antennas[antenna_i].time_mimic[i], stations[station_i].strings[string_i].antennas[antenna_i].V_mimic[i]); - + }// for i - + gr->SetNameTitle(Form("WF%dS%02dC%02d", event_num, station_i, ch), Form("Simulated waveform %d, station %d, channel %d;time (ns); voltage (mV)", event_num, station_i, ch)); - + waveforms.push_back(gr); - + }// for ch - + return waveforms; - + } vector Report::getHitTimesVector(Detector *detector, int station_i, int polarization){ vector times; - + for(int ch=0;chstations[station_i].number_of_antennas;ch++){ - + int string_i = detector->getStringfromArbAntID( station_i, ch); int antenna_i = detector->getAntennafromArbAntID( station_i, ch); - + if(polarization>=0 && detector->stations[station_i].strings[string_i].antennas[antenna_i].type!=polarization) continue; // jump to next channel if this isn't Hpol/Vpol - + if(stations[station_i].strings[string_i].antennas[antenna_i].arrival_time.size()){ - + times.push_back(1e9*stations[station_i].strings[string_i].antennas[antenna_i].arrival_time[0]);// get the direct beam arrival time - + } - + else times.push_back(-1000); // if there's no ray-trace solution just put something in. - + } - + return times; - + } vector Report::getHitTimesVectorVpol(Detector *detector, int station_i){ return getHitTimesVector(detector, station_i, 0); - + } vector Report::getHitTimesVectorHpol(Detector *detector, int station_i){ - - return getHitTimesVector(detector, station_i, 1); - -} + return getHitTimesVector(detector, station_i, 1); +} diff --git a/Settings.cc b/Settings.cc index e35cd115..dc7f2cb9 100644 --- a/Settings.cc +++ b/Settings.cc @@ -299,7 +299,7 @@ void Settings::Initialize() { SC_EFFICIENCY_ERROR_V = 0.9; //Lower bound of Vpol signal chain efficiency SC_EFFICIENCY_ERROR_H = 0.68; //Lower bound of Hpol signal chain efficiency SYSTEMATICS_IceAtten = 0; //Default: Average value (red line) from Eugene's attenuation model (http://radiorm.physics.ohio-state.edu/elog/Write-Ups/170504_105713/Thesis_-_Eugene_Hong.pdf, p. 54), 1 = lower bound, 2 = upper bound - + SYSTEMATICS_Askaryan = 0; //Default:askaryan signal is not changed at all. =1 scale up the askaryan signal by 12%, =2 scale down the askaryan signal by 12%. The 12% comes from Eugene's thesis, Fg. 5.12. } void Settings::ReadFile(string setupfile) { @@ -670,6 +670,9 @@ void Settings::ReadFile(string setupfile) { else if (label == "SYSTEMATICS_IceAtten"){ SYSTEMATICS_IceAtten = atof(line.substr(line.find_first_of("=") + 1).c_str()); } + else if (label == "SYSTEMATICS_Askaryan"){ + SYSTEMATICS_IceAtten = atof(line.substr(line.find_first_of("=") + 1).c_str()); + } } } @@ -984,7 +987,7 @@ int Settings::CheckCompatibilitiesSettings() { } } - + //Check that DETECTOR_STATION=0 is only used with DETECTOR=3 if (DETECTOR_STATION==0 && DETECTOR!=3){ cerr << " DETECTOR_STATION=0 doesn't work with DETECTOR!=3. If you want to work with TestBed, use DETECTOR=3 & DETECTOR_STATION=0" << endl; diff --git a/Settings.h b/Settings.h index 2fc828c1..827bb06a 100644 --- a/Settings.h +++ b/Settings.h @@ -424,6 +424,7 @@ class Settings int horizontal_banana_points; int vertical_banana_points; int SYSTEMATICS_IceAtten; + int SYSTEMATICS_Askaryan; // end of values from icemc From 39301a9aa6d4ca6b361a96efce70da1771aa3d11 Mon Sep 17 00:00:00 2001 From: Ming-Yuan Lu Date: Fri, 24 Jan 2020 16:04:39 -0600 Subject: [PATCH 23/53] Initialize Settings::DETECTOR_STATION & Settings DETECTOR_STATION_LIVETIME_CONFIG with default values, 2 & 0 respectively --- Settings.cc | 3 +++ Settings.h | 1 + log.txt | 4 +++- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Settings.cc b/Settings.cc index dc7f2cb9..5f5e0834 100644 --- a/Settings.cc +++ b/Settings.cc @@ -295,6 +295,9 @@ void Settings::Initialize() { IND_NNU_PHI[100] = {0}; */ + DETECTOR_STATION=2; //default: 2, meaning ARA02 (A2) + DETECTOR_STATION_LIVETIME_CONFIG=0; //default 0: no special config + USE_SIGNAL_CHAIN_LOWER_BOUND = 0; // default: 0 -- don't replace signal chain efficiency with lower bound. 1: replace with lower bound SC_EFFICIENCY_ERROR_V = 0.9; //Lower bound of Vpol signal chain efficiency SC_EFFICIENCY_ERROR_H = 0.68; //Lower bound of Hpol signal chain efficiency diff --git a/Settings.h b/Settings.h index 827bb06a..61e1a304 100644 --- a/Settings.h +++ b/Settings.h @@ -50,6 +50,7 @@ class Settings int DETECTOR; // choose detector layout int DETECTOR_STATION; // for DETECTOR=4, indicates the single station to be simulated + //default is 2 // 0 = testbed, 1 = A1, 2 = A2, 3 = A3 int DETECTOR_STATION_LIVETIME_CONFIG; // only to be used with DETECTOR=4 (real station), and DETECTOR_STATION=2 or =3 (A2/A3) diff --git a/log.txt b/log.txt index 34ea574e..0433855a 100644 --- a/log.txt +++ b/log.txt @@ -1559,5 +1559,7 @@ Values 1 and 2 are used for lower and upper bound, respectively. The values are 2020/01/15 Ming-Yuan Lu Rename overloaded Settings::CheckCompatibilities functions to Settings::CheckCompatibilitiesSettings() & Settings::CheckCompatibilitiesDetector(Detector *detector) to avoid confusion. +============================================================================ - +2020/01/24 Ming-Yuan Lu +Initialize Settings::DETECTOR_STATION to be 2, and Settings::DETECTOR_STATION_LIVETIME_CONFIG to be 0 From bc37d444120eb6fb5828a015888df0cae4c38ffb Mon Sep 17 00:00:00 2001 From: Jorge Torres Date: Sun, 26 Jan 2020 11:29:09 -0500 Subject: [PATCH 24/53] Fixed typo in Settings.cc --- Settings.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Settings.cc b/Settings.cc index dc7f2cb9..6d2893fb 100644 --- a/Settings.cc +++ b/Settings.cc @@ -671,7 +671,7 @@ void Settings::ReadFile(string setupfile) { SYSTEMATICS_IceAtten = atof(line.substr(line.find_first_of("=") + 1).c_str()); } else if (label == "SYSTEMATICS_Askaryan"){ - SYSTEMATICS_IceAtten = atof(line.substr(line.find_first_of("=") + 1).c_str()); + SYSTEMATICS_Askaryan = atof(line.substr(line.find_first_of("=") + 1).c_str()); } } From 8a532fe5a6b487020acb5cef76089fa69d69942a Mon Sep 17 00:00:00 2001 From: Jorge Torres Date: Sun, 26 Jan 2020 14:28:06 -0500 Subject: [PATCH 25/53] Fixed Askaryan and made some changes for Latten in the IceModel class --- IceModel.cc | 3 ++- Report.cc | 15 ++++++++++++--- eventSimDict_rdict.pcm | Bin 0 -> 35096 bytes outputs/AraOut.root | Bin 0 -> 75658 bytes outputs/TrigWindowStudy.txt | 0 sigmaCrossSection.pdf | Bin 0 -> 106813 bytes 6 files changed, 14 insertions(+), 4 deletions(-) create mode 100644 eventSimDict_rdict.pcm create mode 100644 outputs/AraOut.root create mode 100644 outputs/TrigWindowStudy.txt create mode 100644 sigmaCrossSection.pdf diff --git a/IceModel.cc b/IceModel.cc index 8671201c..ab581036 100644 --- a/IceModel.cc +++ b/IceModel.cc @@ -227,10 +227,11 @@ if ( file.is_open() ) { */ //The following hardcoded numbers correspond to a model derived by Eugene Hong, based on ice attenuation measurements (c.f. TestBed paper). This is the default mode usedf by AraSim. //More details can be found on Eugene's Thesis: http://radiorm.physics.ohio-state.edu/elog/Write-Ups/170504_105713/Thesis_-_Eugene_Hong.pdf, p. 54 and 132. + if(SYSTEMAT_IceAtten == 0){ double ARA_IceAtten_Depth_tmp[53] = { 72.7412, 76.5697, 80.3982, 91.8836, 95.7121, 107.198, 118.683, 133.997, 153.139, 179.939, 206.738, 245.023, 298.622, 356.049, 405.819, 470.904, 516.845, 566.616, 616.386, 669.985, 727.412, 784.839, 838.438, 899.694, 949.464, 1003.06, 1060.49, 1121.75, 1179.17, 1236.6, 1297.86, 1347.63, 1405.05, 1466.31, 1516.08, 1565.85, 1611.79, 1657.73, 1699.85, 1745.79, 1791.73, 1833.84, 1883.61, 1929.56, 1990.81, 2052.07, 2109.49, 2170.75, 2232.01, 2304.75, 2362.17, 2431.09, 2496.17 }; double ARA_IceAtten_Length_tmp[53] = { 1994.67, 1952, 1896, 1842.67, 1797.33, 1733.33, 1680, 1632, 1586.67, 1552, 1522.67, 1501.33, 1474.67, 1458.67, 1437.33, 1416, 1392, 1365.33, 1344, 1312, 1274.67, 1242.67, 1205.33, 1168, 1128, 1090.67, 1048, 1008, 965.333, 920, 874.667, 834.667, 797.333, 752, 714.667, 677.333, 648, 616, 589.333, 557.333, 530.667, 506.667, 477.333, 453.333, 418.667, 389.333, 362.667, 333.333, 309.333, 285.333, 264, 242.667, 221.333 }; - +} //Lower bound (in the plot sense) //if lower bound, then diff --git a/Report.cc b/Report.cc index 071deac9..6891d090 100644 --- a/Report.cc +++ b/Report.cc @@ -769,9 +769,18 @@ void Report::Connect_Interaction_Detector (Event *event, Detector *detector, Ray // signal before the antenna (get signal at 1m and apply atten factor) signal->GetVm_FarField_Tarray( event, settings1, viewangle, atten_factor, outbin, Tarray, Earray, stations[i].strings[j].antennas[k].skip_bins[ray_sol_cnt] ); - if(settings1->SYSTEMATICS_Askaryan>0){ - if(settings1->SYSTEMATICS_Askaryan==1) for(int kk=0;kk<64;kk++){Earray[kk]*=1.12;} - if(settings1->SYSTEMATICS_Askaryan==2) for(int kk=0;kk<64;kk++){Earray[kk]*=0.88;} + // cout << "\033[1;31mAskaryan Signal accessed here\033[0m\n"; + if(settings1->SYSTEMATICS_Askaryan>0){ + if(settings1->SYSTEMATICS_Askaryan==1) for(int kk=0;kk<64;kk++){ + // printf("Before:%e \n",Earray[kk]); + Earray[kk]*=1.12; + // printf("After:%e \n",Earray[kk]); + } + if(settings1->SYSTEMATICS_Askaryan==2) for(int kk=0;kk<64;kk++){ + // printf("Before:%e \n",Earray[kk]); + Earray[kk]*=0.88; + // printf("After:%e \n",Earray[kk]); + } } diff --git a/eventSimDict_rdict.pcm b/eventSimDict_rdict.pcm new file mode 100644 index 0000000000000000000000000000000000000000..5099347b5162360a0c865f8668e1cefbc6622db4 GIT binary patch literal 35096 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 literal 0 HcmV?d00001 diff --git a/outputs/AraOut.root b/outputs/AraOut.root new file mode 100644 index 0000000000000000000000000000000000000000..9ddfeb2b7f9558dd98c870e34839ce06923355f2 GIT binary patch literal 75658 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

;Xs_Kh-;M{4~hXNkz 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 literal 0 HcmV?d00001 diff --git a/outputs/TrigWindowStudy.txt b/outputs/TrigWindowStudy.txt new file mode 100644 index 00000000..e69de29b diff --git a/sigmaCrossSection.pdf b/sigmaCrossSection.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e146de1017a894ad6de81d74c23c2981a72a4f68 GIT binary patch literal 106813 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%0DNB{S%4@6h>zj?!1KW4J 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�b;6h%* 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 literal 0 HcmV?d00001 From d90eec95fd4a497b60b2472a1cb1beaa445e916d Mon Sep 17 00:00:00 2001 From: Jorge Torres Date: Sun, 26 Jan 2020 21:43:59 -0500 Subject: [PATCH 26/53] Fixed IceModel class --- IceModel.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/IceModel.cc b/IceModel.cc index ab581036..a003ffba 100644 --- a/IceModel.cc +++ b/IceModel.cc @@ -227,6 +227,8 @@ if ( file.is_open() ) { */ //The following hardcoded numbers correspond to a model derived by Eugene Hong, based on ice attenuation measurements (c.f. TestBed paper). This is the default mode usedf by AraSim. //More details can be found on Eugene's Thesis: http://radiorm.physics.ohio-state.edu/elog/Write-Ups/170504_105713/Thesis_-_Eugene_Hong.pdf, p. 54 and 132. + double ARA_IceAtten_Depth_tmp[53]; + double ARA_IceAtten_Length_tmp[53]; if(SYSTEMAT_IceAtten == 0){ double ARA_IceAtten_Depth_tmp[53] = { 72.7412, 76.5697, 80.3982, 91.8836, 95.7121, 107.198, 118.683, 133.997, 153.139, 179.939, 206.738, 245.023, 298.622, 356.049, 405.819, 470.904, 516.845, 566.616, 616.386, 669.985, 727.412, 784.839, 838.438, 899.694, 949.464, 1003.06, 1060.49, 1121.75, 1179.17, 1236.6, 1297.86, 1347.63, 1405.05, 1466.31, 1516.08, 1565.85, 1611.79, 1657.73, 1699.85, 1745.79, 1791.73, 1833.84, 1883.61, 1929.56, 1990.81, 2052.07, 2109.49, 2170.75, 2232.01, 2304.75, 2362.17, 2431.09, 2496.17 }; From 4f32792479a418004f578867c5427be144c7d706 Mon Sep 17 00:00:00 2001 From: clark2668 Date: Mon, 27 Jan 2020 11:28:01 -0500 Subject: [PATCH 27/53] add SYSTEMATICS_nofz support --- RaySolver.cc | 33 ++++++++++++++++++++++++++++----- Settings.cc | 11 +++++++++++ Settings.h | 5 +++-- eventSimDict_rdict.pcm | Bin 35096 -> 0 bytes log.txt | 8 ++++++++ outputs/AraOut.root | Bin 75658 -> 0 bytes 6 files changed, 50 insertions(+), 7 deletions(-) delete mode 100644 eventSimDict_rdict.pcm delete mode 100644 outputs/AraOut.root diff --git a/RaySolver.cc b/RaySolver.cc index 0e5bb847..0c4edbbd 100644 --- a/RaySolver.cc +++ b/RaySolver.cc @@ -1076,12 +1076,38 @@ void RaySolver::Solve_Ray (Position &source, Position &target, IceModel *antarct // Defaults!!!! src = source_tmp; trg = target_tmp; - + if (settings1->RAY_TRACE_ICE_MODEL_PARAMS == 0){ // South Pole Values (AraSim original default, based on RICE) ns = 1.35; nd = 1.78; nc = 0.0132; + + printf("Old ns, nd, nc: %.4f, %.4f, %.4f \n", ns, nd, nc); + + // if we wan to wiggle parameter uncertaintties + double adjust_ns=0.; + double adjust_nd=0.; + double adjust_nc=0.; + + if(settings1->SYSTEMATICS_nofz==1){ // upper bound + adjust_ns=0.022; + adjust_nd=0.016; + adjust_nc=0.0017; + } + if(settings1->SYSTEMATICS_nofz==2){ // lower bound + adjust_ns=-0.022; + adjust_nd=-0.016; + adjust_nc=-0.0017; + } + + ns+=adjust_ns; + nd+=adjust_nd; + nc+=adjust_nc; + + printf("New ns, nd, nc: %.4f, %.4f, %.4f \n", ns, nd, nc); + + } else if (settings1->RAY_TRACE_ICE_MODEL_PARAMS == 1){ // South Pole Values (RICE (2004)) ns = 1.35; @@ -1123,10 +1149,7 @@ void RaySolver::Solve_Ray (Position &source, Position &target, IceModel *antarct ns = 1.35; nd = 1.78; nc = 0.0132; - } - - - + } // cout << "ns, nd, nc: " << ns << ", " << nd << ", " << nc << endl; diff --git a/Settings.cc b/Settings.cc index 6d2893fb..8bf9b569 100644 --- a/Settings.cc +++ b/Settings.cc @@ -300,6 +300,8 @@ void Settings::Initialize() { SC_EFFICIENCY_ERROR_H = 0.68; //Lower bound of Hpol signal chain efficiency SYSTEMATICS_IceAtten = 0; //Default: Average value (red line) from Eugene's attenuation model (http://radiorm.physics.ohio-state.edu/elog/Write-Ups/170504_105713/Thesis_-_Eugene_Hong.pdf, p. 54), 1 = lower bound, 2 = upper bound SYSTEMATICS_Askaryan = 0; //Default:askaryan signal is not changed at all. =1 scale up the askaryan signal by 12%, =2 scale down the askaryan signal by 12%. The 12% comes from Eugene's thesis, Fg. 5.12. + SYSTEMATICS_Askaryan = 0; // = 0 = default = do nothing; for NOFZ=1 and RAY_TRACE_ICE_MODEL_PARAMS=0, apply the upper bound (=1) and lower bound (=2) + } void Settings::ReadFile(string setupfile) { @@ -673,6 +675,10 @@ void Settings::ReadFile(string setupfile) { else if (label == "SYSTEMATICS_Askaryan"){ SYSTEMATICS_Askaryan = atof(line.substr(line.find_first_of("=") + 1).c_str()); } + else if (label == "SYSTEMATICS_nofz"){ + SYSTEMATICS_nofz = atof(line.substr(line.find_first_of("=") + 1).c_str()); + } + } } @@ -1012,6 +1018,11 @@ int Settings::CheckCompatibilitiesSettings() { num_err++; } + if(SYSTEMATICS_nofz>0 && RAY_TRACE_ICE_MODEL_PARAMS!=0){ + cerr<<"SYSTEMATICS_nofz>0 only works with the default AraSim model RAY_TRACE_ICE_MODEL_PARAMS=0."<GR6iYE(OH=p6;-EC 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 diff --git a/log.txt b/log.txt index 34ea574e..5f343139 100644 --- a/log.txt +++ b/log.txt @@ -1561,3 +1561,11 @@ Values 1 and 2 are used for lower and upper bound, respectively. The values are Rename overloaded Settings::CheckCompatibilities functions to Settings::CheckCompatibilitiesSettings() & Settings::CheckCompatibilitiesDetector(Detector *detector) to avoid confusion. +============================================================================ + + +2020/01/27 Brian Clark +Add SYSTEMATICS_nofz to wiggle RAY_TRACE_ICE_MODEL_PARAMS within uncertainties. +=0=default fit values +=1=make larger by uncertainties +=2=make smaller by uncertainties diff --git a/outputs/AraOut.root b/outputs/AraOut.root deleted file mode 100644 index 9ddfeb2b7f9558dd98c870e34839ce06923355f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75658 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

;Xs_Kh-;M{4~hXNkz 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 From ce4679fa5c0ee86a0f37b0309c9c9ab7eed31f4f Mon Sep 17 00:00:00 2001 From: clark2668 Date: Mon, 27 Jan 2020 11:29:17 -0500 Subject: [PATCH 28/53] reduce output verbosity --- RaySolver.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/RaySolver.cc b/RaySolver.cc index 0c4edbbd..2e86a3d3 100644 --- a/RaySolver.cc +++ b/RaySolver.cc @@ -1083,7 +1083,7 @@ void RaySolver::Solve_Ray (Position &source, Position &target, IceModel *antarct nd = 1.78; nc = 0.0132; - printf("Old ns, nd, nc: %.4f, %.4f, %.4f \n", ns, nd, nc); + // printf("Old ns, nd, nc: %.4f, %.4f, %.4f \n", ns, nd, nc); // if we wan to wiggle parameter uncertaintties double adjust_ns=0.; @@ -1105,7 +1105,7 @@ void RaySolver::Solve_Ray (Position &source, Position &target, IceModel *antarct nd+=adjust_nd; nc+=adjust_nc; - printf("New ns, nd, nc: %.4f, %.4f, %.4f \n", ns, nd, nc); + // printf("New ns, nd, nc: %.4f, %.4f, %.4f \n", ns, nd, nc); } else if (settings1->RAY_TRACE_ICE_MODEL_PARAMS == 1){ From 8dcdc36bd5776e7d3c8b203c7bae9f46f4bd376b Mon Sep 17 00:00:00 2001 From: Jorge Torres Date: Tue, 28 Jan 2020 10:16:13 -0500 Subject: [PATCH 29/53] Changed name of nofz systematics parameter in nofz, as it was wrong --- Settings.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Settings.cc b/Settings.cc index 9afde63d..82d90ae7 100644 --- a/Settings.cc +++ b/Settings.cc @@ -303,7 +303,7 @@ void Settings::Initialize() { SC_EFFICIENCY_ERROR_H = 0.68; //Lower bound of Hpol signal chain efficiency SYSTEMATICS_IceAtten = 0; //Default: Average value (red line) from Eugene's attenuation model (http://radiorm.physics.ohio-state.edu/elog/Write-Ups/170504_105713/Thesis_-_Eugene_Hong.pdf, p. 54), 1 = lower bound, 2 = upper bound SYSTEMATICS_Askaryan = 0; //Default:askaryan signal is not changed at all. =1 scale up the askaryan signal by 12%, =2 scale down the askaryan signal by 12%. The 12% comes from Eugene's thesis, Fg. 5.12. - SYSTEMATICS_Askaryan = 0; // = 0 = default = do nothing; for NOFZ=1 and RAY_TRACE_ICE_MODEL_PARAMS=0, apply the upper bound (=1) and lower bound (=2) + SYSTEMATICS_nofz = 0; // = 0 = default = do nothing; for NOFZ=1 and RAY_TRACE_ICE_MODEL_PARAMS=0, apply the upper bound (=1) and lower bound (=2) } From 188db22bca1e9c9a46c7c3002c670d1cfb603c93 Mon Sep 17 00:00:00 2001 From: Jorge Torres Date: Tue, 28 Jan 2020 18:35:11 -0500 Subject: [PATCH 30/53] Fixed Icemodel class. Arrays need to be defined when initializing them with numbers... --- IceModel.cc | 49 ++++++++++++++++++++++++++++++------------------- 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/IceModel.cc b/IceModel.cc index a003ffba..029b6d12 100644 --- a/IceModel.cc +++ b/IceModel.cc @@ -25,9 +25,6 @@ using namespace std; //class Interaction; // int SYSTEMAT_IceAtten; - -Settings *settings1 = new Settings(); -int SYSTEMAT_IceAtten = settings1->SYSTEMATICS_IceAtten; // //Parameters of the BEDMAP ice model. (See http://www.antarctica.ac.uk/aedc/bedmap/download/) int nCols_ice=1200; //number of columns in data, set by header file (should be 1200) @@ -227,18 +224,26 @@ if ( file.is_open() ) { */ //The following hardcoded numbers correspond to a model derived by Eugene Hong, based on ice attenuation measurements (c.f. TestBed paper). This is the default mode usedf by AraSim. //More details can be found on Eugene's Thesis: http://radiorm.physics.ohio-state.edu/elog/Write-Ups/170504_105713/Thesis_-_Eugene_Hong.pdf, p. 54 and 132. - double ARA_IceAtten_Depth_tmp[53]; - double ARA_IceAtten_Length_tmp[53]; + + ARA_IceAtten_bin = 53; if(SYSTEMAT_IceAtten == 0){ - double ARA_IceAtten_Depth_tmp[53] = { 72.7412, 76.5697, 80.3982, 91.8836, 95.7121, 107.198, 118.683, 133.997, 153.139, 179.939, 206.738, 245.023, 298.622, 356.049, 405.819, 470.904, 516.845, 566.616, 616.386, 669.985, 727.412, 784.839, 838.438, 899.694, 949.464, 1003.06, 1060.49, 1121.75, 1179.17, 1236.6, 1297.86, 1347.63, 1405.05, 1466.31, 1516.08, 1565.85, 1611.79, 1657.73, 1699.85, 1745.79, 1791.73, 1833.84, 1883.61, 1929.56, 1990.81, 2052.07, 2109.49, 2170.75, 2232.01, 2304.75, 2362.17, 2431.09, 2496.17 }; + double ARA_IceAtten_Depth_tmp0[53] = { 72.7412, 76.5697, 80.3982, 91.8836, 95.7121, 107.198, 118.683, 133.997, 153.139, 179.939, 206.738, 245.023, 298.622, 356.049, 405.819, 470.904, 516.845, 566.616, 616.386, 669.985, 727.412, 784.839, 838.438, 899.694, 949.464, 1003.06, 1060.49, 1121.75, 1179.17, 1236.6, 1297.86, 1347.63, 1405.05, 1466.31, 1516.08, 1565.85, 1611.79, 1657.73, 1699.85, 1745.79, 1791.73, 1833.84, 1883.61, 1929.56, 1990.81, 2052.07, 2109.49, 2170.75, 2232.01, 2304.75, 2362.17, 2431.09, 2496.17 }; + + double ARA_IceAtten_Length_tmp0[53] = { 1994.67, 1952, 1896, 1842.67, 1797.33, 1733.33, 1680, 1632, 1586.67, 1552, 1522.67, 1501.33, 1474.67, 1458.67, 1437.33, 1416, 1392, 1365.33, 1344, 1312, 1274.67, 1242.67, 1205.33, 1168, 1128, 1090.67, 1048, 1008, 965.333, 920, 874.667, 834.667, 797.333, 752, 714.667, 677.333, 648, 616, 589.333, 557.333, 530.667, 506.667, 477.333, 453.333, 418.667, 389.333, 362.667, 333.333, 309.333, 285.333, 264, 242.667, 221.333 }; + + for (int bin=0; bin Date: Tue, 28 Jan 2020 18:39:00 -0500 Subject: [PATCH 31/53] Fixed Icemodel class. Arrays need to be defined when initializing them with numbers... --- IceModel.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/IceModel.cc b/IceModel.cc index 029b6d12..a7817079 100644 --- a/IceModel.cc +++ b/IceModel.cc @@ -224,7 +224,7 @@ if ( file.is_open() ) { */ //The following hardcoded numbers correspond to a model derived by Eugene Hong, based on ice attenuation measurements (c.f. TestBed paper). This is the default mode usedf by AraSim. //More details can be found on Eugene's Thesis: http://radiorm.physics.ohio-state.edu/elog/Write-Ups/170504_105713/Thesis_-_Eugene_Hong.pdf, p. 54 and 132. - +SYSTEMAT_IceAtten = settings1->SYSTEMATICS_IceAtten; ARA_IceAtten_bin = 53; if(SYSTEMAT_IceAtten == 0){ double ARA_IceAtten_Depth_tmp0[53] = { 72.7412, 76.5697, 80.3982, 91.8836, 95.7121, 107.198, 118.683, 133.997, 153.139, 179.939, 206.738, 245.023, 298.622, 356.049, 405.819, 470.904, 516.845, 566.616, 616.386, 669.985, 727.412, 784.839, 838.438, 899.694, 949.464, 1003.06, 1060.49, 1121.75, 1179.17, 1236.6, 1297.86, 1347.63, 1405.05, 1466.31, 1516.08, 1565.85, 1611.79, 1657.73, 1699.85, 1745.79, 1791.73, 1833.84, 1883.61, 1929.56, 1990.81, 2052.07, 2109.49, 2170.75, 2232.01, 2304.75, 2362.17, 2431.09, 2496.17 }; From f582295470d73836f27e10013f2473b3350bdff8 Mon Sep 17 00:00:00 2001 From: Jorge Torres Date: Tue, 28 Jan 2020 18:41:01 -0500 Subject: [PATCH 32/53] Changed atof to atoi when reading parameters from settings --- Settings.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Settings.cc b/Settings.cc index 82d90ae7..48e83e01 100644 --- a/Settings.cc +++ b/Settings.cc @@ -673,13 +673,13 @@ void Settings::ReadFile(string setupfile) { SC_EFFICIENCY_ERROR_H = atof(line.substr(line.find_first_of("=") + 1).c_str()); } else if (label == "SYSTEMATICS_IceAtten"){ - SYSTEMATICS_IceAtten = atof(line.substr(line.find_first_of("=") + 1).c_str()); + SYSTEMATICS_IceAtten = atoi(line.substr(line.find_first_of("=") + 1).c_str()); } else if (label == "SYSTEMATICS_Askaryan"){ - SYSTEMATICS_Askaryan = atof(line.substr(line.find_first_of("=") + 1).c_str()); + SYSTEMATICS_Askaryan = atoi(line.substr(line.find_first_of("=") + 1).c_str()); } else if (label == "SYSTEMATICS_nofz"){ - SYSTEMATICS_nofz = atof(line.substr(line.find_first_of("=") + 1).c_str()); + SYSTEMATICS_nofz = atoi(line.substr(line.find_first_of("=") + 1).c_str()); } From 306c70386bb9ab8682fdd0ffac8f07a4fa036e4d Mon Sep 17 00:00:00 2001 From: Jorge Torres Date: Tue, 28 Jan 2020 18:57:16 -0500 Subject: [PATCH 33/53] Fixed Icemodel class. Arrays need to be defined when initializing them with numbers... --- IceModel.cc | 5 ++--- IceModel.h | 1 - 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/IceModel.cc b/IceModel.cc index a7817079..96e6bd36 100644 --- a/IceModel.cc +++ b/IceModel.cc @@ -224,7 +224,8 @@ if ( file.is_open() ) { */ //The following hardcoded numbers correspond to a model derived by Eugene Hong, based on ice attenuation measurements (c.f. TestBed paper). This is the default mode usedf by AraSim. //More details can be found on Eugene's Thesis: http://radiorm.physics.ohio-state.edu/elog/Write-Ups/170504_105713/Thesis_-_Eugene_Hong.pdf, p. 54 and 132. -SYSTEMAT_IceAtten = settings1->SYSTEMATICS_IceAtten; +//SYSTEMAT_IceAtten = settings1->SYSTEMATICS_IceAtten; + SYSTEMAT_IceAtten = 0; ARA_IceAtten_bin = 53; if(SYSTEMAT_IceAtten == 0){ double ARA_IceAtten_Depth_tmp0[53] = { 72.7412, 76.5697, 80.3982, 91.8836, 95.7121, 107.198, 118.683, 133.997, 153.139, 179.939, 206.738, 245.023, 298.622, 356.049, 405.819, 470.904, 516.845, 566.616, 616.386, 669.985, 727.412, 784.839, 838.438, 899.694, 949.464, 1003.06, 1060.49, 1121.75, 1179.17, 1236.6, 1297.86, 1347.63, 1405.05, 1466.31, 1516.08, 1565.85, 1611.79, 1657.73, 1699.85, 1745.79, 1791.73, 1833.84, 1883.61, 1929.56, 1990.81, 2052.07, 2109.49, 2170.75, 2232.01, 2304.75, 2362.17, 2431.09, 2496.17 }; @@ -303,8 +304,6 @@ SYSTEMAT_IceAtten = settings1->SYSTEMATICS_IceAtten; cout << SYSTEMAT_IceAtten << endl; } } - - } // read depth in positive value and return attenuation length (m) at the depth diff --git a/IceModel.h b/IceModel.h index bfe19285..7884cd88 100644 --- a/IceModel.h +++ b/IceModel.h @@ -183,7 +183,6 @@ void GetFresnel ( int ARA_IceAtten_bin; double GetARAIceAttenuLength(double depth); - // void FillArraysforTree(double lon_ground[1068][869],double lat_ground[1068][869],double lon_ice[1200][1000],double lat_ice[1200][1000],double lon_water[1200][1000],double lat_water[1200][1000]); // below three members are copied from icemc icemodel. From c5c398b06553c85c9da42264a50cc2b97528bc55 Mon Sep 17 00:00:00 2001 From: Jorge Torres Date: Tue, 28 Jan 2020 18:59:12 -0500 Subject: [PATCH 34/53] Fixed Icemodel class. Missing int --- IceModel.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/IceModel.cc b/IceModel.cc index 96e6bd36..bf2bad57 100644 --- a/IceModel.cc +++ b/IceModel.cc @@ -225,7 +225,7 @@ if ( file.is_open() ) { //The following hardcoded numbers correspond to a model derived by Eugene Hong, based on ice attenuation measurements (c.f. TestBed paper). This is the default mode usedf by AraSim. //More details can be found on Eugene's Thesis: http://radiorm.physics.ohio-state.edu/elog/Write-Ups/170504_105713/Thesis_-_Eugene_Hong.pdf, p. 54 and 132. //SYSTEMAT_IceAtten = settings1->SYSTEMATICS_IceAtten; - SYSTEMAT_IceAtten = 0; + int SYSTEMAT_IceAtten = 0; ARA_IceAtten_bin = 53; if(SYSTEMAT_IceAtten == 0){ double ARA_IceAtten_Depth_tmp0[53] = { 72.7412, 76.5697, 80.3982, 91.8836, 95.7121, 107.198, 118.683, 133.997, 153.139, 179.939, 206.738, 245.023, 298.622, 356.049, 405.819, 470.904, 516.845, 566.616, 616.386, 669.985, 727.412, 784.839, 838.438, 899.694, 949.464, 1003.06, 1060.49, 1121.75, 1179.17, 1236.6, 1297.86, 1347.63, 1405.05, 1466.31, 1516.08, 1565.85, 1611.79, 1657.73, 1699.85, 1745.79, 1791.73, 1833.84, 1883.61, 1929.56, 1990.81, 2052.07, 2109.49, 2170.75, 2232.01, 2304.75, 2362.17, 2431.09, 2496.17 }; From 8f6df820a85ebb7d61570bd8addffdb7f8d703e8 Mon Sep 17 00:00:00 2001 From: Jorge Torres Date: Tue, 28 Jan 2020 22:39:19 -0500 Subject: [PATCH 35/53] Fixed the IceModel class so it correctly passes the Latten systematics bariable. The function was changed in the AraSim class so it takes a new argument --- AraSim.cc | 94 ++++++++++++++++++++++++++--------------------------- IceModel.cc | 20 ++++++------ IceModel.h | 4 +-- 3 files changed, 59 insertions(+), 59 deletions(-) diff --git a/AraSim.cc b/AraSim.cc index 179c6dcf..2c8682d0 100644 --- a/AraSim.cc +++ b/AraSim.cc @@ -1,6 +1,6 @@ // ROOT includes #include "TFile.h" -#include "TRandom3.h" +#include "TRandom3.h" #include "TTree.h" // AraSim includes @@ -42,7 +42,7 @@ void test(); string outputdir="outputs"; int main(int argc, char **argv) { // read setup.txt file - + Settings *settings1 = new Settings(); cout<<"\n\tDefault values!"<NNU<ICE_MODEL<SetSeed(settings1->SEED + atoi(run_no.c_str() ) ); - + } //cout<<"first random from TRandom3 : "<Rndm()<<"\n"; cout<<"first random : "<Rndm()<<"\n"; // IceModel *icemodel=new IceModel(ICE_MODEL + NOFZ*10,CONSTANTICETHICKNESS * 1000 + CONSTANTCRUST * 100 + FIXEDELEVATION * 10 + 0,MOOREBAY);// creates Antarctica ice model - IceModel *icemodel=new IceModel(settings1->ICE_MODEL + settings1->NOFZ*10,settings1->CONSTANTICETHICKNESS * 1000 + settings1->CONSTANTCRUST * 100 + settings1->FIXEDELEVATION * 10 + 0,settings1->MOOREBAY);// creates Antarctica ice model - // IceModel inherits from EarthModel + IceModel *icemodel=new IceModel(settings1->ICE_MODEL + settings1->NOFZ*10,settings1->CONSTANTICETHICKNESS * 1000 + settings1->CONSTANTCRUST * 100 + settings1->FIXEDELEVATION * 10 + 0,settings1->MOOREBAY, settings1->SYSTEMATICS_IceAtten);// creates Antarctica ice model + // IceModel inherits from EarthModel cout<Surface(0., 0.)<SurfaceAboveGeoid(0., 0.)<DETECTOR); // builds antenna array, 0 for testbed - Trigger *trigger=new Trigger(detector, settings1); // builds the trigger + Trigger *trigger=new Trigger(detector, settings1); // builds the trigger // Efficiencies *efficiencies=new Efficiencies(detector->getnRx(),outputdir); // keeps track of efficiencies at each stage of the simulation Efficiencies *efficiencies=new Efficiencies(100,outputdir); // keeps track of efficiencies at each stage of the simulation cout<<"called Efficiencies"<EXPONENT); // gets library (or whatever) of neutrino spectra cout<<"called Spectra"<TRIG_WINDOW = TRIG_WINDOW_Size; - + Total_Global_Pass = 0; cout<<"begin looping events!!"<CheckCompatibilitiesDetector(detector); @@ -356,7 +356,7 @@ int main(int argc, char **argv) { // read setup.txt file cerr<<"There are "<< settings_compatibility_error<<" errors from settings after Detector class instance is initialized. Check error messages."<DETECTOR == 3 && settings1->READGEOM == 1){ cerr << "ERROR::InstalledStation geometry not available without AraRoot installation!" << endl; @@ -368,7 +368,7 @@ int main(int argc, char **argv) { // read setup.txt file // test autoflush // AraTree2->SetAutoFlush(0); - // reset accumulative trig search bin info + // reset accumulative trig search bin info settings1->ACCUM_TRIG_SEARCH_BINS_STATION0 = 0.; int nuLimit =0; @@ -381,13 +381,13 @@ int main(int argc, char **argv) { // read setup.txt file else { nuLimit = settings1->NNU; } - // cout << "nuLimit: " << nuLimit << endl; + // cout << "nuLimit: " << nuLimit << endl; int inu = 0; int Events_Thrown = 0; int Events_Passed = 0; // for (int inu=0;inuNNU;inu++) { // loop over neutrinos while (inu < nuLimit){ - // cout << "inu: " << inu << endl; + // cout << "inu: " << inu << endl; check_station_DC = 0; check_station_DC = 0; if ( settings1->DEBUG_MODE_ON==0 ) { @@ -399,9 +399,9 @@ int main(int argc, char **argv) { // read setup.txt file // event = new Event ( settings1, spectra, primary1, icemodel, detector, signal, sec1 ); event = new Event ( settings1, spectra, primary1, icemodel, detector, signal, sec1, Events_Thrown ); event->inu_passed = -1; - + report = new Report(detector, settings1); - + #ifdef ARA_UTIL_EXISTS theIcrrEvent = new UsefulIcrrStationEvent(); theAtriEvent = new UsefulAtriStationEvent(); @@ -429,7 +429,7 @@ int main(int argc, char **argv) { // read setup.txt file // cout<<"nu_flavor : "<nuflavor<Nu_Interaction[0].vmmhz1m[0] : "<Nu_Interaction[0].vmmhz1m[0]<Nu_Interaction[0].pickposnu<Nu_Interaction[0].weight; } - // cout << "weight: " << weight <ClearUselessfromConnect(detector, settings1, trigger); for(int i=0;iNu_Interaction.size(); i++) event->Nu_Interaction[i].clear_useless(settings1); @@ -496,24 +496,24 @@ int main(int argc, char **argv) { // read setup.txt file { theIcrrEvent->numRFChans = 14; } else if (settings1->DETECTOR == 4 && settings1->DETECTOR_STATION == 0) { theIcrrEvent->numRFChans = 14; } - else { - theAtriEvent->fNumChannels = 20; - theIcrrEvent->numRFChans = 16; + else { + theAtriEvent->fNumChannels = 20; + theIcrrEvent->numRFChans = 16; } } #endif - + if (max_dt < report->stations[i].max_arrival_time - report->stations[i].min_arrival_time) max_dt = report->stations[i].max_arrival_time - report->stations[i].min_arrival_time; // check the total global trigger passed if (report->stations[i].Global_Pass) { cout<<"\nGlobal_Pass : "<stations[i].Global_Pass<<" evt : "<Nu_Interaction[0].weight<Nu_Interaction[0].weight; Total_Probability += event->Nu_Interaction[0].probability; - + // test increment weight if (settings1->INTERACTION_MODE==1) { count1->incrementEventsFound( event->Nu_Interaction[0].weight, event ); @@ -526,10 +526,10 @@ int main(int argc, char **argv) { // read setup.txt file } else if (settings1->INTERACTION_MODE==4) { count1->incrementEventsFound( event->Nu_Interaction[0].weight, event ); - } + } } check_station_DC++; - event->inu_passed = Events_Passed; + event->inu_passed = Events_Passed; } } @@ -563,7 +563,7 @@ int main(int argc, char **argv) { // read setup.txt file // test FILL_TREE_MODE - if (settings1->FILL_TREE_MODE==0) { // fill event event + if (settings1->FILL_TREE_MODE==0) { // fill event event AraTree2->Fill(); //fill interaction every events #ifdef ARA_UTIL_EXISTS // for 1, save all events whether passed trigger or not @@ -580,7 +580,7 @@ int main(int argc, char **argv) { // read setup.txt file } #endif } - else if (settings1->FILL_TREE_MODE==1) { // fill only usable posnu event + else if (settings1->FILL_TREE_MODE==1) { // fill only usable posnu event if (event->Nu_Interaction[0].pickposnu>0) { AraTree2->Fill(); //fill interaction every events #ifdef ARA_UTIL_EXISTS @@ -599,7 +599,7 @@ int main(int argc, char **argv) { // read setup.txt file #endif } } - else if (settings1->FILL_TREE_MODE==2) { // fill only triggered event + else if (settings1->FILL_TREE_MODE==2) { // fill only triggered event if (check_station_DC>0) { AraTree2->Fill(); //fill interaction every events #ifdef ARA_UTIL_EXISTS @@ -633,7 +633,7 @@ int main(int argc, char **argv) { // read setup.txt file Events_Passed++; } Events_Thrown++; - + //theEvent = NULL; @@ -666,10 +666,10 @@ int main(int argc, char **argv) { // read setup.txt file // }// end trigger window loop TrigWind.close(); - + //-------------------------------------------------- // cFull_window_V->Print("test_V_mimic.pdf"); - //-------------------------------------------------- + //-------------------------------------------------- ofstream weight_file; //weight_file.open(("./weight_output/weight_"+setupfile).c_str()); @@ -690,7 +690,7 @@ int main(int argc, char **argv) { // read setup.txt file cout<<"Total_Global_Pass : "<INTERACTION_MODE==1) { weight_file << "Total_Weight="<eventsfound_binned, error_plus, error_minus ); - /* + /* Veff_test = IceVolume * 4. * PI * signal->RHOICE / signal->RHOH20 * Total_Weight / (double)(settings1->NNU); // account all factors to error @@ -776,7 +776,7 @@ int main(int argc, char **argv) { // read setup.txt file //-------------------------------------------------- // cout<<"Total NNU : "<NNU<<", PickUnbiased passed NNU : "<Write(); // AraFile->Close(); - efficiencies->summarize(); // summarize the results in an output file + efficiencies->summarize(); // summarize the results in an output file double freq[detector->GetFreqBin()], Filter[detector->GetFreqBin()]; double Filter_E[detector->GetFreqBin()]; @@ -822,12 +822,12 @@ int main(int argc, char **argv) { // read setup.txt file cout<<"outputdir= "<SYSTEMATICS_IceAtten; - int SYSTEMAT_IceAtten = 0; + // int SYSTEMAT_IceAtten = 0; ARA_IceAtten_bin = 53; - if(SYSTEMAT_IceAtten == 0){ + if(SYSTEMATICS_IceAttenuation == 0){ double ARA_IceAtten_Depth_tmp0[53] = { 72.7412, 76.5697, 80.3982, 91.8836, 95.7121, 107.198, 118.683, 133.997, 153.139, 179.939, 206.738, 245.023, 298.622, 356.049, 405.819, 470.904, 516.845, 566.616, 616.386, 669.985, 727.412, 784.839, 838.438, 899.694, 949.464, 1003.06, 1060.49, 1121.75, 1179.17, 1236.6, 1297.86, 1347.63, 1405.05, 1466.31, 1516.08, 1565.85, 1611.79, 1657.73, 1699.85, 1745.79, 1791.73, 1833.84, 1883.61, 1929.56, 1990.81, 2052.07, 2109.49, 2170.75, 2232.01, 2304.75, 2362.17, 2431.09, 2496.17 }; double ARA_IceAtten_Length_tmp0[53] = { 1994.67, 1952, 1896, 1842.67, 1797.33, 1733.33, 1680, 1632, 1586.67, 1552, 1522.67, 1501.33, 1474.67, 1458.67, 1437.33, 1416, 1392, 1365.33, 1344, 1312, 1274.67, 1242.67, 1205.33, 1168, 1128, 1090.67, 1048, 1008, 965.333, 920, 874.667, 834.667, 797.333, 752, 714.667, 677.333, 648, 616, 589.333, 557.333, 530.667, 506.667, 477.333, 453.333, 418.667, 389.333, 362.667, 333.333, 309.333, 285.333, 264, 242.667, 221.333 }; @@ -236,14 +236,14 @@ if ( file.is_open() ) { ARA_IceAtten_Depth[bin] = ARA_IceAtten_Depth_tmp0[bin]; ARA_IceAtten_Length[bin] = ARA_IceAtten_Length_tmp0[bin]; printf("bin:%i, ARA_IceAtten_Depth:%f, ARA_IceAtten_Length_tmp:%f \n", bin,ARA_IceAtten_Depth_tmp0[bin],ARA_IceAtten_Length_tmp0[bin]); - cout << SYSTEMAT_IceAtten << endl; + cout << SYSTEMATICS_IceAttenuation << endl; } } //Lower bound (in the plot sense) //if lower bound, then - if(SYSTEMAT_IceAtten == 1){ + if(SYSTEMATICS_IceAttenuation == 1){ double ARA_IceAtten_Depth_tmp1[53] = { 171. , 189. , 258.44, 358.67, 455.76, 572.28, 635.86, 687.97, 746.55, 795.13, 839.62, 871.98, 898.61, 914.15, @@ -269,13 +269,13 @@ if ( file.is_open() ) { ARA_IceAtten_Depth[bin] = ARA_IceAtten_Depth_tmp1[bin]; ARA_IceAtten_Length[bin] = ARA_IceAtten_Length_tmp1[bin]; printf("bin:%i, ARA_IceAtten_Depth:%f, ARA_IceAtten_Length_tmp:%f \n", bin,ARA_IceAtten_Depth_tmp1[bin],ARA_IceAtten_Length_tmp1[bin]); - cout << SYSTEMAT_IceAtten << endl; + cout << SYSTEMATICS_IceAttenuation << endl; } } //Upper bound //if upper bound, then - if(SYSTEMAT_IceAtten == 2){ + if(SYSTEMATICS_IceAttenuation == 2){ double ARA_IceAtten_Depth_tmp2[53] = { 79.9 , 81.78, 85.3 , 87.97, 91.87, 97.73, 101.95, 109.4 , 123. , 132.93, 141.24, 146.53, 153.01, 156.89, @@ -301,7 +301,7 @@ if ( file.is_open() ) { ARA_IceAtten_Depth[bin] = ARA_IceAtten_Depth_tmp2[bin]; ARA_IceAtten_Length[bin] = ARA_IceAtten_Length_tmp2[bin]; printf("bin:%i, ARA_IceAtten_Depth:%f, ARA_IceAtten_Length_tmp:%f \n", bin,ARA_IceAtten_Depth_tmp2[bin],ARA_IceAtten_Length_tmp2[bin]); - cout << SYSTEMAT_IceAtten << endl; + cout << SYSTEMATICS_IceAttenuation << endl; } } } diff --git a/IceModel.h b/IceModel.h index 7884cd88..e4adb14b 100644 --- a/IceModel.h +++ b/IceModel.h @@ -119,10 +119,10 @@ void ENtoLonLat(int e_coord, // const static int NBNPOSITIONS_MAX=26000; //double volume_inhorizon[NBNPOSITIONS_MAX]; // volume of ice within horizon for each balloon phi position // IceModel(); //default constructor - IceModel(int model=0,int earth_model=0,int mooreBay=0); + IceModel(int model=0,int earth_model=0,int mooreBay=0, int SYSTEMATICS_IceAtten = 0); ~IceModel(); - void setUpIceModel(int model=0); + void setUpIceModel(int model=0, int SYSTEMATICS_IceAtten=0); double IceThickness(double lon,double lat) const; double IceThickness(const Position& pos) const; double Surface(double lon,double lat) const; From 6942595dfe2850dc13550b84585de7a5390f1896 Mon Sep 17 00:00:00 2001 From: Jorge Torres Date: Tue, 28 Jan 2020 22:40:17 -0500 Subject: [PATCH 36/53] Reduce verbosity --- IceModel.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/IceModel.cc b/IceModel.cc index 82a2fa28..30b5dbfb 100644 --- a/IceModel.cc +++ b/IceModel.cc @@ -236,7 +236,7 @@ if ( file.is_open() ) { ARA_IceAtten_Depth[bin] = ARA_IceAtten_Depth_tmp0[bin]; ARA_IceAtten_Length[bin] = ARA_IceAtten_Length_tmp0[bin]; printf("bin:%i, ARA_IceAtten_Depth:%f, ARA_IceAtten_Length_tmp:%f \n", bin,ARA_IceAtten_Depth_tmp0[bin],ARA_IceAtten_Length_tmp0[bin]); - cout << SYSTEMATICS_IceAttenuation << endl; + // cout << SYSTEMATICS_IceAttenuation << endl; } } @@ -268,8 +268,8 @@ if ( file.is_open() ) { for (int bin=0; bin Date: Wed, 29 Jan 2020 12:45:30 -0500 Subject: [PATCH 37/53] fix some tabbing, and more elegantly copy attenuation length and depth data --- IceModel.cc | 548 ++++++++++++++++++++++++++-------------------------- 1 file changed, 278 insertions(+), 270 deletions(-) diff --git a/IceModel.cc b/IceModel.cc index 30b5dbfb..1ee4b4ef 100644 --- a/IceModel.cc +++ b/IceModel.cc @@ -228,55 +228,62 @@ if ( file.is_open() ) { // int SYSTEMAT_IceAtten = 0; ARA_IceAtten_bin = 53; if(SYSTEMATICS_IceAttenuation == 0){ - double ARA_IceAtten_Depth_tmp0[53] = { 72.7412, 76.5697, 80.3982, 91.8836, 95.7121, 107.198, 118.683, 133.997, 153.139, 179.939, 206.738, 245.023, 298.622, 356.049, 405.819, 470.904, 516.845, 566.616, 616.386, 669.985, 727.412, 784.839, 838.438, 899.694, 949.464, 1003.06, 1060.49, 1121.75, 1179.17, 1236.6, 1297.86, 1347.63, 1405.05, 1466.31, 1516.08, 1565.85, 1611.79, 1657.73, 1699.85, 1745.79, 1791.73, 1833.84, 1883.61, 1929.56, 1990.81, 2052.07, 2109.49, 2170.75, 2232.01, 2304.75, 2362.17, 2431.09, 2496.17 }; - - double ARA_IceAtten_Length_tmp0[53] = { 1994.67, 1952, 1896, 1842.67, 1797.33, 1733.33, 1680, 1632, 1586.67, 1552, 1522.67, 1501.33, 1474.67, 1458.67, 1437.33, 1416, 1392, 1365.33, 1344, 1312, 1274.67, 1242.67, 1205.33, 1168, 1128, 1090.67, 1048, 1008, 965.333, 920, 874.667, 834.667, 797.333, 752, 714.667, 677.333, 648, 616, 589.333, 557.333, 530.667, 506.667, 477.333, 453.333, 418.667, 389.333, 362.667, 333.333, 309.333, 285.333, 264, 242.667, 221.333 }; - - for (int bin=0; binSurface(thisnuexitice)) { // if the exit point is above the surface -// if ((thisnuexitice.Mag()-Surface(thisnuexitice))/cos(interaction1->nnu.Theta())>5.E3) { -// WhereDoesItExitIce(inu,thisnuexitearth,interaction1->nnu,5.E3, // then back up and find it more precisely -// thisr_exitice); -// thisnuexitice=(5000.)*interaction1->nnu; -// thisnuexitice+=thisr_exitice; -// count1++; -// } -// if ((thisnuexitice.Mag()-Surface(thisnuexitice))/cos(interaction1->nnu.Theta())>5.E2) { -// -// WhereDoesItExitIce(inu,thisnuexitice,interaction1->nnu,5.E2, // then back up and find it more precisely -// thisr_exitice); -// thisnuexitice=5.E2*interaction1->nnu; -// thisnuexitice+=thisr_exitice; -// count1++; -// } -// if ((thisnuexitice.Mag()-Surface(thisnuexitice))/cos(interaction1->nnu.Theta())>50.) { -// -// WhereDoesItExitIce(inu,thisnuexitice,interaction1->nnu,50., // then back up and find it more precisely -// thisr_exitice); -// count1++; -// } // end third wheredoesitexit -// thisnuexitice=thisr_exitice; -// } // if the exit point overshoots -// else -// thisnuexitice=thisnuexitearth; -// -// // should also correct for undershooting +// //cout << "inu is " << inu << " it's in ice.\n"; +// //cout << "this is an ice bin.\n"; +// thisnuexitice=thisnuexitearth; +// thisr_exitice=thisnuexitearth; +// if (thisnuexitice.Mag()>Surface(thisnuexitice)) { // if the exit point is above the surface +// if ((thisnuexitice.Mag()-Surface(thisnuexitice))/cos(interaction1->nnu.Theta())>5.E3) { +// WhereDoesItExitIce(inu,thisnuexitearth,interaction1->nnu,5.E3, // then back up and find it more precisely +// thisr_exitice); +// thisnuexitice=(5000.)*interaction1->nnu; +// thisnuexitice+=thisr_exitice; +// count1++; +// } +// if ((thisnuexitice.Mag()-Surface(thisnuexitice))/cos(interaction1->nnu.Theta())>5.E2) { +// +// WhereDoesItExitIce(inu,thisnuexitice,interaction1->nnu,5.E2, // then back up and find it more precisely +// thisr_exitice); +// thisnuexitice=5.E2*interaction1->nnu; +// thisnuexitice+=thisr_exitice; +// count1++; +// } +// if ((thisnuexitice.Mag()-Surface(thisnuexitice))/cos(interaction1->nnu.Theta())>50.) { +// +// WhereDoesItExitIce(inu,thisnuexitice,interaction1->nnu,50., // then back up and find it more precisely +// thisr_exitice); +// count1++; +// } // end third wheredoesitexit +// thisnuexitice=thisr_exitice; +// } // if the exit point overshoots +// else +// thisnuexitice=thisnuexitearth; +// +// // should also correct for undershooting // if (count1>10) // cout << "count1 is " << count1 << "\n"; // } // if it's an Antarctic ice bin // else { // it leaves a rock bin so back up and find where it leaves ice -// //cout << "inu is " << inu << " it's in rock.\n"; -// if (thisr_in.Distance(thisnuexitearth)>5.E4) { -// count2++; -// if (WhereDoesItExitIce(inu,thisnuexitearth,interaction1->nnu,5.E4, // then back up and find it more precisely -// thisr_exitice)) { -// -// thisnuexitice=(5.E4)*interaction1->nnu; -// thisnuexitice+=thisr_exitice; -// //cout << "inu is " << inu << " I'm here 1.\n"; -// -// } -// else { -// interaction1->neverseesice=1; +// //cout << "inu is " << inu << " it's in rock.\n"; +// if (thisr_in.Distance(thisnuexitearth)>5.E4) { +// count2++; +// if (WhereDoesItExitIce(inu,thisnuexitearth,interaction1->nnu,5.E4, // then back up and find it more precisely +// thisr_exitice)) { +// +// thisnuexitice=(5.E4)*interaction1->nnu; +// thisnuexitice+=thisr_exitice; +// //cout << "inu is " << inu << " I'm here 1.\n"; +// +// } +// else { +// interaction1->neverseesice=1; // interaction1->pickunbiased = 0; -// return 0; -// } -// } -// else -// thisnuexitice=thisnuexitearth; -// // WhereDoesItExitIce(inu,thisnuexit,interaction1->nnu,5.E4, // then back up and find it more precisely -// // thisr_exitice); -// // thisnuexit=5.E4*interaction1->nnu; -// // thisnuexit+=thisr_exitice; -// if (thisr_in.Distance(thisnuexitice)>5.E3) { -// -// -// if (WhereDoesItExitIce(inu,thisnuexitice,interaction1->nnu,5.E3, // then back up and find it more precisely -// thisr_exitice)) { -// count2++; -// //interaction1->neverseesice=1; -// thisnuexitice=5.E3*interaction1->nnu; -// thisnuexitice+=thisr_exitice; -// //cout << "inu is " << inu << " I'm here 2\n"; -// //return 0; -// -// } -// } -// if (thisr_in.Distance(thisnuexitice)>5.E2) { -// -// -// if (WhereDoesItExitIce(inu,thisnuexitice,interaction1->nnu,5.E2, // then back up and find it more precisely -// thisr_exitice)) { -// count2++; -// //interaction1->neverseesice=1; -// -// thisnuexitice=5.E2*interaction1->nnu; -// thisnuexitice+=thisr_exitice; -// //cout << "inu is " << inu << " I'm here 3\n"; -// //return 0; -// } -// -// } -// if (thisr_in.Distance(thisnuexitice)>50.) { -// -// -// if (WhereDoesItExitIce(inu,thisnuexitice,interaction1->nnu,50., // then back up and find it more precisely -// thisr_exitice)) { -// //interaction1->neverseesice=1; -// count2++; -// //cout << "inu is " << inu << " I'm here 4\n"; -// //return 0; -// } -// } -// thisnuexitice=thisr_exitice; -// if (count2>10) -// cout << "count1 is " << count2 << "\n"; -// // else return 0; // never reaches any ice or is it because our step is too big +// return 0; +// } +// } +// else +// thisnuexitice=thisnuexitearth; +// // WhereDoesItExitIce(inu,thisnuexit,interaction1->nnu,5.E4, // then back up and find it more precisely +// // thisr_exitice); +// // thisnuexit=5.E4*interaction1->nnu; +// // thisnuexit+=thisr_exitice; +// if (thisr_in.Distance(thisnuexitice)>5.E3) { +// +// +// if (WhereDoesItExitIce(inu,thisnuexitice,interaction1->nnu,5.E3, // then back up and find it more precisely +// thisr_exitice)) { +// count2++; +// //interaction1->neverseesice=1; +// thisnuexitice=5.E3*interaction1->nnu; +// thisnuexitice+=thisr_exitice; +// //cout << "inu is " << inu << " I'm here 2\n"; +// //return 0; +// +// } +// } +// if (thisr_in.Distance(thisnuexitice)>5.E2) { +// +// +// if (WhereDoesItExitIce(inu,thisnuexitice,interaction1->nnu,5.E2, // then back up and find it more precisely +// thisr_exitice)) { +// count2++; +// //interaction1->neverseesice=1; +// +// thisnuexitice=5.E2*interaction1->nnu; +// thisnuexitice+=thisr_exitice; +// //cout << "inu is " << inu << " I'm here 3\n"; +// //return 0; +// } +// +// } +// if (thisr_in.Distance(thisnuexitice)>50.) { +// +// +// if (WhereDoesItExitIce(inu,thisnuexitice,interaction1->nnu,50., // then back up and find it more precisely +// thisr_exitice)) { +// //interaction1->neverseesice=1; +// count2++; +// //cout << "inu is " << inu << " I'm here 4\n"; +// //return 0; +// } +// } +// thisnuexitice=thisr_exitice; +// if (count2>10) +// cout << "count1 is " << count2 << "\n"; +// // else return 0; // never reaches any ice or is it because our step is too big // } // if the nu leaves a rock bin // } // end wheredoesitleave // else { @@ -510,29 +518,29 @@ Position IceModel::PickBalloonPosition() const { // } // // end finding where it leaves ice // -// // if (thisnuexit.Mag()nnu,20., // then find it more finely -// // thisr_exitice); -// // thisnuexit=thisr_enterice; -// // // then back up and find it more precisely -// // } +// // if (thisnuexit.Mag()nnu,20., // then find it more finely +// // thisr_exitice); +// // thisnuexit=thisr_enterice; +// // // then back up and find it more precisely +// // } // // if (WhereDoesItEnterIce(thisnuexitearth,interaction1->nnu,5.E3, // first pass with sort of course binning -// thisr_enterice)) { +// thisr_enterice)) { // thisr_enterice_tmp=thisr_enterice+5.E3*interaction1->nnu; // //cout << "inu is " << inu << " thisr_enterice is ";thisr_enterice.Print(); // if (WhereDoesItEnterIce(thisr_enterice_tmp,interaction1->nnu,20., // second pass with finer binning -// thisr_enterice)) { -// //cout << "inu is " << inu << " thisr_enterice is ";thisr_enterice.Print(); -// //cout << "entersice is ";thisr_enterice.Print(); -// //cout << "thisnuexitice is ";thisnuexitice.Print(); -// interaction1->pathlength_inice=thisr_enterice.Distance(thisnuexitice); -// //cout << "distance is " << distance << "\n"; -// //cout << "inu " << inu << " thisr_enterice, thisnuexitice are ";thisr_enterice.Print();thisnuexitice.Print(); -// interaction1->posnu=interaction1->pathlength_inice*gRandom->Rndm()*interaction1->nnu; -// interaction1->posnu=interaction1->posnu+thisr_enterice; -// //cout << "inu" << inu << " thisr_enterice, thisnuexitice are ";thisr_enterice.Print();thisnuexitice.Print(); -// //cout << "inu " << inu << " distance is " << distance << "\n"; +// thisr_enterice)) { +// //cout << "inu is " << inu << " thisr_enterice is ";thisr_enterice.Print(); +// //cout << "entersice is ";thisr_enterice.Print(); +// //cout << "thisnuexitice is ";thisnuexitice.Print(); +// interaction1->pathlength_inice=thisr_enterice.Distance(thisnuexitice); +// //cout << "distance is " << distance << "\n"; +// //cout << "inu " << inu << " thisr_enterice, thisnuexitice are ";thisr_enterice.Print();thisnuexitice.Print(); +// interaction1->posnu=interaction1->pathlength_inice*gRandom->Rndm()*interaction1->nnu; +// interaction1->posnu=interaction1->posnu+thisr_enterice; +// //cout << "inu" << inu << " thisr_enterice, thisnuexitice are ";thisr_enterice.Print();thisnuexitice.Print(); +// //cout << "inu " << inu << " distance is " << distance << "\n"; // } // } // else { @@ -674,8 +682,8 @@ Vector IceModel::GetSurfaceNormal(const Position &r_out) const { } //method GetSurfaceNormal Position IceModel::WhereDoesItEnterIce(const Position &posnu, - const Vector &nnu, - double stepsize) const { + const Vector &nnu, + double stepsize) const { // now get exit point... // see my geometry notes. // parameterize the neutrino trajectory and just see where it @@ -716,20 +724,20 @@ Position IceModel::WhereDoesItEnterIce(const Position &posnu, local_surface = Surface(lon,lat); if (lat>COASTLINE) - left_edge=1; + left_edge=1; rock2=pow((local_surface - IceThickness(lon,lat) - WaterDepth(lon,lat)),2); surface2=pow(local_surface,2); if (ice_model==0) { - if ((int)(lat)==COASTLINE && rock_previous2 < x2 && surface2 > x2) - left_edge=1; + if ((int)(lat)==COASTLINE && rock_previous2 < x2 && surface2 > x2) + left_edge=1; } //if (Crust 2.0) } //if (neutrino has stepped into new lon/lat bin) if ((x_previous2>rock_previous2 && x2surface2) - || left_edge) { + || (x_previous2surface2) + || left_edge) { r_enterice = x; // this gets you out of the loop. @@ -774,16 +782,16 @@ Position IceModel::WhereDoesItEnter(const Position &posnu,const Vector &nnu) con // if interaction occurs below surface, as it should if (delta>-0.001) { - a=p*costheta+sqrt(R*R*costheta*costheta+2*delta*R*sintheta*sintheta); // chord length - if (a<0) { - cout << "Negative chord length: " << a << "\n"; - } //end if + a=p*costheta+sqrt(R*R*costheta*costheta+2*delta*R*sintheta*sintheta); // chord length + if (a<0) { + cout << "Negative chord length: " << a << "\n"; + } //end if } //end if (interaction below surface) else if (delta<=-0.001) { - //cout << "Error in interaction position. whichray is " << whichray << "\n"; - // cout << "lon, lat from WhereDoesItEnter is " << " " << lon << " " << lat << "\n"; - // cout << "geoid, surface, p, surface-p are " << Geoid(lat) << " " << Surface(lon,lat) << ", " << p << " , "<<(Surface(lon,lat)-p)<<"\n"; + //cout << "Error in interaction position. whichray is " << whichray << "\n"; + // cout << "lon, lat from WhereDoesItEnter is " << " " << lon << " " << lat << "\n"; + // cout << "geoid, surface, p, surface-p are " << Geoid(lat) << " " << Surface(lon,lat) << ", " << p << " , "<<(Surface(lon,lat)-p)<<"\n"; } //else if: error: interaction takes place above the surface @@ -842,11 +850,11 @@ int IceModel::WhereDoesItEnter_sphere(const Position &sphere_in, const Vector &n // if sphere_in is inside the earth if (delta>-0.001) { - //a=p*costheta+sqrt(R*R*costheta*costheta+2*delta*R*sintheta*sintheta); // chord length - a=p*costheta + sqrt(R*R-p*p*sintheta*sintheta); // chord length - if (a<0) { - cout << "Negative chord length: " << a << "\n"; - } //end if + //a=p*costheta+sqrt(R*R*costheta*costheta+2*delta*R*sintheta*sintheta); // chord length + a=p*costheta + sqrt(R*R-p*p*sintheta*sintheta); // chord length + if (a<0) { + cout << "Negative chord length: " << a << "\n"; + } //end if // first approx r_in = sphere_in - a*nnu; @@ -920,16 +928,16 @@ Position IceModel::WhereDoesItLeave(const Position &posnu,const Vector &nnu) con // if interaction occurs below surface, as it should if (delta>-0.001) { - a=sqrt(R*R*costheta*costheta+2*delta*R*sintheta*sintheta) - p*costheta; // chord length - if (a<0) { - cout << "Negative chord length: " << a << "\n"; - } //end if + a=sqrt(R*R*costheta*costheta+2*delta*R*sintheta*sintheta) - p*costheta; // chord length + if (a<0) { + cout << "Negative chord length: " << a << "\n"; + } //end if } //end if (interaction below surface) else if (delta<=-0.001) { - //cout << "Error in interaction position. whichray is " << whichray << "\n"; - // cout << "lon, lat from WhereDoesItLeave is " << " " << lon << " " << lat << "\n"; - // cout << "geoid, surface, p, surface-p are " << Geoid(lat) << " " << Surface(lon,lat) << " " << p << " , "<<(Surface(lon,lat)-p)<<"\n"; + //cout << "Error in interaction position. whichray is " << whichray << "\n"; + // cout << "lon, lat from WhereDoesItLeave is " << " " << lon << " " << lat << "\n"; + // cout << "geoid, surface, p, surface-p are " << Geoid(lat) << " " << Surface(lon,lat) << " " << p << " , "<<(Surface(lon,lat)-p)<<"\n"; } //else if: error: interaction takes place above the surface @@ -950,9 +958,9 @@ Position IceModel::WhereDoesItLeave(const Position &posnu,const Vector &nnu) con // Below WhereDoesItEnterIce is from icemodel in icemc. //-------------------------------------------------- // int IceModel::WhereDoesItEnterIce(const Position &posnu, -// const Vector &nnu, -// double stepsize, -// Position &r_enterice) { +// const Vector &nnu, +// double stepsize, +// Position &r_enterice) { // // now get exit point... // // see my geometry notes. // // parameterize the neutrino trajectory and just see where it @@ -1002,14 +1010,14 @@ Position IceModel::WhereDoesItLeave(const Position &posnu,const Vector &nnu) con // surface2=pow(local_surface,2); // // if (ice_model==0) { -// if ((int)(lat)==COASTLINE && rock_previous2 < x2 && surface2 > x2) -// left_edge=1; +// if ((int)(lat)==COASTLINE && rock_previous2 < x2 && surface2 > x2) +// left_edge=1; // } //if (Crust 2.0) // } //if (neutrino has stepped into new lon/lat bin) // // if ((((x_previous2>rock_previous2 && x2surface2)) && ice_thickness>0 && latsurface2)) && ice_thickness>0 && lat x2) -// left_edge=1; +// if ((int)(lat)==COASTLINE && rock_previous2 < x2 && surface2 > x2) +// left_edge=1; // } //if (Crust 2.0) // } //if (neutrino has stepped into new lon/lat bin) // @@ -1114,8 +1122,8 @@ Position IceModel::WhereDoesItLeave(const Position &posnu,const Vector &nnu) con // cout << "inu, x_previous2, rock_previous2, x2, rock2 are " << inu << " " << x_previous2 << " " << rock_previous2 << " " << x2 << " " << rock2 << "\n"; // // if ((((x_previous2rock2) // crosses rock boundary from above -// || (x_previous2>surface_previous2 && x20 && latsurface_previous2 && x20 && latMOOREBAY)//if use Moore's Bay measured data for the west land - attenuation_length*=1.717557; //about 450 m (field attenuation length) for one whole way when assuming -3dB for the power loss at the bottom + attenuation_length*=1.717557; //about 450 m (field attenuation length) for one whole way when assuming -3dB for the power loss at the bottom } else //in east antarctica or constant ice thickness { @@ -1459,14 +1467,14 @@ double IceModel::EffectiveAttenuationLength(Settings *settings1, const Position // } depth_index =int(depth*(2809.9/localmaxdepth)); //if (inu<10) - // cout << "depth_index is " << depth_index << "\n"; + // cout << "depth_index is " << depth_index << "\n"; if(whichray==0) - attenuation_length =l_sheetup[depth_index]; + attenuation_length =l_sheetup[depth_index]; else if(whichray==1) - attenuation_length =l_sheetdown[depth_index]; + attenuation_length =l_sheetdown[depth_index]; else - cerr << " wrong attenuation length " <> tempBuf1 >> temp1 >> tempBuf2 >> temp2 - >> tempBuf3 >> temp3 >> tempBuf4 >> temp4 - >> tempBuf5 >> temp5 >> tempBuf6 >> temp6; + >> tempBuf3 >> temp3 >> tempBuf4 >> temp4 + >> tempBuf5 >> temp5 >> tempBuf6 >> temp6; if(tempBuf1 == string("ncols")) { nCols_ice=temp1; @@ -1633,7 +1641,7 @@ void IceModel::ReadIceThickness() { for(int colNum=0;colNum> theValue; if(theValue==NODATA) - theValue=0; //Set ice depth to 0 where we have no data. + theValue=0; //Set ice depth to 0 where we have no data. ice_thickness_array[colNum][rowNum] = double(theValue); //This stores data as ice_thickness_array[easting][northing] }//for }//for @@ -1661,8 +1669,8 @@ void IceModel::ReadGroundBed() { int temp1,temp2,temp3,temp4,temp5,temp6; GroundBedFile >> tempBuf1 >> temp1 >> tempBuf2 >> temp2 - >> tempBuf3 >> temp3 >> tempBuf4 >> temp4 - >> tempBuf5 >> temp5 >> tempBuf6 >> temp6; + >> tempBuf3 >> temp3 >> tempBuf4 >> temp4 + >> tempBuf5 >> temp5 >> tempBuf6 >> temp6; if(tempBuf1 == string("ncols")) { nCols_ground=temp1; @@ -1692,7 +1700,7 @@ void IceModel::ReadGroundBed() { GroundBedFile >> theValue; if(theValue==NODATA) - theValue=0; //Set elevation to 0 where we have no data. + theValue=0; //Set elevation to 0 where we have no data. ground_elevation[colNum][rowNum] = double(theValue); //if (theValue != -96 && theValue != 0) //cout<<"ground_elevation: "<> tempBuf1 >> temp1 >> tempBuf2 >> temp2 - >> tempBuf3 >> temp3 >> tempBuf4 >> temp4 - >> tempBuf5 >> temp5 >> tempBuf6 >> temp6; + >> tempBuf3 >> temp3 >> tempBuf4 >> temp4 + >> tempBuf5 >> temp5 >> tempBuf6 >> temp6; if(tempBuf1 == string("ncols")) { nCols_water=temp1; @@ -1753,7 +1761,7 @@ void IceModel::ReadWaterDepth() { WaterDepthFile >> theValue; if(theValue==NODATA) - theValue=0; //Set depth to 0 where we have no data. + theValue=0; //Set depth to 0 where we have no data. water_depth[colNum][rowNum] = double(theValue); }//for }//for From 4710305560bcf8cfb3d0af9bf6923f6c88e862c3 Mon Sep 17 00:00:00 2001 From: clark2668 Date: Wed, 29 Jan 2020 12:58:35 -0500 Subject: [PATCH 38/53] add a little explanatory note --- IceModel.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/IceModel.cc b/IceModel.cc index 1ee4b4ef..4225ced7 100644 --- a/IceModel.cc +++ b/IceModel.cc @@ -226,6 +226,8 @@ if ( file.is_open() ) { //More details can be found on Eugene's Thesis: http://radiorm.physics.ohio-state.edu/elog/Write-Ups/170504_105713/Thesis_-_Eugene_Hong.pdf, p. 54 and 132. //SYSTEMAT_IceAtten = settings1->SYSTEMATICS_IceAtten; // int SYSTEMAT_IceAtten = 0; + // NB: the difference in the three models are the *depths* not the *length*s + // NB: that's a somewhat non-traditional way of doing it, but should work ARA_IceAtten_bin = 53; if(SYSTEMATICS_IceAttenuation == 0){ double ARA_IceAtten_Depth_central[53] = From 0a849ce48ab285f3977ff229633f0409143bebfe Mon Sep 17 00:00:00 2001 From: clark2668 Date: Wed, 29 Jan 2020 12:59:31 -0500 Subject: [PATCH 39/53] reduce verbosity on atteunation systematic loading --- IceModel.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/IceModel.cc b/IceModel.cc index 4225ced7..9c8bdc8c 100644 --- a/IceModel.cc +++ b/IceModel.cc @@ -311,7 +311,7 @@ if ( file.is_open() ) { } for (int bin=0; bin Date: Wed, 5 Feb 2020 18:02:38 -0500 Subject: [PATCH 40/53] make icemodel systematics filling c++11 friendly by not relying on array begin and end functions --- IceModel.cc | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/IceModel.cc b/IceModel.cc index 9c8bdc8c..38ff158b 100644 --- a/IceModel.cc +++ b/IceModel.cc @@ -250,8 +250,10 @@ if ( file.is_open() ) { 648, 616, 589.333, 557.333, 530.667, 506.667, 477.333, 453.333, 418.667, 389.333, 362.667, 333.333, 309.333, 285.333, 264, 242.667, 221.333 }; - std::copy(begin(ARA_IceAtten_Depth_central), end(ARA_IceAtten_Depth_central), begin(ARA_IceAtten_Depth)); - std::copy(begin(ARA_IceAtten_Length_central), end(ARA_IceAtten_Length_central), begin(ARA_IceAtten_Length)); + + std::copy(ARA_IceAtten_Depth_central,ARA_IceAtten_Depth_central+ARA_IceAtten_bin,ARA_IceAtten_Depth); + std::copy(ARA_IceAtten_Length_central,ARA_IceAtten_Length_central+ARA_IceAtten_bin,ARA_IceAtten_Length); + } //Lower bound (in the plot sense) @@ -278,8 +280,9 @@ if ( file.is_open() ) { 477.333, 453.333, 418.667, 389.333, 362.667, 333.333, 309.333, 285.333, 264. , 242.667, 221.333 }; - std::copy(begin(ARA_IceAtten_Depth_low), end(ARA_IceAtten_Depth_low), begin(ARA_IceAtten_Depth)); - std::copy(begin(ARA_IceAtten_Length_low), end(ARA_IceAtten_Length_low), begin(ARA_IceAtten_Length)); + std::copy(ARA_IceAtten_Depth_low, ARA_IceAtten_Depth_low+ARA_IceAtten_bin, ARA_IceAtten_Depth); + std::copy(ARA_IceAtten_Length_low, ARA_IceAtten_Length_low+ARA_IceAtten_bin, ARA_IceAtten_Length); + } //Upper bound @@ -306,12 +309,13 @@ if ( file.is_open() ) { 477.333, 453.333, 418.667, 389.333, 362.667, 333.333, 309.333, 285.333, 264. , 242.667, 221.333}; - std::copy(begin(ARA_IceAtten_Depth_high), end(ARA_IceAtten_Depth_high), begin(ARA_IceAtten_Depth)); - std::copy(begin(ARA_IceAtten_Length_high), end(ARA_IceAtten_Length_high), begin(ARA_IceAtten_Length)); + std::copy(ARA_IceAtten_Depth_high, ARA_IceAtten_Depth_high+ARA_IceAtten_bin, ARA_IceAtten_Depth); + std::copy(ARA_IceAtten_Length_high,ARA_IceAtten_Length_high+ARA_IceAtten_bin, ARA_IceAtten_Length); + } for (int bin=0; bin Date: Fri, 7 Feb 2020 14:37:16 -0500 Subject: [PATCH 41/53] reduce the verbosity of frequency, gain, phase, etc data in detector.cc --- Detector.cc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Detector.cc b/Detector.cc index 805f5dee..c00ad821 100644 --- a/Detector.cc +++ b/Detector.cc @@ -2403,7 +2403,7 @@ inline void Detector::ReadVgainTop(string filename, Settings *settings1) { // cout<<"freq["<> sub; yNF_tmp.push_back( atof(sub.c_str()) ); } - cout << "freq: " << yNF_tmp[0]; + // cout << "freq: " << yNF_tmp[0]; all_chNF.push_back( yNF_tmp ); yNF_tmp.clear(); - cout << " ch1: " << all_chNF[N][1] << endl; + // cout << " ch1: " << all_chNF[N][1] << endl; N++; @@ -4491,17 +4491,17 @@ inline void Detector::ReadElectChain(string filename, Settings *settings1) { N++; xfreq_tmp.push_back( atof( line.substr(0, line.find_first_of(",")).c_str() ) ); - cout<<"freq : "< Date: Thu, 5 Mar 2020 10:40:36 -0500 Subject: [PATCH 42/53] Added flux from arXiv:0712.1830 (Cuoco et. al) --- fluxes/Cuoco_CenA.dat | 27 +++++++++++++++++++++++++++ fluxes/Kotera2010_Fe_rich.dat | 2 +- fluxes/README | 4 ++-- 3 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 fluxes/Cuoco_CenA.dat diff --git a/fluxes/Cuoco_CenA.dat b/fluxes/Cuoco_CenA.dat new file mode 100644 index 00000000..629869e7 --- /dev/null +++ b/fluxes/Cuoco_CenA.dat @@ -0,0 +1,27 @@ +26 +12.766 -13.039 +12.971 -12.779 +13.171 -12.523 +13.372 -12.265 +13.544 -12.053 +13.743 -11.802 +13.947 -11.542 +14.142 -11.297 +14.365 -11.016 +14.566 -10.759 +14.770 -10.500 +14.987 -10.230 +15.188 -9.974 +15.392 -9.716 +15.587 -9.469 +15.983 -9.250 +16.489 -9.101 +16.984 -8.953 +17.489 -8.803 +17.984 -8.656 +18.490 -8.506 +18.984 -8.360 +19.490 -8.210 +19.985 -8.062 +20.495 -7.911 +20.974 -7.769 diff --git a/fluxes/Kotera2010_Fe_rich.dat b/fluxes/Kotera2010_Fe_rich.dat index 09e245ce..f6cf7312 100644 --- a/fluxes/Kotera2010_Fe_rich.dat +++ b/fluxes/Kotera2010_Fe_rich.dat @@ -1,5 +1,5 @@ 21 -14.0054 -11.5952 +14.0054 -11.5952 14.1573 -11.4549 14.4069 -11.1848 14.7649 -10.8523 diff --git a/fluxes/README b/fluxes/README index ca9813b3..1c7a25a3 100644 --- a/fluxes/README +++ b/fluxes/README @@ -4,7 +4,7 @@ EXPONENT from 12 ~ 100 dat files are from Fenfang Wu in UC Irvine. Can add more models (EXPONENT >= 100 && EXPONENT < 200 is empty). In the file, first line is the number of data points, -and from the second line, first column : energy in log, second column : flux E^2dN/dE [GeV/(cm^2*str*s)]. +and from the second line, first column : energy (in eV) in log, second column : flux E^2dN/dE [GeV/(cm^2*str*s)]. 32. essfig9.dat-----ESS's paper in Physical Review D, Volume 64, 093010 scaled(using fig4 for the ratio of nu_e/nu_mu) FIG 9 for nu_mu+nu_e @@ -57,5 +57,5 @@ and from the second line, first column : energy in log, second column : flux E^2 224. Kotera2010_max.dat-----Kotera flux max from ARA paper arXiv:1105.2854v1, Fig.27 Kotera et al. '10 max - +225. Cuoco_CenA.dat-------Cuoco et. al. flux from Centarurs A (Cen A). Fig 2, arXiv:0712.1830 From 90cd0c3d1a2d2503a23898583801029f33550bf0 Mon Sep 17 00:00:00 2001 From: Jorge Torres Date: Thu, 5 Mar 2020 11:05:39 -0500 Subject: [PATCH 43/53] Fixed IceModel to switch names between upper and lower bounds --- IceModel.cc | 62 ++++++++++++++++++++++++++--------------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/IceModel.cc b/IceModel.cc index 38ff158b..66911321 100644 --- a/IceModel.cc +++ b/IceModel.cc @@ -230,25 +230,25 @@ if ( file.is_open() ) { // NB: that's a somewhat non-traditional way of doing it, but should work ARA_IceAtten_bin = 53; if(SYSTEMATICS_IceAttenuation == 0){ - double ARA_IceAtten_Depth_central[53] = - { 72.7412, 76.5697, 80.3982, 91.8836, 95.7121, 107.198, - 118.683, 133.997, 153.139, 179.939, 206.738, 245.023, - 298.622, 356.049, 405.819, 470.904, 516.845, 566.616, - 616.386, 669.985, 727.412, 784.839, 838.438, 899.694, - 949.464, 1003.06, 1060.49, 1121.75, 1179.17, 1236.6, - 1297.86, 1347.63, 1405.05, 1466.31, 1516.08, 1565.85, - 1611.79, 1657.73, 1699.85, 1745.79, 1791.73, 1833.84, - 1883.61, 1929.56, 1990.81, 2052.07, 2109.49, 2170.75, + double ARA_IceAtten_Depth_central[53] = + { 72.7412, 76.5697, 80.3982, 91.8836, 95.7121, 107.198, + 118.683, 133.997, 153.139, 179.939, 206.738, 245.023, + 298.622, 356.049, 405.819, 470.904, 516.845, 566.616, + 616.386, 669.985, 727.412, 784.839, 838.438, 899.694, + 949.464, 1003.06, 1060.49, 1121.75, 1179.17, 1236.6, + 1297.86, 1347.63, 1405.05, 1466.31, 1516.08, 1565.85, + 1611.79, 1657.73, 1699.85, 1745.79, 1791.73, 1833.84, + 1883.61, 1929.56, 1990.81, 2052.07, 2109.49, 2170.75, 2232.01, 2304.75, 2362.17, 2431.09, 2496.17 }; - double ARA_IceAtten_Length_central[53] = - { 1994.67, 1952, 1896, 1842.67, 1797.33, 1733.33, - 1680, 1632, 1586.67, 1552, 1522.67, 1501.33, - 1474.67, 1458.67, 1437.33, 1416, 1392, 1365.33, - 1344, 1312, 1274.67, 1242.67, 1205.33, 1168, - 1128, 1090.67, 1048, 1008, 965.333, 920, - 874.667, 834.667, 797.333, 752, 714.667, 677.333, - 648, 616, 589.333, 557.333, 530.667, 506.667, - 477.333, 453.333, 418.667, 389.333, 362.667, + double ARA_IceAtten_Length_central[53] = + { 1994.67, 1952, 1896, 1842.67, 1797.33, 1733.33, + 1680, 1632, 1586.67, 1552, 1522.67, 1501.33, + 1474.67, 1458.67, 1437.33, 1416, 1392, 1365.33, + 1344, 1312, 1274.67, 1242.67, 1205.33, 1168, + 1128, 1090.67, 1048, 1008, 965.333, 920, + 874.667, 834.667, 797.333, 752, 714.667, 677.333, + 648, 616, 589.333, 557.333, 530.667, 506.667, + 477.333, 453.333, 418.667, 389.333, 362.667, 333.333, 309.333, 285.333, 264, 242.667, 221.333 }; std::copy(ARA_IceAtten_Depth_central,ARA_IceAtten_Depth_central+ARA_IceAtten_bin,ARA_IceAtten_Depth); @@ -256,10 +256,10 @@ if ( file.is_open() ) { } - //Lower bound (in the plot sense) - //if lower bound, then + //Upper bound + //if upper bound, then if(SYSTEMATICS_IceAttenuation == 1){ - double ARA_IceAtten_Depth_low[53] = + double ARA_IceAtten_Depth_up[53] = { 171. , 189. , 258.44, 358.67, 455.76, 572.28, 635.86, 687.97, 746.55, 795.13, 839.62, 871.98, 898.61, 914.15, 934.88, 960.2 , 991.4 , 1025.34, 1049.71, 1086.29, 1125.33, @@ -269,7 +269,7 @@ if ( file.is_open() ) { 2061.24, 2105.99, 2170.81, 2242.16, 2299.54, 2358.97, 2405.13, 2450. , 2450. , 2450. , 2450. }; - double ARA_IceAtten_Length_low[53] = + double ARA_IceAtten_Length_up[53] = { 1994.67 , 1952. , 1896. , 1842.67 , 1797.33 , 1733.33 , 1680. , 1632. , 1586.67 , 1552. , 1522.67 , 1501.33 , 1474.67 , 1458.67 , 1437.33 , 1416. , 1392. , 1365.33 , @@ -279,16 +279,16 @@ if ( file.is_open() ) { 648. , 616. , 589.333, 557.333, 530.667, 506.667, 477.333, 453.333, 418.667, 389.333, 362.667, 333.333, 309.333, 285.333, 264. , 242.667, 221.333 }; - - std::copy(ARA_IceAtten_Depth_low, ARA_IceAtten_Depth_low+ARA_IceAtten_bin, ARA_IceAtten_Depth); - std::copy(ARA_IceAtten_Length_low, ARA_IceAtten_Length_low+ARA_IceAtten_bin, ARA_IceAtten_Length); + + std::copy(ARA_IceAtten_Depth_up, ARA_IceAtten_Depth_up+ARA_IceAtten_bin, ARA_IceAtten_Depth); + std::copy(ARA_IceAtten_Length_up, ARA_IceAtten_Length_up+ARA_IceAtten_bin, ARA_IceAtten_Length); } - //Upper bound - //if upper bound, then + //Lower bound + //if lower bound, then if(SYSTEMATICS_IceAttenuation == 2){ - double ARA_IceAtten_Depth_high[53] = + double ARA_IceAtten_Depth_low[53] = { 79.9 , 81.78, 85.3 , 87.97, 91.87, 97.73, 101.95, 109.4 , 123. , 132.93, 141.24, 146.53, 153.01, 156.89, 168.5 , 184.5 , 202.5 , 245.45, 281.28, 362.2 , 471.68, @@ -298,7 +298,7 @@ if ( file.is_open() ) { 1792.54, 1829.06, 1892.58, 1959.24, 2017.25, 2082.31, 2137.69, 2194.45, 2245.24, 2302.73, 2369.08}; - double ARA_IceAtten_Length_high[53] = + double ARA_IceAtten_Length_low[53] = { 1994.67 , 1952. , 1896. , 1842.67 , 1797.33 , 1733.33 , 1680. , 1632. , 1586.67 , 1552. , 1522.67 , 1501.33 , 1474.67 , 1458.67 , 1437.33 , 1416. , 1392. , 1365.33 , @@ -309,8 +309,8 @@ if ( file.is_open() ) { 477.333, 453.333, 418.667, 389.333, 362.667, 333.333, 309.333, 285.333, 264. , 242.667, 221.333}; - std::copy(ARA_IceAtten_Depth_high, ARA_IceAtten_Depth_high+ARA_IceAtten_bin, ARA_IceAtten_Depth); - std::copy(ARA_IceAtten_Length_high,ARA_IceAtten_Length_high+ARA_IceAtten_bin, ARA_IceAtten_Length); + std::copy(ARA_IceAtten_Depth_low, ARA_IceAtten_Depth_low+ARA_IceAtten_bin, ARA_IceAtten_Depth); + std::copy(ARA_IceAtten_Length_low,ARA_IceAtten_Length_low+ARA_IceAtten_bin, ARA_IceAtten_Length); } From cca893345467f6dc7f14dfbc5107913f0b80b675 Mon Sep 17 00:00:00 2001 From: Jorge Torres Date: Thu, 5 Mar 2020 11:18:25 -0500 Subject: [PATCH 44/53] test --- data/effs/test.csv | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 data/effs/test.csv diff --git a/data/effs/test.csv b/data/effs/test.csv new file mode 100644 index 00000000..e69de29b From f14b1e8e9c802639ec7f90bd17a528ccf057991f Mon Sep 17 00:00:00 2001 From: Jorge Torres Date: Thu, 5 Mar 2020 11:18:50 -0500 Subject: [PATCH 45/53] rm test --- data/effs/test.csv | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 data/effs/test.csv diff --git a/data/effs/test.csv b/data/effs/test.csv deleted file mode 100644 index e69de29b..00000000 From 725b848d61b5867b62064197de390eba9c256250 Mon Sep 17 00:00:00 2001 From: Brian Clark Date: Sun, 15 Mar 2020 12:44:54 -0500 Subject: [PATCH 46/53] add cooper-sarkar uncertainties to available cross-section models --- Primaries.cc | 193 ++++++++++++++++++++++++++++-- Primaries.h | 11 +- data/coopersarkar_sigma_nu.csv | 31 +++++ data/coopersarkar_sigma_nubar.csv | 31 +++++ log.txt | 8 +- 5 files changed, 265 insertions(+), 9 deletions(-) create mode 100644 data/coopersarkar_sigma_nu.csv create mode 100644 data/coopersarkar_sigma_nubar.csv diff --git a/Primaries.cc b/Primaries.cc index 9220bb46..22d40577 100644 --- a/Primaries.cc +++ b/Primaries.cc @@ -258,16 +258,177 @@ Primaries::Primaries(){//constructor ymax_low=1.E-3; ymin_high=ymax_low; ymax_high=1.; + + // cooper-sarkar cross-section version + + vector energy; // energy [GeV] + vector nu_cc; // nu cc cross section [pb] + vector nu_cc_ul; // nu cc cross section upper limit [pb] + vector nu_cc_ll; // nu cc cross section lower limit [pb] + vector nu_nc; // nu nc cross section + vector nu_nc_ul; // nu nc cross section upper limit [pb] + vector nu_nc_ll; // nu nc cross section lower limit [pb] + + vector nubar_cc; // nubar cc cross section [pb] + vector nubar_cc_ul; // nubar cc cross section upper limit [pb] + vector nubar_cc_ll; // nubar cc cross section lower limit [pb] + vector nubar_nc; // nubar nc cross section [pb] + vector nubar_nc_ul; // nubar nc cross section upper limit [pb] + vector nubar_nc_ll; // nubar nc cross section lower limit [pb] + + // first, load the neutrino (nu) cross sections + ifstream fin_nu("./data/coopersarkar_sigma_nu.csv"); + string line; + if(fin_nu.is_open()){ + while(fin_nu.good()){ + getline(fin_nu, line); + stringstream s_stream(line); + vector result; + while(s_stream.good()){ + string substr; + getline(s_stream, substr, ','); + result.push_back(atof(substr.c_str())); + } + energy.push_back(result[0]); // energy + nu_cc.push_back(result[1]); // charged current cross-section + nu_nc.push_back(result[5]); // neutral current cross-section + + double cc_ul = (1+result[2]); // 1 + upper uncertainty on cc (result[2]>0) + double cc_ll = (1+result[4]); // 1 + lower uncertainty on cc (result[4]<0) + nu_cc_ul.push_back(result[1]*cc_ul); + nu_cc_ll.push_back(result[1]*cc_ll); + + + double nc_ul = (1+result[6]); // 1 + upper uncertainty on nc (result[6]>0) + double nc_ll = (1+result[8]); // 1 + lower uncertainty on nc (result[8]<0) + nu_nc_ul.push_back(result[5]*nc_ul); + nu_nc_ll.push_back(result[5]*nc_ll); + } + } + fin_nu.close(); + + // for(int i=0; i result; + while(s_stream.good()){ + string substr; + getline(s_stream, substr, ','); + result.push_back(atof(substr.c_str())); + } + nubar_cc.push_back(result[1]); // charged current cross-section + nubar_nc.push_back(result[5]); // neutral current cross-section + + double cc_ul = (1+result[2]); // 1 + upper uncertainty on cc (result[2]>0) + double cc_ll = (1+result[4]); // 1 + lower uncertainty on cc (result[4]<0) + nubar_cc_ul.push_back(result[1]*cc_ul); + nubar_cc_ll.push_back(result[1]*cc_ll); + + double nc_ul = (1+result[6]); // 1 + upper uncertainty on nc (result[6]>0) + double nc_ll = (1+result[8]); // 1 + lower uncertainty on nc (result[8]<0) + nubar_nc_ul.push_back(result[5]*nc_ul); + nubar_nc_ll.push_back(result[5]*nc_ll); + } + } + fin_nubar.close(); + + // for(int i=0; i logenergy; + + vector nu_logcc; + vector nu_logcc_ul; + vector nu_logcc_ll; + vector nu_lognc; + vector nu_lognc_ul; + vector nu_lognc_ll; + + vector nubar_logcc; + vector nubar_logcc_ul; + vector nubar_logcc_ll; + vector nubar_lognc; + vector nubar_lognc_ul; + vector nubar_lognc_ll; + + for(int i=0; iSIGMA_FACTOR*(m_fsigma[nu_nubar][currentint]->Eval(epsilon))/1.E4;//convert cm to meters. multiply by (1m^2/10^4 cm^2). sigma_total = (settings1->SIGMA_FACTOR*(m_fsigma[nu_nubar][0]->Eval(epsilon))/1.E4) + (settings1->SIGMA_FACTOR*(m_fsigma[nu_nubar][1]->Eval(epsilon))/1.E4); - } - - - + } if(m_hsigma->GetEntries()<2000){ - m_hsigma->Fill(epsilon, log10(sigma)); + m_hsigma->Fill(epsilon, log10(sigma)); } }//else current code + else if(settings1->SIGMAPARAM==2){//Cooper-Sarkar et al. + double pnuGeV=pnu/1.E9; + double epsilon=log10(pnuGeV); + if(settings1->SIGMA_SELECT==0){// use mean value + sigma=settings1->SIGMA_FACTOR*(pow(10.,cs_fsigma[nu_nubar][currentint]->Eval(epsilon)))/1.E40; //convert picobarns to m^2 + sigma_total = (settings1->SIGMA_FACTOR*(pow(10.,m_fsigma[nu_nubar][0]->Eval(epsilon)))/1.E40) + (settings1->SIGMA_FACTOR*(pow(10.,m_fsigma[nu_nubar][1]->Eval(epsilon)))/1.E40); + } + else if(settings1->SIGMA_SELECT==1){// use upper bound value + sigma=settings1->SIGMA_FACTOR*(pow(10.,cs_fsigma_upper[nu_nubar][currentint]->Eval(epsilon)))/1.E40; //convert picobarns to m^2 + sigma_total = (settings1->SIGMA_FACTOR*(pow(10.,m_fsigma_upper[nu_nubar][0]->Eval(epsilon)))/1.E40) + (settings1->SIGMA_FACTOR*(pow(10.,m_fsigma_upper[nu_nubar][1]->Eval(epsilon)))/1.E40); + } + else if(settings1->SIGMA_SELECT==1){// use lower bound value + sigma=settings1->SIGMA_FACTOR*(pow(10.,cs_fsigma_lower[nu_nubar][currentint]->Eval(epsilon)))/1.E40; //convert picobarns to m^2 + sigma_total = (settings1->SIGMA_FACTOR*(pow(10.,m_fsigma_lower[nu_nubar][0]->Eval(epsilon)))/1.E40) + (settings1->SIGMA_FACTOR*(pow(10.,m_fsigma_lower[nu_nubar][1]->Eval(epsilon)))/1.E40); + } + else{// if other values are chosen, just use mean value + sigma=settings1->SIGMA_FACTOR*(pow(10.,cs_fsigma[nu_nubar][currentint]->Eval(epsilon)))/1.0E40; //convert picobarns to m^2 + sigma_total = (settings1->SIGMA_FACTOR*(pow(10.,m_fsigma[nu_nubar][0]->Eval(epsilon)))/1.E40) + (settings1->SIGMA_FACTOR*(pow(10.,m_fsigma[nu_nubar][1]->Eval(epsilon)))/1.E40); + } + } }//if + + + // interaction length in kg/m^2 len_int_kgm2=M_NUCL/sigma; // kg/m^2 diff --git a/Primaries.h b/Primaries.h index 8e9a371c..3a4b3870 100644 --- a/Primaries.h +++ b/Primaries.h @@ -19,6 +19,7 @@ #include "Vector.h" #include #include "Position.h" +#include "TSpline.h" //-------------------------------------------------- // class Interaction; @@ -125,10 +126,18 @@ class Primaries { double c3_lower[2][2]; double c4_lower[2][2]; + // cooper sarkar + // first index is nu/nu bar [0][x] = nu, [1][x] = nu-bar + // second index is nc/cc [x][0] = nc, [x][1] = cc + TSpline3* cs_fsigma[2][2]; // spline for cooper-sarkar central sigma values + TSpline3* cs_fsigma_upper[2][2]; // spline for cooper-sarkar upper limit sigma values + TSpline3* cs_fsigma_lower[2][2]; // spline for cooper-sarkar lower limit sigma values - static const int NSIGMAS=2;// number of possible cross section models + + static const int NSIGMAS=3;// number of possible cross section models // 0=Gandhi et al. // 1=Connolly et al. 2011 + // 2=Cooper-Sarkar et. al. 2011 (https://arxiv.org/abs/1106.3723) double mine[NSIGMAS];// minimum energy for cross section parametrizations, in eV double maxe[NSIGMAS]; //max diff --git a/data/coopersarkar_sigma_nu.csv b/data/coopersarkar_sigma_nu.csv new file mode 100644 index 00000000..e62b8352 --- /dev/null +++ b/data/coopersarkar_sigma_nu.csv @@ -0,0 +1,31 @@ +50,0.32,4.1,-2.3,-2.4,0.1,3.8,-1.9,-2 +100,0.65,3.8,-2,-2,0.2,3.5,-1.8,-1.8 +200,1.3,3.5,-1.8,-1.9,0.41,3.2,-1.6,-1.7 +500,3.2,3.2,-1.7,-1.8,1,2.9,-1.5,-1.5 +1000,6.2,3,-1.6,-1.7,2,2.7,-1.4,-1.5 +2000,12,2.7,-1.6,-1.6,3.8,2.4,-1.3,-1.4 +5000,27,2.3,-1.5,-1.5,8.6,2.1,-1.3,-1.3 +10000,47,2,-1.4,-1.4,15,1.8,-1.2,-1.2 +20000,77,1.8,-1.3,-1.4,26,1.6,-1.1,-1.1 +50000,140,1.5,-1.2,-1.2,49,1.3,-1,-1.1 +100000,210,1.4,-1.2,-1.2,75,1.2,-1,-1 +200000,310,1.5,-1.1,-1.1,110,1.2,-0.9,-0.9 +500000,490,1.6,-1,-1,180,1.3,-0.8,-0.8 +1.00E+06,690,1.7,-0.9,-0.9,260,1.4,-0.8,-0.8 +2.00E+06,950,1.9,-0.9,-0.9,360,1.6,-0.8,-0.8 +5.00E+06,1400,2,-0.9,-0.9,540,1.8,-0.8,-0.8 +1.00E+07,1900,2.2,-0.9,-0.9,730,2,-0.8,-0.8 +2.00E+07,2600,2.3,-0.9,-1,980,2.2,-0.8,-0.9 +5.00E+07,3700,2.5,-0.9,-1.2,1400,2.4,-0.9,-1.1 +1.00E+08,4800,2.7,-0.9,-1.5,1900,2.6,-0.9,-1.3 +2.00E+08,6200,2.8,-1,-2,2400,2.7,-1,-1.8 +5.00E+08,8700,3,-1.1,-3,3400,2.9,-1,-2.6 +1.00E+09,11000,3.1,-1.2,-3.9,4400,3,-1.1,-3.4 +2.00E+09,14000,3.3,-1.2,-5,5600,3.2,-1.2,-4.4 +5.00E+09,19000,3.4,-1.4,-6.8,7600,3.4,-1.3,-6.1 +1.00E+10,24000,3.6,-1.5,-8.5,9600,3.5,-1.4,-7.6 +2.00E+10,30000,3.7,-1.6,-10.3,12000,3.6,-1.5,-9.3 +5.00E+10,39000,3.8,-1.7,-13.1,16000,3.8,-1.7,-11.8 +1.00E+11,48000,4,-1.8,-15.2,20000,3.9,-1.8,-13.9 +2.00E+11,59000,4.1,-1.9,-17.5,24000,4,-1.9,-16.1 +5.e11,75000,4.2,-2.0,-20.3,31000,4.2,-2.0,-18.8 \ No newline at end of file diff --git a/data/coopersarkar_sigma_nubar.csv b/data/coopersarkar_sigma_nubar.csv new file mode 100644 index 00000000..80d53177 --- /dev/null +++ b/data/coopersarkar_sigma_nubar.csv @@ -0,0 +1,31 @@ +50,0.15,15,-9,-9,0.05,12,-6.4,-6.4 +100,0.33,13.3,-7.4,-7.4,0.12,10.7,-5.7,-5.7 +200,0.69,11.9,-6.5,-6.5,0.24,9.6,-5.1,-5.1 +500,1.8,10.5,-5.7,-5.7,0.61,8.6,-4.6,-4.6 +1000,3.6,9.4,-5.2,-5.2,1.2,7.8,-4.2,-4.2 +2000,7,8.3,-4.6,-4.6,2.4,7,-3.8,-3.8 +5000,17,6.5,-3.7,-3.7,5.8,5.7,-3.2,-3.2 +10000,31,5.1,-3,-3,11,4.6,-2.7,-2.7 +20000,55,3.8,-2.3,-2.3,19,3.6,-2.1,-2.1 +50000,110,2.5,-1.7,-1.7,39,2.4,-1.5,-1.5 +100000,180,1.9,-1.4,-1.4,64,1.7,-1.2,-1.2 +200000,270,1.7,-1.2,-1.2,99,1.4,-1,-1 +500000,460,1.7,-1.1,-1.1,170,1.4,-0.9,-0.9 +1.00E+06,660,1.8,-1,-1,240,1.5,-0.8,-0.8 +2.00E+06,920,1.9,-1,-1,350,1.6,-0.8,-0.8 +5.00E+06,1400,2.1,-0.9,-0.9,530,1.9,-0.8,-0.8 +1.00E+07,1900,2.2,-0.9,-0.9,730,2,-0.8,-0.8 +2.00E+07,2500,2.3,-0.9,-1,980,2.2,-0.8,-0.9 +5.00E+07,3700,2.5,-0.9,-1.2,1400,2.4,-0.9,-1.1 +1.00E+08,4800,2.7,-1,-1.5,1900,2.6,-0.9,-1.3 +2.00E+08,6200,2.8,-1,-2,2400,2.7,-1,-1.8 +5.00E+08,8700,3,-1.1,-3,3400,2.9,-1,-2.6 +1.00E+09,11000,3.1,-1.2,-3.9,4400,3,-1.1,-3.4 +2.00E+09,14000,3.3,-1.2,-5,5600,3.2,-1.2,-4.4 +5.00E+09,19000,3.4,-1.4,-6.8,7600,3.4,-1.3,-6.1 +1.00E+10,24000,3.6,-1.5,-8.5,9600,3.5,-1.4,-7.6 +2.00E+10,30000,3.7,-1.6,-10.3,12000,3.6,-1.5,-9.3 +5.00E+10,39000,3.8,-1.7,-13.1,16000,3.8,-1.7,-11.8 +1.00E+11,48000,4,-1.8,-15.2,20000,3.9,-1.8,-13.9 +2.00E+11,59000,4.1,-1.9,-17.5,24000,4,-1.9,-16.1 +5.e11,75000,4.2-20.3,-2.0,31000,4.2,-2.0,-18.8 \ No newline at end of file diff --git a/log.txt b/log.txt index 37ea62bb..ad215608 100644 --- a/log.txt +++ b/log.txt @@ -1564,4 +1564,10 @@ Initialize Settings::DETECTOR_STATION to be 2, and Settings::DETECTOR_STATION_LI Add SYSTEMATICS_nofz to wiggle RAY_TRACE_ICE_MODEL_PARAMS within uncertainties. =0=default fit values =1=make larger by uncertainties -=2=make smaller by uncertainties \ No newline at end of file +=2=make smaller by uncertainties + +============================================================================ + + +2020/03/15 Brian Clark +Add Cooper-Sarkar cross-section model. Activated by using SIGMAPARAM=2 \ No newline at end of file From 0e0cd5c466f8d6a5bd4a97104f95ea1f8b37b533 Mon Sep 17 00:00:00 2001 From: Brian Clark Date: Sun, 15 Mar 2020 13:50:26 -0500 Subject: [PATCH 47/53] add ability to use cooper-sarkar uncertainties on the connolly cross section for systematic study --- Primaries.cc | 79 ++++++++++++++++++++++++++++++++++++++++++---------- Primaries.h | 3 +- log.txt | 11 +++++++- 3 files changed, 77 insertions(+), 16 deletions(-) diff --git a/Primaries.cc b/Primaries.cc index 22d40577..2afc0b37 100644 --- a/Primaries.cc +++ b/Primaries.cc @@ -265,16 +265,24 @@ Primaries::Primaries(){//constructor vector nu_cc; // nu cc cross section [pb] vector nu_cc_ul; // nu cc cross section upper limit [pb] vector nu_cc_ll; // nu cc cross section lower limit [pb] + vector nu_cc_uu; // nu cc cross section upper uncertainties [%] + vector nu_cc_lu; // nu cc cross section lower uncertainties [%] vector nu_nc; // nu nc cross section vector nu_nc_ul; // nu nc cross section upper limit [pb] vector nu_nc_ll; // nu nc cross section lower limit [pb] + vector nu_nc_uu; // nu cc cross section upper uncertainties [%] + vector nu_nc_lu; // nu cc cross section lower uncertainties [%] vector nubar_cc; // nubar cc cross section [pb] vector nubar_cc_ul; // nubar cc cross section upper limit [pb] vector nubar_cc_ll; // nubar cc cross section lower limit [pb] + vector nubar_cc_uu; // nu cc cross section upper uncertainties [%] + vector nubar_cc_lu; // nu cc cross section lower uncertainties [%] vector nubar_nc; // nubar nc cross section [pb] vector nubar_nc_ul; // nubar nc cross section upper limit [pb] vector nubar_nc_ll; // nubar nc cross section lower limit [pb] + vector nubar_nc_uu; // nu cc cross section upper uncertainties [%] + vector nubar_nc_lu; // nu cc cross section lower uncertainties [%] // first, load the neutrino (nu) cross sections ifstream fin_nu("./data/coopersarkar_sigma_nu.csv"); @@ -290,17 +298,26 @@ Primaries::Primaries(){//constructor result.push_back(atof(substr.c_str())); } energy.push_back(result[0]); // energy + nu_cc.push_back(result[1]); // charged current cross-section - nu_nc.push_back(result[5]); // neutral current cross-section - - double cc_ul = (1+result[2]); // 1 + upper uncertainty on cc (result[2]>0) - double cc_ll = (1+result[4]); // 1 + lower uncertainty on cc (result[4]<0) + double cc_ul = (result[2]); + double cc_ll = (result[4]); + nu_cc_uu.push_back(cc_ul); + nu_cc_lu.push_back(cc_ll); + cc_ul+=1.; // 1 + upper uncertainty on cc (result[2]>0) + cc_ll+=1.; // 1 + lower uncertainty on cc (result[4]<0) nu_cc_ul.push_back(result[1]*cc_ul); nu_cc_ll.push_back(result[1]*cc_ll); - - double nc_ul = (1+result[6]); // 1 + upper uncertainty on nc (result[6]>0) - double nc_ll = (1+result[8]); // 1 + lower uncertainty on nc (result[8]<0) + + nu_nc.push_back(result[5]); // neutral current cross-section + double nc_ul = (result[6]); + double nc_ll = (result[8]); + nu_nc_uu.push_back(nc_ul); + nu_nc_lu.push_back(nc_ll); + cout<0) + nc_ll+=1.; // 1 + lower uncertainty on nc (result[8]<0) nu_nc_ul.push_back(result[5]*nc_ul); nu_nc_ll.push_back(result[5]*nc_ll); } @@ -325,15 +342,22 @@ Primaries::Primaries(){//constructor result.push_back(atof(substr.c_str())); } nubar_cc.push_back(result[1]); // charged current cross-section - nubar_nc.push_back(result[5]); // neutral current cross-section - - double cc_ul = (1+result[2]); // 1 + upper uncertainty on cc (result[2]>0) - double cc_ll = (1+result[4]); // 1 + lower uncertainty on cc (result[4]<0) + double cc_ul = (result[2]); + double cc_ll = (result[4]); + nubar_cc_uu.push_back(cc_ul); + nubar_cc_lu.push_back(cc_ll); + cc_ul+=1.; // 1 + upper uncertainty on cc (result[2]>0) + cc_ll+=1.; // 1 + lower uncertainty on cc (result[4]<0) nubar_cc_ul.push_back(result[1]*cc_ul); nubar_cc_ll.push_back(result[1]*cc_ll); - double nc_ul = (1+result[6]); // 1 + upper uncertainty on nc (result[6]>0) - double nc_ll = (1+result[8]); // 1 + lower uncertainty on nc (result[8]<0) + nubar_nc.push_back(result[5]); // neutral current cross-section + double nc_ul = (result[6]); + double nc_ll = (result[8]); + nubar_nc_uu.push_back(nc_ul); + nubar_nc_lu.push_back(nc_ll); + nc_ul+=1.; // 1 + upper uncertainty on nc (result[6]>0) + nc_ll+=1.; // 1 + lower uncertainty on nc (result[8]<0) nubar_nc_ul.push_back(result[5]*nc_ul); nubar_nc_ll.push_back(result[5]*nc_ll); } @@ -343,7 +367,7 @@ Primaries::Primaries(){//constructor // for(int i=0; i logenergy; @@ -399,21 +423,29 @@ Primaries::Primaries(){//constructor cs_fsigma[0][0] = new TSpline3("nu nc", &logenergy[0], &nu_lognc[0], logenergy.size()); cs_fsigma_upper[0][0] = new TSpline3("nu nc ul", &logenergy[0], &nu_lognc_ul[0], logenergy.size()); cs_fsigma_lower[0][0] = new TSpline3("nu nc ll", &logenergy[0], &nu_lognc_ll[0], logenergy.size()); + cs_fsigma_uncertainty_upper[0][0] = new TSpline3("nu nc uu", &logenergy[0], &nu_nc_uu[0], logenergy.size()); + cs_fsigma_uncertainty_lower[0][0] = new TSpline3("nu nc lu", &logenergy[0], &nu_nc_lu[0], logenergy.size()); // nu cc cs_fsigma[0][1] = new TSpline3("nu cc", &logenergy[0], &nu_logcc[0], logenergy.size()); cs_fsigma_upper[0][1] = new TSpline3("nu cc ul", &logenergy[0], &nu_logcc_ul[0], logenergy.size()); cs_fsigma_lower[0][1] = new TSpline3("nu cc ll", &logenergy[0], &nu_logcc_ll[0], logenergy.size()); + cs_fsigma_uncertainty_upper[0][1] = new TSpline3("nu cc uu", &logenergy[0], &nu_cc_uu[0], logenergy.size()); + cs_fsigma_uncertainty_lower[0][1] = new TSpline3("nu cc lu", &logenergy[0], &nu_cc_lu[0], logenergy.size()); // nubar nc cs_fsigma[1][0] = new TSpline3("nubar nc", &logenergy[0], &nubar_lognc[0], logenergy.size()); cs_fsigma_upper[1][0] = new TSpline3("nubar nc ul", &logenergy[0], &nubar_lognc_ul[0], logenergy.size()); cs_fsigma_lower[1][0] = new TSpline3("nubar nc ll", &logenergy[0], &nubar_lognc_ll[0], logenergy.size()); + cs_fsigma_uncertainty_upper[1][0] = new TSpline3("nubar nc uu", &logenergy[0], &nubar_nc_uu[0], logenergy.size()); + cs_fsigma_uncertainty_lower[1][0] = new TSpline3("nubar nc lu", &logenergy[0], &nubar_nc_lu[0], logenergy.size()); // nubar cc cs_fsigma[1][1] = new TSpline3("nubar cc", &logenergy[0], &nubar_logcc[0], logenergy.size()); cs_fsigma_upper[1][1] = new TSpline3("nubar cc ul", &logenergy[0], &nubar_logcc_ul[0], logenergy.size()); cs_fsigma_lower[1][1] = new TSpline3("nubar cc ll", &logenergy[0], &nubar_logcc_ll[0], logenergy.size()); + cs_fsigma_uncertainty_upper[1][1] = new TSpline3("nubar cc uu", &logenergy[0], &nubar_cc_uu[0], logenergy.size()); + cs_fsigma_uncertainty_lower[1][1] = new TSpline3("nubar cc lu", &logenergy[0], &nubar_cc_lu[0], logenergy.size()); run_old_code=0;//for GetSigma() & Gety() runs of the old code if 1, else runs current code. @@ -557,6 +589,25 @@ int Primaries::GetSigma(double pnu,double& sigma,double &len_int_kgm2,Settings * sigma=settings1->SIGMA_FACTOR*(m_fsigma_lower[nu_nubar][currentint]->Eval(epsilon))/1.E4;//convert cm to meters. multiply by (1m^2/10^4 cm^2). sigma_total = (settings1->SIGMA_FACTOR*(m_fsigma_lower[nu_nubar][0]->Eval(epsilon))/1.E4) + (settings1->SIGMA_FACTOR*(m_fsigma_lower[nu_nubar][1]->Eval(epsilon))/1.E4); } + else if (settings1->SIGMA_SELECT==3){ // use Cooper-Sarkar upper uncertainties + double cs_uncertainty_this = cs_fsigma_uncertainty_upper[nu_nubar][currentint]->Eval(epsilon); + cs_uncertainty_this+=1.; // turn it into a multiplicative factor + double cs_uncertainty_nc = cs_fsigma_uncertainty_upper[nu_nubar][0]->Eval(epsilon); + double cs_uncertainty_cc = cs_fsigma_uncertainty_upper[nu_nubar][1]->Eval(epsilon); + + sigma=settings1->SIGMA_FACTOR*(m_fsigma[nu_nubar][currentint]->Eval(epsilon))/1.E4*cs_uncertainty_this ;//convert cm to meters. multiply by (1m^2/10^4 cm^2). + sigma_total = (settings1->SIGMA_FACTOR*(m_fsigma[nu_nubar][0]->Eval(epsilon))/1.E4*cs_uncertainty_nc) + (settings1->SIGMA_FACTOR*(m_fsigma[nu_nubar][1]->Eval(epsilon))/1.E4*cs_uncertainty_cc); + } + else if(settings1->SIGMA_SELECT==4){ // use Cooper-Sarkar lower uncertainties + double cs_uncertainty_this = cs_fsigma_uncertainty_lower[nu_nubar][currentint]->Eval(epsilon); + cs_uncertainty_this+=1.; // turn it into a multiplicative factor + double cs_uncertainty_nc = cs_fsigma_uncertainty_lower[nu_nubar][0]->Eval(epsilon); + double cs_uncertainty_cc = cs_fsigma_uncertainty_lower[nu_nubar][1]->Eval(epsilon); + + sigma=settings1->SIGMA_FACTOR*(m_fsigma[nu_nubar][currentint]->Eval(epsilon))/1.E4*cs_uncertainty_this ;//convert cm to meters. multiply by (1m^2/10^4 cm^2). + sigma_total = (settings1->SIGMA_FACTOR*(m_fsigma[nu_nubar][0]->Eval(epsilon))/1.E4*cs_uncertainty_nc) + (settings1->SIGMA_FACTOR*(m_fsigma[nu_nubar][1]->Eval(epsilon))/1.E4*cs_uncertainty_cc); + + } else {// if other values are chosen, just use mean value sigma=settings1->SIGMA_FACTOR*(m_fsigma[nu_nubar][currentint]->Eval(epsilon))/1.E4;//convert cm to meters. multiply by (1m^2/10^4 cm^2). diff --git a/Primaries.h b/Primaries.h index 3a4b3870..f952395c 100644 --- a/Primaries.h +++ b/Primaries.h @@ -132,7 +132,8 @@ class Primaries { TSpline3* cs_fsigma[2][2]; // spline for cooper-sarkar central sigma values TSpline3* cs_fsigma_upper[2][2]; // spline for cooper-sarkar upper limit sigma values TSpline3* cs_fsigma_lower[2][2]; // spline for cooper-sarkar lower limit sigma values - + TSpline3* cs_fsigma_uncertainty_upper[2][2]; // the *relative* [%] upper uncertainties + TSpline3* cs_fsigma_uncertainty_lower[2][2]; // the rrelative* [%] lower uncertainties static const int NSIGMAS=3;// number of possible cross section models // 0=Gandhi et al. diff --git a/log.txt b/log.txt index ad215608..5a05ae86 100644 --- a/log.txt +++ b/log.txt @@ -1570,4 +1570,13 @@ Add SYSTEMATICS_nofz to wiggle RAY_TRACE_ICE_MODEL_PARAMS within uncertainties. 2020/03/15 Brian Clark -Add Cooper-Sarkar cross-section model. Activated by using SIGMAPARAM=2 \ No newline at end of file +Add Cooper-Sarkar cross-section model. Activated by using SIGMAPARAM=2. + +Also, add two new SIGMA_SELECT modes (3 and 4) for use with SIGMAPARAM=1. +Modes 3 and 4 allow you to use the upper and lower bounds (respectively) +from Cooper-Sarkar, but apply them to the Connolly cross-section limit. +So, if SIGMAPARAM=1 and SIGMA_SELECT=3, then the cross-section used will +be the Connolly cross section, but reduced by the lower bound uncertainty +as computed by Cooper-Sarkar. This is a "hack" to see what happens to +the Connolly result if you assume the Cooper-Sarkar uncertainties +which are smaller than those derived in Connolly et. al. \ No newline at end of file From 48b883157b0407789479fa4d852d3934b31d95c1 Mon Sep 17 00:00:00 2001 From: Brian Clark Date: Sun, 15 Mar 2020 13:57:44 -0500 Subject: [PATCH 48/53] fix typo in log file --- log.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/log.txt b/log.txt index 5a05ae86..14c1a413 100644 --- a/log.txt +++ b/log.txt @@ -1574,9 +1574,9 @@ Add Cooper-Sarkar cross-section model. Activated by using SIGMAPARAM=2. Also, add two new SIGMA_SELECT modes (3 and 4) for use with SIGMAPARAM=1. Modes 3 and 4 allow you to use the upper and lower bounds (respectively) -from Cooper-Sarkar, but apply them to the Connolly cross-section limit. +from Cooper-Sarkar, but apply them to the Connolly cross-section calculation. So, if SIGMAPARAM=1 and SIGMA_SELECT=3, then the cross-section used will -be the Connolly cross section, but reduced by the lower bound uncertainty +be the Connolly cross section, but increased by the upper bound uncertainty as computed by Cooper-Sarkar. This is a "hack" to see what happens to the Connolly result if you assume the Cooper-Sarkar uncertainties which are smaller than those derived in Connolly et. al. \ No newline at end of file From 8c50f3d49550fd6f91e9546717908eb2c859be26 Mon Sep 17 00:00:00 2001 From: Brian Clark Date: Mon, 16 Mar 2020 10:15:14 -0500 Subject: [PATCH 49/53] fix mistake where Cooper-Sarkar uncertainties applied to CTW cross sections were not fractional --- Primaries.cc | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/Primaries.cc b/Primaries.cc index 2afc0b37..f95cb45c 100644 --- a/Primaries.cc +++ b/Primaries.cc @@ -304,6 +304,8 @@ Primaries::Primaries(){//constructor double cc_ll = (result[4]); nu_cc_uu.push_back(cc_ul); nu_cc_lu.push_back(cc_ll); + cc_ul/=100.; // convert from % to fraction + cc_ll/=100.; // convert from % to fraction cc_ul+=1.; // 1 + upper uncertainty on cc (result[2]>0) cc_ll+=1.; // 1 + lower uncertainty on cc (result[4]<0) nu_cc_ul.push_back(result[1]*cc_ul); @@ -315,7 +317,8 @@ Primaries::Primaries(){//constructor double nc_ll = (result[8]); nu_nc_uu.push_back(nc_ul); nu_nc_lu.push_back(nc_ll); - cout<0) nc_ll+=1.; // 1 + lower uncertainty on nc (result[8]<0) nu_nc_ul.push_back(result[5]*nc_ul); @@ -346,6 +349,8 @@ Primaries::Primaries(){//constructor double cc_ll = (result[4]); nubar_cc_uu.push_back(cc_ul); nubar_cc_lu.push_back(cc_ll); + cc_ul/=100.; // convert from % to fraction + cc_ll/=100.; // convert from % to fraction cc_ul+=1.; // 1 + upper uncertainty on cc (result[2]>0) cc_ll+=1.; // 1 + lower uncertainty on cc (result[4]<0) nubar_cc_ul.push_back(result[1]*cc_ul); @@ -356,6 +361,8 @@ Primaries::Primaries(){//constructor double nc_ll = (result[8]); nubar_nc_uu.push_back(nc_ul); nubar_nc_lu.push_back(nc_ll); + nc_ul/=100.; + nc_ll/=100.; nc_ul+=1.; // 1 + upper uncertainty on nc (result[6]>0) nc_ll+=1.; // 1 + lower uncertainty on nc (result[8]<0) nubar_nc_ul.push_back(result[5]*nc_ul); @@ -591,22 +598,29 @@ int Primaries::GetSigma(double pnu,double& sigma,double &len_int_kgm2,Settings * } else if (settings1->SIGMA_SELECT==3){ // use Cooper-Sarkar upper uncertainties double cs_uncertainty_this = cs_fsigma_uncertainty_upper[nu_nubar][currentint]->Eval(epsilon); - cs_uncertainty_this+=1.; // turn it into a multiplicative factor + cs_uncertainty_this/=100.; // change from % to fraction + cs_uncertainty_this+=1.; // turn it into a multiplicative factor double cs_uncertainty_nc = cs_fsigma_uncertainty_upper[nu_nubar][0]->Eval(epsilon); + cs_uncertainty_nc/=100.; + cs_uncertainty_nc+=1.; double cs_uncertainty_cc = cs_fsigma_uncertainty_upper[nu_nubar][1]->Eval(epsilon); - + cs_uncertainty_cc/=100.; + cs_uncertainty_cc+=1.; sigma=settings1->SIGMA_FACTOR*(m_fsigma[nu_nubar][currentint]->Eval(epsilon))/1.E4*cs_uncertainty_this ;//convert cm to meters. multiply by (1m^2/10^4 cm^2). sigma_total = (settings1->SIGMA_FACTOR*(m_fsigma[nu_nubar][0]->Eval(epsilon))/1.E4*cs_uncertainty_nc) + (settings1->SIGMA_FACTOR*(m_fsigma[nu_nubar][1]->Eval(epsilon))/1.E4*cs_uncertainty_cc); } else if(settings1->SIGMA_SELECT==4){ // use Cooper-Sarkar lower uncertainties double cs_uncertainty_this = cs_fsigma_uncertainty_lower[nu_nubar][currentint]->Eval(epsilon); - cs_uncertainty_this+=1.; // turn it into a multiplicative factor + cs_uncertainty_this/=100.; // change from % to fraction + cs_uncertainty_this+=1.; // turn it into a multiplicative factor double cs_uncertainty_nc = cs_fsigma_uncertainty_lower[nu_nubar][0]->Eval(epsilon); + cs_uncertainty_nc/=100.; + cs_uncertainty_nc+=1.; double cs_uncertainty_cc = cs_fsigma_uncertainty_lower[nu_nubar][1]->Eval(epsilon); - + cs_uncertainty_cc/=100.; + cs_uncertainty_cc+=1.; sigma=settings1->SIGMA_FACTOR*(m_fsigma[nu_nubar][currentint]->Eval(epsilon))/1.E4*cs_uncertainty_this ;//convert cm to meters. multiply by (1m^2/10^4 cm^2). sigma_total = (settings1->SIGMA_FACTOR*(m_fsigma[nu_nubar][0]->Eval(epsilon))/1.E4*cs_uncertainty_nc) + (settings1->SIGMA_FACTOR*(m_fsigma[nu_nubar][1]->Eval(epsilon))/1.E4*cs_uncertainty_cc); - } else {// if other values are chosen, just use mean value @@ -639,8 +653,6 @@ int Primaries::GetSigma(double pnu,double& sigma,double &len_int_kgm2,Settings * } }//if - - // interaction length in kg/m^2 len_int_kgm2=M_NUCL/sigma; // kg/m^2 From d5788f4ac93fbd346534dd56453d6be398731a68 Mon Sep 17 00:00:00 2001 From: Brian Clark Date: Wed, 18 Mar 2020 12:43:27 -0500 Subject: [PATCH 50/53] mainly fix an error in the uncertainties for 1E21 in cooper sarkar nubar model, but also update the number used for energy to formatting match --- data/coopersarkar_sigma_nu.csv | 2 +- data/coopersarkar_sigma_nubar.csv | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data/coopersarkar_sigma_nu.csv b/data/coopersarkar_sigma_nu.csv index e62b8352..450a64b6 100644 --- a/data/coopersarkar_sigma_nu.csv +++ b/data/coopersarkar_sigma_nu.csv @@ -28,4 +28,4 @@ 5.00E+10,39000,3.8,-1.7,-13.1,16000,3.8,-1.7,-11.8 1.00E+11,48000,4,-1.8,-15.2,20000,3.9,-1.8,-13.9 2.00E+11,59000,4.1,-1.9,-17.5,24000,4,-1.9,-16.1 -5.e11,75000,4.2,-2.0,-20.3,31000,4.2,-2.0,-18.8 \ No newline at end of file +5.00E+11,75000,4.2,-2.0,-20.3,31000,4.2,-2.0,-18.8 \ No newline at end of file diff --git a/data/coopersarkar_sigma_nubar.csv b/data/coopersarkar_sigma_nubar.csv index 80d53177..828e17d8 100644 --- a/data/coopersarkar_sigma_nubar.csv +++ b/data/coopersarkar_sigma_nubar.csv @@ -28,4 +28,4 @@ 5.00E+10,39000,3.8,-1.7,-13.1,16000,3.8,-1.7,-11.8 1.00E+11,48000,4,-1.8,-15.2,20000,3.9,-1.8,-13.9 2.00E+11,59000,4.1,-1.9,-17.5,24000,4,-1.9,-16.1 -5.e11,75000,4.2-20.3,-2.0,31000,4.2,-2.0,-18.8 \ No newline at end of file +5.00E+11,75000,4.2,-2.0,-20.3,31000,4.2,-2.0,-18.8 \ No newline at end of file From db84014d6d052f44efe8049362c54429de4ad5b8 Mon Sep 17 00:00:00 2001 From: Jorge Torres Date: Mon, 6 Apr 2020 11:22:51 -0400 Subject: [PATCH 51/53] Adding flux by Cuoco et al --- fluxes/Cuoco_CenA.dat | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/fluxes/Cuoco_CenA.dat b/fluxes/Cuoco_CenA.dat index 629869e7..09847240 100644 --- a/fluxes/Cuoco_CenA.dat +++ b/fluxes/Cuoco_CenA.dat @@ -1,16 +1,4 @@ -26 -12.766 -13.039 -12.971 -12.779 -13.171 -12.523 -13.372 -12.265 -13.544 -12.053 -13.743 -11.802 -13.947 -11.542 -14.142 -11.297 -14.365 -11.016 -14.566 -10.759 -14.770 -10.500 -14.987 -10.230 +14 15.188 -9.974 15.392 -9.716 15.587 -9.469 From d6977120d4f9df02f8f26fb7f184661ab200441c Mon Sep 17 00:00:00 2001 From: Jorge Torres Date: Tue, 9 Jun 2020 13:19:55 -0400 Subject: [PATCH 52/53] Adding Cuoco et al flux --- Spectra.cc | 90 +++++++++++++++++++++++++++++------------------------- 1 file changed, 48 insertions(+), 42 deletions(-) diff --git a/Spectra.cc b/Spectra.cc index 4c75763c..a6c8acf4 100644 --- a/Spectra.cc +++ b/Spectra.cc @@ -33,7 +33,7 @@ Spectra::Spectra(double EXPONENT) { double Emuons[E_bin]; // E dN/dE/dA/dt for neutrinos that are produced as muon neutrinos or muon antineutrinos. double Eelectrons[E_bin];// E dN/dE/dA/dt for neutrinos that are produced as electron neutrinos or muon antineutrinos. - + for (int i=0;i=510. && EXPONENT_model<=650.) // g.n. added so we can have simulations at E^2=17.8 not just whole numbers { pnu_EXPONENT = (EXPONENT_model - 400)/10; cout<<"**************** energy is "<=10. && EXPONENT_model<30.) { return pow(10.,pnu_EXPONENT); } else { - + while(thisflux>max) { - // pick an energy + // pick an energy thisenergy=Rand3.Rndm()*(maxenergy-minenergy)+minenergy; // pick energy at random between the highest and lowest - // the energy array is actually filled with energy exponents + // the energy array is actually filled with energy exponents // and thisenergy starts from 0 so it has an offset - + energybin=Tools::Getifreq(thisenergy,minenergy,maxenergy,E_bin); //max=gspectrum[(int)EXPONENT]->Eval(thisenergy,0,"S")/maxflux; // this is the maximum the normalized flux can be in this bin, always less than 1 max=EdNdEdAdt[energybin]/maxflux; @@ -394,7 +401,7 @@ double Spectra::GetNuEnergy_bin() { } //while return pow(10.,thisenergy); } - + } //Pick Neutrino Energy @@ -402,7 +409,7 @@ double Spectra::GetNuEnergy_bin() { double Spectra::GetNuEnergy() { - + double thisenergy=16.; // arbitrary initialisation double thisflux=2.; // initialise higher than max double max=1.; @@ -411,19 +418,19 @@ double Spectra::GetNuEnergy() { double minenergy=Tools::dMin(energy,E_bin); // this uses the dartboard approach //cout << "minenergy, maxenergy are " << minenergy << " " << maxenergy << "\n"; - + if ((EXPONENT_model>=10. && EXPONENT_model<30.) || (EXPONENT_model>=510. && EXPONENT_model<=650.)) { return pow(10.,pnu_EXPONENT); } else { - + while(thisflux>max) { - // pick an energy + // pick an energy thisenergy=Rand3.Rndm()*(maxenergy-minenergy)+minenergy; // pick energy at random between the highest and lowest - // the energy array is actually filled with energy exponents + // the energy array is actually filled with energy exponents // and thisenergy starts from 0 so it has an offset - + // get interpolated flux at "thisenergy" max=SimpleLinearInterpolation_value(E_bin, energy, EdNdEdAdt, thisenergy ) / maxflux; // normalize to 1 //cout<<"interpolated max : "<>energy[i]>>E2dNdEdAdt[i]; } - + for(int i=0;i EdN @@ -510,19 +517,19 @@ inline void Spectra::GetFlux(string filename) // TGraph *Spectra::GetGEdNdEdAdt() { // return gEdNdEdAdt; // } -// +// // TGraph *Spectra::GetGE2dNdEdAdt() { // return gE2dNdEdAdt; // } -// +// // TSpline3 *Spectra::GetSEdNdEdAdt() { // return sEdNdEdAdt; // } -// +// // TSpline3 *Spectra::GetSE2dNdEdAdt() { // return sE2dNdEdAdt; // } -//-------------------------------------------------- +//-------------------------------------------------- double *Spectra::Getenergy() { return energy; @@ -609,4 +616,3 @@ int Spectra::IsMonoenergetic() { } return out; } - From 77e97783088652cebc0e89abdbb1cd7230155d94 Mon Sep 17 00:00:00 2001 From: Jorge Torres Date: Thu, 11 Jun 2020 10:33:13 -0400 Subject: [PATCH 53/53] Fixed fluxes/Cuoco_CenA.dat with correct formatting --- fluxes/Cuoco_CenA.dat | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/fluxes/Cuoco_CenA.dat b/fluxes/Cuoco_CenA.dat index 09847240..0dc13f21 100644 --- a/fluxes/Cuoco_CenA.dat +++ b/fluxes/Cuoco_CenA.dat @@ -1,15 +1,15 @@ 14 -15.188 -9.974 -15.392 -9.716 -15.587 -9.469 -15.983 -9.250 -16.489 -9.101 -16.984 -8.953 -17.489 -8.803 -17.984 -8.656 -18.490 -8.506 -18.984 -8.360 -19.490 -8.210 -19.985 -8.062 -20.495 -7.911 -20.974 -7.769 +15.188 -9.974 +15.392 -9.716 +15.587 -9.469 +15.983 -9.250 +16.489 -9.101 +16.984 -8.953 +17.489 -8.803 +17.984 -8.656 +18.490 -8.506 +18.984 -8.360 +19.490 -8.210 +19.985 -8.062 +20.495 -7.911 +20.974 -7.769