411 plot=dict(showFlags=False, showRejection=False)):
412
413 if not set:
414 set = psfexLib.Set(context)
415
416 cmin, cmax = None, None
417 if set.getNcontext():
418 cmin = np.empty(set.getNcontext())
419 cmax = np.empty(set.getNcontext())
420 for i in range(set.getNcontext()):
421 if set.getNsample():
422 cmin[i] = set.getContextOffset(i) - set.getContextScale(i)/2.0
423 cmax[i] = cmin[i] + set.getContextScale(i)
424 else:
425 cmin[i] = psfexLib.BIG
426 cmax[i] = -psfexLib.BIG
427
428
429
430 tab = afwTable.SourceCatalog.readFits(filename)
431
432 centroid = tab.getCentroidDefinition()
433 xm = tab.get("%s.x" % centroid)
434 ym = tab.get("%s.y" % centroid)
435
436 shape = tab.getShapeDefinition()
437 ixx = tab.get("%s.xx" % shape)
438 iyy = tab.get("%s.yy" % shape)
439
440 rmsSize = np.sqrt(0.5*(ixx + iyy))
441 elong = 0.5*(ixx - iyy)/(ixx + iyy)
442
443 flux = tab.get(prefs.getPhotfluxRkey())
444 fluxErr = tab.get(prefs.getPhotfluxerrRkey())
445 flags = getFlags(tab)
446
447
448
449
450 vigw, vigh = 35, 35
451 if set.empty():
452 set.setVigSize(vigw, vigh)
453
454 vignet = np.empty(nobj*vigw*vigh, "float32").reshape(nobj, vigw, vigh)
455
456
457 calexpFile = guessCalexp(filename)
458 mi = afwImage.MaskedImageF(calexpFile)
459 backnoise2 = np.median(mi.getVariance().getArray())
460 gain = 1.0
461
462 edgeBit = [k for k, v in getFlags().items() if v == "edge"][0]
463
464 for i, xc, yc in zip(range(nobj), xm, ym):
465 try:
466 x, y = int(xc), int(yc)
467 except ValueError:
468 flags[i] |= edgeBit
469
470 try:
471 pstamp = mi[x - vigw//2:x + vigw//2 + 1, y - vigh//2:y + vigh//2 + 1]
472 vignet[i] = pstamp.getImage().getArray().transpose()
473 except Exception:
474 flags[i] |= edgeBit
475
476
477 pc = 0
478 contextvalp = []
479 for i, key in enumerate(context.getName()):
480 if context.getPcflag(i):
481 contextvalp.append(pcval[pc])
482 pc += 1
483 elif key[0] == ':':
484 try:
485 contextvalp.append(tab.header[key[1:]])
486 except KeyError:
487 raise RuntimeError("*Error*: %s parameter not found in the header of %s" %
488 (key[1:], filename))
489 else:
490 try:
491 contextvalp.append(tab.get(key))
492 except KeyError:
493 raise RuntimeError("*Error*: %s parameter not found in the header of %s" %
494 (key, filename))
495 set.setContextname(i, key)
496
497
498 good = select_candidates(set, prefs, frmin, frmax,
499 flags, flux, fluxErr, rmsSize, elong, vignet,
500 plot=plot, title="%s[%d]" % (filename, ext + 1) if next > 1 else filename)
501
502
503
504 if not vignet.dtype.isnative:
505
506
507 vignet = vignet.byteswap()
508
509 for i in np.where(good)[0]:
510 sample = set.newSample()
511 sample.setCatindex(catindex)
512 sample.setExtindex(ext)
513
514 sample.setVig(vignet[i])
515 sample.setNorm(float(flux[i]))
516 sample.setBacknoise2(backnoise2)
517 sample.setGain(gain)
518 sample.setX(float(xm[i]))
519 sample.setY(float(ym[i]))
520 sample.setFluxrad(float(rmsSize[i]))
521
522 for j in range(set.getNcontext()):
523 sample.setContext(j, float(contextvalp[j][i]))
524
525 set.finiSample(sample, prefs.getProfAccuracy())
526
527
528 for j in range(set.getNcontext()):
529 cmin[j] = contextvalp[j][good].min()
530 cmax[j] = contextvalp[j][good].max()
531
532
533 if set.getNsample():
534 for i in range(set.getNcontext()):
535 set.setContextScale(i, cmax[i] - cmin[i])
536 set.setContextOffset(i, (cmin[i] + cmax[i])/2.0)
537
538
539 set.trimMemory()
540
541 return set
542
543