Chapter 3: Two-Dimensional Kinematics
Introduction
- Most motions in nature follow a curved path rather than a straight line.
- One-dimensional kinematics (such as those from Ch. 2) can easily be extended to two- and three-dimensional kinematics.
3-1 Kinematics in Two Dimensions
- Vector: a quantity with both magnitude (length) and direction (angle).
- Vectors can be used to describe the path of objects in two dimensions
- Example: one vector may show the horizontal component of motion, while another shows the vertical component.
- Two perpendicular vectors form a right angle. If we wish to find the straight-line path between the start and end points of these vectors, we can use the Pythagorean theorem.
- a2 + b2 = c2
- a and b are the magnitudes of the perpendicular vectors, while c is the magnitude of the hypotenuse.
- The horizontal and vertical components of motion are independent of each other, and neither affects the other
3-2 Vector Addition and Subtraction: Graphical Methods
- Given a vector V, its magnitude is represented by the variable in italics V and its direction is represented by θ.
- Adding vectors graphically: place all vectors head to tail, and draw the resultant vector.
- Subtracting vector graphically: subtracting a vector is like adding its negation. Negate the vectors that will be subtracted, then add all the vectors together by placing them head to tail and drawing the resultant vector.
- Vectors are often separated into their perpendicular component vectors to be analyzed.
3-3 Vector Addition and Subtraction: Analytical Methods
- Trigonometry is used to determine the magnitudes and directions of vectors
- Say there exists a vector, vector A, with direction θ. It is composed of two perpendicular vectors added together: its x-component (Ax) and its y-component (Ay).
- Magnitude of Ax: Ax = A cos θ
- Magnitude of Ay: Ay = A sin θ
- Magnitude of A: A2 = Ax2 + Ay2
- Direction θ: θ = tan-1(Ax / Ay)
3-4 Projectile Motion
- Objects thrown into the air are called projectiles, and their path is called the trajectory. Assume air resistance is negligible for now.
- Recall that motions along perpendicular axes are independent of each other.
- This allows us to analyze motion by splitting it into two motions: one vertical, one horizontal.
- Assume that gravity only affects motion in the vertical direction.
- ay = -g = -9.80 m/s2
- ax = 0
- Total displacement of a projectile can be found by using a vector s that's composed of perpendicular x- and y-components. Velocity is v.
- Horizontal motion
- x = x0 + vxt
- vx = v0x = constant velocity
- Vertical motion
- y = y0 + 1/2(v0y + vy)t
- vy = v0y - gt
- y = y0 + v0y - 1/2(gt)
- vy2 = v0y2 - 2g(y - y0)
- Total displacement and velocity (of the original vector s)
- s2 = x2 + y2
- θ = tan-1(vy / vx)
- v2 = vx2 + vy2
- θv = tan-1(vy / vx)
- Maximum height of a projectile
Compare the purple square with its x-component (blue) and y-component(red)
3-5 Addition of Velocities
- Velocity is a vector, so the same rules of vector addition explained above apply to them.
- The velocity of an object can be split into its component velocity vectors along the x- and y-axes.
- Given a velocity vector v with direction θ that is made up of component velocity vectors vx and vy:
- vx = v cos θ
- vy = v sin θ
- v2 = vx2 + vy2
- θ = tan-1(vy / vx)


Balthisar Tidy offers a lot of options to correct, diagnose, and pretty-format your code. Learn how to discover the meaning of each of these options by following these few steps.
You can always consult the Tidy Options Reference Section for descriptions of all of the Tidy options that Balthisar Tidy supports. However it’s often more convenient to…
Look at option descriptions in any Tidy Options panel. Any time you select an option, its description will appear at the bottom of this panel.
If the description is not visible, it can be revealed with the button at the bottom left of the Tidy Options panel.


5
Name of friend
This is a samble status message
M-30(300m from you)
0
Name of friend
This is a samble status message
F-35(500m from you)
1
Name of friend
This is a samble status message
M-25(1km from you)
0
Name of friend
This is a samble status message
M-18(30km from you)
4
Name of friend
This is a samble status message
M-21(20km from you)
1
Name of friend
This is a samble status message
F-20(30m from you)


Gradient Buttons - Light Background
Scroll down for dark background!

Red
Red-Yellow
Red-Orange
Red-Purple
Red-Pink
Red-Blue
Red-Cyan
Red-Green
Red-Teal
Yellow
Yellow-Orange
Yellow-Red
Yellow-Purple
Yellow-Pink
Yellow-Blue
Yellow-Cyan
Yellow-Green
Yellow-Teal
Cyan
Cyan-Yellow
Cyan-Orange
Cyan-Red
Cyan-Purple
Cyan-Pink
Cyan-Blue
Cyan-Green
Cyan-Teal
Blue
Blue-Yellow
Blue-Orange
Blue-Red
Blue-Purple
Blue-Pink
Blue-Cyan
Blue-Green
Blue-Teal
Purple
Purple-Yellow
Purple-Orange
Purple-Red
Purple-Pink
Purple-Blue
Purple-Cyan
Purple-Green
Purple-Teal
Pink
Pink-Yellow
Pink-Orange
Pink-Red
Pink-Purple
Pink-Blue
Pink-Cyan
Pink-Green
Pink-Teal
Dark
Dark-Black
Dark-Yellow
Dark-Orange
Dark-Red
Dark-Pink
Dark-Purple
Dark-Blue
Dark-Cyan
Dark-Green
Dark-Teal
Light
Light-Black
Light-Yellow
Light-Orange
Light-Red
Light-Pink
Light-Purple
Light-Blue
Light-Cyan
Light-Green
Light-Teal
Gradient Buttons - Dark Background
Scroll up for light background!

Red
Red-Yellow
Red-Orange
Red-Purple
Red-Pink
Red-Blue
Red-Cyan
Red-Green
Red-Teal
Yellow
Yellow-Orange
Yellow-Red
Yellow-Purple
Yellow-Pink
Yellow-Blue
Yellow-Cyan
Yellow-Green
Yellow-Teal
Cyan
Cyan-Yellow
Cyan-Orange
Cyan-Red
Cyan-Purple
Cyan-Pink
Cyan-Blue
Cyan-Green
Cyan-Teal
Blue
Blue-Yellow
Blue-Orange
Blue-Red
Blue-Purple
Blue-Pink
Blue-Cyan
Blue-Green
Blue-Teal
Purple
Purple-Yellow
Purple-Orange
Purple-Red
Purple-Pink
Purple-Blue
Purple-Cyan
Purple-Green
Purple-Teal
Pink
Pink-Yellow
Pink-Orange
Pink-Red
Pink-Purple
Pink-Blue
Pink-Cyan
Pink-Green
Pink-Teal
Dark
Dark-Black
Dark-Yellow
Dark-Orange
Dark-Red
Dark-Pink
Dark-Purple
Dark-Blue
Dark-Cyan
Dark-Green
Dark-Teal
Light
Light-Black
Light-Yellow
Light-Orange
Light-Red
Light-Pink
Light-Purple
Light-Blue
Light-Cyan
Light-Green
Light-Teal
Gradient Text
Pink-Purple
Light-Yellow


# # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # from pyspark import since from pyspark.ml.param import Params from pyspark.ml.param.shared import HasCheckpointInterval, HasSeed, HasWeightCol, Param, \ TypeConverters, HasMaxIter, HasStepSize, HasValidationIndicatorCol from pyspark.ml.wrapper import JavaPredictionModel from pyspark.ml.common import inherit_doc @inherit_doc class _DecisionTreeModel(JavaPredictionModel): """ Abstraction for Decision Tree models. .. versionadded:: 1.5.0 """ @property @since("1.5.0") def numNodes(self): """Return number of nodes of the decision tree.""" return self._call_java("numNodes") @property @since("1.5.0") def depth(self): """Return depth of the decision tree.""" return self._call_java("depth") @property @since("2.0.0") def toDebugString(self): """Full description of model.""" return self._call_java("toDebugString") @since("3.0.0") def predictLeaf(self, value): """ Predict the indices of the leaves corresponding to the feature vector. """ return self._call_java("predictLeaf", value) class _DecisionTreeParams(HasCheckpointInterval, HasSeed, HasWeightCol): """ Mixin for Decision Tree parameters. """ leafCol = Param(Params._dummy(), "leafCol", "Leaf indices column name. Predicted leaf " + "index of each instance in each tree by preorder.", typeConverter=TypeConverters.toString) maxDepth = Param(Params._dummy(), "maxDepth", "Maximum depth of the tree. (>= 0) E.g., " + "depth 0 means 1 leaf node; depth 1 means 1 internal node + 2 leaf nodes.", typeConverter=TypeConverters.toInt) maxBins = Param(Params._dummy(), "maxBins", "Max number of bins for discretizing continuous " + "features. Must be >=2 and >= number of categories for any categorical " + "feature.", typeConverter=TypeConverters.toInt) minInstancesPerNode = Param(Params._dummy(), "minInstancesPerNode", "Minimum number of " + "instances each child must have after split. If a split causes " + "the left or right child to have fewer than " + "minInstancesPerNode, the split will be discarded as invalid. " + "Should be >= 1.", typeConverter=TypeConverters.toInt) minWeightFractionPerNode = Param(Params._dummy(), "minWeightFractionPerNode", "Minimum " "fraction of the weighted sample count that each child " "must have after split. If a split causes the fraction " "of the total weight in the left or right child to be " "less than minWeightFractionPerNode, the split will be " "discarded as invalid. Should be in interval [0.0, 0.5).", typeConverter=TypeConverters.toFloat) minInfoGain = Param(Params._dummy(), "minInfoGain", "Minimum information gain for a split " + "to be considered at a tree node.", typeConverter=TypeConverters.toFloat) maxMemoryInMB = Param(Params._dummy(), "maxMemoryInMB", "Maximum memory in MB allocated to " + "histogram aggregation. If too small, then 1 node will be split per " + "iteration, and its aggregates may exceed this size.", typeConverter=TypeConverters.toInt) cacheNodeIds = Param(Params._dummy(), "cacheNodeIds", "If false, the algorithm will pass " + "trees to executors to match instances with nodes. If true, the " + "algorithm will cache node IDs for each instance. Caching can speed " + "up training of deeper trees. Users can set how often should the cache " + "be checkpointed or disable it by setting checkpointInterval.", typeConverter=TypeConverters.toBoolean) def __init__(self): super(_DecisionTreeParams, self).__init__() def setLeafCol(self, value): """ Sets the value of :py:attr:`leafCol`. """ return self._set(leafCol=value) def getLeafCol(self): """ Gets the value of leafCol or its default value. """ return self.getOrDefault(self.leafCol) def getMaxDepth(self): """ Gets the value of maxDepth or its default value. """ return self.getOrDefault(self.maxDepth) def getMaxBins(self): """ Gets the value of maxBins or its default value. """ return self.getOrDefault(self.maxBins) def getMinInstancesPerNode(self): """ Gets the value of minInstancesPerNode or its default value. """ return self.getOrDefault(self.minInstancesPerNode) def getMinWeightFractionPerNode(self): """ Gets the value of minWeightFractionPerNode or its default value. """ return self.getOrDefault(self.minWeightFractionPerNode) def getMinInfoGain(self): """ Gets the value of minInfoGain or its default value. """ return self.getOrDefault(self.minInfoGain) def getMaxMemoryInMB(self): """ Gets the value of maxMemoryInMB or its default value. """ return self.getOrDefault(self.maxMemoryInMB) def getCacheNodeIds(self): """ Gets the value of cacheNodeIds or its default value. """ return self.getOrDefault(self.cacheNodeIds) @inherit_doc class _TreeEnsembleModel(JavaPredictionModel): """ (private abstraction) Represents a tree ensemble model. """ @property @since("2.0.0") def trees(self): """Trees in this ensemble. Warning: These have null parent Estimators.""" return [_DecisionTreeModel(m) for m in list(self._call_java("trees"))] @property @since("2.0.0") def getNumTrees(self): """Number of trees in ensemble.""" return self._call_java("getNumTrees") @property @since("1.5.0") def treeWeights(self): """Return the weights for each tree""" return list(self._call_java("javaTreeWeights")) @property @since("2.0.0") def totalNumNodes(self): """Total number of nodes, summed over all trees in the ensemble.""" return self._call_java("totalNumNodes") @property @since("2.0.0") def toDebugString(self): """Full description of model.""" return self._call_java("toDebugString") @since("3.0.0") def predictLeaf(self, value): """ Predict the indices of the leaves corresponding to the feature vector. """ return self._call_java("predictLeaf", value) class _TreeEnsembleParams(_DecisionTreeParams): """ Mixin for Decision Tree-based ensemble algorithms parameters. """ subsamplingRate = Param(Params._dummy(), "subsamplingRate", "Fraction of the training data " + "used for learning each decision tree, in range (0, 1].", typeConverter=TypeConverters.toFloat) supportedFeatureSubsetStrategies = ["auto", "all", "onethird", "sqrt", "log2"] featureSubsetStrategy = \ Param(Params._dummy(), "featureSubsetStrategy", "The number of features to consider for splits at each tree node. Supported " + "options: 'auto' (choose automatically for task: If numTrees == 1, set to " + "'all'. If numTrees > 1 (forest), set to 'sqrt' for classification and to " + "'onethird' for regression), 'all' (use all features), 'onethird' (use " + "1/3 of the features), 'sqrt' (use sqrt(number of features)), 'log2' (use " + "log2(number of features)), 'n' (when n is in the range (0, 1.0], use " + "n * number of features. When n is in the range (1, number of features), use" + " n features). default = 'auto'", typeConverter=TypeConverters.toString) def __init__(self): super(_TreeEnsembleParams, self).__init__() @since("1.4.0") def getSubsamplingRate(self): """ Gets the value of subsamplingRate or its default value. """ return self.getOrDefault(self.subsamplingRate) @since("1.4.0") def getFeatureSubsetStrategy(self): """ Gets the value of featureSubsetStrategy or its default value. """ return self.getOrDefault(self.featureSubsetStrategy) class _RandomForestParams(_TreeEnsembleParams): """ Private class to track supported random forest parameters. """ numTrees = Param(Params._dummy(), "numTrees", "Number of trees to train (>= 1).", typeConverter=TypeConverters.toInt) bootstrap = Param(Params._dummy(), "bootstrap", "Whether bootstrap samples are used " "when building trees.", typeConverter=TypeConverters.toBoolean) def __init__(self): super(_RandomForestParams, self).__init__() @since("1.4.0") def getNumTrees(self): """ Gets the value of numTrees or its default value. """ return self.getOrDefault(self.numTrees) @since("3.0.0") def getBootstrap(self): """ Gets the value of bootstrap or its default value. """ return self.getOrDefault(self.bootstrap) class _GBTParams(_TreeEnsembleParams, HasMaxIter, HasStepSize, HasValidationIndicatorCol): """ Private class to track supported GBT params. """ stepSize = Param(Params._dummy(), "stepSize", "Step size (a.k.a. learning rate) in interval (0, 1] for shrinking " + "the contribution of each estimator.", typeConverter=TypeConverters.toFloat) validationTol = Param(Params._dummy(), "validationTol", "Threshold for stopping early when fit with validation is used. " + "If the error rate on the validation input changes by less than the " + "validationTol, then learning will stop early (before `maxIter`). " + "This parameter is ignored when fit without validation is used.", typeConverter=TypeConverters.toFloat) @since("3.0.0") def getValidationTol(self): """ Gets the value of validationTol or its default value. """ return self.getOrDefault(self.validationTol) class _HasVarianceImpurity(Params): """ Private class to track supported impurity measures. """ supportedImpurities = ["variance"] impurity = Param(Params._dummy(), "impurity", "Criterion used for information gain calculation (case-insensitive). " + "Supported options: " + ", ".join(supportedImpurities), typeConverter=TypeConverters.toString) def __init__(self): super(_HasVarianceImpurity, self).__init__() @since("1.4.0") def getImpurity(self): """ Gets the value of impurity or its default value. """ return self.getOrDefault(self.impurity) class _TreeClassifierParams(Params): """ Private class to track supported impurity measures. .. versionadded:: 1.4.0 """ supportedImpurities = ["entropy", "gini"] impurity = Param(Params._dummy(), "impurity", "Criterion used for information gain calculation (case-insensitive). " + "Supported options: " + ", ".join(supportedImpurities), typeConverter=TypeConverters.toString) def __init__(self): super(_TreeClassifierParams, self).__init__() @since("1.6.0") def getImpurity(self): """ Gets the value of impurity or its default value. """ return self.getOrDefault(self.impurity) class _TreeRegressorParams(_HasVarianceImpurity): """ Private class to track supported impurity measures. """ pass


Two People Die in Explosion in Kiev Dormitory - Police
MOSCOW (Sputnik) - Two people have died in an explosion in a dormitory in Kiev, Ukraine's capital, the local police announced on late Friday.
On Saturday, at approximately 9 p.m. local time (19:00 GMT), the police received information about the explosion in the dormitory, located at Karl Marx Street.
"The law enforcement officers have established that two men received mortal wounds due to the explosion", the police wrote on Facebook.
According to Kiev police chief Andriy Kryschenko, right now the evidence points to a grenade explosion.
The police have identified the victims: one was a security guard, the other one was a construction worker.


| Home | Trees | Indices | Help |
|---|
|
|
object --+ | BaseNotifier
Base class for notifiers
Custom notifiers must implement this interface (that is just the run method, however).
Additionally it contains some useful utility methods, which can be used.
|
|||
|
|||
str
|
|
||
tuple
|
|
||
str
|
|
||
unicode
|
|
||
str
|
|
||
str
|
|
||
tuple of str
|
|
||
tuple
|
|
||
svnmailer.differ.*
|
|
||
str
|
|
||
str
|
|
||
unicode
|
|
||
unicode or {str}
|
|
||
svnmailer.util.TempFile
|
|
||
int
|
|
||
str
|
|
||
bool
|
|
||
bool
|
|
||
bool
|
|
||
|
|||
|
Inherited from |
|
|||
unicode
|
ADD =
"add" token |
||
unicode
|
COPY =
"copy" token |
||
unicode
|
DELETE =
"delete" token |
||
str
|
ENC_CONFIG =
magic value, meaning that the content encoding should be retrieved from the config |
||
ENC_DEFAULT =
|
|||
str
|
ENC_PROPERTY =
The property name, where encodings could be stored |
||
unicode
|
MODIFY =
"modify" token |
||
unicode
|
NONE =
"none" token |
||
unicode
|
PROPCHANGE =
"propchange" token |
||
tuple
|
_diffable_tests =
Map generate_diffs list entrys to change methods
|
|
|||
list
|
_groupset The groupset to process |
||
dict
|
_penc_cache The (path, rev) -> property encoding cache |
||
svnmailer.settings.Settings
|
_settings The settings to use |
|
|||
|
Inherited from |
|
Initialization
|
Returns the encoding for the specified path and revision
|
Dump the two revisions of a particular change (This dumps the files, not the properties)
|
Returns the author of the revision
|
Returns the content diff action for a particular change
|
Returns the content diff url for a particular change
|
Returns the content encoding property for a path/rev
|
Returns the encodings of the change content (base and current rev)
|
Returns valid diff tokens and tests
|
Returns the initialized differ
|
Returns the encoding extracted from svn:mime-type
|
Returns the log entry of the revision
|
Returns the property diff action for a particular change
|
Returns the temporary directory
|
Returns an open temporary file container object
|
Returns the time of the revision in seconds since epoch
|
Returns the revision URL
|
Returns if the supplied property seems to be binary Note that is a very rudimentary check, just to not pollute diff output with garbage
|
Returns if the supplied property value takes just one line
|
Returns if the supplied property name represents an UTF-8 property
|
|
_diffable_testsMapgenerate_diffs list entrys to change methods
|
| Home | Trees | Indices | Help |
|---|
| Generated by Epydoc 3.0.1 on Sun Sep 25 21:07:32 2011 | http://epydoc.sourceforge.net |


Search for forms which accepts sensitive data and doesn't have
autocomplete=off
tag.
Autocomplete data can be extracted from Windows Registry or Local Files System on Linux


About
Benefits of the #100DaysOfCode Challenge
There are several good reasons you should consider committing to this challenge:
- Coding will become a daily habit for you - a habit that you can easily maintain after you've finished the challenge.
- Every day that you consistently code, you’ll build momentum. That momentum will make it easier for you to learn more advanced topics. You won’t have to spend extra time trying to remember what you did previously. You can stay in the “flow” of coding.
- You’ll make friends and meet like-minded people who are also working through this challenge alongside you. They’ll help you find the strength to keep coding even on the days when you don’t feel like you’re making progress. They can also help you when you inevitably get stuck.
- The projects that you’ll build will be small in scope, so by the time you finish, you’ll have completed several of them — and gained a wide range of experience.
- If you were just working through tutorials, you wouldn’t have much to show for it. But with #100DaysOfCode, you’ll build real portfolio projects that you can show to potential employers and share with your family.
- These projects will give you practice with concepts that frequently come up during developer job interviews.
- Your GitHub profile will look extremely active. And yes, hiring managers and recruiters do look at these.
- You’ll greatly diminish your fear of starting a new coding project. It will become a natural, ordinary thing to do.
- You’ll have a good reason to stop procrastinating and start coding every day.
Rules
The main rule: Code a mininum of an hour a day for the next 100 days.
Learn more about the main rules, as well as some other considerations:
- Code for minimum of an hour a day.
- Tweet your progress daily with the hashtag: #100DaysOfCode
- Each day, reach out to at least two people on Twitter who are also doing the challenge.
Outcome
Results after 100 days:
The outcome of programming for a hundred days straight:
- I learned HTML, CSS & JavaScript/(Responsive Web Design)
- I also learned how to use GitHub
- I learned about Bootstap, Sass, and other CSS frameworks.
- I learned about JavaScript libraries Vue.js, React.js, jQuery, etc
- And most importantly: I became a constant learner.


Postgres DB Sample App
Fruit ID
Fruit Name
{% for fruit in fruits %}
{{ fruit.id }}
{{ fruit.name }}
{% endfor %}


Labelling only possible in combination with your own FrischSchoggi™. You will find
already labelled FrischSchoggi™ hearts from our standard assortment in unserem Online Shop.
Our Confiseure label according to your text specifications:
Lid "Heart - large" for CHF 11.50 (115g | 45 characters): This lid is made of white
chocolate and is fixed to your FrischSchoggi™ heart with a drop of chocolate.


{% include "scaffold/incbootstrap.html" %}
Conference: {{crrt_conference.name}}
Review round: {{review_round}} - {{review_config.name()}}
Name speaker: (If not selected then reviews will be anonymous: name and bibliogrraphy will be withheld)
Private comments allowed:
Min vote:
Max vote:


#include <tiffio.h> typedef unsigned char TIFFRGBValue; typedef struct _TIFFRGBAImage TIFFRGBAImage; int TIFFRGBAImageOK(TIFF* tif, char emsg[1024]); int TIFFRGBAImageBegin(TIFFRGBAImage* img, TIFF* tif, int stopOnError, char emsg[1024]); int TIFFRGBAImageGet(TIFFRGBAImage* img, uint32* raster, uint32 width, uint32 height); void TIFFRGBAImageEnd(TIFFRGBAImage* img);
The default usage for these routines is: check if an image can be processed using TIFFRGBAImageOK, construct a decoder state block using TIFFRGBAImageBegin, read and decode an image into a target raster using TIFFRGBAImageGet, and then release resources using TIFFRGBAImageEnd. TIFFRGBAImageGet can be called multiple times to decode an image using different state parameters. If multiple images are to be displayed and there is not enough space for each of the decoded rasters, multiple state blocks can be managed and then calls can be made to TIFFRGBAImageGet as needed to display an image.
The generated raster is assumed to be an array of width times height 32-bit entries, where width must be less than or equal to the width of the image (height may be any non-zero size). If the raster dimensions are smaller than the image, the image data is cropped to the raster bounds. If the raster height is greater than that of the image, then the image data are placed in the lower part of the raster. (Note that the raster is assume to be organized such that the pixel at location (x,y) is raster[y*width+x]; with the raster origin in the lower-left hand corner.)
Raster pixels are 8-bit packed red, green, blue, alpha samples. The macros TIFFGetR, TIFFGetG, TIFFGetB, and TIFFGetA should be used to access individual samples. Images without Associated Alpha matting information have a constant Alpha of 1.0 (255).
TIFFRGBAImageGet converts non-8-bit images by scaling sample values. Palette, grayscale, bilevel, CMYK, and YCbCr images are converted to RGB transparently. Raster pixels are returned uncorrected by any colorimetry information present in the directory.
The paramater stopOnError specifies how to act if an error is encountered while reading the image. If stopOnError is non-zero, then an error will terminate the operation; otherwise TIFFRGBAImageGet will continue processing data until all the possible data in the image have been requested.
static void putContigAndDraw(TIFFRGBAImage* img, uint32* raster, uint32 x, uint32 y, uint32 w, uint32 h, int32 fromskew, int32 toskew, unsigned char* cp) { (*putContig)(img, raster, x, y, w, h, fromskew, toskew, cp); if (x+w == width) { w = width; if (img->orientation == ORIENTATION_TOPLEFT) lrectwrite(0, y-(h-1), w-1, y, raster-x-(h-1)*w); else lrectwrite(0, y, w-1, y+h-1, raster); } }
(the original routine provided by the library is saved in the variable putContig.)
Palettte image colormaps that appear to be incorrectly written as 8-bit values are automatically scaled to 16-bits.
Sorry, can not handle %d-bit pictures. The image had BitsPerSample other than 1, 2, 4, 8, or 16.
Sorry, can not handle %d-channel images. The image had SamplesPerPixel other than 1, 3, or 4.
Missing needed "PhotometricInterpretation" tag. The image did not have a tag that describes how to display the data.
No "PhotometricInterpretation" tag, assuming RGB. The image was missing a tag that describes how to display it, but because it has 3 or 4 samples/pixel, it is assumed to be RGB.
No "PhotometricInterpretation" tag, assuming min-is-black. The image was missing a tag that describes how to display it, but because it has 1 sample/pixel, it is assumed to be a grayscale or bilevel image.
No space for photometric conversion table. There was insufficient memory for a table used to convert image samples to 8-bit RGB.
Missing required "Colormap" tag. A Palette image did not have a required Colormap tag.
No space for tile buffer. There was insufficient memory to allocate an i/o buffer.
No space for strip buffer. There was insufficient memory to allocate an i/o buffer.
Can not handle format. The image has a format (combination of BitsPerSample, SamplesPerPixel, and PhotometricInterpretation) that can not be handled.
No space for B&W mapping table. There was insufficient memory to allocate a table used to map grayscale data to RGB.
No space for Palette mapping table. There was insufficient memory to allocate a table used to map data to 8-bit RGB.


January 30
I am Alpha and Omega, the beginning and the ending, saith the Lord, which is, and which was, and which is to come, the Almighty.
Revelation 1:8
Jesus is the beginning and the ending. He is the Almighty. When He told us that in the Book of Revelation, He wasn't just giving us a general piece of information about Himself. He was giving us a powerful truth we can apply now, today!
Let me show you how. He said He is the beginning. So no matter what challenge or situation you may be facing right now, you need to start with Him. John 1:1 says Jesus is the Word. That means, if you're going to start with Jesus, you're going to start with the Word. Don't do anything until you find out what the Word has to say about it.
Then, stay on the Word. As Colossians 1:23 says, "Continue in the faith grounded and settled, and be not moved away from the hope of the gospel, which ye have heard."
Continue in the faith. The only way the devil can defeat you is to pressure you into throwing away the Word. Everything he does, every challenge he brings you is intended to make you doubt the Word of God. So don't let go of the Word, no matter what may happen. Settle it with God in prayer and stay with it forever. It is written!
Then end with the Word. Jesus said He was the first and the last. That means the word of your doctor is not the last word. Even the word of your pastor is not the last word. The Word of Jesus is the last Word!
Remember this: You are now what the Word says you are. You can do what the Word says you can do. And you can have what the Word says you can have. Begin to believe that. Begin to say it out loud in faith.
Now shout the victory. Yes, now! You don't have to wait to see the outcome to celebrate. You have Jesus' Word on the matter, so you know beyond any doubt that your breakthrough is coming. Once you've settled yourself on Him, you can be assured that He will have the last word!
Scripture Reading: Proverbs 1:1-9


PRETTYPRINT
signaturePrettyPrint implements a facility for defining and installing user-defined prettyprinters over (monomorphic) user-defined types for use by the top-level loop of the SML compiler. The underlying algorithm is that of Oppen (TOPLAS, 1980). There are more expressive prettyprinting languages around, notably that of PPML, but the Oppen interface has the benefit of being efficiently implementable. Thus it is a good option for modest prettyprinting tasks that need to be quick, such as the printing of SML values. These same prettyprinting facilities are used by the compiler for such tasks as printing values in the interactive top level and printing expressions in error messages.
The high-level view is that the user will define a prettyprinter for a datatype and install it in a prettyprinter table. When it comes time for the compiler to print a value, it looks first in the prettyprinter table, to see if a prettyprinter is installed for that type. If so, it calls the prettyprinter on the value, otherwise, it calls the default printing routine.
The Oppen algorithm provides a block abstraction: a block establishes a level of indentation. Since blocks can be nested and offset from one another, levels of indentation can be achieved. A block can be broken up by one or more breaks, which mark possible places to add carriage returns. There are two styles of block: CONSISTENT and INCONSISTENT. If a consistent block does not fit completely onto the current line, a carriage return will be added after each component of the block. If an INCONSISTENT block does not fit completely onto the current line, a carriage return is added after the last item that does fit on the line; this style of block conserves on vertical space.
signature PRETTYPRINT
structure PrettyPrint
: PRETTYPRINT
type ppstream
type ppconsumer
datatype break_style = CONSISTENT | INCONSISTENT
exception PP_FAIL of string
val mk_ppstream : ppconsumer -> ppstream
val dest_ppstream : ppstream -> ppconsumer
val add_break : ppstream -> (int * int) -> unit
val add_newline : ppstream -> unit
val add_string : ppstream -> string -> unit
val begin_block : ppstream -> break_style -> int -> unit
val end_block : ppstream -> unit
val clear_ppstream : ppstream -> unit
val flush_ppstream : ppstream -> unit
val with_pp : ppconsumer -> (ppstream -> unit) -> unit
val pp_to_string : int -> (ppstream -> 'a -> unit) -> 'a -> string
type ppstream
type ppconsumer
datatype break_style
CONSISTENT
INCONSISTENT
exception PP_FAIL
mk_ppstream consumer
dest_ppstream pps
add_break pp (i, j)
If block_style = CONSISTENT
and the entire block fits on the remainder of the current line: output size
spaces.
If block_style = CONSISTENT
and the block does not fit on the rest of the line: add a carriage return after each component in the block and add the block offset to the current indentation level. Each component will be further indented by offset spaces.
If block_style = INCONSISTENT
and the next component of the current block fits on the rest of the line: output size
spaces.
If block_style = INCONSISTENT
and the next component doesn't fit on the rest of the line: output a carriage return and indent to the current indentation level plus the block offset plus offset extra spaces.
Size is taken into account when determining if there is enough room to print the next component in the block.
add_newline pps
add_string pps s
begin_block pp bs i
end_block pps
clear_ppstream pps
flush_ppstream pps
with_pp consumer printfn
pp_to_string i printit x


_____________ MATLAB files ¯¯¯¯¯¯¯¯¯¯¯¯¯ • SudokuSolver.m - use this with MATLAB* to solve Sudokus • SudokuMaker.m - use this with MATLAB* to make Sudokus • publisher.m - use this with MATLAB* to make .png files of your Sudokus so that they can be printed and published • numbers.png - file used by publisher.m • suma.m - a function called by SudokuMaker.m • other .m files - needed by both SudokuSolver.m and SudokuMaker.m *Octave, a free imitator of MATLAB, can also "work" _____________ my goal ¯¯¯¯¯¯¯¯¯¯¯¯¯ The sole purpose of this code is not to make some flashy software but to make the best code for making the most difficult Sudokus. My initial goal was to make the ABSOLUTE hardest Sudokus, but I soon only cared to make the quality so high (people can spend many years on this task), so you may not be able to make the world's hardest Sudoku, but they will get very close. Also, do not get upset if SudokuSolver.m tells you that a Sudoku that is claimed to be very difficult by the author is easy. This can be especially frustrating when you yourself cannot solve it. This happens because VERY difficult Sudokus are the target audience of my solver. I must say that there is one thing I did that was not intended to make the most difficult Sudokus. I added a feature to allow the created Sudokus to have various symmetries, even though these symmetries restrict the Sudoku maker from making the hardest Sudokus. Because I value GOOD algorithms, whenever I had to choose between speed and quality, I chose quality (don't worry... it's still plenty quick). For example, when resorting to guessing the number to some squares to solve a Sudoku, my code will try advanced algorithms instead of simple ones to test each guess. This slows the code down, but it allows for a more meaningful interpretation of the "depth of thread" value, which is the minimum number of guesses required. I made some very hard Sudokus. I have put the seeds that generated them in SudokuMaker.m. Good luck trying to solve them! Just don't use my code to do it because that will take, at most, a few seconds. This code is under the BSD license, so you can mostly do what you want with it. But! If you by blind luck use this code to create and publish the world's hardest Sudoku, please give me, Bradley Knockel, some credit (money is also good!). Lastly, I've done my best to make the code readable, so, if you are curious how Sudokus can be generated and solved with computers, feel free to look at it. _____________ more info ¯¯¯¯¯¯¯¯¯¯¯¯¯ • Release date of this version: April 2011 • Version of MATLAB I used: R2006b • If you find bugs or have questions, leave me a message at www.BradleyKnockel.com Many thanks to... • http://www.sudoku.org.uk/PDF/Solving_Sudoku.pdf • http://www.sudokuwiki.org/Strategy_Families


20
1 About that time, Hezekiah became very ill. He thought that he was about to die. Isaiah the prophet came to him and said, "This is what Yahweh says: 'You should tell the people in your palace what you want them to do after you die, because you are not going to recover from this illness. You are going to die.' "
2 Hezekiah turned his face toward the wall and prayed this:
3 "Yahweh, do not forget that I have always served you faithfully with all my inner being, and I have done things that pleased you." Then Hezekiah started to cry loudly.
4 Isaiah left the king, but before he had crossed the middle courtyard of the palace, Yahweh gave him a message.
5 He said, "Go back to Hezekiah, the ruler of my people, and say to him, 'I, Yahweh, the God whom your ancestor King David worshiped, have heard what you prayed. And I have seen your tears. So, listen, I am going to heal you. Two days from now you will be able to go up to my temple.
6 I will enable you to live for fifteen more years. And I will rescue you and this city again from the power of the king of Assyria. I will defend this city for the sake of my own reputation and because of what I promised King David, who served me well.'~"
7 Isaiah returned to the palace and told Hezekiah what Yahweh had said. Then he said to Hezekiah's servants, "Bring a paste made of boiled figs. Put some of it on his boils, and he will get well." The servants did that, and the king recovered.
8 Then Hezekiah replied to Isaiah, "What will Yahweh do to prove that he will heal me and that two days from now I will be able to go up to the temple?"
9 Isaiah replied, "Yahweh will do something that will prove to you that he will do what he promised. Do you want him to cause the shadow on the stairway to go back ten steps or to go forward ten steps ?"
10 Hezekiah replied, "It is easy to for the shadow to move forward, because that is what it always does. Aks Yahweh to make it move backward ten steps."
11 So Isaiah prayed earnestly to Yahweh, and Yahweh caused the shadow to go backward ten steps.
12 At that time, King Merodach Baladan son of Baladan, the previous king of Babylonia, heard a report that King Hezekiah had been very sick. So he wrote some letters and gave them to some messengers to take to Hezekiah, along with a gift.
13 When the messengers arrived, Hezekiah welcomed them gladly. Then he showed them all the treasure that was in his palace and treasuries—the silver and gold, the spices, the nice-smelling olive oil, and all the weapons for his soldiers. There were no valuable things in his storerooms or anywhere else in his kingdom that he did not show them.
14 Then the prophet Isaiah went to Hezekiah and asked him, "Where did those men come from, and what did they say to you?"
Hezekiah replied, "They came from a country very far from here. They came from Babylonia."
15 Isaiah asked, "What did they see in your palace?"
Hezekiah replied, "They saw everything. I showed them absolutely everything that I own—all my valuable things."
16 Isaiah knew that Hezekiah had done a very foolish thing. So Isaiah said to him, "Listen to what Yahweh says to you.
17 There will be a time when everything that is still in your palace, all the valuable things that were put there by you and your ancestors, will be carried away to Babylon. There will be nothing left here! That is what Yahweh says to you!
18 Furthermore, some of your own descendants will be forced to go there, and they will be castrated in order that they may become servants in the palace of the king of Babylon."
19 Then Hezekiah replied to Isaiah, "The message from Yahweh that you have given to me is good." He said that because he was thinking, "Even if that happens, there will be peace and security in Israel all during the remaining time that I remain alive."
20 If you want to know more about all the other things that Hezekiah did, about his brave deeds in battle, about how he commanded his people to build a reservoir in the city and a tunnel to be dug to bring water into the reservoir, they are all written in the Book of the Events of the Kings of Judah.
21 Later Hezekiah died, and his son Manasseh became the king.


If you don't see anything, please, in a command prompt, go in folder `test18-webpack-vue-cli` and run `npm
run serve` that will start http://localhost:8081/,
If you try to access to http://localhost:8081/ and it doesn't work, it means that you've not yet run `npm
run serve`,
If you modify a source like the css, js or html and don't see changes, run `npm run build` to see the
change in the browser.


public abstract static class ActionFilter.Simple extends AbstractComponent implements ActionFilter
ActionFilter.Simple
deprecationLogger, logger, settings
| 限定符和类型 | 方法和说明 |
|---|---|
protected abstract boolean |
apply(java.lang.String action,
ActionRequest request,
ActionListener<?> listener)
Applies this filter and returns
true if the execution chain should proceed, or false
if it should be aborted since the filter already handled the request and called the given listener. |
<Request extends ActionRequest,Response extends ActionResponse> |
apply(Task task,
java.lang.String action,
Request request,
ActionListener<Response> listener,
ActionFilterChain<Request,Response> chain)
Enables filtering the execution of an action on the request side, either by sending a response through the
ActionListener or by continuing the execution through the given chain |
logDeprecatedSetting, logRemovedSetting, nodeName
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
order
protected Simple(Settings settings)
public final <Request extends ActionRequest,Response extends ActionResponse> void apply(Task task, java.lang.String action, Request request, ActionListener<Response> listener, ActionFilterChain<Request,Response> chain)
ActionFilter
ActionListener
or by continuing the execution through the given chain
apply
在接口中 ActionFilter
protected abstract boolean apply(java.lang.String action, ActionRequest request, ActionListener<?> listener)
true
if the execution chain should proceed, or false
if it should be aborted since the filter already handled the request and called the given listener.


Create an APUSH Game
Select the game mode
Quiz
Rocket
Clicker
Start Section
End Section
Create
Start Game
Next Question


{% extends "shared/_layout.html" %} {% block pre_content %}
{% endblock %} {% block content %}Description: {{ project_details.description }}
Start Date: {{ project_details.start_date }}
End Date: {{ project_details.end_date }}
No annotations completed.
{% endif %}


Getting Started
This Page is Deprecated
We’ve revamped our getting started documentation! Instead of this page, use one of the following:
Getting started using Debian based distribution like Debian squeeze and Ubuntu is easy as DEBs are available for most the required components. This guide walks you through the process.
Requirements
We try to keep the requirements on external Gems to a minimum, you only need:
- A Stomp server, tested against ActiveMQ
- Ruby
- RubyGems
- Ruby Stomp Client
Packages
We strongly recommend you set up a local Apt repository that will host all the packages on your LAN, you can get the prerequisite packages here:
- ActiveMQ
- Java - OpenJDK that is included with your distribution
- Ruby - included with your distribution
- RubyGems
- Stomp Ruby Gem
- MCollective - mcollective-2.2.x-1_all.deb, mcollective-common-2.2.x-1_all.deb, mcollective-client-2.2.x-1_all.deb
The rest of this guide will assume you set up a Apt repository. Puppet Labs hosts a Apt repository with all these dependencies at apt.puppetlabs.com.
ActiveMQ
ActiveMQ is currently the most used and tested middleware for use with MCollective.
You need at least one ActiveMQ server on your network, all the nodes you wish to manage will connect to the central ActiveMQ server. Later on you can cluster the ActiveMQ servers for availability and scale.
Install
On the server that you chose to configure as the ActiveMQ server:
% apt-get install openjdk-6-jre
ActiveMQ installation instructions can be found here.
Configuring
The ActiveMQ config reference describes all of the ActiveMQ settings that MCollective cares about. For best use, skim the sections you care about while comparing it to an example activemq.xml file.
We recommend that new users:
- Start with the single-broker example config.
- Change the user account passwords.
- Set up TLS and use a TLS Stomp transport connector.
Other example config files are also available from GitHub.
Starting
Start the ActiveMQ service:
# /etc/init.d/activemq start
You should see it running in the process list:
# ps auxw|grep java
activemq 3012 0.1 14.5 1155112 152180 ? Sl Dec28 2:02 java -Dactivemq.home=/usr/share/activemq -Dactivemq.base=/usr/share/activemq -Dcom.sun.management.jmxremote -Dorg.apache.activemq.UseDedicatedTaskRunner=true -Xmx512m -Djava.library.path=/usr/lib:/usr/lib64 -classpath /usr/share/java/tanukiwrapper.jar:/usr/share/activemq/bin/run.jar -Dwrapper.key=eg4_VvENzCmvtAKg -Dwrapper.port=32000 -Dwrapper.jvm.port.min=31000 -Dwrapper.jvm.port.max=31999 -Dwrapper.pid=3000 -Dwrapper.version=3.2.3 -Dwrapper.native_library=wrapper -Dwrapper.service=TRUE -Dwrapper.cpu.timeout=10 -Dwrapper.jvmid=1 org.tanukisoftware.wrapper.WrapperSimpleApp org.apache.activemq.console.Main start
You should also see it listening on port 61613 or 61614 in your network stack, depending on whether you turned on TLS.
You should open port 61613 or 61614 for all your nodes to connect to.
Marionette Collective
There are a few packages supplied and you will have potentially two type of server:
- Nodes that you wish to manage using mcollective need the mcollective and mcollective-common packages
- Nodes that you wish to use to initiate requests from also known as clients need mcollective-client and mcollective-common packages
A machine can be both at once, in which case you need to install all 3 packages. We’ll work on the assumption here that you wish to both manage your machine and use it as a client by installing all 3 packages on our initial node.
Installation
# apt-get install mcollective mcollective-client mcollective-common
# gem install stomp
Configuring
You’ll need to tweak some configs in /etc/mcollective/client.cfg, a full reference of config settings can be found here:
We’re assuming you called the machine running ActiveMQ stomp.example.net; please change as appropriate. Also note that the port should be 61614 if you turned on TLS.
# main config
libdir = /usr/libexec/mcollective
logfile = /dev/null
loglevel = error
# connector plugin config
connector = activemq
plugin.activemq.pool.size = 1
plugin.activemq.pool.1.host = stomp.example.net
plugin.activemq.pool.1.port = 61613
plugin.activemq.pool.1.user = mcollective
plugin.activemq.pool.1.password = marionette
# security plugin config
securityprovider = psk
plugin.psk = abcdefghj
You should also create /etc/mcollective/server.cfg here’s a sample, a full reference of config settings can be found on the Server Configuration Reference:
# main config
libdir = /usr/libexec/mcollective
logfile = /var/log/mcollective.log
daemonize = 1
loglevel = info
# connector plugin config
connector = activemq
plugin.activemq.pool.size = 1
plugin.activemq.pool.1.host = stomp.example.net
plugin.activemq.pool.1.port = 61613
plugin.activemq.pool.1.user = mcollective
plugin.activemq.pool.1.password = marionette
# facts
factsource = yaml
plugin.yaml = /etc/mcollective/facts.yaml
# security plugin config
securityprovider = psk
plugin.psk = abcdefghj
Replace the plugin.psk in both these files with a Pre-Shared Key of your own.
Create Facts
By default - and for this setup - we’ll use a simple YAML file for a fact source, later on you can use Puppet Labs Facter or something else.
Create /etc/mcollective/facts.yaml along these lines:
---
location: devel
country: uk
Start the Server
The packages include standard init script, just start the server:
# /etc/init.d/mcollective restart
You should see in the log file somethig like:
# tail /var/log/mcollective.log
I, [2010-12-29T11:15:32.321744 #11479] INFO -- : mcollectived:33 The Marionette Collective 1.1.0 started logging at info level
Test connectivity
If all is fine and you see this log message you can test with the client code:
% mco ping
your.domain.com time=74.41 ms
---- ping statistics ----
1 replies max: 74.41 min: 74.41 avg: 74.41
This sends out a simple ‘hello’ packet to all the machines, as we only installed one you should have just one reply.
If you install the mcollective and mcollective-common packages along wit the facts and server.cfg you should see more nodes show up here.
You can explore other aspects of your machines:
% mco find --with-fact country=uk
your.domain.com
This searches all systems currently active for ones with a fact country=uk, it got the data from the yaml file you made earlier.
If you use confiuration management tools like puppet and the nodes are setup with classes with classes.txt in /var/lib/puppet then you can search for nodes with a specific class on them - the locations will configurable soon:
% mco find --with-class common::linux
your.domain.com
The filter commands are important they will be the main tool you use to target only parts of your infrastructure with calls to agents.
See the --help
option to the various mco *
commands for available options. You can now look at some of the available plugins and
play around, you might need to run the server process as root if you want to play with services etc.
Plugins
We provide limited default plugins, you can look on our sister project MCollective Plugins where you will find various plugins to manage packages, services etc.
Further Reading
From here you should look at the rest of the wiki pages some key pages are:
- Screencasts - Get a hands-on look at what is possible
- Terminology
- Introduction to Simple RPC - a simple to use framework for writing clients and agents
- ControllingTheDaemon - Controlling a running daemon
- AESSecurityPlugin - Using AES+RSA for secure message encryption and authentication of clients
- SSLSecurityPlugin - Using SSL for secure message signing and authentication of clients


Skip to main content
Toggle navigation
Eric Hollbach
Home
Blog
About
Welcome to Sourced In
Nothing to do here yet. I really hope I can teach myself design.


East Ayrshire Primary school and village suffer power cut
Power outages have been reported in the KA2 and KA11 area.
by Ross Dunn, https://www.dailyrecord.co.uk/authors/ross-dunn/A number of homes and a primary school in the KA postcode area have suffered a power cut this afternoon.
East Ayrshire Council say that the school will remain open as normal.
Scottish Power Energy Networks has said that they hope to restore the power by 2.15pm.
East Ayrshire Council said: "We're aware that there is a power cut in the Crosshouse Area that is affecting Crosshouse Primary & ECC.
"Lunches are still being provided for the pupils and it's hoped that the situation will be resolved within the next two hours.
"The school and ECC are remaining open as normal."
Scottish Power Energy Networks' website states: "There is a power cut affecting the KA2 and KA11 postcode area of Kilmarnock and Irvine.
"We did not know in advance there would be a power cut, and became aware of this at 12.10PM.
"Our control centre will attempt to reset the network remotely to restore power in stages, and our emergency response team are on their way to site to investigate and repair the fault.
"Our team will work to get your power back on as quickly and as safely as possible by 2.15PM.
"Once they arrive, or when we receive any update regarding the cause, we will be able to provide you with more information.
"We apologise for the inconvenience and thank you for your patience."


Super-resolution fluorescence microscopy performed via 3D structured illumination microscopy (3D-SIM) is well established on flat, adherent cells. However, blastomeres of mammalian embryos are non-adherent, round and large. Scanning whole mount mammalian embryos with 3D-SIM is prone to failure due to the movement during scanning and the large distance to the cover glass.
Here we present a highly detailed protocol that allows performing 3D-SIM on blastomeres of mammalian embryos with an image quality comparable to scans in adherent cells. This protocol was successfully tested on mouse, rabbit and cattle embryos and on rabbit spermatozoa.
Our protocol provides detailed instructions on embryo staining, blastomere isolation, blastomere attachment, embedding, correct oil predictions, scanning conditions, and oil correction choices after the first scan. Finally, the most common problems are documented and solutions are suggested. To our knowledge, this protocol presents for the first time a highly detailed and practical way to perform 3D-SIM on mammalian embryos and spermatozoa.
With an axial resolution of about 100 nm and a lateral resolution of about 300 nm 3D structured illumination microscopy (3D-SIM) features an 8-fold volumetric resolution improvement over confocal microscopy [ 1 , 2 ]. This improvement is achieved by redirecting the laser beams through a mobile grid and scanning each section 15 times with a slightly altered grid location and orientation (3 angles with 5 phases each). The signals produced at the borders of this mobile grid allow a software to compute super-resolution images [ 3 – 6 ]. This scanning and calculating procedure has three requirements for specimens. Firstly, 15 scans per section require superior bleach resistant signal providing molecules. This is especially important when scanning thick objects since the total exposure time throughout all sections increases with the total number of z-sections scanned. Secondly, all signal providing molecules must remain at their 3D location during the entire scanning process, otherwise the calculation of the final image stack will fail. Since complete stacks are scanned for each angle before rotating the grid, even the slightest movement may reduce image quality markedly. Even individual signal providing molecules moving through the object such as particles can greatly interfere with the algorithm. Thirdly, 3D-SIM is a form of wide-field microscopy. This means that sharp images can only be acquired in an area at a certain distance to the cover glass. Signals outside the optimal range will appear less crisp and image artifacts such as artificial generation of signals can occur. This requires the use of the correct oil for a specific distance to the cover glass. Because of these three requirements flat and adherent cells are the optimal choice for 3D-SIM. However, blastomeres of mammalian embryos are non-adherent, large and surrounded by the zona pellucida. We have developed a protocol for 3D-SIM on mammalian embryos and generated high quality data for multiple studies [ 7 , 8 ]. Here we present a detailed experimental protocol how to achieve superior image quality of mammalian blastomeres using 3D-SIM.
All animal procedures and experiments with embryos were approved by the Government of Upper Bavaria (permit number 55.2-1-54-2532-34-09) and performed in accordance with the German Animal Welfare Act and European Union Normative for Care and Use of Experimental Animals.
Female mice were injected interperitoneally (IP) with pregnant mare’s serum (PMS) between 1:00 and 4:00 PM of Day 1. On Day 3, forty-two hours after the PMS injection, the mice received an IP injection of human chorionic gonadotropin (HCG). Immediately following injection, females of the FVB/N inbred strain were mated with males of the same mouse strain. Ovulation occurs approximately 12 h after HCG injection, at which time the eggs can be fertilized. Females were screened every morning and evening for vaginal plugs to see if mating has occurred and sacrificed by cervical dislocation at the same day after finding a vaginal plug (0.5 dpc). For embryo recovery, females were euthanized by cervical dislocation under isoflurane anesthesia. The oviduct was removed and flushed with M2 medium (Sigma, Taufkirchen, Germany) containing 0.4 % bovine serum albumin (BSA) (Roth, Karlsruhe, Germany). Zygotes were collected under a stereo microscope (Zeiss, Jena, Germany) with 20x magnification and transferred to microdrops of M16 medium (Sigma) on a culture dish covered with paraffin oil (Roth). Embryos were cultivated at 37 °C and 5 % CO
Recovery of embryos was performed as described [ 9 ]. Female Zika rabbits were first superovulated by injection of 100 IU (international units) of equine chorionic gonadotropin (ECG; Intergonan, Intervet) intramuscularly and 100 IU of human chorionic gonadotropin (HCG; Ovogest, Intervet) intravenously 72 h later. 18-20 h post-HCG injection and after natural mating in vivo fertilized zygotes were flushed from the explanted oviducts of rabbits in warm phosphate buffered saline (PBS) supplemented with 4 mg/ml bovine serum albumin. Rabbit embryos were cultured in Quinn’s medium (SAGE, Trumbull, CT) containing 2.5 % fetal calf serum (FCS) in a humidified atmosphere of 5 % CO
In vitro fertilization of bovine embryos was performed as described [ 10 ]. Cumulus-oocyte complexes (COCs) were obtained by aspiration from ovaries of slaughtered cows. COCs were matured in modified Parker’s medium containing TCM199 supplemented with 5 % estrous cow serum (ECS) and 0.2 U/ml o-FSH (Ovagen; ICPbio) for 20–22 h at 39 °C, 5 % CO
Clean cover glasses were covered by polylysine (33 μl of a 1:100 Polylysine dilution in aqua bidest for 5 min) applying it in the exact center of each cover glass. If the covered area was too large the Vectashield applied to this prepared area at the final steps of the embedding procedure touched the constructed chamber’s walls and could leave the blastomeres uncovered and dried out (see below). When finished with the last cover glass, but at least 5 min after the start with the first one, the drop of polylysine solution was rinsed off the cover glasses in the same order with 500 μl-1000 μl aqua bidest. No drops were left, since after drying they could leave marks. The polylysinated side in the same corner of each cover glass was marked with a permanent marker and with a character or number that can only be read correctly from one side (for example "1"). Even though no liquid was visible on the slides they were dried for at least 2 h.
Clean glasses were covered with 4 layers of Tesa-Film. To cover a glass its center was pressed at a 45° angle against the sticky side of the film (Fig. 1a). Rotating a finger slowly in a circular pattern, the film was carefully pressed against the glass and attached onto the glass without generating bubbles. Then the film was cut off before and after the attached region on the glass. This procedure was repeated 3 more times to obtain 4 layers of Tesa-Film exactly on the top of each other on the glass. The reason for building such a high chamber lies in the effect of the objective pressing down and thereby reducing the distance between the cover glass and the slide inside the chamber. According to the equation of continuity A1*v1 = A2*v2 (A1, A2 = cross-sectional areas before and after distance reduction; v1, v2 = speed of the embedding medium before and after distance reduction) the flow speed of the embedding medium inside the chamber will increase when pressing against the cover glass with the objective. A larger initial volume in the chamber equals a smaller relative volume decrease which equals a smaller speed increase under the pressure of the objective. Furthermore, the slide was placed under a stereo microscope and using a scalpel and tweezers the pattern shown in Fig. 1b was cut into all 4 layers. The central area should be as large as possible to prevent contact between embedding medium and film when placing the cover glass on top of this structure. The parts shown in Fig. 1c were removed with tweezers except for the center part. This central area of the film remained attached during storage and was removed shortly before placing the cover glass on top of this construct in order to minimize dust within the central chamber.
Preparation of slides. a The film was attached to the slide. The black arrow marks the spot where the film was pressed against the slide in a circular motion. b The film layers were cut with a scalpel. The dashed lines mark the cutting positions. c The slide was prepared for storage. The grey areas inside the outer border mark Tesa-Film removed with 'tweezers'
Unless noted otherwise fixation of embryos and all subsequent steps were performed at room temperature (RT). For preservation of the 3D shape of embryos and nuclei it was necessary to avoid any deforming pressure and prevent embryos from drying out at any step of the following procedures. Embryos were briefly washed in 38 °C 1x phosphate buffered saline (PBS), fixed in 2 % paraformaldehyde (PFA) in PBS for 10 min, washed twice in PBS and then stored at 4 °C in PBS until further use. The maximum allowed storage duration depended on the concentration of target proteins for staining. Target proteins with a low concentration such as histones were stained and scanned shortly after fixation because the achievable signal strength diminishes with time. Target proteins with a high concentration such as nuclear lamins or nucleoporins were stained and scanned even after months of storage in PBS with acceptable signal strengths compared to the background signals.
Background caused by PFA was quenched using 20 mM glycine in PBS for 10 min. After washing twice with PBS embryos were permeabilized with 0.5 % Triton-X 100 for 15-30 min. After washing twice with PBS unspecific background signals were reduced by incubation in 2 % BSA for 2-4 h at RT. When targeting proteins with a low concentration, such as histones, embryos were blocked before staining for 4 h or longer in 2 % BSA in PBS to differentiate actual signals from background more efficiently. Four hours of blocking could result in a more focused localization of the signals leading to a slightly altered appearance compared to blocking for 2 h. When targeting proteins with a high concentration such as nuclear lamins or nucleoporins embryos were blocked before staining for only 2 h since the background was relatively less intense. However, maximum image quality was achieved with a blocking for 4 h. Then embryos were sequentially incubated in 40 μl of primary and secondary antibody solutions contained within PCR-tube caps, diluted in PBS with 2 % BSA. The source of the first antibody was different from the species of the embryo or the zona pellucida to avoid staining problems (see Troubleshooting below). In the case of using the same source as the embryo’s species, the zona pellucida was removed prior to staining as described below. Tables 1 and 2 show examples of primary and secondary antibodies used successfully with 3D-SIM. Specimens were incubated with primary antibodies overnight at 4 °C. After washing in PBS for 5 times with 2 % BSA the appropriate secondary antibodies, diluted in PBS with 2 % BSA, were applied for 1 h, again followed by washing in PBS for 5 times with 2 % BSA and 5 times without BSA. BSA had two effects. It blocked background signals and made embryos less sticky. While the first property was desired the second one was counter-effective when trying to attach blastomeres on a cover glass for minimal movement. In order to maximize stickiness even after 5 times of washing away BSA with PBS the following fixation step was used to bind the remaining BSA. After washing away the PFA embryos were extremely sticky and in order to prevent their attachment to any surface PBS was constantly pumped under the embryos to keep them floating within the PBS and transporting the embryos not within the transferpettor’s pipette but in a tiny drop at the tip of it. If the embryo has attached to a surface recovery was possible by blowing the embryo with the PBS very strongly against it. However, the pressure produced by a standard size opening of a pipette on a transferpettor may not suffice. In this case, the tip of a new glass pipette was melted until the opening was barely visible. Coating the pipette with silicone and the surfaces with silicone or agar may prevent embryos from attaching prior to the final embedding step. A cover glass with the polylysinated side upwards was put into the middle of the cover of a 3.5 cm well. A drop of 10-20 μl PBS was added in the center of the glass. Fixation of antibodies was performed with 4 % PFA in PBS for 10 min, followed by washing twice in PBS. PFA could cause increased background signals in the 488 nm channel. Therefore, fixing antibodies with only 2 % PFA in PBS was used to reduce such additional background signals. Chromatin was counterstained with DAPI (Life Technologies, Catalog No. D1306; 4′,6-diamidino-2-phenylindole) 25 μg/ml diluted in PBS for 15 min followed by washing twice in PBS.
Examples of primary antibodies used successfully with 3D-SIM
| Host | Target | Official name | Dilution | Company | ID |
|---|---|---|---|---|---|
| Goat | Epitope at C-terminus of Lamin B1. Detecting Lamin B1 and, to a lesser extent, Lamin B2 | Lamin B Antibody (M-20) | 1:100 | Santa Cruz | SC-6217 |
| Mouse | NUP153 | Anti-NUP153 [QE5] antibody | 1:200 | Abcam | ab24700 |
| Rabbit | H3K4me3 | Anti-Histone H3 (tri methyl K4) antibody - ChIP Grade | 1:100 | Abcam | ab8580 |
| Mouse | H3K9me3 | Histone H3K9me3 antibody (mAb) | 1:100 | Active Motif | 39285/6 |
| Rat | RNAPII-S5p | Monoclonal antibody against CTD phosphoserine epitope 5 | 1:20 | Gift from Dirk Eick (see Markaki et al. [ 23 ]) | |
| Mouse | B23 | Monoclonal Anti-B23 antibody produced in mouse | 1:1000 | Sigma | B0556 |
The host should be different from the species of the embryo. Otherwise, the zona pellucida should be removed prior to staining
Examples of secondary antibodies used successfully with 3D-SIM
| Host | Target | Fluorophore | Excitation [nm] | Dilution | Company | ID |
|---|---|---|---|---|---|---|
| Donkey | Mouse IgG (H + L) | Alexa | 488 | 1:400 | Invitrogen | A-21202 |
| Donkey | Mouse IgG (H + L) | Alexa | 594 | 1:500 | Invitrogen | A-21203 |
| Donkey | Goat IgG (H + L) | Alexa | 488 | 1:400 | Invitrogen | A-11055 |
| Donkey | Goat IgG (H + L) preadsorbed | Alexa | 594 | 1:400 | Abcam | ab150136 |
| Donkey | Rabbit IgG (H + L) | Dylight (Alexa bleaches less) | 488 | 1:300 | Jackson Immuno Research | 711-485-152 |
| Donkey | Rabbit IgG (H + L) | Dylight (Alexa bleaches less) | 594 | 1:500 | Jackson Immuno Research | 711-505-152 |
| Goat | Mouse IgG (H + L) preadsorbed | Alexa | 594 | 1:300 | Invitrogen | A-11032 |
| Donkey | Rat IgG (H + L) | Alexa | 594 | 1:300 | Invitrogen | A-21209 |
The 3.5 cm well containing the polylysinated cover glass, the drop of PBS and the embryo were transported to a microscope with at least one micromanipulator (two are preferred). An empty injection needle was mounted into the right micromanipulator holder. Similarly, a needle with a diameter smaller than an embryo was mounted into the left micromanipulator holder. This second needle was helpful to stabilize the position of the embryo but was not absolutely necessary for the subsequent steps. Once the embryo was placed inside the drop of PBS on top of the polylysinated cover glass adhesion forces attached the zona pellucida to the glass. An area of the zona pellucida slightly remote from the blastomeres was pressed against the cover glass with the injection needle. Then the needle was moved back and forth while keeping the zona pressed against the glass. The slit in the zona pellucida was enlarged by vibrating the needle via knocking against the micromanipulator with a finger (Fig. 2a). Afterwards the injection needle was inserted into the zona and stretched along the surface of the cover glass away from the embryo to open the zona even more. The embryo inside the open zona pellucida was rotated with the injection needle to line up the border between two blastomeres. Then the injection needle was placed along this border and moved back and forth to separate the blastomeres (Fig. 2b). Additional knocking against the micromanipulator could facilitate this process. A single blastomere was removed from the zona pellucida and the zona pellucida was moved with the remaining blastomeres away (Fig. 2c and d). The remaining blastomeres were moved inside the zona pellucida to a different remote location from the previous blastomere to prevent bleaching from scanning a neighbouring blastomere (Fig. 2e). The procedure was repeated for all blastomeres. The initial attachment of the blastomeres was automatically facilitated by the adhesion forces of the polylysinated surface. The attached blastomeres were left immobile otherwise this could lead to tearing and stretching artifacts. When working with blastocysts and the task was to scan only trophectoderm (TE) cells a blastocyst was let to sink on the glass and the monolayer of cells closest to the glass was scanned (Fig. 3a). The cell-free space inside blastocysts (blastocoel) can be large enough so that TE cells on the far side of the blastocyst do not interfere with the scans. If there were multiple layers of TE cells then individual TE cells were isolated and placed next to each other in remote locations as a monolayer. If inner cell mass (ICM) and TE cells were scanned the layer(s) of TE cells were cut like the zona pellucida. Tearing and stretching of cells remote from the slit were avoided. TE cells were then gently attached to the glass while the sphere of ICM cells was residing on top of this monolayer. This ICM sphere was then detached from the monolayer of TE cells by gently pressing against it with the side of the injection needle (Fig. 3b). The ICM sphere was then moved to a remote location and individual cells were isolated as described above for other embryos (Fig. 3c). To maximize image quality it was necessary to attach single blastomeres to the glass not touching each other (Fig. 3d). After attachment of all blastomeres to their target location additional attachments were performed to prevent movements disabling 3D-SIM reconstruction (Fig. 2f and g). The outermost part of blastomeres was pressed down with the injection needle against the cover glass. Then the 3.5 cm well was carefully rotated by 90° and the newly accessible outermost parts were pressed down. The zona pellucida was moved outside the drop so that it could not swim through the medium while scanning. When scanning sperm cells attached to the zona pellucida after an IVF procedure the zona was cut in smaller parts and these parts were pressed against the glass for maximum adhesion.
Isolation and attachment of individual blastomeres. a The zona pellucida was cut open. b A blastomere was isolated. c The isolated blastomere was moved outside the zona pellucida through the cut. d The zona pellucida with the remaining blastomeres was moved to the target location for the next blastomere. e Positions of blastomeres on the cover glass were chosen as far away from each other as possible, but not too close to the border of the PBS drop. f Once all blastomeres had been placed on the cover glass their outermost parts were pressed against the glass. The dashed line marks the section shown in G. g The attachment surface was increased even further by stretching out the pressed down periphery of blastomeres by moving the pressed down needle away from the blastomere. The circled N marks the position of the nucleus in this blastomere. h The finalized slide with the reversed cover glass attached in the center chamber and sealed with nail polish. The marker "1" was dissolved by the nail polish
Isolation of blastomeres from blastocysts. a The trophectoderm (TE) layer was cut open. b The inner cell mass was moved away from the TE layer. c Blastomere isolation. d Individual blastomeres were placed remotely from each other
The closed well was transported back to the stereo microscope. The excess of PBS was removed from the cover glass while keeping all blastomeres covered with it. The cover glass was washed two times with 10-20 μl of PBS and covered slowly with 10-20 μl of Vectashield. The excess of Vectashield was removed from the cover glass while keeping all blastomeres covered with it. The slide with the removed central part of the Tesa-Film was placed under the stereo microscope. The cover glass with the drop facing down was put above the center part of the Tesa-Film frame and slowly lowered until the drop reached the slide avoiding the attachment of the drop with the Tesa-Film. The edges of the cover glass rested on the outer frame of the Tesa-Film. All sides of the outer frame were treated with a very small amount of nail polish using a fine brush. A contact between nail polish and Vectashield was avoided, while ensuring the complete sealing of the outer frame. After the nail polish had dried out the slide with the cover glass was held down at an angle under the stereo microscope and all blastomeres were marked with arrows on the back of the slide, but not on the cover glass (Fig. 2h). The slide was stored at 4 °C horizontally with the cover glass facing down to prevent movement of the Vectashield drop and detachment of the blastomeres.
Selection of the correct oil required to produce crisp images at the desired distance to the cover glass was performed in two steps. Firstly, the oil was estimated using embryos at various stages of development based on empirical testing (Table 3 ). We found that smaller blastomeres required oils with lower refractive indexes. Secondly, the correct oil was determined by analyzing preview and reconstructed images provided by 3D-SIM and its accompanying software package.
Optimal refractive indices of oils per stage based on empirical testing
| Stage/cell type | Optimal refractive index of oil |
|---|---|
| Zygote (centrally located pronuclei) | >1.534 |
| 2-cell | 1.528–1.534 |
| 4-cell | 1.526–1.528 |
| 8-cell | 1.518–1.526 |
| 16-cell, morula and blastocyst | 1.512–1.518 |
| Spermatozoa, fibroblasts and cell lines | 1.512–1.514 |
A small drop of the estimated oil was applied on the clean cover glass. With the specimen localization microscope of the 3D-SIM setup the arrows in transmission light mode were found and the locations of the associated blastomeres were marked in the software.
The slide was transferred to the 3D-SIM microscope and the objective was moved in the z-direction at the position of the first blastomere. The z-position of the objective was compared before moving it towards the cover glass and afterwards. In our setup, smaller z-position values required oils with a higher refractive index, because the layer of the specimen was located at a greater distance from the cover glass. With this understanding, the preview image was used to predict the selection of the correct oil. In round specimens such as nuclei, wide-field microscopy apparently generates intense circular patterns that form cone shapes above and below the specimens (Fig. 4). The key to find the oil that provides a focused image in the vertical center of the specimen is to ensure that the distance of the upper and lower congregation points to the specimen is equal above and below the specimen (Fig. 4a–c). This can be assessed by moving in the z-direction above and below the specimen and counting sections between the top and bottom cone focal points and the first clearly visible grid on the nucleus’ top and bottom side. If the distance of the upper and lower congregation points was equal above and below the specimen then the focal section of the oil was in the specimen center. This was verified by checking for sharp lines of the grid in the mid-section. If the distance was not the same, then the oil with a higher refractive index was used in the case when the side of the nucleus with the lower z-position had a shorter distance between the cone focal point and the first clearly visible grid on the nucleus compared to the side of the nucleus with the higher z-position. If this scenario was reversed then the oil with a lower refractive index was used.
Determination of the correct oil before the first scan. a1–5 Preview images of the first focal point of grid-free signals ( a1), the first occurrence of the grid on the specimen ( a2), the mid-section ( a3), the last occurrence of the grid ( a4) and the second focal point of grid-free signals. b1–5 show the same images as in ( a1–5) with optimized contrast for improved visualization of the grid. c1 Orthogonal view of the first of the three non-reconstructed scans with different angles. The dashed lines mark sections ( a1– a5). c2 Orthogonal view of the second of three non-reconstructed scans. Note the reduction of signal strength between the two scans caused by bleaching. d1 Orthogonal view of the reconstructed scan. The central dashed line marks the section of D2. d2 Reconstructed mid-section with full resolution
3D-SIM of embryonic nuclei was performed on a DeltaVision OMX V3 system (Applied Precision Imaging/GE Healthcare) with a lateral (x,y) resolution of ~120 nm and an axial (z) resolution of ~300 nm. The system was equipped with a 100x/1.40 NA PlanApo oil immersion objective (Olympus), Cascade II:512 EMCCD cameras (Photometrics) and 405, 488 and 593 nm diode lasers. Image stacks were acquired with a z-distance of 125 nm and with 15 raw SIM images per plane (5 phases, 3 angles). The SI raw data were computationally reconstructed with channel specific measured OTFs using the softWoRX 4.0 software package (Applied Precision). Images from the different color channels were registered with alignment parameters obtained from calibration measurements with 0.2 μm diameter TetraSpeck beads (Invitrogen). The voxel size of the reconstructed images is 39.5 nm in x,y and 125 nm in z with 32-bit depth. For all subsequent image processing and data analysis, images were converted to 16-bit composite tiff-stacks. Image stacks were processed using ImageJ 1.45b (
Before scanning the specimen was centered by comparing the distance of its border to the borders of the frame. This was also checked throughout all z-sections to use entire 3D-stacks. The key to great scans of perfectly immobile and clean specimens in clean Vectashield was to minimize bleaching during the scan. With highly concentrated target proteins such as lamins or nucleoporins a special property of the Alexa brand of secondary antibodies was used to not only reduce bleaching, but even stop or reverse bleaching. Alexa antibodies displayed two bleaching properties. Firstly, they bleached during a first intense scan (Table 4 ). Secondly, after such a first intense scan, their photon count was much more stable during a second less intense scan (Table 5 ). To obtain optimal results, Alexa stained specimens were scanned with a highly concentrated target protein in two steps. In the first step scanning was performed using the CCD camera with high laser intensity. This first reconstructed scan was inspected using the orthogonal viewer of the DV viewer software or with FIJI (ImageJ with appropriate plugins for viewing DV files) to check if the correct oil had been selected (Fig. 4). In that case, the two cones on the top and on the bottom of the sample had the same height. If the intensity of the signals did not allow for a second scan with the settings according to Table 5 then the first scan was repeated. The second scan was performed with a highly sensitive EMCCD camera with far less intense laser settings. A large photon count reduction was observed between the beginning and the end of the first, high intensity scan. The photon count stayed more stable in the second, low intensity scan. However, even the initial scan yielded very good results in many cases. This could be due to the fact that the bleaching of the fluorescent beads used to configure the algorithm of the software was proportional to the bleaching of the initial scan and therefore resembled the configured situation better than a reduced bleaching situation. Generally however, less bleaching was better than more bleaching. If the image quality was suboptimal when scanning multiple wavelengths at the same time then those were scanned in separate runs and the channels were combined after the scans using FIJI or the DV software provided with the microscope. The reduced image quality in parallel scans could be due to fluorophores being bleached by other wavelengths as well, adding additional bleaching during parallel scanning. For optimal results each channel was bleached independently until the scenario described in Table 5 was achieved for all channels at the beginning of the final scan. If the target was not highly concentrated multiple scans were avoided. In this case each channel was scanned independently with the second scan settings.
Microscope settings and expected photon counts for the first scan
| Fluorophor/staining | Mode | Exposure | Laser | Initial photon count |
|---|---|---|---|---|
| Alexa | CCD 5 MHz | 25 ms | 50 % | 17000 |
| DAPI | CCD 5 MHz | 50 ms-120 ms (lower is better) | 100 % | 8000 - 16000 |
Microscope settings and expected photon counts for the second scan
| Fluorophor/staining | Camera | EMCCD gain | Exposure | Laser | Initial photon count |
|---|---|---|---|---|---|
| Alexa | EMCCD 5 MHz | 2800-3300 | 30 ms | 10 % | 17000 |
| DAPI | CCD 5 MHz | - | 50 ms-120 ms (lower is better) | 100 % | 8000 – 16000 |
Not all objects generated cones of artificially increased signals above and below the object. Non-round nucleus-like objects observed in early stage rabbit embryos did not generate intense cones (see the orthogonal views in Fig. 5). In this case, the correct oil was determined after the first scan. A highly concentrated target protein generating line-like signals along the z-axis like a nuclear lamina staining was the best indicator of whether to increase or lower the chosen oil refractive index and for this purpose orthogonal views of the first scan were generated. This was performed with the DV viewer software or with FIJI. Objects like nucleoli were identified in the stack and in the preview window to determine whether the top or the bottom of the z-stack were closer to the cover glass. To determine whether the top or the bottom of the scanned stack was closer to the cover glass the objective was moved up and down in the z-axis with the preview window and the z-position was compared with the objective’s position when it was at a large distance to the cover glass before scanning. The area of the z-stack was identified in the orthogonal viewer with the highest signal intensity and the sharpest lines (Fig. 5). This focus area was moved further away from the glass by changing to oil with a higher refractive index or moved closer to the glass by changing to oil with a lower refractive index. Once the correct oil had been identified all channels were scanned.
Effect of oils with different refractive indices. The same nucleus stained for lamin B from a rabbit 8-cell stage in vivo embryo scanned with 1.520 ( a), 1.526 ( b) and 1.530 ( c) oils. Note the movement of the optimal focal section away from the cover glass with higher oils. The sides of the orthogonal views are color-coded for high quality sections at around the optimal focal section (green), medium quality sections further away (yellow) and low quality sections even further away (red)
To ensure high quality scans the scanned stack was computed immediately after scanning. If the computed result was not optimal the same area was scanned again with different settings. In large scans the central area of 256 by 256 pixels was cut out and only this area was reconstructed for preview purposes. The final images were reconstructed with the optical transfer function (OTF) files generated using the optimal oil for fluorescent beads attached to the cover glass. In our case the refractive index of the oil optimal for beads was 1.512. Drift correction was activated to counteract any movements and produce images with a maximum quality. This setting did not have any negative effects on scans with perfectly still specimens.
PMS: pregnant mare’s serum
HCG: human chorionic gonadotropin
Isoflurane
BSA: bovine serum albumin
M2: medium
M16: medium
ECG: equine chorionic gonadotropin
Quinn’s medium
FCS: fetal calf serum
Parker’s medium
TCM199: medium
ECS: estrous cow serum
FSH: follicular stimulating hormone
FERT-TALP: fertilization medium Tyrode's albumin lactate pyruvate supplemented
Heparin: sodium salt
SOF: synthetic oviductal fluid
BME: Basal Medium Eagle
MEM: Minimum Essential Medium
Polylysine
Vectashield
PFA: paraformaldehyde
Glycine
Triton-X 100
DAPI: 4′,6-diamidino-2-phenylindole
In the case of a suboptimal image quality of scanned blastomeres we tested the staining and the microscope first using flat, adherent cells stained using the same conditions as stated above. If channels were misaligned (Fig. 6a) in adherent cells we recalibrated the microscope using fluorescent beads with the same temperature during scanning as for calibration. Misalignment could be checked best with prominent structures in multiple channels such as a lamin B and a nucleoporin staining or a nucleoli and a DAPI staining in nuclei with nucleoli lined by dense chromatin. If antibodies for internuclear signals were also located at the nuclear periphery (Fig. 6b) we used only 2 % BSA in PBS as blocking buffer since other additives could reduce accessibility of chromatin for antibodies. The antibody itself could also not be specific.
Potential problems. a1. Misaligned B23 (green), H3K4me3 (red) and DAPI (grey) channel. a2 shows an enlargement of the box in a1. Arrows mark the gap between the signals that should be aligned. b. H3K4me3 staining at the periphery occasionally caused by using the blocking buffer developed by Markaki et al. [ 21 ] and utilized by Huebner et al. [ 22 ] without such an effect. c1. Movement during scanning may have caused short lines instead of round nuclear pores as visualized by a NUP153 staining. c2. The DAPI channel from the same nucleus as shown in c2 is blurry. c3. The lines of lamin B of the same nucleus as shown in c1 and c2 are duplicated. d1. Blurry X/Y section of a DAPI stained nucleus next to another DAPI stained nucleus at the right top border. d2. The X/Z section marked in D1 shows lines emanating from all four corners caused by the second nucleus (marked by arrows; compare with Figure 4 D1). d3. These lines interfere with the signals produced by the central nucleus. e. Rabbit anti CDX2 staining of a rabbit blastocyst recorded by confocal microscopy shows a normal staining pattern outside the zona pellucida, a strongly stained zona pellucida and an altered staining pattern of blastomeres inside the zona pellucida when compared with nuclei outside the zona pellucida
The wrong oil led to suboptimal results as described above. Bleaching was minimized by the pre-bleaching strategy outlined above. In the case of bleaching the top sections of a nucleus in an orthogonal view were brighter than the bottom sections. Artificial short lines emanating from the real signals (Fig. 6c) indicated sample movement during scanning. This could be either due to an improper attachment of the sample to the cover glass or movements of other materials inside the sample (loose fluorophores or particles). The solution was to re-attach the specimen and to fix the specimen again. To achieve this with the same sample, PBS was added to the hardened nail polish seal while gently disconnecting the bond between the nail polish and the cover glass with very thin tweezers. Once the nail polish seal and the Tesa-Film were disconnected from the cover glass on all sides the cover glass was lifted up using tweezers, turned in the way that the drop of Vectashield faced up and then placed inside a 3.5 cm well. All subsequent steps were performed by exchanging chemicals on the cover glass with the blastomeres still attached. Vectashield was washed away gently but completely with PBS for 5 times while not blowing against the attached blastomeres. The specimen was fixed with 4 % PFA in PBS for 10 min, washed twice with PBS and restained with DAPI 25 μg/ml diluted in PBS for 15 min followed by washing twice in PBS. The well was moved to a microscope featuring micromanipulators. The periphery of blastomeres was pressed onto the cover glass with an injection needle attached to a micromanipulator as described above. The well was moved back to a stereo microscope and the sample was washed gently without blowing against the blastomeres with PBS for 5 times. The different light direction options of the stereo microscope were used to check the medium for floating particles. All particles were removed with a pipette. The specimens were washed twice with Vectashield and checked again for particles. All particles were removed with a pipette. The cover glass was turned in the way that the Vectashield was facing down and then was slowly lowered to a fresh clean slide while keeping it horizontally aligned. The slide was sealed with nail polish and scanned again. Another factor for optimal image quality was to ensure that there were no additional nuclei in close vicinity (Fig. 6d) to the nucleus scanned. Nuclei in the vicinity could cause artificial patterns reducing the image quality. If the zona pellucida displayed strong signals (Fig. 6e) while blastomeres within the zona pellucida had low to no signals the secondary antibody was most likely targeting the embryo’s species. The zona pellucida could be saturated with target proteins. This is a common problem with mouse and rabbit embryos as most secondary antibodies are created in these species. The solution to this problem was to remove the zona pellucida before the first contact with antibodies. Handling sticky embryos after removal of 2 % BSA in PBS without a zona pellucida could be challenging. This required constant blowing under the embryos to prevent attachment to the bottom of the Eppendorf tube cap. When moving embryos between caps it was necessary to keep embryos in a drop of liquid at the tip of the transferpettor’s pipette to prevent attachment inside the pipette. In order to maximize stickiness even after 5 times of washing away BSA with PBS the following fixation step was used to bind the remaining BSA. After washing away the PFA embryos were extremely sticky and in order to prevent their attachment to any surface PBS was constantly pumped under the embryos to keep them floating within the PBS and transporting the embryos not within the transferpettor’s pipette but in a tiny drop at the tip of it.
To avoid the stickiness of embryos with or without the zona pellucida a more simple solution than a complicated pipetting system could be the use of chambers/slides/dishes covered by agar or silicon and pipettes covered with silicon. However, such additional reagents in direct contact with the solutions containing the embryos may create particles disturbing the scanning and calculating procedure. It should also be noted that the embryo’s stickiness is increased during prolonged storage of the fixed embryos at 4 °C, as prolonged storage can alter the surface of blastomeres and of the zona pellucida.
Figure 7 features 3D-SIM scans of nuclei in blastomeres from cattle, rabbit and mouse embryos and rabbit spermatozoa. A confocal scan shows the difference in resolution.
Examples of 3D-SIM and confocal microscopy scans. a. 3D-SIM scans of a nucleus in a trophectoderm blastomere from a bovine blastocyst. b. 3D-SIM scans of a nucleus in a blastomere from a rabbit 21-cell embryo. c. 3D-SIM scans of a nucleus in a blastomere from a mouse morula. The background may have increased slightly since this morula was stored for 2 years in PBS under mineral oil between fixation and staining. d. 3D-SIM scans of a rabbit spermatozoon. e. Confocal microscopy scans of a nucleus in a blastomere from a rabbit 2-cell stage embryo. a1– e1. DAPI. a2– e2. NUP153. a3– e3. Lamin B. a4– e4. Composite of DAPI (grey), NUP153 (green) and lamin B (red). a5– d5. DAPI without a correction of the background signals. a6– d6. NUP153 without a correction of the background signals. a7– d7. Lamin B without a correction of the background signals
This figure showcases the image quality possible with our 3D-SIM protocol by resolving individual nuclear pores.
While 3D-SIM surpasses the image resolution of confocal imaging [ 11 , 12 ], the stabilization of specimens, the determination of the correct oil, potentially increased bleaching by scanning each section far more often than during confocal microscopy and the requirement of reconstructing the final image make this method more demanding. Alternatively, confocal scanning without deconvolution may be the preferred method if signal intensities between multiple samples have to be compared, since algorithms can alter the signal intensity and create artifacts [ 13 ]. Wide-field microscopy also introduces new artifacts such as spherically increased signals to the specimens, which were not observed in confocal scans. GFP or RFP signals can get bleached too much with our setup and may require GFP or RFP boosters featuring Alexa fluorophores.
While the resolution of 3D-SIM is lower than the resolution achieved with electron microscopy [ 14 , 15 ], 3D-SIM offers the advantage of using lasers with multiple wavelengths for multiple target co-localization studies not possible with electron microscopy. Additionally, embedding specimens in solid blocks and cutting/milling the blocks for scanning sections is necessary for electron microscopy and may introduce artifacts such as stretching of sections or cut marks [ 16 , 17 ]. 3D-SIM can be performed in a liquid embedding medium that does not dry out and does not require cutting/milling and therefore does not change the morphology of specimens as demonstrated in completely spherical nuclei in 3D. However, liquid embedding media with a different density than PBS may potentially cause temporary deformation. A temporarily deformed zona pellucida was observed in earlier tests when embedding whole embryos with a zona pellucida in one step from PBS to Vectashield. Usually, the deformed zona pellucida recovered its original shape after some time. This temporary problem can be circumvented by washing embryos with increasing concentrations of the embedding medium in PBS before the final embedding step in pure embedding medium. Spherical nuclei in all dimensions prove that deformation based on medium density differences is either temporary or does not affect blastomeres. Earlier tests with embedding media that harden such as ProLong Gold led to alterations in morphology and an increased background signal and are therefore not recommended. This may be due to volume reductions during vaporization of the solvent.
This protocol essentially aims to simulate the stability of fluorescent molecule localizations of adherent cells by attaching blastomeres to polylysinated cover glasses. Furthermore, it aims to simulate their proximity to the cover glass by using the correct oil to work around the distance to the cover glass. Therefore, because this protocol essentially turns blastomeres into simulated adherent cells close to the cover glass, it is feasible that this protocol is also compatible with other super-resolution microscopy solutions proven to work with adherent cells such as photoactivated localization microscopy (PALM) [ 18 ], stochastic optical reconstruction microscopy (STORM) [ 19 ] and stimulated-emission-depletion microscopy STED [ 20 ].
To our knowledge, this protocol presents for the first time a highly detailed and practical way to perform super-resolution fluorescence microscopy on areas within blastomeres of mammalian embryos which can be remotely located from the cover glass. It underscores the importance of stabilizing the location of all signal providing molecules throughout the scanning process and demonstrates the process of achieving stability in non-adherent cells. Furthermore, this protocol gives practical advice in selecting the oil with the correct refractive index before the first scan is performed. Selection of the correct oil is mandatory for performing high quality wide-field microscopy at large distances from the cover glass such as nuclei in large, round blastomeres of early mammalian embryos.
While the image resolution surpasses confocal imaging, the stabilization of specimens, the determination of the correct oil, potentially increased bleaching by scanning each section more often than in confocal microscopy and the requirement of reconstructing the final image make this method more demanding. The problem of bleaching is far greater in large blastomeres that require scanning of many z-sections than in flat adherent cells. This protocol gives practical advice on how to utilize the non-linear bleaching properties of Alexa fluorophores to minimize bleaching in large stacks.
Finally, this protocol serves as a guide to generate super-resolution fluorescence scans of areas within blastomeres in a highly robust and reliable way.
three-dimensional
nucleolar phosphoprotein B23
Bovine serum albumin
Charge-coupled device
Caudal-type homeobox 2
4′,6-diamidino-2-phenylindole
Electron multiplying charge coupled device
Green fluorescent protein
Histone 3 lysine 4 trimethylated
Inner cell mass
in vitro fertilization
Nucleoporin 153 kDa
Phosphate buffered saline
Paraformaldehyde
Red fluorescent protein
Room temperature
Structured illumination microscopy
Trophectoderm
Competing interests
The authors declare that they have no competing interests.
Authors’ contributions
Conceived and designed the experiments: JP VZ. Performed the experiments: JP TG VZ. Analyzed the data: JP. Wrote the paper: JP EW VZ. All authors read and approved the final manuscript.
We gratefully acknowledge the support provided by Thomas Cremer. This study was supported by grants from the Deutsche Forschungsgemeinschaft to E.W. and V.Z. (CR 59/26, FOR 1041, ZA 425/1-3). In addition, research of E.W. and V.Z. was supported by the EU grant Plurisys, HEALTH-F4-2009-223485 FP7 Health 534 project. The authors are members of COST Action BM1308 “Sharing Advances on Large Animal Models – SALAAM”.