Skip to content

Commit

Permalink
Introduce morphing of ToA lnL data
Browse files Browse the repository at this point in the history
  • Loading branch information
tschiffer committed Dec 19, 2024
1 parent 20c62e5 commit 5db3b65
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 3 deletions.
7 changes: 5 additions & 2 deletions Analysis/ingrid/likelihood.nim
Original file line number Diff line number Diff line change
Expand Up @@ -1774,10 +1774,13 @@ proc main(
echo "path:"
ToAProbabilityHists ="../../resources/ToA_P_densitys.csv"
var df = newDataFrame()
var Energy_list = newSeq[int]()
var Energy_list = newSeq[float]()
var test = newDataFrame()
df = readToAProbabilitys(ToAProbabilityHists, Energy_list)
echo Energy_list
test = getInterpolatedDfToA(df,Energy_list)
echo test


# until here

let region = if region.len > 0:
Expand Down
57 changes: 56 additions & 1 deletion Analysis/ingrid/private/likelihood_utils.nim
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,61 @@ proc getInterpolatedWideDf*(df: DataFrame, num = 1000): DataFrame =
dfLoc["Variable"] = constantColumn(tup[0][1].toStr, dfLoc.len)
result.add dfLoc

proc morphToA*(df: DataFrame, lineEnergies: seq, energy: float, offset = 1): (Tensor[int], Tensor[float]) =
## generates a distribution for the appropriate energy `energy` between the
## distribution below and above `energy` using linear interpolation
## DF needs to have columns:
## - "Hist": counts of distributions
## - "Bins": bin edges of distributions
## - "Dset": name of the target filter combination

let idx = max(lineEnergies.lowerBound(energy) - 1, 0)

# need idx and idx+offset

let refLow = int(lineEnergies[idx])
let refHigh = int(lineEnergies[idx+offset])


let refLowT = df[$refLow, float]
let refHighT = df[$refHigh, float]

let bins = df["bin", int]


var res = zeros[float](refLowT.size.int)
# walk over each bin and compute linear interpolation between
let Ediff = abs(lineEnergies[idx] - lineEnergies[idx+offset])
for i in 0 ..< bins.size:
res[i] = refLowT[i] * (1 - (abs(lineEnergies[idx] - energy)) / Ediff) +
refHighT[i] * (1 - (abs(lineEnergies[idx+offset] - energy)) / Ediff)
result = (bins, res)

proc getInterpolatedDfToA*(df: DataFrame, lineEnergies: seq, num = 100): DataFrame =
## returns a DF with `num` interpolated distributions using next neighbors
## for linear interpolation
echo "enter interpolation"
let energies = linspace(lineEnergies[0], lineEnergies[^1], num)
var test: int
var dfLoc = newDataFrame()
var lastBins = zeros[int](0)
result = newDataFrame()
for idx, E in energies:
let (bins, res) = morphToA(df, lineEnergies, E, offset = 1)

block Sanity:
# really the same bins in all Target/Filter combinations? Should be, but check!
if lastBins.size > 0:
doAssert bins == lastBins
lastBins = bins
let suffix = "_" & $idx
dfLoc["Hist" & $suffix] = res

dfLoc["Bins"] = lastBins
#echo dfLoc
result.add dfLoc


proc readMorphKind(): MorphingKind
proc calcLikelihoodDataset*(h5f: var H5File,
groupName: string,
Expand Down Expand Up @@ -274,7 +329,7 @@ proc readToAProbabilitys*(pathtoToA:string, Energy_list: var seq): DataFrame =
for i in 0 ..< 20000:
try:
let t: Tensor[float] = df[$i, float]
Energy_list.add i
Energy_list.add float(i)
except:
discard
result = df
Expand Down

0 comments on commit 5db3b65

Please sign in to comment.