<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.pymol.org/index.php?action=history&amp;feed=atom&amp;title=Tiff2ccp4</id>
	<title>Tiff2ccp4 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.pymol.org/index.php?action=history&amp;feed=atom&amp;title=Tiff2ccp4"/>
	<link rel="alternate" type="text/html" href="https://wiki.pymol.org/index.php?title=Tiff2ccp4&amp;action=history"/>
	<updated>2026-07-10T10:38:32Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.1</generator>
	<entry>
		<id>https://wiki.pymol.org/index.php?title=Tiff2ccp4&amp;diff=13597&amp;oldid=prev</id>
		<title>Cchem: 1 revision</title>
		<link rel="alternate" type="text/html" href="https://wiki.pymol.org/index.php?title=Tiff2ccp4&amp;diff=13597&amp;oldid=prev"/>
		<updated>2016-08-22T02:06:16Z</updated>

		<summary type="html">&lt;p&gt;1 revision&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left diff-editfont-monospace&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 02:06, 22 August 2016&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Cchem</name></author>
	</entry>
	<entry>
		<id>https://wiki.pymol.org/index.php?title=Tiff2ccp4&amp;diff=13596&amp;oldid=prev</id>
		<title>Speleo3: see also load_img_stack</title>
		<link rel="alternate" type="text/html" href="https://wiki.pymol.org/index.php?title=Tiff2ccp4&amp;diff=13596&amp;oldid=prev"/>
		<updated>2016-08-17T14:23:49Z</updated>

		<summary type="html">&lt;p&gt;see also load_img_stack&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left diff-editfont-monospace&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 14:23, 17 August 2016&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l2&quot; &gt;Line 2:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 2:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;This script will convert tiff stacks to CCP4 maps for reading in PyMOL.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;This script will convert tiff stacks to CCP4 maps for reading in PyMOL.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;''See also the [[load_img_stack]] script for loading image stacks directly into PyMOL''.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;If someone knows how to determine the file's dimensions from the file itself (not the image size, but the physical dimension size) please let me know.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;If someone knows how to determine the file's dimensions from the file itself (not the image size, but the physical dimension size) please let me know.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Speleo3</name></author>
	</entry>
	<entry>
		<id>https://wiki.pymol.org/index.php?title=Tiff2ccp4&amp;diff=5699&amp;oldid=prev</id>
		<title>Pyadmin: 3 revisions</title>
		<link rel="alternate" type="text/html" href="https://wiki.pymol.org/index.php?title=Tiff2ccp4&amp;diff=5699&amp;oldid=prev"/>
		<updated>2014-03-28T01:44:36Z</updated>

		<summary type="html">&lt;p&gt;3 revisions&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Overview =&lt;br /&gt;
&lt;br /&gt;
This script will convert tiff stacks to CCP4 maps for reading in PyMOL.&lt;br /&gt;
&lt;br /&gt;
If someone knows how to determine the file's dimensions from the file itself (not the image size, but the physical dimension size) please let me know.&lt;br /&gt;
&lt;br /&gt;
Note: requires Python 2.7 or later (for argparse).&lt;br /&gt;
&lt;br /&gt;
= Usage =&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#&lt;br /&gt;
# convert input.tiff to output.ccp4 which has cell dimensions&lt;br /&gt;
# x=40 A, y=80.5 A, Z=125.2 A&lt;br /&gt;
#&lt;br /&gt;
python tiff2ccp4.py input.tiff output.ccp4 -x 40 -y 80.5 -z 125.2&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
# print help&lt;br /&gt;
#&lt;br /&gt;
python tiff2ccp4.py -h&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= The Code =&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
#&lt;br /&gt;
# tiff2ccp4.py -- convert a TIFF stack to a CCP4 map&lt;br /&gt;
#&lt;br /&gt;
# Author: Jason Vertrees&lt;br /&gt;
# Date  : 2011-09-16&lt;br /&gt;
#&lt;br /&gt;
# Notes : To get help, type &amp;quot;python tiff2ccp4.py -h&amp;quot;&lt;br /&gt;
#&lt;br /&gt;
import struct&lt;br /&gt;
import sys&lt;br /&gt;
import string&lt;br /&gt;
&lt;br /&gt;
# key   = field_type&lt;br /&gt;
# value = # bytes for that field&lt;br /&gt;
field_types = {                                                                                                                &lt;br /&gt;
    1 : 1,                                                                                                                     &lt;br /&gt;
    2 : 1,                                                                                                                     &lt;br /&gt;
    3 : 2,                                                                                                                     &lt;br /&gt;
    4 : 4,                                                                                                                     &lt;br /&gt;
    5 : 8,                                                                                                                     &lt;br /&gt;
    6 : 1,                                                                                                                     &lt;br /&gt;
    7 : 1,                                                                                                                     &lt;br /&gt;
    8 : 2,                                                                                                                     &lt;br /&gt;
    9 : 4,                                                                                                                     &lt;br /&gt;
    10: 8,                                                                                                                     &lt;br /&gt;
    11: 4,                                                                                                                     &lt;br /&gt;
    12: 8 }                                                                                                                    &lt;br /&gt;
                                                                                                                               &lt;br /&gt;
field_fmt = {                                                                                                                  &lt;br /&gt;
    1 : &amp;quot;B&amp;quot;,                                                                                                                   &lt;br /&gt;
    2 : &amp;quot;c&amp;quot;,                                                                                                                   &lt;br /&gt;
    3 : &amp;quot;H&amp;quot;,                                                                                                                   &lt;br /&gt;
    4 : &amp;quot;I&amp;quot;,                                                                                                                   &lt;br /&gt;
    5 : &amp;quot;II&amp;quot;,                                                                                                                  &lt;br /&gt;
    6 : &amp;quot;i&amp;quot;,                                                                                                                   &lt;br /&gt;
    7 : &amp;quot;B&amp;quot;,                                                                                                                   &lt;br /&gt;
    8 : &amp;quot;h&amp;quot;,                                                                                                                   &lt;br /&gt;
    9 : &amp;quot;i&amp;quot;,                                                                                                                   &lt;br /&gt;
    10: &amp;quot;ii&amp;quot;,                                                                                                                  &lt;br /&gt;
    11: &amp;quot;f&amp;quot;,                                                                                                                   &lt;br /&gt;
    12: &amp;quot;d&amp;quot; }                                                                                                                  &lt;br /&gt;
                                                                                                                               &lt;br /&gt;
tag_types = {                                                                                                                  &lt;br /&gt;
    &amp;quot;NewSubfileType&amp;quot; : 254,                                                                                                    &lt;br /&gt;
    &amp;quot;ImageWidth&amp;quot;  : 256,  # # cols (number of pixels per scanline)                                                             &lt;br /&gt;
    &amp;quot;ImageLength&amp;quot; : 257,  # # rows (number of scanlines)                                                                       &lt;br /&gt;
    &amp;quot;BitsPerSample&amp;quot; : 258,                                                                                                     &lt;br /&gt;
    &amp;quot;PhotometricInterpretation&amp;quot; : 262,                                                                                         &lt;br /&gt;
    &amp;quot;ImageDescription&amp;quot; : 270,                                                                                                  &lt;br /&gt;
    &amp;quot;StripOffsets&amp;quot; : 273,                                                                                                      &lt;br /&gt;
    &amp;quot;SamplesPerPixel&amp;quot; : 277,                                                                                                   &lt;br /&gt;
    &amp;quot;RowsPerStrip&amp;quot; : 278,                                                                                                      &lt;br /&gt;
    &amp;quot;StripByteCounts&amp;quot; : 279,                                                                                                   &lt;br /&gt;
    &amp;quot;XResolution&amp;quot; : 282,                                                                                                       &lt;br /&gt;
    &amp;quot;YResolution&amp;quot; : 283,                                                                                                       &lt;br /&gt;
    &amp;quot;ZResolution&amp;quot; : 284,                                                                                                       &lt;br /&gt;
    &amp;quot;ResolutionUnit&amp;quot; : 296,                                                                                                    &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class TIFFStack:&lt;br /&gt;
&lt;br /&gt;
    def __init__(self,filename):&lt;br /&gt;
&lt;br /&gt;
        self._filename = filename&lt;br /&gt;
        self._f = open(self._filename, 'rb')&lt;br /&gt;
        &lt;br /&gt;
        self._file_size = self.get_file_size()&lt;br /&gt;
&lt;br /&gt;
        # read and store the file header&lt;br /&gt;
&lt;br /&gt;
        self._header = self.get_header()&lt;br /&gt;
&lt;br /&gt;
        # read all IFDs and store&lt;br /&gt;
&lt;br /&gt;
        self._IFDs = self.get_IFDs()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def __str__(self):&lt;br /&gt;
        s  = &amp;quot;&amp;quot;&lt;br /&gt;
        s += &amp;quot;[TIFFStack]\n&amp;quot;&lt;br /&gt;
        s += &amp;quot;Filename   : %s\n&amp;quot; % self._filename&lt;br /&gt;
        s += &amp;quot;File size  : %s\n&amp;quot; % self._file_size&lt;br /&gt;
        s += &amp;quot;Header     : %s\n&amp;quot; % self._header&lt;br /&gt;
        s += &amp;quot;IFDs       : %s\n&amp;quot; % self._IFDs&lt;br /&gt;
        return s&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def get_file_size(self):&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        file size in bytes&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        if not self._f:&lt;br /&gt;
            print &amp;quot;Invalid: Must have open file handle.&amp;quot;&lt;br /&gt;
            return -1&lt;br /&gt;
&lt;br /&gt;
        # less typing&lt;br /&gt;
&lt;br /&gt;
        f = self._f&lt;br /&gt;
&lt;br /&gt;
        # get file size&lt;br /&gt;
&lt;br /&gt;
        curP = f.tell()&lt;br /&gt;
        f.seek(0,2)&lt;br /&gt;
        sz = f.tell()&lt;br /&gt;
&lt;br /&gt;
        # return to previous location&lt;br /&gt;
&lt;br /&gt;
        f.seek(curP)&lt;br /&gt;
&lt;br /&gt;
        return sz&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def get_header(self):&lt;br /&gt;
        return TIFFHeader(self._f)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def get_IFDs(self):&lt;br /&gt;
        return IFD_Store(self._f, self._header)&lt;br /&gt;
&lt;br /&gt;
    def get_data(self):&lt;br /&gt;
&lt;br /&gt;
        f = self._f&lt;br /&gt;
&lt;br /&gt;
        # bits per sample&lt;br /&gt;
&lt;br /&gt;
        bps = 258&lt;br /&gt;
&lt;br /&gt;
        # StripOffsets&lt;br /&gt;
&lt;br /&gt;
        offset = 273&lt;br /&gt;
&lt;br /&gt;
        # byte counts per strip&lt;br /&gt;
&lt;br /&gt;
        byte_count = 279&lt;br /&gt;
&lt;br /&gt;
        sample_format = 339&lt;br /&gt;
&lt;br /&gt;
        data = []&lt;br /&gt;
&lt;br /&gt;
        ifds = self._IFDs._store&lt;br /&gt;
&lt;br /&gt;
        for curIFD in ifds:&lt;br /&gt;
&lt;br /&gt;
            curOffset = curIFD[offset]._val&lt;br /&gt;
            curLength = curIFD[byte_count]._val&lt;br /&gt;
            curBPS = curIFD[bps]._val&lt;br /&gt;
            bytesPerSample = curBPS / 8.0&lt;br /&gt;
            &lt;br /&gt;
            fld = self.get_field_fmt(curIFD)&lt;br /&gt;
&lt;br /&gt;
            # use &amp;quot;B&amp;quot; for now; support 16-bit later using tag 339 (SampleFormat)&lt;br /&gt;
            unpackStr = self._header._e_flg + fld * int(curLength/bytesPerSample)&lt;br /&gt;
&lt;br /&gt;
            f.seek(curOffset)&lt;br /&gt;
&lt;br /&gt;
            data.extend(struct.unpack(unpackStr, f.read(curLength)))&lt;br /&gt;
&lt;br /&gt;
        return data&lt;br /&gt;
        &lt;br /&gt;
    def get_field_fmt(self,ifd):&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        Determines the Python struct code given&lt;br /&gt;
        BitsPerSample and SampleFormat from the IFD&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        bits_per_sample, sample_fmt = 258, 339&lt;br /&gt;
&lt;br /&gt;
        bps = ifd[bits_per_sample]._val&lt;br /&gt;
&lt;br /&gt;
        fmt = None&lt;br /&gt;
&lt;br /&gt;
        if sample_fmt in ifd.keys():&lt;br /&gt;
            fmt = ifd[sample_fmt]._val&lt;br /&gt;
        else:&lt;br /&gt;
            fmt = 1&lt;br /&gt;
&lt;br /&gt;
        if bps==8:&lt;br /&gt;
            # 1-byte unsigned int&lt;br /&gt;
            if fmt==1:&lt;br /&gt;
                return &amp;quot;B&amp;quot;&lt;br /&gt;
            # 1-byte signed&lt;br /&gt;
            elif fmt==2:&lt;br /&gt;
                return &amp;quot;b&amp;quot;&lt;br /&gt;
        elif bps==16:&lt;br /&gt;
            # 2-byte unsigned&lt;br /&gt;
            if fmt==1:&lt;br /&gt;
                return &amp;quot;H&amp;quot;&lt;br /&gt;
            elif fmt==2:&lt;br /&gt;
                return &amp;quot;h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def get_size(self):&lt;br /&gt;
        fX, fY = 256, 257&lt;br /&gt;
        x = self._IFDs._store[0][fX]._val&lt;br /&gt;
        y = self._IFDs._store[0][fY]._val&lt;br /&gt;
        z = len(self._IFDs._store)&lt;br /&gt;
        &lt;br /&gt;
        return x, y, z&lt;br /&gt;
&lt;br /&gt;
    def get_axes_scale(self):&lt;br /&gt;
        # for now&lt;br /&gt;
        return 1,1,1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def asCCP4(self,filename,dimX=-1,dimY=-1,dimZ=-1):&lt;br /&gt;
        data = self.get_data()&lt;br /&gt;
        &lt;br /&gt;
        # pixels size x,y,z&lt;br /&gt;
&lt;br /&gt;
        nX, nY, nZ = self.get_size()&lt;br /&gt;
&lt;br /&gt;
        # dimension scaling&lt;br /&gt;
&lt;br /&gt;
        if -1 in (dimX,dimY,dimZ):&lt;br /&gt;
            dimX, dimY, dimZ = self.get_axes_scale()&lt;br /&gt;
            dimX *= nX&lt;br /&gt;
            dimY *= nY&lt;br /&gt;
            dimZ *= nZ&lt;br /&gt;
&lt;br /&gt;
        m, avg, M = min(data), sum(data)/len(data), max(data)&lt;br /&gt;
        &lt;br /&gt;
        outFile = open(filename, 'wb')&lt;br /&gt;
        &lt;br /&gt;
        outFile.write(struct.pack('i',nX)) # col&lt;br /&gt;
        outFile.write(struct.pack('i',nY)) # row&lt;br /&gt;
        outFile.write(struct.pack('i',nZ)) # section&lt;br /&gt;
        outFile.write(struct.pack('i',2))  # mode = 2&lt;br /&gt;
        &lt;br /&gt;
        outFile.write(struct.pack('i',1))  # number of first col &lt;br /&gt;
        outFile.write(struct.pack('i',1))  # '' row&lt;br /&gt;
        outFile.write(struct.pack('i',1))  # '' section&lt;br /&gt;
        &lt;br /&gt;
        outFile.write(struct.pack('i',nX)) # nIntervals&lt;br /&gt;
        outFile.write(struct.pack('i',nY)) #&lt;br /&gt;
        outFile.write(struct.pack('i',nZ)) #&lt;br /&gt;
        &lt;br /&gt;
        outFile.write(struct.pack('f',dimX)) # length in X&lt;br /&gt;
        outFile.write(struct.pack('f',dimY)) # length in Y&lt;br /&gt;
        outFile.write(struct.pack('f',dimZ)) # length in Z&lt;br /&gt;
        &lt;br /&gt;
        outFile.write(struct.pack('f',90.)) # alpha &lt;br /&gt;
        outFile.write(struct.pack('f',90.)) # beta&lt;br /&gt;
        outFile.write(struct.pack('f',90.)) # gamma&lt;br /&gt;
        &lt;br /&gt;
        outFile.write(struct.pack('i',1)) # axis cols&lt;br /&gt;
        outFile.write(struct.pack('i',2)) # axis rows&lt;br /&gt;
        outFile.write(struct.pack('i',3)) # axis section&lt;br /&gt;
        &lt;br /&gt;
        outFile.write(struct.pack('f', m)) # min density&lt;br /&gt;
        outFile.write(struct.pack('f', avg))  # max density&lt;br /&gt;
        outFile.write(struct.pack('f', M))  # mean density&lt;br /&gt;
        &lt;br /&gt;
        outFile.write(struct.pack('i',0)) # space gp ?&lt;br /&gt;
&lt;br /&gt;
        # header info; blank for us&lt;br /&gt;
        for x in range(24,257): outFile.write(struct.pack('i',0))&lt;br /&gt;
&lt;br /&gt;
        # assume constant data in file&lt;br /&gt;
        norm = 255.&lt;br /&gt;
        bps = tag_types[&amp;quot;BitsPerSample&amp;quot;]&lt;br /&gt;
        max_bits = self._IFDs._store[0][bps]._val&lt;br /&gt;
        norm = float(2**max_bits-1.)&lt;br /&gt;
&lt;br /&gt;
        # read/write data&lt;br /&gt;
        for x in data:&lt;br /&gt;
            outFile.write(struct.pack('f', x/norm))&lt;br /&gt;
&lt;br /&gt;
        outFile.close()  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class TIFFHeader:&lt;br /&gt;
    def __init__(self,fileHandle):&lt;br /&gt;
        self._endian, self._e_flg = self.get_endian(fileHandle)&lt;br /&gt;
        self._magic_number = self.get_magic_number(fileHandle)&lt;br /&gt;
        self._first_IFD = self.get_first_IFDOffset(fileHandle)&lt;br /&gt;
        &lt;br /&gt;
    def __str__(self):&lt;br /&gt;
        s  = &amp;quot;\n&amp;quot;&lt;br /&gt;
        s += &amp;quot;  [TIFF Header]\n&amp;quot;&lt;br /&gt;
        s += &amp;quot;  Endian        : %s\n&amp;quot; % self._endian&lt;br /&gt;
        s += &amp;quot;  Endian Flag   : %s\n&amp;quot; % self._e_flg&lt;br /&gt;
        s += &amp;quot;  Magic Number  : %s\n&amp;quot; % self._magic_number&lt;br /&gt;
        s += &amp;quot;  IFD[0] Offset : %s&amp;quot; % self._first_IFD&lt;br /&gt;
        return s&lt;br /&gt;
&lt;br /&gt;
    # for struct.unpackx&lt;br /&gt;
    def _1byte(self,n=1):&lt;br /&gt;
        return self._e_flg + &amp;quot;C&amp;quot;*n&lt;br /&gt;
    def _2byte(self,n=1):&lt;br /&gt;
        return self._e_flg + &amp;quot;H&amp;quot;*n&lt;br /&gt;
    def _4byte(self,n=1):&lt;br /&gt;
        return self._e_flg + &amp;quot;I&amp;quot;*n&lt;br /&gt;
    def _IFDbyte(self,n=1):&lt;br /&gt;
        return self._e_flg + &amp;quot;HHII&amp;quot;*n&lt;br /&gt;
&lt;br /&gt;
    def get_endian(self,fileHandle):&lt;br /&gt;
        f = fileHandle&lt;br /&gt;
        f.seek(0)&lt;br /&gt;
        code = struct.unpack(&amp;quot;cc&amp;quot;, f.read(2))&lt;br /&gt;
        code = &amp;quot;&amp;quot;.join(code)&lt;br /&gt;
        flg = &amp;quot;&amp;quot;&lt;br /&gt;
        if code==&amp;quot;II&amp;quot;:&lt;br /&gt;
            flg = &amp;quot;&amp;lt;&amp;quot;&lt;br /&gt;
        elif code==&amp;quot;MM&amp;quot;:&lt;br /&gt;
            flg = &amp;quot;&amp;gt;&amp;quot;&lt;br /&gt;
        else:&lt;br /&gt;
            print &amp;quot;This file is not a valid TIFF (bad endian tag).&amp;quot;&lt;br /&gt;
            flg = &amp;quot;?&amp;quot;&lt;br /&gt;
        return code,flg&lt;br /&gt;
&lt;br /&gt;
    def get_magic_number(self,fileHandle):&lt;br /&gt;
        f = fileHandle&lt;br /&gt;
        f.seek(2)&lt;br /&gt;
        # read the magic number&lt;br /&gt;
        idx = 0&lt;br /&gt;
        if self._endian == &amp;quot;II&amp;quot;: idx = 1&lt;br /&gt;
        _42 = struct.unpack(self._2byte(), f.read(2))[0]&lt;br /&gt;
        if _42!=42:&lt;br /&gt;
            print &amp;quot;Error: Improperly formatted TIFF file (bad magic number).&amp;quot;&lt;br /&gt;
            return None&lt;br /&gt;
        return _42&lt;br /&gt;
&lt;br /&gt;
    def get_first_IFDOffset(self,fileHandle):&lt;br /&gt;
        f=fileHandle&lt;br /&gt;
        f.seek(4)&lt;br /&gt;
        off = struct.unpack(self._4byte(), f.read(4))[0]&lt;br /&gt;
        return off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class IFD_Store:&lt;br /&gt;
    def __init__(self,fileHandle,fileHeader):&lt;br /&gt;
        self._f = fileHandle&lt;br /&gt;
        self._header = fileHeader&lt;br /&gt;
        self._first_offset = self._header._first_IFD&lt;br /&gt;
        # array of IFDs&lt;br /&gt;
        self._store = self.read_ifds()&lt;br /&gt;
&lt;br /&gt;
    def __str__(self):&lt;br /&gt;
        s  = &amp;quot;\n&amp;quot;&lt;br /&gt;
        s += &amp;quot;  [IFD_Store]\n&amp;quot;&lt;br /&gt;
        s += &amp;quot;  First Offset : %d\n&amp;quot; % self._first_offset&lt;br /&gt;
        s += &amp;quot;  Store :\n&amp;quot;&lt;br /&gt;
        for st in self._store:&lt;br /&gt;
            s += &amp;quot;\n\n  IFD Store =&amp;gt;\n&amp;quot;&lt;br /&gt;
            for k in st:&lt;br /&gt;
                s += &amp;quot;    %s =&amp;gt; %s&amp;quot; % (k,st[k])&lt;br /&gt;
        return s&lt;br /&gt;
&lt;br /&gt;
    def read_ifds(self):&lt;br /&gt;
&lt;br /&gt;
        f = self._f&lt;br /&gt;
&lt;br /&gt;
        pos = self._first_offset&lt;br /&gt;
&lt;br /&gt;
        ifds = []&lt;br /&gt;
&lt;br /&gt;
        while pos!=0:&lt;br /&gt;
&lt;br /&gt;
            ifds.append({})&lt;br /&gt;
            &lt;br /&gt;
            # get number of IFD_Entries&lt;br /&gt;
&lt;br /&gt;
            f.seek(pos)&lt;br /&gt;
        &lt;br /&gt;
            # read number of IFDs&lt;br /&gt;
            num_entries = struct.unpack(self._header._2byte(), f.read(2))&lt;br /&gt;
            num_entries = num_entries[0]&lt;br /&gt;
&lt;br /&gt;
            # read all into IFD[x]&lt;br /&gt;
            for x in range(num_entries):&lt;br /&gt;
                # pull the current record from file&lt;br /&gt;
                curParams = struct.unpack(self._header._IFDbyte(), f.read(12))&lt;br /&gt;
&lt;br /&gt;
                # format the data if necessary&lt;br /&gt;
                if (self._header._e_flg==&amp;quot;&amp;gt;&amp;quot; and sys.byteorder==&amp;quot;little&amp;quot;) and \&lt;br /&gt;
                        curParams[0] not in (270,50838,50839):&lt;br /&gt;
                    scale = 32 - (8 * field_types[curParams[1]])&lt;br /&gt;
                    scaledData = curParams[3] &amp;gt;&amp;gt; scale&lt;br /&gt;
                else:&lt;br /&gt;
                    scaledData = curParams[3]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                ifds[-1][curParams[0]] = IFDEntry(curParams[0], curParams[1], curParams[2], scaledData)&lt;br /&gt;
&lt;br /&gt;
            # read next offset&lt;br /&gt;
            pos = struct.unpack(self._header._4byte(), f.read(4))[0]&lt;br /&gt;
&lt;br /&gt;
        return ifds&lt;br /&gt;
&lt;br /&gt;
class IFDEntry:&lt;br /&gt;
    def __init__(self,theTag=None,theType=None,theCount=None,theValue=None):&lt;br /&gt;
        self._tag = theTag&lt;br /&gt;
        self._type = theType&lt;br /&gt;
        self._count = theCount&lt;br /&gt;
        self._val = theValue&lt;br /&gt;
&lt;br /&gt;
    def __str__(self):&lt;br /&gt;
        s  = &amp;quot;\n&amp;quot;&lt;br /&gt;
        s += &amp;quot;  [IFD_Entry]\n&amp;quot;&lt;br /&gt;
        s += &amp;quot; Tag    : %s\n&amp;quot; % self._tag&lt;br /&gt;
        s += &amp;quot; Type   : %s\n&amp;quot; % self._type&lt;br /&gt;
        s += &amp;quot; Count  : %s\n&amp;quot; % self._count&lt;br /&gt;
        s += &amp;quot; Val/Off: %s\n&amp;quot; % self._val&lt;br /&gt;
        return s&lt;br /&gt;
&lt;br /&gt;
if __name__==&amp;quot;__main__&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Running,&lt;br /&gt;
&lt;br /&gt;
    python tiff2ccp4.py&lt;br /&gt;
&lt;br /&gt;
    will convert all TIFF stacks in the current directory to &lt;br /&gt;
    CCP4 maps.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    import argparse&lt;br /&gt;
    from string import split&lt;br /&gt;
&lt;br /&gt;
    parser = argparse.ArgumentParser(description=&amp;quot;Convert a TIFF Stack to a CCP4 Map&amp;quot;)&lt;br /&gt;
    parser.add_argument(&amp;quot;input&amp;quot;, type=str, help=&amp;quot;input file name (usually .tif, .tiff)&amp;quot;)&lt;br /&gt;
    parser.add_argument(&amp;quot;output&amp;quot;, type=str, help=&amp;quot;output file name (usually .ccp4)&amp;quot;)&lt;br /&gt;
    parser.add_argument('-x',&amp;quot;--x&amp;quot;, help=&amp;quot;length of x-dimension&amp;quot;,default=-1.,type=float)&lt;br /&gt;
    parser.add_argument('-y',&amp;quot;--y&amp;quot;, help=&amp;quot;length of y-dimension&amp;quot;,default=-1.,type=float)&lt;br /&gt;
    parser.add_argument('-z',&amp;quot;--z&amp;quot;, help=&amp;quot;length of z-dimension&amp;quot;,default=-1.,type=float)&lt;br /&gt;
    &lt;br /&gt;
    args = parser.parse_args()&lt;br /&gt;
&lt;br /&gt;
    s = TIFFStack(args.input)&lt;br /&gt;
    s.asCCP4(args.output, args.x, args.y, args.z)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Script_Library]]&lt;br /&gt;
[[Category:System_Scripts]]&lt;br /&gt;
[[Category:ThirdParty_Scripts]]&lt;/div&gt;</summary>
		<author><name>Pyadmin</name></author>
	</entry>
</feed>