def makeDayLists (paramIndex):
  dayLists = []
  for i in range (2):
    days = ambient.Days (os.path.join (args.indirs [i].path, ambient.parameterBasenames [paramIndex] + ".orig"), args.start_date, args.stop_date)
    dayList = ambient.dayListFromRange (days, args.indirs [i].startDate, args.indirs [i].stopDate)
    dayLists.append (dayList)
  return dayLists
def plotSensorSeeingPC (which):
  days = seeing [which]
  allDays = allSeeing [which]
  siteRange = args.indirs [which]

  yTicks = []
  correlationsArray = []
  for p in ambient.parameterBasenames [1:]:
    otherDays = ambient.Days (os.path.join (siteRange.path, p + ".orig"), args.start_date, args.stop_date)
    otherDays.setGoodness (allDays)
    yTicks.append (p)
    dayList = ambient.dayListFromRange (otherDays, siteRange.startDate, siteRange.stopDate)
    correlations = ambient.goodCorrelate (days, dayList, args.min_points)
    correlationsArray.append (correlations)

  ambient.plotSensorSeeingPC (os.path.join (args.outdir, "pc-seeing+all-{}.pdf").format (siteRange.name),
                              correlationsArray, yTicks, days,
                              args.indirs [which].name)
def makeHistogram (paramIndex):

  filename = "sites-" + ambient.parameterNames [paramIndex].translate (str.maketrans (" ", "-")) + ".histogram.pdf"
  filename = filename.lower ()
  title = "Normalized " + ambient.parameterNames [paramIndex]

  #get a list of seeing days, 1 Days object for each site
  sites = []
  for siteRange in args.indirs:
    sites.append (ambient.Days (os.path.join (siteRange.path, ambient.parameterBasenames [paramIndex] + ".orig"), args.start_date, args.stop_date))


  pages = PdfPages (os.path.join (args.outdir, filename))
  fig = plt.figure ()
  ax = fig.add_subplot (1, 1, 1)
  ax.set_color_cycle (['b','r','g','m','c','y'])
  datasets = []
  labels = []

  #for each site, add a list of values to "datasets"
  #also make a corresponding list of labels based on site dir names
  for site, siteRange in zip (sites, [siteRange for siteRange in args.indirs]):
    labels.append (siteRange)
    datasets.append ([])
    dayList = ambient.dayListFromRange (site, siteRange.startDate, siteRange.stopDate)
    for day in dayList:
      if day:
        func = day.periodFilter (args.start_minutes * 60, args.stop_minutes * 60, args.past_midnight)
        filtered = filter (func, day.measurements)
        datasets [-1].extend ([m [1] for m in filtered])

  ax.hist (datasets, bins=args.num_bins, label=labels, normed=1)

  ax.set_title (title.title ())
  ax.set_xlabel (ambient.paramLabel (paramIndex))
  ax.legend ()

  pages.savefig (fig)
  plt.close (fig)
  pages.close ()
#parse user's command line arguments
args = parser.parse_args ()

#make sure the output directory exists
utils.makeDir (args.outdir)

#get list of all seeing days
allSeeingDays = ambient.Days (os.path.join (args.indir, ambient.parameterBasenames [0] + ".orig"), args.start_date, args.stop_date)

#scripts need start/stop dates now
#assert args.start_date

#if start-date/stop-date is specified on command line, only look at a subset of days
if args.start_date:
  seeingDays = ambient.dayListFromRange (allSeeingDays, args.start_date, args.stop_date)
else:
  seeingDays = allSeeingDays.days


def seeingCorrelations (seeingDays, otherDays):
  """
  :param seeingDays: a list of Day objects for seeing
  :param otherDays: a list of Day objects for some sensor
  :return: correlation list of 3-tuples of pc's
  """
  correlations = ambient.crossCorrelate (seeingDays, otherDays, args.start_minutes*60, args.stop_minutes*60, args.past_midnight, args.min_points)

  #this is a 3-tuple (day, otherDay, pc), day is in seeingDays, otherDay is in otherDays

  #remove rows with nonsense pc values
  return days

#make lists of all seeing days for each site and subranges of days we are interested in
#see if any of the date ranges is for a leap year so we can pad any non leap year ranges
#with a fake leap day
allSeeing = []
seeing = []
leapYear = False
for i in range (2):
  allSeeing.append (getSeeingDays (i))
  if allSeeing [-1].isLeapYear ():
    leapYear = True

for i in range (2):
  dayList = ambient.dayListFromRange (allSeeing [i], args.indirs [i].startDate, args.indirs [i].stopDate, leapYear=leapYear)
  seeing.append (dayList)


# 1e. calculate PC for each day. Sort from highest to lowest PC
#make a list of (day0, day1, pc)
#day0 is never None but day1 can be None whenever it's lacking a day that site0 has
#pc values > 1.0 mean nonsense, including not enough matching points
correlations = ambient.goodCorrelate (seeing [0], seeing [1], args.min_points)

#sort on pc
correlations = sorted (correlations, key=lambda x: x[2], reverse=not args.worst)
def writeCorr (out, c):
  day0 = c [0]
  day1 = c [1]
  if not day0: