#include <bits/stdc++.h>
#pragma GCC optimize(3, "Ofast", "inline")
#pragma GCC target("avx")
using namespace std;
template <class t>
inline t read(t &x) {
  char c = getchar();
  bool f = 0;
  x = 0;
  while (!isdigit(c)) f |= c == '-', c = getchar();
  while (isdigit(c)) x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
  if (f) x = -x;
  return x;
}
template <class t, class... A>
inline void read(t &x, A &...a) {
  read(x);
  read(a...);
}
template <class t>
inline void write(t x) {
  if (x < 0)
    putchar('-'), write(-x);
  else {
    if (x > 9) write(x / 10);
    putchar('0' + x % 10);
  }
}
const int mod = 1e9 + 7, N = 4e5 + 5;
int n, inv[N], fac[N], ifac[N], a[N], b[N], ans;
char s[N];
int C(int n, int m) { return 1ll * fac[n] * ifac[m] % mod * ifac[n - m] % mod; }
signed main() {
  scanf("%s", s + 1);
  n = strlen(s + 1);
  fac[0] = ifac[0] = inv[1] = 1;
  for (int i = 2; i <= n + n; i++)
    inv[i] = 1ll * (mod - mod / i) * inv[mod % i] % mod;
  for (int i = 1; i <= n + n; i++)
    fac[i] = 1ll * fac[i - 1] * i % mod,
    ifac[i] = 1ll * ifac[i - 1] * inv[i] % mod;
  for (int i = 1; s[i]; i++) a[i] = a[i - 1] + (s[i] == '(');
  for (int i = n; i; i--) b[i] = b[i + 1] + (s[i] == ')');
  for (int i = 1; i <= n; i++)
    if (s[i] == '(') ans = (ans + C(a[i] + b[i] - 1, a[i])) % mod;
  write(ans);
}
