package main import ( "encoding/json" "github.com/gorilla/mux" "log" "math" "net/http" "strconv" ) // Defining the constants used in the NFW profile const ( sigma float64 = 200 f0 float64 = 0.1 G float64 = 4.302e-3 rS float64 = 1e4 ) // The actual NFW profile // Uses the given distance to the middle of the galaxy to calculate the probability that a star is generated func rho(r float64) float64 { a := (1) / (math.Sqrt(2*math.Pi) * sigma) b := math.Exp(-phi(r) / math.Pow(sigma, 2)) return a * b } // A subset of the NFW function in order to handle the 0 case func phi(x float64) float64 { if x == 0 { return -4 * math.Pi * f0 * G * math.Pow(rS, 2) } a := -(4 * math.Pi * f0 * G * math.Pow(rS, 3)) / x b := math.Log(1.0 + (x / rS)) return a * b } // NFW is the corresponding HTTP-handler to the NFW Profile // It uses the given distance to the Midpoint of the galaxy to calculate and return the probability that a star // is generated. func NFW(w http.ResponseWriter, r *http.Request) { params := mux.Vars(r) distanceToMidpoint, err := strconv.ParseFloat(params["r"], 64) if err != nil { panic(err) } var returnValue float64 = rho(distanceToMidpoint) err = json.NewEncoder(w).Encode(returnValue) if err != nil { panic(err) } } func main() { router := mux.NewRouter() router.HandleFunc("/NFW/{r}", NFW).Methods("GET") log.Fatal(http.ListenAndServe(":8000", router)) }