Remove pipeline_demo.py link

* util/pipeline_demo.py: Subject.
add height and wilting features, fixed window size
Propagate exceptions throughout the pipecomponents

When a component throws an exception we complete the pipeline by passing the
exception object instead of the normal return val. By default each component
will re-raise the exception. Components can intervene in the default behavior by
overriding the __chkExcept__ method.
* scripts/run-pipeline.py: We use the TimeStreamTraverser instead of TimeStream.
This allows for more control of the iteration. We now have access to the
timestamp that generates the next img instance.
* timestream/__init__.py (TimeStreamTraverser.__init__): New input argument
live_except. If true we check validity of img every time we try to
generate/access it.
(TimeStreamTraverser.curr): Now calls getImgByTimeStamp to execute command
(TimeStreamTraverser.getImgByTimeStamp): Checks for errors when live_except is
True. Note that when live_except is false we check for errors in __init__.
* timestream/manipulate/__init__.py: Moved all exception classes here.
(PCExBadConfig): New exception to be thrown when a configuration element is not
right.
(PCExBadContext): Thrown when a context element is not right.
* timestream/manipulate/pipecomponents.py (PipeComponent): Before we call
__exec__, we check to see if there is an exception and re-raise it.
(PipeComponent.__chkExcept__): New method that is called to check for existance
of exception in input args. This is the method that should be overloaded in case
a component needs to do something with the exception.
* timestream/manipulate/pipeline.py (process): We re-raise the exception that
was returned after running the whole pipeline.
Remove the "output to ndarray"

We are not using it and its becoming a pain to maintain in ResultFeatureWriter.
When we want to implement an alternative way of outputing features, we can
re-add it.
* timestream/manipulate/pipecomponents.py: Remove all ndarra output feature
logic.
Update image recalculation policy

We control the recalculation from a --recalculate cli option.
We differentiate between ignoring images becase they are already calculated and
just ignoring.

* scripts/run-pipeline.py (existing_ts): is now the only var that holds the list
of the calculated (existing) images.
* timestream/__init__.py (__init__, getImgByTimeStamp): Use the new exception
when we find an existing image.
* timestream/manipulate/__init__.py (PCExExistingImage): New Excpetion.
Merge glasshouse pipeline with latest pipeline, there's still error when using glasshouse
temporarily remove functions to calculate plant height and wilting
Add logic to recover previous CSV feature files.

* timestream/manipulate/pipecomponents.py (Resultingfeaturewriter.overwrite):
The default is not False.
(Resultingfeaturewriter._featFiles): New instance attribute that will hold the
csv paths for every feature name. It is a dictionary.
(Resultingfeaturewriter._prevCsvIndex): When we want to recover previous feature
values from old csv files we initiate a prevCsvIndex. It holds the timestamps
for every feature and the byte offset where they are located. _prevCsvIndex
allows us to index a large amount of feature data.
argNames, errStr)
(Resultingfeaturewriter._addErrStr): New Method that appends class.errStr to the
output file.
(Resultingfeaturewriter._recoverFromPrev): New method that recovers a specific
timestamp row from a previous feature csv file.
(Resultingfeaturewriter._initPrevCsvIndex): New method that initializes the
index dictionary used to keep the file offsets of previous features.
Implement __chkExcept__ at ResultingFeatureWriter

* timestream/__init__.py (getImgByTimeStamp): Remove debugging line.
* timestream/manipulate/pipecomponents.py(Resultingfeaturewriter._guessTimeStamp):
New method to guess a timestamp with a TimeStreamImage
(Resultingfeaturewriter.tsHName): Hard coded name for the column holding the
timestamps.
(ResultingFeatureWriter.__chkExcept__): New method to append data to feature
files when there is an exception in the pipeline.
Add audit file to CSV outputs.

* timestream/manipulate/pipecomponents.py
(Resultingfeaturewriter._appendToAudit): New method with logic to output to
audit file.
Merge remote-tracking branch 'joel/next' into next

Conflicts:
	timestream/manipulate/pipecomponents.py
add plant heights and wiltings
fix return type errors
Added intensity correction due to field view angle.
This requires field of view angles (fovx, fovy) calculated from
  fovx, fovy, focalLength, principalPoint, aspectRatio = \
    cv2.calibrationMatrixValues(np.asarray(self.cameraMatrix),
                                tuple(self.imageSize),
                                self.sensorSize[0],
                                self.sensorSize[1])
  where sensor size of Canon D700 is 22.3mm x 14.9mm
Remove origImg

* scripts/run-pipeline.py (img): We don't need origImg given that we pass a
TimeStreamImgage throughout the pipeline.
Refactor derandomization

Handling everything on a single table made the code too complex and error prone.
We now handle three tables: (i) a time stream table, (ii) a csv table and (iii)
a master table.
* util/derandui.py: Refactor in order to use three tables instead of one.
* util/derandui.ui: Likewise.
Use closest existing timestamp

* timestream/manipulate/pipecomponents.py (DerandomizeTimeStreams.refreshMids):
Subject
Add ability to see derandomized image.

* util/derandui.py (DerandomizeGui._showPrev): New method to show a preview of
the derandomization.
(PanZoomGraphicsView): Activate this class so we can pan and zoom the preview
image.
Allow netcdf4 versions equal or greter than 1.1.0

* setup.py (install_requires): Subject
Require absolute paths in TimeStream.

* timestream/__init__.py (TimeStream.{path,create}): We only accept absolute paths. The
change from relative to absolute should be done in the user interface code.