人工晶状体在线公式A常数优化——多线程

1. Preparation

参照上篇

项目下载链接

3

2. Barret Universal II

2.1 OptimizePlus.go

package main

import (
    "os"
    "fmt"
    //"time"
    "sync"
    "strconv"
    "github.com/360EntSecGroup-Skylar/excelize"
    "github.com/tebeka/selenium"
    "./BU2"
)

const (
    chromeDriverPath = "./chromedriver"
    port             = 8080
)
var(
    chanDatamap         chan map[string]string
    waitGroup           sync.WaitGroup
    lock                sync.Mutex
)


func main(){
    var n int
    fmt.Println("Please input from where to start,default input is 0:")
    fmt.Scanln(&n)
    chanDatamap  = make(chan map[string]string, 200)
    go GetDataMap(n)
    for i := 0; i < 10; i++ {
        waitGroup.Add(1)
        go run()
    }
    waitGroup.Wait()
}


func GetDataMap(n int){
   // Get all the rows in the Sheet1.
   DataMap := make(map[string]string, 0)
   f, err := excelize.OpenFile("Data.xlsx")
   if err != nil {
        fmt.Println(err)
        return
    }
   rows, err := f.GetRows("Sheet1")
   for i, row := range rows {
            if i == 0 {
                f.SetCellValue("Sheet1", "N1", "Optimized A_constant") 
                continue
            }else if i>=n{
                /*
                fmt.Println("Processing patient:")
                fmt.Println(i)
                */
                DataMap=map[string]string{
                            "num":strconv.Itoa(i+1),
                            "MainContent_PatientName":row[0],
                            //"MainContent_PatientNo":row[1],
                            "MainContent_Aconstant":"118.80",
                            "MainContent_Axlength":row[1],
                            "MainContent_MeasuredK1":row[3],
                            "MainContent_MeasuredK2":row[5],
                            "MainContent_OpticalACD":row[2],
                            "MainContent_Refraction":"0",
                            "MainContent_LensThickness":row[10],
                            "MainContent_WTW":row[9],
                            "IOL":row[11],
                            "Ref_PostOP":row[12],
                        }

                /*
                for k,v := range DataMap{
                    fmt.Println(k,v)
                }
                */
                chanDatamap <- DataMap
            }
    }
    //close(chanDatamap)
}

func run() {
   // Start a WebDriver server instance
    opts := []selenium.ServiceOption{
        //selenium.Output(os.Stderr),            // Output debug information to STDERR.
    }
    //selenium.SetDebug(true)
    selenium.SetDebug(false)
    service, err := selenium.NewChromeDriverService(chromeDriverPath, port, opts...)
    if err != nil {
        panic(err) // panic is used only as an example and is not otherwise recommended.
    }
    defer service.Stop()

    // Connect to the WebDriver instance running locally.
    caps := selenium.Capabilities{"browserName": "chrome"}
    wd, err := selenium.NewRemote(caps, fmt.Sprintf("http://localhost:%d/wd/hub", port))
    if err != nil {
        panic(err)
    }
    defer wd.Quit()

    // Navigate to the simple playground interface.
    // Navigate to the simple playground interface.
    err = wd.Get("https://calc.apacrs.org/barrett_universal2105/")
    if err != nil {
      fmt.Println("get page faild", err.Error())
      //return
    }
    for DataMap := range chanDatamap{
        i, _ := strconv.Atoi(DataMap["num"])
        fmt.Printf("Processing Patient:%d\n",i-1)
        A_constant := BU2.Get_A_constant(wd, DataMap)
        A_constant_ :=strconv.FormatFloat(A_constant, 'f', 4, 64)
        
        lock.Lock()
        f, err := excelize.OpenFile("Data.xlsx")
        if err != nil {
            fmt.Println(err)
            return
        }
        f.SetCellValue("Sheet1", "N"+DataMap["num"], A_constant_) 
        fmt.Println("Optimized A_constant :" + A_constant_)
        err = f.Save()
        if err != nil {
            fmt.Println(err)
            os.Exit(1)
        }
        lock.Unlock()
    }
    wd.Quit()
    waitGroup.Done()
}

2.2 BU2

package BU2

import (
    "fmt"
    "strconv"
    //"time"
    "math"
    "strings"
    "github.com/tebeka/selenium"
)


func Find_Send(wd selenium.WebDriver, ID string, key string){
   btn, err := wd.FindElement(selenium.ByID, ID)
   if err != nil {
      //panic(err)
      fmt.Println(err)
   }
   err =  btn.Clear()
   if err != nil {
      //panic(err)
      fmt.Println(err)
   }
   err =  btn.SendKeys(key)
   if err != nil {
      //panic(err)
      fmt.Println(err)
   }
}

func ConvertStrSlice2Map(sl []string) map[string]struct{} {
    set := make(map[string]struct{}, len(sl))
    for _, v := range sl {
        set[v] = struct{}{}
    }
    return set
}


func InMap(m map[string]struct{}, s string) bool {
    _, ok := m[s]
    return ok
}

func FloatRound(f float64, n int) float64 {
    format := "%." + strconv.Itoa(n) + "f"
    res, _ := strconv.ParseFloat(fmt.Sprintf(format, f), 64)
    return res
}

func Iterate(wd selenium.WebDriver, A_constant float64,IOL string)(Ref float64){
   Patient_Data, err := wd.FindElement(selenium.ByLinkText, "Patient Data")
   if err != nil {
      //panic(err)
      fmt.Println(err)
   }
   if err := Patient_Data.Click(); err != nil {
        panic(err)
   }

   btn, err := wd.FindElement(selenium.ByID, "MainContent_Aconstant")
   if err != nil {
      //panic(err)
      fmt.Println(err)
   }
   err =  btn.Clear()
   if err != nil {
      //panic(err)
      fmt.Println(err)
   }
   err =  btn.SendKeys(strconv.FormatFloat(A_constant,'f', 3, 64))
   if err != nil {
      //panic(err)
      fmt.Println(err)
   }
   //time.Sleep(3 * time.Second)

   Calc, err := wd.FindElement(selenium.ByID, "MainContent_Button1")
   if err != nil {
      //panic(err)
      fmt.Println(err)
   }
   if err := Calc.Click(); err != nil {
        panic(err)
   }

   Formula, err := wd.FindElement(selenium.ByLinkText, "Universal Formula")
   if err != nil {
      //panic(err)
      fmt.Println(err)
   }
   if err := Formula.Click(); err != nil {
        panic(err)
    }

   t,err :=wd.FindElement(selenium.ByTagName, "tbody")
   if err != nil {
      //panic(err)
      fmt.Println(err)
   }
   Results,err :=t.Text()
   if err != nil {
     panic(err)
   }
   Power_Refs := strings.Split(Results,"\n")

   for i,Power_Ref := range Power_Refs{
       if i==0 {
            continue
        } else {
             Power_Ref_:=strings.Split(strings.TrimSpace(Power_Ref)," ")
            Power_ := Power_Ref_[0]
            Ref_ := Power_Ref_[2]
            if Power_ == IOL{
                Ref,_ = strconv.ParseFloat(Ref_,64)
            }
        } 
   }
   return Ref
}

func Ajust(wd selenium.WebDriver, A_constant float64,IOL string,Ref_Post float64, Ref float64)(float64, float64){
   A_constant = FloatRound(A_constant + Ref_Post - Ref,3)
   Ref = Iterate(wd, A_constant, IOL)
   return Ref, A_constant
}

func Micro_Ajust(wd selenium.WebDriver, A_constant float64, IOL string, _Ref float64, Ref float64,Step float64)(float64,float64, float64){
   A_constant =FloatRound(A_constant + Step,3)
   Ref = Iterate(wd, A_constant, IOL)
   //fmt.Println(_Ref,Ref)
   if _Ref > Ref{
    _Step := FloatRound(math.Abs(Step)/2,4)
    Step = _Step
    fmt.Println("Upaward!")
    //fmt.Println(Step)
   }else if _Ref < Ref{
    _Step := FloatRound(math.Abs(Step)/2,4)
    Step = - _Step
    fmt.Println("Downaward!")
    //fmt.Println(Step)
   }else{
    fmt.Println("Keep original direction!")
    //fmt.Println(Step)
   }
   fmt.Printf("Refraction (SE): %.3f A_constant: %.3f next step: %.3f\n", Ref, A_constant, Step)
   //time.Sleep(10* time.Second)
   return Ref, A_constant, Step

}

func Micro_Ajust_UpAndDown(wd selenium.WebDriver, A_constant float64,IOL string, Ref float64)(float64){
    fmt.Println("Micro_Ajust_UpAndDown!")
    A_constant_max,A_constant_min :=A_constant,A_constant
    Ref0 :=Ref
    Step := 0.016
    for{
        _Ref := Ref
        Ref, A_constant_max, Step = Micro_Ajust(wd, A_constant_max,IOL, _Ref, Ref, Step) 
        if _Ref >Ref &&  math.Abs(Step) <=0.001 {
            _Ref := Ref
            var A_constant_max0 float64
            Ref, A_constant_max0, Step = Micro_Ajust(wd, A_constant_max,IOL, _Ref, Ref, Step)
            if _Ref ==Ref{
                A_constant_max=A_constant_max0
            }
            break
        }
        
    }
    fmt.Println("A_constant_max:" +strconv.FormatFloat(A_constant_max, 'f', 3, 64))

    Ref = Ref0
    Step = -0.016
    for{
        _Ref := Ref
        Ref, A_constant_min, Step = Micro_Ajust(wd, A_constant_min,IOL,_Ref, Ref, Step)
        if _Ref < Ref &&  math.Abs(Step) <=0.001{
            _Ref := Ref
            var A_constant_min0 float64
            Ref, A_constant_min0, Step = Micro_Ajust(wd, A_constant_min,IOL,_Ref, Ref, Step)
            if _Ref ==Ref{
                A_constant_min=A_constant_min0
            }
            break
        }
    }
    fmt.Println("A_constant_min:" + strconv.FormatFloat(A_constant_min, 'f', 3, 64))
    A_constant = FloatRound ((A_constant_max+A_constant_min)/2,4)
    return A_constant
}

func Get_A_constant(wd selenium.WebDriver, DataMap map[string]string)(A_constant float64) {
    IOL := DataMap["IOL"]
    Ref_PostOP := DataMap["Ref_PostOP"]
    A_constant, _ = strconv.ParseFloat(DataMap["MainContent_Aconstant"],64)
    for k,v := range DataMap{
        switch k {
        case "IOL","Ref_PostOP","num":
            continue
        default:
            Find_Send(wd,k,v)
        }
    }
   //time.Sleep(15*time.Second)
   Calc, err := wd.FindElement(selenium.ByID, "MainContent_Button1")
   if err != nil {
      //panic(err)
      fmt.Println(err)
   }
   if err := Calc.Click(); err != nil {
        panic(err)
    }
   Formula, err := wd.FindElement(selenium.ByLinkText, "Universal Formula")
   if err != nil {
      //panic(err)
      fmt.Println(err)
   }
   if err := Formula.Click(); err != nil {
        panic(err)
    }

   t,err :=wd.FindElement(selenium.ByTagName, "tbody")
   if err != nil {
      //panic(err)
      fmt.Println(err)
   }
   Results,err :=t.Text()
   if err != nil {
     panic(err)
   }
   //fmt.Println(Results)
   Power_Refs := strings.Split(Results,"\n")
   //fmt.Println(Power_Refs)
   Power_Refs_Map := map[string](string){}
   Powers := []string{}
   for i,Power_Ref := range Power_Refs{
       if i==0 {
            continue
        } else {
            _Power_Ref:=strings.Split(Power_Ref," ")
            Power := _Power_Ref[0]
            Powers = append(Powers,Power)
            Ref:=_Power_Ref[2]
            Power_Refs_Map[Power] = Ref
        } 
   }
   /*
   for Power,Ref := range Power_Refs_Map{
    fmt.Println(Power,Ref)
   }
   */
   //fmt.Println(Powers)
   set := ConvertStrSlice2Map(Powers)
   if !InMap(set,IOL){
    fmt.Println("IOL not in Powers")
    Patient_Data, _:= wd.FindElement(selenium.ByLinkText, "Patient Data")
    if err := Patient_Data.Click(); err != nil {
        panic(err)
    }
    return 0
   }else{
        fmt.Printf("IOL in Powers:%s\n",IOL)
        fmt.Printf("Refraction post operation:%s\n",DataMap["Ref_PostOP"])
        Ref, _:= strconv.ParseFloat(Power_Refs_Map[IOL],64)
        Ref_Post, _ := strconv.ParseFloat(Ref_PostOP,64)
        //fmt.Println(Ref,Ref_Post)
        for {
                A_constant_ := FloatRound(A_constant + Ref_Post - Ref,3)
                //fmt.Println(A_constant_)
                if !(A_constant_ >=112 && A_constant_<=125){
                    fmt.Println("A_constant out of boundary!")
                    Patient_Data, _:= wd.FindElement(selenium.ByLinkText, "Patient Data")
                    if err := Patient_Data.Click(); err != nil {
                        panic(err)
                    }
                    return 0
                    break
                }else{
                    _Ref_D :=FloatRound(Ref_Post - Ref,3)
                    Ref, A_constant = Ajust(wd, A_constant,IOL,Ref_Post, Ref)
                    Ref_D := FloatRound(Ref_Post - Ref,3)
                    //fmt.Println(_Ref_D,Ref_D)
                    if math.Abs(Ref_D)<=0.020{
                        if Ref_D ==0 {
                            A_constant = Micro_Ajust_UpAndDown(wd, A_constant, IOL, Ref)
                            break
                        }else if _Ref_D*Ref_D<0 {
                            if Ref_D >0 {
                                fmt.Println("Micro_Ajust_Up")
                                Step := 0.002
                                for{
                                    _Ref := Ref
                                    _A_constant := A_constant
                                    Ref, A_constant, Step = Micro_Ajust(wd, A_constant,IOL, _Ref, Ref, Step)
                                    Ref_D = FloatRound(Ref_Post - Ref,2)
                                    if Ref_D ==0 {
                                        A_constant = Micro_Ajust_UpAndDown(wd, A_constant, IOL, Ref)
                                        break
                                    }
                                    if _Ref > Ref {
                                        fmt.Println(_A_constant,A_constant)
                                        A_constant = FloatRound ((_A_constant +A_constant)/2,4)
                                        break
                                    }
                                }
                                break
                            }
                            if Ref_D <0{
                                fmt.Println("Micro_Ajust_Down")
                                Step :=-0.002
                                for{
                                    _Ref := Ref
                                    _A_constant := A_constant
                                    Ref, A_constant, Step = Micro_Ajust(wd, A_constant,IOL, _Ref, Ref, Step)
                                    Ref_D = FloatRound(Ref_Post - Ref,2)
                                    if Ref_D ==0 {
                                        A_constant = Micro_Ajust_UpAndDown(wd, A_constant, IOL, Ref)
                                        break
                                    }
                                    if _Ref < Ref {
                                        fmt.Println(_A_constant,A_constant)
                                        A_constant = FloatRound ((_A_constant +A_constant)/2,4)
                                        break
                                    }
                                }
                                break
                            }

                        }
                    }
                }
            //time.Sleep(10* time.Second)
        }
        
    }
   //time.Sleep(15 * time.Second)
   //wd.Quit()
   Patient_Data, _:= wd.FindElement(selenium.ByLinkText, "Patient Data")
   if err := Patient_Data.Click(); err != nil {
        panic(err)
   }
   return A_constant
}

2.3 GetRefPlus.go

package main

import (
    "os"
    "fmt"
    "time"
    "sync"
    "strconv"
    "strings"
    "github.com/360EntSecGroup-Skylar/excelize"
    "github.com/tebeka/selenium"
)

const (
    chromeDriverPath = "./chromedriver"
    port             = 8080
)
var(
    chanDatamap         chan map[string]string
    waitGroup           sync.WaitGroup
    lock                sync.Mutex
)


func main(){
    var n int
    fmt.Println("Please input from where to start,default input is 0:")
    fmt.Scanln(&n)
    chanDatamap  = make(chan map[string]string)
    go GetDataMap(n)
    for i := 0; i < 10; i++ {
        waitGroup.Add(1)
        go run()
    }
    waitGroup.Wait()
}


func GetDataMap(n int){
   // Get all the rows in the Sheet1.
   DataMap := make(map[string]string, 0)
   f, err := excelize.OpenFile("Data.xlsx")
   if err != nil {
        fmt.Println(err)
        return
    }
   rows, err := f.GetRows("Sheet1")
   for i, row := range rows {
            if i == 0 {
                f.SetCellValue("Sheet1", "R1", "Ref with A_constant Optimized ") 
                continue
            }else if i >=n{
                /*
                fmt.Println("Processing patient:")
                fmt.Println(i)
                */
                DataMap=map[string]string{
                            "num":strconv.Itoa(i+1),
                            "MainContent_PatientName":row[0],
                            //"MainContent_PatientNo":row[1],
                            "MainContent_Aconstant":"118.56",
                            "MainContent_Axlength":row[1],
                            "MainContent_MeasuredK1":row[3],
                            "MainContent_MeasuredK2":row[5],
                            "MainContent_OpticalACD":row[2],
                            "MainContent_Refraction":"0",
                            "MainContent_LensThickness":row[10],
                            "MainContent_WTW":row[9],
                            "IOL":row[11],
                            "Ref_PostOP":row[12],
                        }

                /*
                for k,v := range DataMap{
                    fmt.Println(k,v)
                }
                */
                chanDatamap <- DataMap
            }
    }
    //close(chanDatamap)
}

func run() {
   // Start a WebDriver server instance
    opts := []selenium.ServiceOption{
        //selenium.Output(os.Stderr),            // Output debug information to STDERR.
    }
    //selenium.SetDebug(true)
    selenium.SetDebug(false)
    service, err := selenium.NewChromeDriverService(chromeDriverPath, port, opts...)
    if err != nil {
        panic(err) // panic is used only as an example and is not otherwise recommended.
    }
    defer service.Stop()

    // Connect to the WebDriver instance running locally.
    caps := selenium.Capabilities{"browserName": "chrome"}
    wd, err := selenium.NewRemote(caps, fmt.Sprintf("http://localhost:%d/wd/hub", port))
    if err != nil {
        panic(err)
    }
    defer wd.Quit()

    // Navigate to the simple playground interface.
    // Navigate to the simple playground interface.
    err = wd.Get("https://calc.apacrs.org/barrett_universal2105/")
    if err != nil {
      fmt.Println("get page faild", err.Error())
      //return
    }
    time.Sleep(5*time.Second)
    for DataMap := range chanDatamap{
        Ref := Get_Ref(wd, DataMap)
        lock.Lock()
        f, err := excelize.OpenFile("Data.xlsx")
        if err != nil {
            fmt.Println(err)
            return
        }
        //fmt.Printf("Processing Patient:%d\n",i-1)
        f.SetCellValue("Sheet1", "R"+DataMap["num"], Ref) 
        fmt.Println("Ref with A_constant Optimized :" + Ref)
        err = f.Save()
        if err != nil {
            fmt.Println(err)
            os.Exit(1)
        }
        lock.Unlock()
    }
    waitGroup.Done()
}




func Find_Send(wd selenium.WebDriver, ID string, key string){
   btn, err := wd.FindElement(selenium.ByID, ID)
   if err != nil {
      //panic(err)
      fmt.Println(err)
   }
   err =  btn.Clear()
   if err != nil {
      //panic(err)
      fmt.Println(err)
   }
   err =  btn.SendKeys(key)
   if err != nil {
      //panic(err)
      fmt.Println(err)
   }
}

func ConvertStrSlice2Map(sl []string) map[string]struct{} {
    set := make(map[string]struct{}, len(sl))
    for _, v := range sl {
        set[v] = struct{}{}
    }
    return set
}


func InMap(m map[string]struct{}, s string) bool {
    _, ok := m[s]
    return ok
}


func Get_Ref(wd selenium.WebDriver, DataMap map[string]string)(Ref string) {
    IOL := DataMap["IOL"]
    for k,v := range DataMap{
        switch k {
        case "IOL","Ref_PostOP","num":
            continue
        default:
            Find_Send(wd,k,v)
        }
    }
   //time.Sleep(15*time.Second)
   Calc, err := wd.FindElement(selenium.ByID, "MainContent_Button1")
   if err != nil {
      //panic(err)
      fmt.Println(err)
   }
   if err := Calc.Click(); err != nil {
        panic(err)
    }
   Formula, err := wd.FindElement(selenium.ByLinkText, "Universal Formula")
   if err != nil {
      //panic(err)
      fmt.Println(err)
   }
   if err := Formula.Click(); err != nil {
        panic(err)
    }

   t,err :=wd.FindElement(selenium.ByTagName, "tbody")
   if err != nil {
      //panic(err)
      fmt.Println(err)
   }
   Results,err :=t.Text()
   if err != nil {
     panic(err)
   }
   //fmt.Println(Results)
   Power_Refs := strings.Split(Results,"\n")
   //fmt.Println(Power_Refs)
   Power_Refs_Map := map[string](string){}
   Powers := []string{}
   for i,Power_Ref := range Power_Refs{
       if i==0 {
            continue
        } else {
            _Power_Ref:=strings.Split(Power_Ref," ")
            Power := _Power_Ref[0]
            Powers = append(Powers,Power)
            Ref:=_Power_Ref[2]
            Power_Refs_Map[Power] = Ref
        } 
   }
   /*
   for Power,Ref := range Power_Refs_Map{
    fmt.Println(Power,Ref)
   }
   */
   //fmt.Println(Powers)
   set := ConvertStrSlice2Map(Powers)
   if !InMap(set,IOL){

    fmt.Println("IOL not in Powers")
    Patient_Data, _:= wd.FindElement(selenium.ByLinkText, "Patient Data")
    if err := Patient_Data.Click(); err != nil {
        panic(err)
    }
    return "---"
   }else{
        fmt.Printf("IOL in Powers:%s\n",IOL)
        Ref = Power_Refs_Map[IOL]
        Patient_Data, _:= wd.FindElement(selenium.ByLinkText, "Patient Data")
        if err := Patient_Data.Click(); err != nil {
            panic(err)
        }
        return Ref
    }
}

3. EVO

3.1 OptimizePlus.go

package main

import (
    "os"
    "fmt"
    //"time"
    "sync"
    "strconv"
    "github.com/360EntSecGroup-Skylar/excelize"
    "github.com/tebeka/selenium"
    "./EVO"
)

const (
    chromeDriverPath = "./chromedriver"
    port             = 8080
)
var(
    chanDatamap         chan map[string]string
    waitGroup           sync.WaitGroup
    lock                sync.Mutex
)


func main(){
    var n int
    fmt.Println("Please input from where to start,default input is 0:")
    fmt.Scanln(&n)
    chanDatamap  = make(chan map[string]string, 200)
    go GetDataMap(n)
    for i := 0; i < 10; i++ {
        waitGroup.Add(1)
        go run()
    }
    waitGroup.Wait()
}


func GetDataMap(n int){
   // Get all the rows in the Sheet1.
   DataMap := make(map[string]string, 0)
   f, err := excelize.OpenFile("Data.xlsx")
   if err != nil {
        fmt.Println(err)
        return
    }
   rows, err := f.GetRows("Sheet1")
   for i, row := range rows {
            if i == 0 {
                f.SetCellValue("Sheet1", "N1", "Optimized A_constant") 
                continue
            }else if i>=n{
                /*
                fmt.Println("Processing patient:")
                fmt.Println(i)
                */
                DataMap=map[string]string{
                            "num":strconv.Itoa(i+1),
                            "TextBoxName":row[0],
                            //"TextBoxID":row[1],
                            "txtAConstant":"118.80",
                            "txtAL":row[1],
                            "txtK1":row[3],
                            "txtK2":row[5],
                            "txtACD":row[2],
                            "txtRefraction":"0",
                            "txtLT":row[10],
                            //"txtCCT":row[9],
                            "IOL":row[11],
                            "Ref_PostOP":row[12],
                        }

                /*
                for k,v := range DataMap{
                    fmt.Println(k,v)
                }
                */
                chanDatamap <- DataMap
            }
    }
    //close(chanDatamap)
}

func run() {
    // Start a WebDriver server instance
    opts := []selenium.ServiceOption{
        //selenium.Output(os.Stderr),            // Output debug information to STDERR.
    }
    //selenium.SetDebug(true)
    selenium.SetDebug(false)
    service, err := selenium.NewChromeDriverService(chromeDriverPath, port, opts...)
    if err != nil {
        panic(err) // panic is used only as an example and is not otherwise recommended.
    }
    defer service.Stop()

    // Connect to the WebDriver instance running locally.
    caps := selenium.Capabilities{"browserName": "chrome"}
    wd, err := selenium.NewRemote(caps, fmt.Sprintf("http://localhost:%d/wd/hub", port))
    if err != nil {
        panic(err)
    }
    defer wd.Quit()

    // Navigate to the simple playground interface.
    // Navigate to the simple playground interface.
    err = wd.Get("https://www.evoiolcalculator.com/calculator.aspx")
    if err != nil {
      fmt.Println("get page faild", err.Error())
      //return
    }
   for DataMap := range chanDatamap{
        i, _ := strconv.Atoi(DataMap["num"])
        fmt.Printf("Processing Patient:%d\n",i-1)
        A_constant := EVO.Get_A_constant(wd, DataMap)
        A_constant_ :=strconv.FormatFloat(A_constant, 'f', 4, 64)
        
        lock.Lock()
        f, err := excelize.OpenFile("Data.xlsx")
        if err != nil {
            fmt.Println(err)
            return
        }
        f.SetCellValue("Sheet1", "N"+DataMap["num"], A_constant_) 
        fmt.Println("Optimized A_constant :" + A_constant_)
        err = f.Save()
        if err != nil {
            fmt.Println(err)
            os.Exit(1)
        }
        lock.Unlock()
        if i == len(chanDatamap){
            close(chanDatamap)
        }
    }
    wd.Quit()
    waitGroup.Done()
}

3.2 EVO.go

package EVO

import (
    "fmt"
    "strconv"
    //"time"
    "math"
    "strings"
    "github.com/tebeka/selenium"
)


func Find_Send(wd selenium.WebDriver, ID string, key string){
   btn, err := wd.FindElement(selenium.ByID, ID)
   if err != nil {
      //panic(err)
      fmt.Println(err)
   }
   err =  btn.Clear()
   if err != nil {
      //panic(err)
      fmt.Println(err)
   }
   err =  btn.SendKeys(key)
   if err != nil {
      //panic(err)
      fmt.Println(err)
   }
}

func ConvertStrSlice2Map(sl []string) map[string]struct{} {
    set := make(map[string]struct{}, len(sl))
    for _, v := range sl {
        set[v] = struct{}{}
    }
    return set
}


func InMap(m map[string]struct{}, s string) bool {
    _, ok := m[s]
    return ok
}

func FloatRound(f float64, n int) float64 {
    format := "%." + strconv.Itoa(n) + "f"
    res, _ := strconv.ParseFloat(fmt.Sprintf(format, f), 64)
    return res
}

func Iterate(wd selenium.WebDriver, A_constant float64,IOL string)(Ref float64){
   Back, err := wd.FindElement(selenium.ByID, "btnBack")
   if err != nil {
      //panic(err)
      fmt.Println(err)
   }
   if err := Back.Click(); err != nil {
        panic(err)
   }

   btn, err := wd.FindElement(selenium.ByID, "txtAConstant")
   if err != nil {
      //panic(err)
      fmt.Println(err)
   }
   err =  btn.Clear()
   if err != nil {
      //panic(err)
      fmt.Println(err)
   }
   err =  btn.SendKeys(strconv.FormatFloat(A_constant,'f', 3, 64))
   if err != nil {
      //panic(err)
      fmt.Println(err)
   }
   //time.Sleep(3 * time.Second)

   Calc, err := wd.FindElement(selenium.ByID, "btnCalculate")
   if err != nil {
      //panic(err)
      fmt.Println(err)
   }
   if err := Calc.Click(); err != nil {
        panic(err)
   }
   div,err :=wd.FindElement(selenium.ByCSSSelector, "#PnPred")
   if err != nil {
      //panic(err)
      fmt.Println(err)
   }
   t,err :=div.FindElement(selenium.ByCSSSelector, "tbody")
   if err != nil {
      //panic(err)
      fmt.Println(err)
   }
   Results,err :=t.Text()
   if err != nil {
     panic(err)
   }
   Power_Refs := strings.Split(Results,"\n")

   for i,Power_Ref := range Power_Refs{
       if i<=5 {
            continue
        } else if i<=10 {
            Power_Ref_:=strings.Split(strings.TrimSpace(Power_Ref)," ")
            Power_ := Power_Ref_[0]
            Ref_ := Power_Ref_[1]
            if Power_ == IOL{
                Ref,_ = strconv.ParseFloat(Ref_,64)
            }
        } 
   }
   return Ref 
}

func Ajust(wd selenium.WebDriver, A_constant float64,IOL string,Ref_Post float64, Ref float64)(float64, float64){
   A_constant = FloatRound(A_constant + Ref_Post - Ref,3)
   Ref = Iterate(wd, A_constant, IOL)
   return Ref, A_constant
}

func Micro_Ajust(wd selenium.WebDriver, A_constant float64, IOL string, _Ref float64, Ref float64,Step float64)(float64,float64, float64){
   A_constant =FloatRound(A_constant + Step,3)
   Ref = Iterate(wd, A_constant, IOL)
   //fmt.Println(_Ref,Ref)
   if _Ref > Ref{
    _Step := FloatRound(math.Abs(Step)/2,3)
    Step = _Step
    fmt.Println("Upaward!")
    //fmt.Println(Step)
   }else if _Ref < Ref{
    _Step := FloatRound(math.Abs(Step)/2,3)
    Step = - _Step
    fmt.Println("Downaward!")
    //fmt.Println(Step)
   }else{
    fmt.Println("Keep original direction!")
    //fmt.Println(Step)
   }
   //fmt.Println(Ref, A_constant, Step)
   fmt.Printf("Refraction (SE): %.3f A_constant: %.3f next step: %.3f\n", Ref, A_constant, Step)
   return Ref, A_constant, Step

}

func Micro_Ajust_UpAndDown(wd selenium.WebDriver, A_constant float64,IOL string, Ref float64)(float64){
    fmt.Println("Micro_Ajust_UpAndDown!")
    A_constant_max,A_constant_min :=A_constant,A_constant
    Ref0 :=Ref
    Step := 0.01
    for{
        _Ref := Ref
        Ref, A_constant_max, Step = Micro_Ajust(wd, A_constant_max,IOL, _Ref, Ref, Step) 
        if _Ref >Ref {
            break
        }
        
    }
    fmt.Println("A_constant_max:" +strconv.FormatFloat(A_constant_max, 'f', 3, 64))

    Ref = Ref0
    Step = -0.01
    for{
        _Ref := Ref
        Ref, A_constant_min, Step = Micro_Ajust(wd, A_constant_min,IOL,_Ref, Ref, Step)
        if _Ref < Ref {
            break
        }
    }
    fmt.Println("A_constant_min:" + strconv.FormatFloat(A_constant_min, 'f', 3, 64))
    A_constant = FloatRound ((A_constant_max+A_constant_min)/2,4)
    return A_constant
}

func Get_A_constant(wd selenium.WebDriver, DataMap map[string]string)(A_constant float64) {
   IOL := DataMap["IOL"]
   Ref_PostOP := DataMap["Ref_PostOP"]
   A_constant, _ = strconv.ParseFloat(DataMap["txtAConstant"],64)
   for k,v := range DataMap{
    switch k {
    case "IOL","Ref_PostOP","num":
        continue
    default:
        Find_Send(wd,k,v)
    }
   }
   //time.Sleep(3* time.Second)
   Calc, err := wd.FindElement(selenium.ByID, "btnCalculate")
   if err != nil {
      //panic(err)
      fmt.Println(err)
   }
   if err := Calc.Click(); err != nil {
        panic(err)
    }

   //time.Sleep(3* time.Second)
   div,err :=wd.FindElement(selenium.ByCSSSelector, "#PnPred")
   if err != nil {
      //panic(err)
      fmt.Println(err)
   }
   t,err :=div.FindElement(selenium.ByCSSSelector, "tbody")
   if err != nil {
      //panic(err)
      fmt.Println(err)
   }
   Results,err :=t.Text()
   if err != nil {
     panic(err)
   }
   //fmt.Println(Results)
   //time.Sleep(5* time.Second)
   Power_Refs := strings.Split(Results,"\n")
   //fmt.Println(len(Power_Refs))
   //fmt.Println(Power_Refs)
   Power_Refs_Map := map[string](string){}
   Powers := []string{}
   for i,Power_Ref := range Power_Refs{
       if i<=5 {
            continue
        } else if i<=10 {
            _Power_Ref:=strings.Split(strings.TrimSpace(Power_Ref)," ")
            //fmt.Println(_Power_Ref)
            Power := _Power_Ref[0]
            //fmt.Println(Power)
            Powers = append(Powers,Power)
            Ref:=_Power_Ref[1]
            Power_Refs_Map[Power] = Ref
            //fmt.Println(Ref)
        } 
   }
   /*
   for Power,Ref := range Power_Refs_Map{
    fmt.Println(Power,Ref)
   }
   */
   //fmt.Println(Powers)
   set := ConvertStrSlice2Map(Powers)
   if !InMap(set,IOL){
    fmt.Println("IOL not in Powers")
    Back, _ := wd.FindElement(selenium.ByID, "btnBack")
    if err := Back.Click(); err != nil {
        panic(err)
    }
    return 0
   }else{
        fmt.Printf("IOL in Powers:%s\n",IOL)
        fmt.Printf("Refraction post operation:%s\n",DataMap["Ref_PostOP"])
        Ref, _:= strconv.ParseFloat(Power_Refs_Map[IOL],64)
        Ref_Post, _ := strconv.ParseFloat(Ref_PostOP,64)
        //fmt.Println(Ref,Ref_Post)
        for {
                A_constant_ := FloatRound(A_constant + Ref_Post - Ref,3)
                //fmt.Println(A_constant_)
                if !(A_constant_ >=110 && A_constant_<=125){
                    fmt.Println("A_constant out of boundary!")
                    Back, _ := wd.FindElement(selenium.ByID, "btnBack")
                    if err := Back.Click(); err != nil {
                        panic(err)
                    }
                    return 0
                    break
                }else{
                    _Ref_D :=FloatRound(Ref_Post - Ref,3)
                    Ref, A_constant = Ajust(wd, A_constant,IOL,Ref_Post, Ref)
                    Ref_D := FloatRound(Ref_Post - Ref,3)
                    //fmt.Println(_Ref_D,Ref_D)
                    if math.Abs(Ref_D)<=0.02{
                        if Ref_D ==0 {
                            A_constant = Micro_Ajust_UpAndDown(wd, A_constant, IOL, Ref)
                            break
                        }else if _Ref_D*Ref_D<0 {

                            if Ref_D >0 {
                                fmt.Println("Micro_Ajust_Up")
                                Step := 0.01
                                for{
                                    _Ref := Ref
                                    _A_constant := A_constant
                                    Ref, A_constant, Step = Micro_Ajust(wd, A_constant,IOL, _Ref, Ref, Step)
                                    Ref_D = FloatRound(Ref_Post - Ref,2)
                                    if Ref_D ==0 {
                                        A_constant = Micro_Ajust_UpAndDown(wd, A_constant, IOL, Ref)
                                        break
                                    }
                                    if _Ref > Ref {
                                        fmt.Println(_A_constant,A_constant)
                                        A_constant = FloatRound ((_A_constant +A_constant)/2,4)
                                        break
                                    }
                                }
                                break
                            }
                            if Ref_D <0{
                                fmt.Println("Micro_Ajust_Down")
                                Step :=-0.01
                                for{
                                    _Ref := Ref
                                    _A_constant := A_constant
                                    Ref, A_constant, Step = Micro_Ajust(wd, A_constant,IOL, _Ref, Ref, Step)
                                    Ref_D = FloatRound(Ref_Post - Ref,2)
                                    if Ref_D ==0 {
                                        A_constant = Micro_Ajust_UpAndDown(wd, A_constant, IOL, Ref)
                                        break
                                    }
                                    if _Ref < Ref {
                                        fmt.Println(_A_constant,A_constant)
                                        A_constant = FloatRound ((_A_constant +A_constant)/2,4)
                                        break
                                    }
                                }
                                break
                            }
                        }
                    }
                }
            //time.Sleep(10* time.Second)
        }
        
    }
   //time.Sleep(15 * time.Second)
   //wd.Quit()
   Back, _ := wd.FindElement(selenium.ByID, "btnBack")
   if err := Back.Click(); err != nil {
        panic(err)
   }
   return A_constant
}

3.3 GetRefPlus.go

package main

import (
    "os"
    "fmt"
    "time"
    "sync"
    "strconv"
    "strings"
    "github.com/360EntSecGroup-Skylar/excelize"
    "github.com/tebeka/selenium"
)

const (
    chromeDriverPath = "./chromedriver"
    port             = 8080
)
var(
    chanDatamap         chan map[string]string
    waitGroup           sync.WaitGroup
    lock                sync.Mutex
)


func main(){
    var n int
    fmt.Println("Please input from where to start,default input is 0:")
    fmt.Scanln(&n)
    chanDatamap  = make(chan map[string]string, 200)
    go GetDataMap(n)
    for i := 0; i < 10; i++ {
        waitGroup.Add(1)
        go run()
    }
    waitGroup.Wait()
}


func GetDataMap(n int){
   // Get all the rows in the Sheet1.
   DataMap := make(map[string]string, 0)
   f, err := excelize.OpenFile("Data.xlsx")
   if err != nil {
        fmt.Println(err)
        return
    }
   rows, err := f.GetRows("Sheet1")
   for i, row := range rows {
            if i == 0 {
                f.SetCellValue("Sheet1", "R1", "Ref with A_constant Optimized ") 
                continue
            }else if i>=n{
                /*
                fmt.Println("Processing patient:")
                fmt.Println(i)
                */
                DataMap=map[string]string{
                            "num":strconv.Itoa(i+1),
                            "TextBoxName":row[0],
                            //"TextBoxID":row[1],
                            "txtAConstant":"118.68",
                            "txtAL":row[1],
                            "txtK1":row[3],
                            "txtK2":row[5],
                            "txtACD":row[2],
                            "txtRefraction":"0",
                            "txtLT":row[10],
                            //"txtCCT":row[9],
                            "IOL":row[11],
                            "Ref_PostOP":row[12],
                        }

                /*
                for k,v := range DataMap{
                    fmt.Println(k,v)
                }
                */
                chanDatamap <- DataMap
            }
    }
    //close(chanDatamap)
}

func run() {
    // Start a WebDriver server instance
    opts := []selenium.ServiceOption{
        //selenium.Output(os.Stderr),            // Output debug information to STDERR.
    }
    //selenium.SetDebug(true)
    selenium.SetDebug(false)
    service, err := selenium.NewChromeDriverService(chromeDriverPath, port, opts...)
    if err != nil {
        panic(err) // panic is used only as an example and is not otherwise recommended.
    }
    defer service.Stop()

    // Connect to the WebDriver instance running locally.
    caps := selenium.Capabilities{"browserName": "chrome"}
    wd, err := selenium.NewRemote(caps, fmt.Sprintf("http://localhost:%d/wd/hub", port))
    if err != nil {
        panic(err)
    }
    defer wd.Quit()

    // Navigate to the simple playground interface.
    // Navigate to the simple playground interface.
    err = wd.Get("https://www.evoiolcalculator.com/calculator.aspx")
    if err != nil {
      fmt.Println("get page faild", err.Error())
      //return
    }
    time.Sleep(5*time.Second)
    for DataMap := range chanDatamap{
        Ref := Get_Ref(wd, DataMap)
        lock.Lock()
        f, err := excelize.OpenFile("Data.xlsx")
        if err != nil {
            fmt.Println(err)
            return
        }
        //fmt.Printf("Processing Patient:%d\n",i-1)
        f.SetCellValue("Sheet1", "R"+DataMap["num"], Ref) 
        fmt.Println("Ref with A_constant Optimized :" + Ref)
        err = f.Save()
        if err != nil {
            fmt.Println(err)
            os.Exit(1)
        }
        lock.Unlock()
    }
    wd.Quit()
    waitGroup.Done()
}




func Find_Send(wd selenium.WebDriver, ID string, key string){
   btn, err := wd.FindElement(selenium.ByID, ID)
   if err != nil {
      //panic(err)
      fmt.Println(err)
   }
   err =  btn.Clear()
   if err != nil {
      //panic(err)
      fmt.Println(err)
   }
   err =  btn.SendKeys(key)
   if err != nil {
      //panic(err)
      fmt.Println(err)
   }
}

func ConvertStrSlice2Map(sl []string) map[string]struct{} {
    set := make(map[string]struct{}, len(sl))
    for _, v := range sl {
        set[v] = struct{}{}
    }
    return set
}


func InMap(m map[string]struct{}, s string) bool {
    _, ok := m[s]
    return ok
}


func Get_Ref(wd selenium.WebDriver, DataMap map[string]string)(Ref string) {
    IOL := DataMap["IOL"]
    for k,v := range DataMap{
        switch k {
        case "IOL","Ref_PostOP","num":
            continue
        default:
            Find_Send(wd,k,v)
        }
    }
   //time.Sleep(15*time.Second)
   Calc, err := wd.FindElement(selenium.ByID, "btnCalculate")
   if err != nil {
      //panic(err)
      fmt.Println(err)
   }
   if err := Calc.Click(); err != nil {
        panic(err)
    }

   //time.Sleep(3* time.Second)
   div,err :=wd.FindElement(selenium.ByCSSSelector, "#PnPred")
   if err != nil {
      //panic(err)
      fmt.Println(err)
   }
   t,err :=div.FindElement(selenium.ByCSSSelector, "tbody")
   if err != nil {
      //panic(err)
      fmt.Println(err)
   }
   Results,err :=t.Text()
   if err != nil {
     panic(err)
   }
   //fmt.Println(Results)
   //time.Sleep(5* time.Second)
   Power_Refs := strings.Split(Results,"\n")
   //fmt.Println(len(Power_Refs))
   //fmt.Println(Power_Refs)
   Power_Refs_Map := map[string](string){}
   Powers := []string{}
   for i,Power_Ref := range Power_Refs{
       if i<=5 {
            continue
        } else if i<=10 {
            _Power_Ref:=strings.Split(strings.TrimSpace(Power_Ref)," ")
            //fmt.Println(_Power_Ref)
            Power := _Power_Ref[0]
            //fmt.Println(Power)
            Powers = append(Powers,Power)
            Ref:=_Power_Ref[1]
            Power_Refs_Map[Power] = Ref
            //fmt.Println(Ref)
        } 
   }
   /*
   for Power,Ref := range Power_Refs_Map{
    fmt.Println(Power,Ref)
   }
   */
   //fmt.Println(Powers)
   set := ConvertStrSlice2Map(Powers)
   if !InMap(set,IOL){
    fmt.Println("IOL not in Powers")
    Back, _ := wd.FindElement(selenium.ByID, "btnBack")
    if err := Back.Click(); err != nil {
        panic(err)
    }
    return "---"
   }else{
        fmt.Printf("IOL in Powers:%s\n",IOL)
        Ref = Power_Refs_Map[IOL]
        Back, _ := wd.FindElement(selenium.ByID, "btnBack")
        if err := Back.Click(); err != nil {
            panic(err)
        }
        return Ref
    }
}

4. Kane

Kane公式在线计算网站反应慢得十分过分,并且对多线程运行有防范机制,这个没戏


  1. 项目下载链接1:https://gitee.com/niu_xiao_long/Optimize_A_constant ↩︎

  2. 项目下载链接2:https://github.com/Lemeilleurprince/Optimize_A_constant ↩︎

  3. 多线程为10线程并发,将看到10个浏览器同时运行,为了运行的稳定型,通道常开,因此运行结束后并不会自动退出,请手动结束。GetRefPlus.go 为得到优化A常数后,用优化后的A常数的平均值代入在线计算器以计算每个晶体的预留度数,请自行修改对应的A常数值,同样是10线程 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值