added monitorType

This commit is contained in:
2024-10-22 09:43:44 +02:00
parent 772d921f03
commit 7f2d5cf765
4 changed files with 44 additions and 25 deletions

View File

@@ -36,6 +36,10 @@ def commandLineArgs():
input_data.add_argument("-nm", "--normalisationMethod",
default = Defaults.normalisationMethod,
help = "normalisation method: [o]verillumination, [u]nderillumination, [d]irect_beam")
input_data.add_argument("-mt", "--monitorType",
type = str,
default = Defaults.monitorType,
help = "one of 'protonCurrent', 'countingTime' or 'neutronMonitor'")
output = clas.add_argument_group('output')
output.add_argument("-o", "--outputName",
@@ -190,7 +194,8 @@ def command_line_options():
incidentAngle = clas.incidentAngle,
mu = clas.mu,
nu = clas.nu,
muOffset = clas.muOffset
muOffset = clas.muOffset,
monitorType = clas.monitorType,
)
reduction_config = ReductionConfig(
qResolution = clas.qResolution,

View File

@@ -20,17 +20,18 @@ try:
except Exception:
nb_helpers = None
def get_current_per_pulse(t_pulses, t_currents, currents):
def get_current_per_pulse(pulseTimeS, currentTimeS, currents):
# add currents for early pulses and current time value after last pulse (j+1)
t_currents = np.hstack([[0], t_currents, [t_pulses[-1]+1]])
currentTimeS = np.hstack([[0], currentTimeS, [pulseTimeS[-1]+1]])
currents = np.hstack([[0], currents])
pulse_currents = np.zeros(t_pulses.shape[0], dtype=float)
pulseCurrentS = np.zeros(pulseTimeS.shape[0], dtype=float)
j = 0
for i, ti in enumerate(t_pulses):
if ti>=t_currents[j+1]:
j+=1
pulse_currents[i] = currents[j]
return pulse_currents
for i, ti in enumerate(pulseTimeS):
if ti >= currentTimeS[j+1]:
j += 1
pulseCurrentS[i] = currents[j]
#print(f' {i} {pulseTimeS[i]} {pulseCurrentS[i]}')
return pulseCurrentS
class AmorData:
"""read meta-data and event streams from .hdf file(s), apply filters and conversions"""
@@ -54,6 +55,7 @@ class AmorData:
tau: float
tofCut: float
start_date: str
monitorType: str
seriesStartTime = None
@@ -98,7 +100,6 @@ class AmorData:
#self.monitor = _monitor
self.monitorPerPulse = _monitorPerPulse
self.pulseTimeS = _pulseTimeS
#logging.warning(f' {self.monitorType} monitor = {self.monitor:9.3f}')
#-------------------------------------------------------------------------------------------------
#def path_generator(self, number):
@@ -204,6 +205,8 @@ class AmorData:
self.extract_walltime(norm)
self.events_per_pulse()
self.monitor_threshold()
self.filter_strange_times()
@@ -243,15 +246,15 @@ class AmorData:
self.pulseTimeS = self.pulseTimeS[1:-1]
def associate_pulse_with_monitor(self):
if self.monitorType == 'protonCharge':
if self.config.monitorType == 'protonCharge':
self.currentTime -= self.seriesStartTime
self.monitorPerPulse = get_current_per_pulse(self.pulseTimeS, self.currentTime, self.current) * 2*self.tau * 1e-3
# filter low-current pulses
self.monitorPerPulse = np.where(self.monitorPerPulse > 2*self.tau * self.config.lowCurrentThreshold*1e-3, self.monitorPerPulse, 0)
self.monitorPerPulse = np.where(self.monitorPerPulse > 2*self.tau * self.config.lowCurrentThreshold, self.monitorPerPulse, 0)
# remove 'partially filled' pulses
#self.monitorPerPulse[0] = 0
#self.monitorPerPulse[-1] = 0
elif self.monitorType == 'countingTime':
elif self.config.monitorType == 'countingTime':
self.monitorPerPulse = self.tau
else:
self.monitorPerPulse = 1./np.shape(pulseTimeS)[1]
@@ -267,8 +270,14 @@ class AmorData:
self.wallTime_e -= np.int64(self.seriesStartTime)
logging.debug(f' wall time from {self.wallTime_e[0]/1e9:6.1f} s to {self.wallTime_e[-1]/1e9:6.1f} s')
def events_per_pulse(self):
if self.config.monitorType == 'protonCharge':
for i, time in enumerate(self.pulseTimeS):
events = np.shape(self.wallTime_e[self.wallTime_e == time])[0]
#print(f' {i:6.0f} {events:6.0f} {self.monitorPerPulse[i]:6.2f}')
def monitor_threshold(self):
if self.monitorType == 'protonCharge': # fix to check for file compatibility
if self.config.monitorType == 'protonCharge': # fix to check for file compatibility
goodTimeS = self.pulseTimeS[self.monitorPerPulse!=0]
filter_e = np.where(np.isin(self.wallTime_e, goodTimeS), True, False)
self.tof_e = self.tof_e[filter_e]
@@ -357,17 +366,20 @@ class AmorData:
self.tof_e = np.array(self.hdf['/entry1/Amor/detector/data/event_time_offset'][:])/1.e9
self.pixelID_e = np.array(self.hdf['/entry1/Amor/detector/data/event_id'][:], dtype=np.int64)
self.dataPacket_p = np.array(self.hdf['/entry1/Amor/detector/data/event_index'][:], dtype=np.uint64)
#self.dataPacketTime_p = np.array(self.hdf['/entry1/Amor/detector/data/event_time_zero'][:], dtype=np.uint64)/1e9
self.dataPacketTime_p = np.array(self.hdf['/entry1/Amor/detector/data/event_time_zero'][:], dtype=np.int64)
try:
self.currentTime = np.array(self.hdf['entry1/Amor/detector/proton_current/time'][:], dtype=np.int64)
self.current = np.array(self.hdf['entry1/Amor/detector/proton_current/value'][:,0], dtype=float)
if len(self.current)>0:
self.monitorType = 'protonCharge'
else:
self.monitorType = 'countingTime'
except(KeyError, IndexError):
self.monitorType = 'countingTime'
if self.config.monitorType in ['auto', 'protonCharge']:
try:
self.currentTime = np.array(self.hdf['entry1/Amor/detector/proton_current/time'][:], dtype=np.int64)
self.current = np.array(self.hdf['entry1/Amor/detector/proton_current/value'][:,0], dtype=float)
if len(self.current)>0:
self.config.monitorType = 'protonCharge'
else:
self.config.monitorType = 'countingTime'
except(KeyError, IndexError):
self.config.monitorType = 'countingTime'
else:
self.config.monitorType = 'countingTime'
#TODO: protonMonitor
def read_individual_header(self):
self.chopperDistance = float(np.take(self.hdf['entry1/Amor/chopper/pair_separation'], 0))

View File

@@ -16,6 +16,7 @@ class Defaults:
year = datetime.now().year
normalisationFileIdentifier = []
normalisationMethod = 'o'
monitorType = 'auto'
# subtract
outputName = "fromEOS"
outputFormat = ['Rqz.ort']
@@ -54,6 +55,7 @@ class ExperimentConfig:
yRange: Tuple[float, float]
lambdaRange: Tuple[float, float]
qzRange: Tuple[float, float]
monitorType: str
lowCurrentThreshold: float
sampleModel: Optional[str] = None

View File

@@ -77,7 +77,7 @@ class AmorReduction:
lamda_e = self.file_reader.lamda_e
detZ_e = self.file_reader.detZ_e
self.monitor = np.sum(self.file_reader.monitorPerPulse)
logging.warning(f' monitor = {self.monitor:8.2f}')
logging.warning(f' monitor = {self.monitor:8.2f} ({self.experiment_config.monitorType})')
qz_lz, qx_lz, ref_lz, err_lz, res_lz, lamda_lz, theta_lz, int_lz, self.mask_lz = self.project_on_lz(
self.file_reader, self.norm_lz, self.normAngle, lamda_e, detZ_e)
#if self.monitor>1 :