package main import ( "encoding/json" "fmt" "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 ) type result struct { NFW float64 `json:"NFW"` } // 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(x float64, y float64, z float64) float64 { r := math.Sqrt(math.Pow(x, 2) + math.Pow(y, 2) + math.Pow(z, 2)) 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 := r.URL.Query() // parse the parameters x, _ := strconv.ParseFloat(params.Get("x"), 64) y, _ := strconv.ParseFloat(params.Get("y"), 64) z, _ := strconv.ParseFloat(params.Get("z"), 64) // calculate the NFW-value var returnValue result = result{rho(x, y, z)} log.Print(returnValue) b, err := json.Marshal(returnValue) if err != nil { panic(err) } // http response writer w.Header().Set("Content-Type", "application/json") _, err = fmt.Fprintf(w, "%v", string(b)) if err != nil { panic(err) } } // Index handles request on the / endpoint func Index(w http.ResponseWriter, r *http.Request) { log.Print(fmt.Fprintln(w, "usage: nfw.docker.localhost/NFW?x=&y=&z=")) } func main() { router := mux.NewRouter() // routes router.HandleFunc("/", Index).Methods("GET") router.HandleFunc("/NFW", NFW).Methods("GET") log.Println("Starting the service on port localhost:8081") log.Fatal(http.ListenAndServe(":8081", router)) }