text:
package alluxio.master.file.activesync;

import alluxio.AlluxioURI;
import alluxio.Configuration;
import alluxio.ProcessUtils;
import alluxio.PropertyKey;
import alluxio.SyncInfo;
import alluxio.exception.ExceptionMessage;
import alluxio.exception.InvalidPathException;
import alluxio.heartbeat.HeartbeatContext;
import alluxio.heartbeat.HeartbeatThread;
import alluxio.master.file.FileSystemMaster;
import alluxio.master.file.meta.MountTable;
import alluxio.master.journal.JournalContext;
import alluxio.master.journal.JournalEntryIterable;
import alluxio.master.journal.JournalEntryReplayable;
import alluxio.proto.journal.File;
import alluxio.proto.journal.File.AddSyncPointEntry;
import alluxio.proto.journal.File.RemoveSyncPointEntry;
import alluxio.proto.journal.Journal;
import alluxio.resource.CloseableResource;
import alluxio.resource.LockResource;
import alluxio.retry.RetryUtils;
import alluxio.underfs.UnderFileSystem;
import alluxio.util.io.PathUtils;
import alluxio.wire.SyncPointInfo;

import com.google.common.collect.Iterators;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.annotation.concurrent.NotThreadSafe;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.function.Supplier;

/**
 * Manager for the Active UFS sync process.
 */
@NotThreadSafe
public class ActiveSyncManager implements JournalEntryIterable, JournalEntryReplayable {
  private static final Logger LOG = LoggerFactory.getLogger(ActiveSyncManager.class);
  // a reference to the mount table
  private final MountTable mMountTable;
  // a list of sync points
  private final List<AlluxioURI> mSyncPathList;
  // a map which maps mount id to a thread polling that UFS
  private final Map<Long, Future<?>> mPollerMap;
  //  a map which maps each mount id to a list of paths being actively synced on mountpoint
  private final Map<Long, List<AlluxioURI>> mFilterMap;
  // a map which maps mount id to the latest txid synced on that mount point
  private final Map<Long, Long> mStartingTxIdMap;
  // Future.isDone = INITIALLY_SYNCED, !Future.isDone = SYNCING
  // Future == null => NOT_INITIALLY_SYNCED
  private final Map<AlluxioURI, Future<?>> mSyncPathStatus;
  // a lock which protects the above data structures
  private final Lock mSyncManagerLock;
  // a reference to FSM
  private FileSystemMaster mFileSystemMaster;
  // a local executor service used to launch polling threads
  private ExecutorService mExecutorService;

  /**
   * Constructs a Active Sync Manager.
   *
   * @param mountTable mount table
   * @param fileSystemMaster file system master
   */
  public ActiveSyncManager(MountTable mountTable,
      FileSystemMaster fileSystemMaster) {

    mMountTable = mountTable;
    mPollerMap = new ConcurrentHashMap<>();
    mFilterMap = new ConcurrentHashMap<>();
    mStartingTxIdMap = new ConcurrentHashMap<>();
    mSyncPathList = new CopyOnWriteArrayList<>();
    mFileSystemMaster = fileSystemMaster;
    mSyncPathStatus = new ConcurrentHashMap<>();

    // A lock used to protect the state stored in the above maps and lists
    mSyncManagerLock = new ReentrantLock();
    // Executor Service for active syncing
    mExecutorService =
        Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
  }

  /**
   * Check if a URI is actively synced.
   *
   * @param path path to check
   * @return true if a URI is being actively synced
   */
  public boolean isActivelySynced(AlluxioURI path) {
    for (AlluxioURI syncedPath : mSyncPathList) {
      try {
        if (PathUtils.hasPrefix(path.getPath(), syncedPath.getPath())) {
          return true;
        }
      } catch (InvalidPathException e) {
        return false;
      }
    }
    return false;
  }

  /**
   * Gets the lock protecting the syncManager.
   *
   * @return syncmanager lock
   */
  public Lock getSyncManagerLock() {
    return mSyncManagerLock;
  }

  /**
   * start the polling threads.
   *
   */
  public void start() throws IOException {
    // Initialize UFS states
    for (AlluxioURI syncPoint : mSyncPathList) {

      MountTable.Resolution resolution = null;
      long mountId = 0;
      try {
        resolution = mMountTable.resolve(syncPoint);
        mountId = resolution.getMountId();
      } catch (InvalidPathException e) {
        LOG.info("Invalid Path encountered during start up of ActiveSyncManager, "
            + "path {}, exception {}", syncPoint, e);
        continue;
      }

      try (CloseableResource<UnderFileSystem> ufsResource = resolution.acquireUfsResource()) {
        if (!ufsResource.get().supportsActiveSync()) {
          throw new UnsupportedOperationException("Active Sync is not supported on this UFS type: "
              + ufsResource.get().getUnderFSType());
        }
        ufsResource.get().startSync(resolution.getUri());
      }
    }
    // attempt to restart from a past txid, if this fails, it will result in MissingEventException
    // therefore forces a sync
    for (long mountId: mFilterMap.keySet()) {
      long txId = mStartingTxIdMap.containsKey(mountId)
          ? mStartingTxIdMap.get(mountId) : SyncInfo.INVALID_TXID;
      launchPollingThread(mountId, txId);

      try {
        if ((txId == SyncInfo.INVALID_TXID)
            && Configuration.getBoolean(PropertyKey.MASTER_ACTIVE_UFS_SYNC_INITIAL_SYNC)) {
          mExecutorService.submit(
              () -> mFilterMap.get(mountId).parallelStream().forEach(
                  syncPoint -> {
                    try {
                      RetryUtils.retry("active sync during start",
                          () -> mFileSystemMaster.activeSyncMetadata(syncPoint,
                              null, getExecutor()),
                          RetryUtils.defaultActiveSyncClientRetry());
                    } catch (IOException e) {
                      LOG.warn("IOException encountered during active sync while starting {}", e);
                    }
                  }
          )).get();
        }
      } catch (Exception e) {
        LOG.warn("exception encountered during initial sync {}", e);
      }
    }
  }

  /**
   * Launches polling thread on a particular mount point with starting txId.
   *
   * @param mountId launch polling thread on a mount id
   * @param txId specifies the transaction id to initialize the pollling thread
   */
  public void launchPollingThread(long mountId, long txId) {
    if (!mPollerMap.containsKey(mountId)) {
      try (CloseableResource<UnderFileSystem> ufsClient =
               mMountTable.getUfsClient(mountId).acquireUfsResource()) {
        ufsClient.get().startActiveSyncPolling(txId);
      } catch (IOException e) {
        LOG.warn("IO Exception trying to launch Polling thread {}", e);
      }
      ActiveSyncer syncer = new ActiveSyncer(mFileSystemMaster, this, mMountTable, mountId);
      Future<?> future = getExecutor().submit(
          new HeartbeatThread(HeartbeatContext.MASTER_ACTIVE_UFS_SYNC,
              syncer,
              (int) Configuration.getMs(PropertyKey.MASTER_ACTIVE_UFS_SYNC_INTERVAL)));
      mPollerMap.put(mountId, future);
    }
  }

  /**
   * Apply AddSyncPoint entry and journal the entry.
   *  @param context journal context
   * @param entry addSyncPoint entry
   */
  public void applyAndJournal(Supplier<JournalContext> context, AddSyncPointEntry entry) {
    try {
      apply(entry);
      context.get().append(Journal.JournalEntry.newBuilder().setAddSyncPoint(entry).build());
    } catch (Throwable t) {
      ProcessUtils.fatalError(LOG, t, "Failed to apply %s", entry);
      throw t; // fatalError will usually system.exit
    }
  }

  /**
   * Apply removeSyncPoint entry and journal the entry.
   * @param context journal context
   * @param entry removeSyncPoint entry
   */
  public void applyAndJournal(Supplier<JournalContext> context, RemoveSyncPointEntry entry) {
    try {
      apply(entry);
      context.get().append(Journal.JournalEntry.newBuilder().setRemoveSyncPoint(entry).build());
    } catch (Throwable t) {
      ProcessUtils.fatalError(LOG, t, "Failed to apply %s", entry);
      throw t; // fatalError will usually system.exit
    }
  }

  /**
   * stop active sync on a mount id.
   *
   * @param mountId mountId to stop active sync
   */
  public void stopSyncForMount(long mountId) throws InvalidPathException, IOException {
    if (mFilterMap.containsKey(mountId)) {
      for (AlluxioURI uri : mFilterMap.get(mountId)) {
        MountTable.Resolution resolution = resolveSyncPoint(uri);
        if (resolution != null) {
          stopSyncInternal(uri, resolution);
        }
      }
    }
  }

  /**
   * Perform various checks of stopping a sync point.
   *
   * @param syncPoint sync point to stop
   * @return the path resolution result if successfully passed all checks
   */
  public MountTable.Resolution resolveSyncPoint(AlluxioURI syncPoint) throws InvalidPathException {
    if (!mSyncPathList.contains(syncPoint)) {
      LOG.debug("syncPoint not found {}", syncPoint.getPath());
      return null;
    }
    MountTable.Resolution resolution = mMountTable.resolve(syncPoint);
    return resolution;
  }
  /**
   * stop active sync on a URI.
   *
   * @param syncPoint sync point to be stopped
   * @param resolution path resolution for the sync point
   */
  public void stopSyncInternal(AlluxioURI syncPoint, MountTable.Resolution resolution) {
    try (LockResource r = new LockResource(mSyncManagerLock)) {
      LOG.debug("stop syncPoint {}", syncPoint.getPath());
      RemoveSyncPointEntry removeSyncPoint = File.RemoveSyncPointEntry.newBuilder()
          .setSyncpointPath(syncPoint.toString())
          .setMountId(resolution.getMountId())
          .build();
      apply(removeSyncPoint);
      try {
        stopSyncPostJournal(syncPoint);
      } catch (Throwable e) {
        // revert state;
        AddSyncPointEntry addSyncPoint =
            File.AddSyncPointEntry.newBuilder()
                .setSyncpointPath(syncPoint.toString()).build();
        apply(addSyncPoint);
        recoverFromStopSync(syncPoint, resolution.getMountId());
      }
    }
  }

  /**
   * Get the filter list associated with mount Id.
   *
   * @param mountId mountId
   * @return a list of URIs (sync points) associated with that mount id
   */
  public List<AlluxioURI> getFilterList(long mountId) {
    return mFilterMap.get(mountId);
  }

  /**
   * Get the sync point list.
   *
   * @return a list of URIs (sync points)
   */
  public List<SyncPointInfo> getSyncPathList() {
    List<SyncPointInfo> returnList = new ArrayList<>();
    for (AlluxioURI uri: mSyncPathList) {
      SyncPointInfo.SyncStatus status;
      Future<?> syncStatus = mSyncPathStatus.get(uri);
      if (syncStatus == null) {
        status = SyncPointInfo.SyncStatus.NOT_INITIALLY_SYNCED;
      } else if (syncStatus.isDone()) {
        status = SyncPointInfo.SyncStatus.INITIALLY_SYNCED;
      } else {
        status = SyncPointInfo.SyncStatus.SYNCING;
      }
      returnList.add(new SyncPointInfo(uri, status));
    }
    return returnList;
  }

  private Iterator<Journal.JournalEntry> getSyncPathIterator() {
    final Iterator<AlluxioURI> it = mSyncPathList.iterator();
    return new Iterator<Journal.JournalEntry>() {
      private AlluxioURI mEntry = null;

      @Override
      public boolean hasNext() {
        if (mEntry != null) {
          return true;
        }
        if (it.hasNext()) {
          mEntry = it.next();
          return true;
        }
        return false;
      }

      @Override
      public Journal.JournalEntry next() {
        if (!hasNext()) {
          throw new NoSuchElementException();
        }
        String syncPointPath = mEntry.getPath();
        long mountId = -1;
        while (mountId == -1) {
          try {
            syncPointPath = mEntry.getPath();
            MountTable.Resolution resolution = mMountTable.resolve(mEntry);
            mountId = resolution.getMountId();
          } catch (InvalidPathException e) {
            LOG.info("Path resolution failed for {}, exception {}", syncPointPath, e);
            mEntry = null;
            if (!hasNext()) {
              throw new NoSuchElementException();
            }
          }
        }
        mEntry = null;

        File.AddSyncPointEntry addSyncPointEntry =
            File.AddSyncPointEntry.newBuilder()
                .setSyncpointPath(syncPointPath)
                .setMountId(mountId)
                .build();

        return Journal.JournalEntry.newBuilder().setAddSyncPoint(addSyncPointEntry).build();
      }

      @Override
      public void remove() {
        throw new UnsupportedOperationException(
            "ActiveSyncManager#Iterator#remove is not supported.");
      }
    };
  }

  @Override
  public boolean replayJournalEntryFromJournal(Journal.JournalEntry entry) {
    if (entry.hasAddSyncPoint()) {
      apply(entry.getAddSyncPoint());
      return true;
    } else if (entry.hasRemoveSyncPoint()) {
      apply(entry.getRemoveSyncPoint());
      return true;
    } else if (entry.hasActiveSyncTxId()) {
      File.ActiveSyncTxIdEntry activeSyncTxId = entry.getActiveSyncTxId();
      setTxId(activeSyncTxId.getMountId(), activeSyncTxId.getTxId());
      return true;
    }
    return false;
  }

  private void apply(RemoveSyncPointEntry removeSyncPoint) {
    AlluxioURI syncPoint = new AlluxioURI(removeSyncPoint.getSyncpointPath());
    long mountId = removeSyncPoint.getMountId();

    try (LockResource r = new LockResource(mSyncManagerLock)) {
      LOG.debug("stop syncPoint {}", syncPoint.getPath());

      if (mFilterMap.containsKey(mountId)) {
        List list = mFilterMap.get(mountId);
        if (list != null) {
          list.remove(syncPoint);
        }
        mSyncPathList.remove(syncPoint);
      } else {
        mSyncPathList.remove(syncPoint);
        // We should not be in this situation
        throw new RuntimeException(
            String.format("mountId for the syncPoint %s not found in the filterMap",
                syncPoint.toString()));
      }
    }
  }

  private void apply(AddSyncPointEntry addSyncPoint) {
    AlluxioURI syncPoint = new AlluxioURI(addSyncPoint.getSyncpointPath());
    long mountId = addSyncPoint.getMountId();

    LOG.debug("adding syncPoint {}", syncPoint.getPath());
    // Add the new sync point to the filter map
    if (mFilterMap.containsKey(mountId)) {
      mFilterMap.get(mountId).add(syncPoint);
    } else {
      ArrayList<AlluxioURI> list = new ArrayList<>();
      list.add(syncPoint);
      mFilterMap.put(mountId, list);
    }
    // Add to the sync point list
    mSyncPathList.add(syncPoint);
  }

  /**
   * Clean up tasks to stop sync point after we have journaled.
   *
   * @param syncPoint the sync point to stop
   * @throws InvalidPathException
   */
  public void stopSyncPostJournal(AlluxioURI syncPoint) throws InvalidPathException {
    MountTable.Resolution resolution = mMountTable.resolve(syncPoint);
    long mountId = resolution.getMountId();
    // Remove initial sync thread
    Future<?> syncFuture = mSyncPathStatus.remove(syncPoint);
    if (syncFuture != null) {
      syncFuture.cancel(true);
    }

    if (mFilterMap.get(mountId).isEmpty()) {
      // syncPoint removed was the last syncPoint for the mountId
      mFilterMap.remove(mountId);
      Future<?> future = mPollerMap.remove(mountId);
      if (future != null) {
        future.cancel(true);
      }
    }

    // Tell UFS to stop monitoring the path
    try (CloseableResource<UnderFileSystem> ufs = resolution.acquireUfsResource()) {
      ufs.get().stopSync(resolution.getUri());
    } catch (IOException e) {
      LOG.info("Ufs IOException for uri {}, exception is {}", syncPoint, e);
    }

    // Stop active sync polling on a particular UFS if it is the last sync point
    if (mFilterMap.containsKey(mountId) && mFilterMap.get(mountId).isEmpty()) {
      try (CloseableResource<UnderFileSystem> ufs = resolution.acquireUfsResource()) {
        ufs.get().stopActiveSyncPolling();
      } catch (IOException e) {
        LOG.warn("Encountered IOException when trying to stop polling thread {}", e);
      }
    }
  }

  private Iterator<Journal.JournalEntry> getTxIdIterator() {
    final Iterator<Map.Entry<Long, Long>> it = mStartingTxIdMap.entrySet().iterator();
    return new Iterator<Journal.JournalEntry>() {
      private Map.Entry<Long, Long> mEntry = null;

      @Override
      public boolean hasNext() {
        if (mEntry != null) {
          return true;
        }
        if (it.hasNext()) {
          mEntry = it.next();
          return true;
        }
        return false;
      }

      @Override
      public Journal.JournalEntry next() {
        if (!hasNext()) {
          throw new NoSuchElementException();
        }
        long mountId = mEntry.getKey();
        long txId = mEntry.getValue();
        mEntry = null;

        File.ActiveSyncTxIdEntry txIdEntry =
            File.ActiveSyncTxIdEntry.newBuilder().setMountId(mountId)
                .setTxId(txId).build();
        return Journal.JournalEntry.newBuilder().setActiveSyncTxId(txIdEntry).build();
      }

      @Override
      public void remove() {
        throw new UnsupportedOperationException(
            "ActiveSyncManager#Iterator#remove is not supported.");
      }
    };
  }

  @Override
  public Iterator<Journal.JournalEntry> getJournalEntryIterator() {
    return Iterators.concat(getSyncPathIterator(), getTxIdIterator());
  }

  /**
   * set the transaction id for a particular mountId.
   *
   * @param mountId mount id
   * @param txId transaction id
   */
  public void setTxId(long mountId, long txId) {
    mStartingTxIdMap.put(mountId, txId);
  }

  /**
   * Get SyncManager Executor.
   *
   * @return an executor for active syncing
   */
  public ExecutorService getExecutor() {
    return mExecutorService;
  }

  /**
   * Stop the sync manager.
   */
  public void stop() {
    for (long mountId : mFilterMap.keySet()) {
      try {
        stopSyncForMount(mountId);
      } catch (IOException e) {
        LOG.info("ActiveSyncManager stop: IOException stopping mountId {}, exception {}",
            mountId,  e);
      } catch (InvalidPathException e) {
        LOG.info("ActiveSyncManager stop: InvalidPathException stopping mountId {}, exception {}",
            mountId,  e);
      }
    }
  }

  private void startInitSync(AlluxioURI uri, MountTable.Resolution resolution) throws IOException {
    try (CloseableResource<UnderFileSystem> ufsResource = resolution.acquireUfsResource()) {
      Future<?> syncFuture = mExecutorService.submit(
          () -> {
            try {
              ufsResource.get().startSync(resolution.getUri());
            } catch (IOException e) {
              LOG.info(ExceptionMessage.FAILED_INITIAL_SYNC.getMessage(
                  resolution.getUri()), e);
            }
          });

      mSyncPathStatus.put(uri, syncFuture);
    }
    if (Configuration.getBoolean(PropertyKey.MASTER_ACTIVE_UFS_SYNC_INITIAL_SYNC)) {
      mFileSystemMaster.activeSyncMetadata(uri, null, getExecutor());
    }
  }

  /**
   * Continue to start sync after we have journaled the operation.
   *
   * @param uri the sync point that we are trying to start
   */
  public void startSyncPostJournal(AlluxioURI uri) throws InvalidPathException, IOException {
    MountTable.Resolution resolution = mMountTable.resolve(uri);
    startInitSync(uri, resolution);
    launchPollingThread(resolution.getMountId(), SyncInfo.INVALID_TXID);
  }

  /**
   * Recover from a stop sync operation.
   *
   * @param uri uri to stop sync
   * @param mountId mount id of the uri
   */
  public void recoverFromStopSync(AlluxioURI uri, long mountId) {
    if (mSyncPathStatus.containsKey(uri)) {
      // nothing to recover from, since the syncPathStatus still contains syncPoint
      return;
    }
    try {
      // the init sync thread has been removed, to reestablish sync, we need to sync again
      MountTable.Resolution resolution = mMountTable.resolve(uri);
      startInitSync(uri, resolution);
      launchPollingThread(resolution.getMountId(), SyncInfo.INVALID_TXID);
    } catch (Throwable t) {
      LOG.warn("Recovering from stop syncing failed {}", t);
    }
  }

  /**
   * Recover from start sync operation.
   *
   * @param uri uri to start sync
   * @param mountId mount id of the uri
   */
  public void recoverFromStartSync(AlluxioURI uri, long mountId) {
    // if the init sync has been launched, we need to stop it
    if (mSyncPathStatus.containsKey(uri)) {
      Future<?> syncFuture = mSyncPathStatus.remove(uri);
      if (syncFuture != null) {
        syncFuture.cancel(true);
      }
    }

    // if the polling thread has been launched, we need to stop it
    mFilterMap.remove(mountId);
    Future<?> future = mPollerMap.remove(mountId);
    if (future != null) {
      future.cancel(true);
    }
  }
}


text:
Burg Radboud () steht auf der östlichen Hafenseite im niederländischen Medemblik.

Geschichte
Floris V. von Holland unterwarf nach einem erfolgreichen Krieg
Westfriesland. Anschließend ließ er zur Sicherung seines Hoheitsgebietes, als Teil einer Burgenkette gegen die Westfriesen, unter anderem in Medemblik eine Burg erbauen. Burg Radboud wurde im Jahr 1282 in Auftrag gegeben. Das genaue Datum der Errichtung ist jedoch nicht bekannt. Der ursprüngliche Bauplan der Burg entsprach der Burg Muiderslot. Es wird angenommen, dass die Burg nach dem friesischen König Radbod benannt wurde. Dafür gibt es jedoch keine Beweise.

In späteren Jahren wurde die Zwingburg mehrfach belagert und diente zwischenzeitlich auch als Gefängnis. Während des Achtzigjährigen Krieges belagerte man die Burg in den Jahren 1572 und 1588. Ab dem 17. Jahrhundert verfiel die Burg. Später wurden Teile der Burg abgebrochen. Im Jahr 1889 wurde die Burg dem Staat übertragen. Dieser ließ die Anlage renovieren und rettete damit die Burg vor dem vollständigen Verfall. Von 1897 bis zum Jahr 1934 war in einem Burgsaal das Medembliker Amtsgericht untergebracht.

Nach Restaurierungen in den Jahren 1964 bis 1965 wurde in der Burg ein Museum eingerichtet. Von der anfänglichen Burg stehen noch zwei Wohnflügel, die besichtigt werden können. Zu sehen ist auch eine Ausstellung über das Leben der Westfriesen im Mittelalter und die Geschichte der Stadt und ihrer Burg.

Weblinks

 Offizielle Webseiten (niederländisch)

Einzelnachweise

Radboud
Museum in den Niederlanden
Bauwerk in Noord-Holland
Medemblik
Radboud
Gegründet 1965
Radboud
Kultur (Noord-Holland)
Bildung und Forschung in Noord-Holland
Organisation (Noord-Holland)

redpajama_set_name: RedPajamaWikipedia


Shop for womens backpacks online at Target. Free shipping on purchases over $35 and save 5% every day with your Target REDcard.
Shop for backpacks for girls online at Target. Free shipping on purchases over $35 and save 5% every day with your Target REDcard.


That is one sweet build.
Wowser! Very VERY nice build! I´m liking this!
Merc-57 replied to Merc-57's topic in Wanted!
Merc-57 posted a topic in Wanted!
Anglia 105E This is slightly going off topic but I've got the Amazon Volvo and a SAAB 96 from Air-Trax and like them both very much.


Part of my passion as a plastic surgeon in Flower Mound, Texas is in educating others about the medical specialty of cosmetic laser procedures (skin resurfacing, laser hair removal, etc.) and aesthetic injectables and fillers (Botox, Juvederm, etc.).
There has been a fast rise in the popularity of the use of non-invasive or minimally invasive cosmetic laser and injection procedures to help patients prevent and treat their concerns. Newer technology and techniques allow patients to treat their concerns more cost-effectively and conveniently with less downtime (possibly avoiding surgery). For the best results, it is critical that only practitioners who are highly trained perform these procedures. Unfortunately, patients who are looking for a place to receive these treatments often do not know the things to look for in a med spa. I hear too often from someone who has had a problem somewhere else, "I feel stupid, but I never thought this could hurt me or that a physician needed to be involved." Don't make the mistake of not knowing.
Most states require a medical doctor (MD, DO) not a "doctor of who knows what" to be highly trained and physically involved with each procedure, whether performing the procedure him/herself or supervising it.
Not all devices in one category (i.e. laser hair removal, etc.) are created equal. Some devices are cheap like 10K and others cost over 100K.
Some companies will sell these devices to anyone even if they have no formal training.
What is his/her training? What is his/her specialty?
How many times have they personally used the device or offered the treatment?
Have they had any problems or complications (if they say "never" than they are either lying or have not performed it enough to have at least a little issue/problem)?
Have they treated significant others, friends, family?
If it's not a doctor performing the treatment then ask: is that practitioner legally allowed to perform the procedure? Does he/she have the proper training, number of procedures?
What is his/her before/after care/instructions specific to this procedure?
Finally, if there is a problem, what would they do? Are they comfortable managing side effects and complications? Many of these issues end up being referred to plastic surgeons.
Remember to research and ask questions. Beware of extreme couponing or going cheap on these procedures. While many of the latest aesthetic spa procedures have incredible results, they can damage your skin if a properly trained and experienced specialist does not do them. I have several patients who are embarrassed that they price shopped, came to see me after having a problem or simply no result from a procedure. Don't take chances with your body and skin. Know the law, who is treating you and specifics about the procedure you are receiving.


Even though video crew members carried in bright lights, this vast chamber's 60-foot ceilings swallowed much of the illumination. Tumbling Creek runs through the room; it is fed by runoff from a nine-square-mile area.
Videographer Neil Rosenbaum captures video of light playing on water droplets as they fall from the cave roof and then echo when they hit the still pool below.
Springwater flows over a dam built early in the 1900s to generate hydroelectric power. The old turbine is on public display in the building to the right of the dam.


text:
Global Indianstory Photographer of the Year 2021, Pubarun Basu's lens evokes emotions, creates stellar imagery
Global Indian Exclusive
Global Indian Teens
Young Photographer
Photographer of the Year 2021, Pubarun Basu's lens evokes emotions, creates stellar imagery
Written by: Charu Thakur
(March 16, 2022) Crammed into a narrow alleyway in the backstreets of Kumortuli in North Kolkata, a sculptor is sculpting the face of goddess Durga ahead of Pujo. That stunning photo by young photographer Pubarun Basu speaks volumes of his love for the craft. Yet, it's only one among his many stellar photographs. Another photo turned the tide for this muse-seeking shutterbug – a 2020 photo titled No Escape from Reality that won him the Youth Photographer of the Year 2021 at the Sony World Photography Awards. Basu was the first Indian to achieve the feat. "My photo was selected among 3,30,000 entries from around 29 countries. It was a very humbling experience," the 20-year-old tells Global Indian in an interview.
Pubarun Basu
Snapshot happy
The 2001-born Kolkata lad got inclined towards photography at age four when he picked his first camera, thanks to his photographer father. Being in the company of the best of gadgets, the Bengali boy was fascinated by the dynamics of photography. That first DSLR camera he held, and the photo he clicked seemed to activate a passion that has only embellished itself. "I vividly remember my father handing me his camera. Since I had seen my dad click photos, I somehow managed to take a picture by imitation," says Pubarun who took his first photo at the Khoai Fair in Shantiniketan.
Seeing his father "in action all the time," he learnt the tricks of the trade. Getting access to a good DSLR so early, was a blessing that proved fortuitous. "I understood the tonality, correct exposure and framing. My father had a home lab where he would develop. In time, my taste evolved and so did my understanding of photography," says the English literature student at the University of Calcutta.
At age nine, he was gifted a Nikon point and shoot camera. "I began clicking photos of the birds in our vicinity – bulbuls, tailor birds, kingfishers, I'd capture them all on my lens," reminisces Pubarun who later got fascinated by street photography. "I love capturing sunsets and portraits. Over the years, I developed this style of photography, which has now become my signature," adds Pubarun.
A post shared by Pubarun (@pubarun.basu)
When he won the Youth Photographer of the Year 2021, it augured more acclaim. In July 2020, Pubarun submitted his award-winning photo – No Escape from Reality – (theme composition and design). "The brief was to look for an unfamiliar setting within a familiar setting, and what better place could it be than our home (during lockdown). One evening, I was in my parents' bedroom when I noticed sunlight seeping through the windows, and the iron rails created quite a stunning shadow. It gave the illusion of a cage. I asked my mom to stand behind the curtain, stretch out her hands to touch the curtain. The idea was to represent the feeling of being trapped in a moment, or in one's reality," says Pubarun who used a Nikon D800E for the shot.
No Escape from Reality by Pubarun Basu
All this gave his photography career a major boost. "Winning that title remains unmatched. It took me a while to let it sink in. Many aspiring photographers started approaching me to inquire about the process of selection for the title and my technique," gushes the young photographer who is "still in disbelief" that Sony exhibited his photo across the globe.
The urge to explore
The award-winning photo was exhibited in Japan, France, Switzerland, and Italy. Later, he bagged the Indica cultural photography grant 2021 to work on a project on the tribal communities of North-East India. "I pitched the idea as northeast is a hidden treasure and the tribes of that region haven't been explored much. Eight photographers from the country were selected for the project. I was the youngest," says Pubarun whose project will be published as a coffee table book soon.
The young photographer is keen to capture stories that create an impact. "I want my voice to be heard through my art. My photography has evolved with time, and I wish to put forth a constructive narrative," says the documentary filmmaker who took up online photography course from the Museum of Modern Art, New York during the lockdown, which he says was "an enriching experience."
A father's legacy
Basu loves Steve McCurry, Dorothea Lange, and Raghu Rai's oeuvre, yet, it's his father Pranab Basu who is his mentor. "I have learnt everything from him. Whatever I create, he is often the first person I show my work to. He is my biggest cheerleader and biggest critique," reveals Pubarun who has an equal support system in his homemaker mother. "She has been a shield, protecting me against the taunts of my relatives who questioned my unconventional line of work," says the young photographer.
Today, Pubarun, still so young, is a photographer to reckon with. "The idea to be original" he feels helped him set sail. He adds, "When you are young, you love to imitate the works of people you admire. But in the process, you start to live in their shadow. Creativity thrives when you have an individualistic style." Which he sure does.
For aspiring shutterbugs, he advices, "be open-minded and keep experimenting different styles before settling for one," yet he cautions not to get influenced by social media.
A movie buff, his creative spirit meanders into tabla playing, which he has been practising since he was six. Now, he plans to study photography abroad after graduation. "Photography is my passion and I want to pursue it as a career. My vision is to create a community of artists who do projects that speak about contemporary issues," adds Pubarun who is currently in Varanasi to shoot a musical documentary on the holy city.
Follow Pubarun Basu on Twitter and Instagram
Global Indian Youth
Indian Photographer
Indian Youth Photographer
Youth Photographer of the Year 2021
Published on 16, Mar 2022
Showing Ellen DeGeneres how it's done: Young chef Kicha's culinary adventures
How Indian teen scientist Snehadeep K started the world's first student-run space org & scientific journal

redpajama_set_name: RedPajamaCommonCrawl


text:
<?php

namespace IPS\core\extensions\core\GroupForm;

/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
	exit;
}

/**
 * Group Form: Core: Content
 */
class _Content
{
	/**
	 * Process Form
	 *
	 * @param	\IPS\Helpers\Form		$form	The form
	 * @param	\IPS\Member\Group		$group	Existing Group
	 * @return	void
	 */
	public function process( &$form, $group )
	{
		/* Uploading */
		if ( \IPS\Settings::i()->attach_allowed_types != 'none' )
		{
			$form->addHeader( 'uploads' );
			$form->add( new \IPS\Helpers\Form\YesNo( 'g_attach', ( $group->g_attach_max != 0 ), FALSE, array( 'togglesOn' => array( 'g_attach_max', 'g_attach_per_post', 'gbw_delete_attachments' ) ) ) );
			if( $group->g_id != \IPS\Settings::i()->guest_group )
			{
				$form->add( new \IPS\Helpers\Form\Number( 'g_attach_max', $group->g_attach_max, FALSE, array( 'unlimited' => -1 ), NULL, NULL, \IPS\Member::loggedIn()->language()->addToStack( 'filesize_raw_k' ), 'g_attach_max' ) );
			}
			$form->add( new \IPS\Helpers\Form\Number( 'g_attach_per_post', $group->g_attach_per_post, FALSE, array( 'unlimited' => 0 ), NULL, NULL, \IPS\Member::loggedIn()->language()->addToStack( 'filesize_raw_k' ), 'g_attach_per_post' ) );
			$form->add( new \IPS\Helpers\Form\YesNo( 'gbw_delete_attachments', $group->g_bitoptions['gbw_delete_attachments'], FALSE, array(), NULL, NULL, NULL, 'gbw_delete_attachments' ) );
		}

		/* Polls */
		if( $group->g_id != \IPS\Settings::i()->guest_group )
		{
			$form->addHeader( 'polls' );
			$form->add( new \IPS\Helpers\Form\YesNo( 'g_post_polls', $group->g_post_polls ) );
			$form->add( new \IPS\Helpers\Form\YesNo( 'g_vote_polls', $group->g_vote_polls ) );
		}

		/* Viewing */
		$form->addHeader( 'group_viewing_title' );

		$form->add( new \IPS\Helpers\Form\YesNo( 'gbw_post_highlight', $group->g_id ? $group->g_bitoptions['gbw_post_highlight'] : FALSE ) );

		/* Tags */
		$form->addHeader( 'tags' );

		if ( \IPS\Settings::i()->tags_enabled )
		{
			$form->add( new \IPS\Helpers\Form\YesNo( 'gbw_disable_tagging', $group->g_id ? !( $group->g_bitoptions['gbw_disable_tagging'] ) : TRUE ) );
			if ( \IPS\Settings::i()->tags_can_prefix )
			{
				$form->add( new \IPS\Helpers\Form\YesNo( 'gbw_disable_prefixes', $group->g_id ? !( $group->g_bitoptions['gbw_disable_prefixes'] ) : TRUE ) );
			}
		}

		/* Ratings */
		$form->addHeader('ratings');
		$form->add( new \IPS\Helpers\Form\YesNo( 'g_topic_rate_setting', $group->g_topic_rate_setting, FALSE, array( 'togglesOn' => array( 'g_topic_rate_change' ) ) ) );
		$form->add( new \IPS\Helpers\Form\YesNo( 'g_topic_rate_change', $group->g_topic_rate_setting == 2, FALSE, array(), NULL, NULL, NULL, 'g_topic_rate_change' ) );

		/* Editing */
		if( $group->g_id != \IPS\Settings::i()->guest_group )
		{
			$form->addHeader( 'group_editing' );
			$form->add( new \IPS\Helpers\Form\YesNo( 'g_edit_posts', $group->g_edit_posts, FALSE, array( 'togglesOn' => array( 'g_edit_cutoff', 'g_append_edit' ) ) ) );
			$form->add( new \IPS\Helpers\Form\Number( 'g_edit_cutoff', $group->g_edit_cutoff, FALSE, array( 'unlimited' => 0 ), NULL, \IPS\Member::loggedIn()->language()->addToStack('g_edit_cutoff_prefix'), \IPS\Member::loggedIn()->language()->addToStack('g_edit_cutoff_suffix'), 'g_edit_cutoff' ) );
			if ( \IPS\Settings::i()->edit_log )
			{
				$form->add( new \IPS\Helpers\Form\YesNo( 'g_append_edit', $group->g_append_edit, FALSE, array(), NULL, NULL, NULL, 'g_append_edit' ) );
			}
		}

		/* Deleting */
		if( $group->g_id != \IPS\Settings::i()->guest_group )
		{
			$form->addHeader( 'group_deleting' );
			$form->add( new \IPS\Helpers\Form\YesNo( 'gbw_soft_delete_own', $group->g_id ? ( $group->g_bitoptions['gbw_soft_delete_own'] ) : FALSE ) );
			$form->add( new \IPS\Helpers\Form\YesNo( 'g_delete_own_posts', $group->g_delete_own_posts ) );
		}

		/* Content Limits */
        if( $group->g_id != \IPS\Settings::i()->guest_group )
        {
            $form->addHeader( 'group_content_limits' );
            $form->add( new \IPS\Helpers\Form\Number( 'g_ppd_limit', $group->g_id ? $group->g_ppd_limit : 0, FALSE, array( 'unlimitedToggles' => array( 'g_ppd_unit' ), 'unlimited' => 0, 'unlimitedToggleOn' => FALSE ), NULL, NULL, \IPS\Member::loggedIn()->language()->addToStack('per_day') ) );
            $form->add( new \IPS\Helpers\Form\Custom( 'g_ppd_unit', array( ( $group->g_id ? $group->g_ppd_unit : 0 ), $group->g_bitoptions['gbw_ppd_unit_type'] ), FALSE, array( 'getHtml' => function( $element )
            {
                return \IPS\Theme::i()->getTemplate( 'members' )->postingLimits( $element->name, $element->value );
            } ), NULL, NULL, NULL, 'g_ppd_unit' ) );
        }

		/* Moderation */
		$form->addHeader( 'group_moderation' );
		$form->add( new \IPS\Helpers\Form\YesNo( 'gbw_no_report', !$group->g_bitoptions['gbw_no_report'] ) );
		$form->add( new \IPS\Helpers\Form\YesNo( 'g_avoid_flood', $group->g_avoid_flood ) );
		$form->add( new \IPS\Helpers\Form\YesNo( 'g_avoid_q', $group->g_avoid_q, FALSE, array( 'togglesOff' => array( 'g_mod_preview' ), 'toggleValue' => FALSE ) ) );
		$form->add( new \IPS\Helpers\Form\YesNo( 'g_mod_preview', $group->g_mod_preview, FALSE, array( 'togglesOn' => array( 'g_mod_post_unit' ) ), NULL, NULL, NULL, 'g_mod_preview' ) );
		$form->add( new \IPS\Helpers\Form\Custom( 'g_mod_post_unit', array( $group->g_mod_post_unit ? : 0, $group->g_bitoptions['gbw_mod_post_unit_type'] ), FALSE, array( 'getHtml' => function( $element )
		{
			return \IPS\Theme::i()->getTemplate( 'members' )->moderationLimits( $element->name, $element->value );
		} ), NULL, NULL, NULL, 'g_mod_post_unit' ) );
		$form->add( new \IPS\Helpers\Form\YesNo( 'g_bypass_badwords', $group->g_bypass_badwords ) );
	}

	/**
	 * Save
	 *
	 * @param	array				$values	Values from form
	 * @param	\IPS\Member\Group	$group	The group
	 * @return	void
	 */
	public function save( $values, &$group )
	{
		/* Posting limit */
        if( $group->g_id != \IPS\Settings::i()->guest_group )
        {
            $group->g_ppd_limit = $values['g_ppd_limit'];
            $group->g_ppd_unit = intval( $values['g_ppd_unit'][0] );
            $group->g_bitoptions['gbw_ppd_unit_type'] = $values['g_ppd_unit'][1];
        }

		/* Polls */
		if( $group->g_id != \IPS\Settings::i()->guest_group )
		{
			$group->g_post_polls = $values['g_post_polls'];
			$group->g_vote_polls = $values['g_vote_polls'];
		}

		/* Ratings */
		$group->g_topic_rate_setting = 0;
		if ( $values['g_topic_rate_setting'] )
		{
			if ( $values['g_topic_rate_change'] )
			{
				$group->g_topic_rate_setting = 2;
			}
			else
			{
				$group->g_topic_rate_setting = 1;
			}
		}

		/* If we can bypass the mod-queue, then the require approval setting is hidden so we need to turn that off */
		if( isset( $values['g_avoid_q'] ) AND $values['g_avoid_q'] )
		{
			$values['g_mod_preview'] = 0;
		}

		/* Mod Queue */
		$group->g_mod_post_unit = isset( $values['g_mod_post_unit'][2] ) ? 0 : $values['g_mod_post_unit'][0];
		$group->g_bitoptions['gbw_mod_post_unit_type'] = isset( $values['g_mod_post_unit'][2] ) ? 0 : $values['g_mod_post_unit'][1];

		/* Bitwise */
		$values['gbw_disable_tagging'] = \IPS\Settings::i()->tags_enabled ? !$values['gbw_disable_tagging'] : $group->g_bitoptions['gbw_disable_tagging'];
		$values['gbw_disable_prefixes'] = ( \IPS\Settings::i()->tags_enabled AND \IPS\Settings::i()->tags_can_prefix ) ? !$values['gbw_disable_prefixes'] : $group->g_bitoptions['gbw_disable_prefixes'];
		$values['gbw_no_report'] = !$values['gbw_no_report'];
		$bwKeys = array( 'gbw_disable_tagging', 'gbw_disable_prefixes', 'gbw_soft_delete_own', 'gbw_no_report', 'gbw_delete_attachments', 'gbw_post_highlight' );
		foreach ( $bwKeys as $k )
		{
			if ( isset( $values[ $k ] ) )
			{
				$group->g_bitoptions[ $k ] = $values[ $k ];
			}
		}

		/* Other */
		if ( !$values['g_attach'] )
		{
			$values['g_attach_max'] = 0;
		}
		if ( !isset( $values['g_attach_max'] ) )
		{
			$values['g_attach_max'] = -1;
		}
		$keys = array( 'g_attach_max', 'g_attach_per_post', 'g_edit_posts', 'g_edit_cutoff', 'g_append_edit', 'g_delete_own_posts', 'g_avoid_flood', 'g_avoid_q', 'g_mod_preview', 'g_bypass_badwords' );
		foreach ( $keys as $k )
		{
			if ( isset( $values[ $k ] ) )
			{
				$group->$k = $values[ $k ];
			}
		}
	}
}

redpajama_set_name: RedPajamaGithub


SHEPHERDSTOWN, WV — Shepherd University is hosting a college fair September 22-23 that will give high school students and their parents the opportunity to visit with representatives from about 50 institutions.
The annual West Virgina Association of Collegiate Registrars and Admissions Officers annual college tour comes to Shepherd's Wellness Center on September 22 from 6-8 p.m. and September 23 from 9-11 a.m.
Kristen Lorenz, Shepherd University director of admissions, said public and private four year colleges, two year colleges, and technical schools from across West Virginia and the region will be represented at the fair.
On the morning of September 23 about 1,400 students from high schools in Morgan, Berkeley, and Jefferson counties will be bussed to Shepherd to visit the fair. There's also an opportunity for the students to attend the evening before, and Lorenz said there are benefits to coming both days.
Lorenz said Monday evening is also a great time for high schools students who are not seniors, as well as home schooled students, to shop for a college.
Lorenz advises students and their parents to get the most out of attending the college fair by asking as many questions as possible and finding out when open houses are scheduled.
Be prepared with plenty of questions.
Print cards or mailing labels in advance with your address so you can hand those out if you're interested in hearing from a particular school.
Keep an open mind because there might be a college that you didn't think about that might have a great program for you.
Don't be afraid to ask questions and don't be shy; the admissions counselors are there to help you.
Relax a little bit. Deciding on a college can be stressful, but the admissions counselors are there to help you make it a little easier.
For more information about the college fair, contact Shepherd University's Office of Admissions at 304-876-5212.


text:
Products Home / Scientific Cameras / Camera Noise and Temperature Tutorial
Camera Noise and Temperature Tutorial
Camera Noise
Camera Noise and Temperature
When purchasing a camera, an important consideration is whether or not the application will require a cooled sensor. Generally, most applications have high signal levels and do not require cooling. However, for certain situations, generally under low light levels where long exposures are necessary, cooling will provide a benefit. In the tutorial below, we derive the following "rule of thumb": for exposures less than 1 second, a standard camera is generally sufficient; for exposures greater than 1 second, cooling could be beneficial; for exposures greater than 5 seconds, cooling is generally recommended; and for exposures above 10 seconds, cooling is usually required. If you have questions about which domain your application will fall, you might consider estimating the signal levels and noise sources by following the steps detailed in the tutorial below, where we present sample calculations using the specifications for our 1.4 megapixel cameras. Alternatively you can contact us, and one of our scientific camera specialists will help you decide which camera is right for you.
Sources of Noise
Noise in a camera image is the aggregate spatial and temporal variation in the measured signal, assuming constant, uniform illumination. There are several components of noise:
Dark Shot Noise (σD): Dark current is a current that flows even when no photons are incident on the camera. It is a thermal phenomenon resulting from electrons spontaneously generated within the silicon chip (valence electrons are thermally excited into the conduction band). The variation in the amount of dark electrons collected during the exposure is the dark shot noise. It is independent of the signal level but is dependent on the temperature of the sensor as shown in Table 1.
Read Noise (σR): This is the noise generated in producing the electronic signal. This results from the sensor design but can also be impacted by the design of the camera electronics. It is independent of signal level and temperature of the sensor, and is larger for faster CCD pixel clock rates.
Photon Shot Noise (σS): This is the statistical noise associated with the arrival of photons at the pixel. Since photon measurement obeys Poisson statistics, the photon shot noise is dependent on the signal level measured. It is independent of sensor temperature.
Fixed Pattern Noise (σF): This is caused by spatial non-uniformities of the pixels and is independent of signal level and temperature of the sensor. Note that fixed pattern noise will be ignored in the discussion below; this is a valid assumption for the CCD cameras sold here but may need to be included for other non-scientific-grade sensors.
Total Effective Noise
The total effective noise per pixel is the quadrature sum of each of the noise sources listed above:
Here, σD is the dark shot noise, σR is the read noise (for sample calculations, we will use our 1.4 megapixel cameras, which use the ICX285AL sensor. Typically the read noise is less than 10 e- for scientific-grade cameras using the ICX285AL CCD; we will assume a value of 10 e- in this tutorial), and σS is the photon shot noise. If σS>>σD and σS>>σR, then σeff is approximately given by the following:
Again, fixed pattern noise is ignored, which is a good approximation for scientific-grade CCDs but may need to be considered for non-scientific-grade sensors.
Dark Current (ID)
-20 °C 0.1 e-/(s•pixel)
0 °C 1 e-/(s•pixel)
25 °C 5 e-/(s•pixel)
Table 1: Nominal dark current values at several temperatures for a sample CCD sensor.
Figure 1: Plot of dark shot noise and read noise as a function of exposure for three sensor temperatures for a sample camera. This plot uses logarithmic scales for both axes.The dotted vertical line at 5 s indicates the values calculated as the example in the text.
Dark Shot Noise and Sensor Temperature
As mentioned above, the dark current is a thermal effect and can therefore be reduced by cooling the sensor. Table 1 lists typical dark current values for a sample camera with a CCD sensor. As the dark current results from spontaneously generated electrons, the dark current is measured by simply "counting" these electrons. Since counting electrons obeys Poisson statistics, the noise associated with the dark current ID is proportional to the square root of the number of dark electrons that accumulate during the exposure. For a given exposure, the dark shot noise, σD, is therefore the square root of the ID value from Table 1 (for a given sensor temperature) multiplied by the exposure time t in seconds:
Since the dark current decreases with decreasing temperature, the associated noise can be decreased by cooling the camera. For example, assuming an exposure of 5 seconds, the dark shot noise levels for the three sensor temperatures listed in the table are
Figure 1, which is a plot of the dark shot noise as a function of exposure for the three temperatures listed in Table 1, illustrates how the dark shot noise increases with increasing exposure. Figure 1 also includes a plot of the upper limit of the read noise.
If the photon shot noise is significantly larger than the dark shot noise, then cooling provides a negligible benefit in terms of the noise, and our standard package cameras will work well.
Photon Shot Noise
If S is the number of "signal" electrons generated when a photon flux of N photons/second is incident on each pixel of a sensor with a quantum efficiency QE and an exposure duration of t seconds, then
From S, the photon shot noise, σS, is given by:
Example Calculations (Using our 1.4 Megapixel Cameras)
If we assume that there is a sufficiently high photon flux and quantum efficiency to allow for a signal S of 10,000 e- to accumulate in a pixel with an exposure of 5 seconds, then the estimated shot noise, σS, would be the square root of 10,000, or 100 e-. The read noise is 10 e- (independent of exposure time). For an exposure of 5 seconds and sensor temperatures of 25, 0, and -25 °C, the dark shot noise is given in equation (4). The effective noise is:
The signal-to-noise ratio (SNR) is a useful figure of merit for image quality and is estimated as:
From Equation 7, the SNR values for the three sensor temperatures are:
As the example shows, there is a negligible benefit to using a cooled camera compared to a non-cooled camera operating at room temperature, and the photon shot noise is the dominant noise source in this example. In this case our standard package cameras should therefore work quite well.
However, if the light levels were lower such that a 100 second exposure was required to achieve 900 e- per pixel, then the shot noise would be 30 e-. The estimated dark shot noise would be 22.4 e- at 25 °C, while at -20 °C the dark shot noise would be 3.2 e-. The total effective noise would be
From Equation 8, the SNR values are
Camera Recommendation
<1 s Standard Non-Cooled Camera Generally Sufficient
1 s to 5 s Cooled Camera Could Be Helpful
5 s to 10 s Cooled Camera Recommended
>10 s Cooled Camera Usually Required
Table 2: From the results shown in Figure 1, these are the general "rule of thumb" recommendations related to colling considerations based on the exposure requirements of an application. Please keep in mind that some applications are more sensitive to noise than others.
In this example, the dark shot noise is a more significant contributor to the total noise for the 25 °C sensor than for the -25 °C sensor. Depending on the application's noise budget, a cooled camera may be beneficial.
Figure 2 shows plots of the different noise components, including dark shot noise at three sensor temperatures, as a function of exposure time for three photon fluxes. The plots show that dark shot noise is not a significant contributor to total noise except for low signal (and consequently long exposure) situations. While the photon flux levels used for the calculations are given in the figure, it is not necessary to know the exact photon flux level for your application. Figure 2 suggests a general metric based on exposure time that can be used to determine whether a cooled camera is required if the exposure time can be estimated, and these results are summarized in Table 2. If you find that your dominant source of noise is due to the read noise, then we recommend running the camera at a lower CCD pixel clock rate of 20 MHz, since that will offer a lower read noise.
Figure 2: Noise from all sources as a function of exposure for three different photon fluxes: (a) low, (b) medium, and (c) high. In (c) the signal and photon shot noise saturate above approximately 20 seconds because the pixel becomes saturated at the corresponding incident photon levels. A quantum efficiency of 60% was used for the calculations. Note that these plots use logarithmic scales for both axes.
Thermoelectric cooling should also be considered for long exposures even where the dark shot noise is not a significant contributor to total noise because cooling also helps to reduce the effects of hot pixels. Hot pixels cause a "star field" pattern that appears under long exposures. Figure 3 shows an example of this star field pattern for images taken using cameras with and without TEC cooling with an exposure of 10 seconds.
Figure 3: Images of the "star field" pattern that results from hot pixels using our (a) standard non-cooled camera and (b) our camera cooled to -20 °C. Both images were taken with an exposure of 10 seconds and with a gain of 32 dB (to make the hot pixels more visible). Please note that in order to show the pattern the images displayed here were cropped from the full-resolution 16 bit images. The full size 16 bit images may be downloaded here and viewed with software such as ImageJ, which is a free download.
4. Feedback On ALL PRODUCTSPresentation Feedback
Posted Comments:
Additional Scientific Cameras
Scientific Camera Selection Guide
2.1 MP sCMOS Compact Scientific Camera
2.3 MP CMOS Compact Scientific Cameras
5.0 MP CMOS Compact Scientific Polarization Camera
1.4 MP CCD Scientific Cameras
Fast Frame Rate, VGA CCD Scientific Cameras
General Purpose Cameras
Custom/OEM Scientific Cameras
Intro to Camera Terminology
Camera Noise Tutorial
Rotation Mount for Scientific Cameras
Two-Camera Mount for Microscopes