RasterElement flip performance

classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|

RasterElement flip performance

John Tobe

I’m having performance issues running code on a on-disk read only dataset that I’m not experiencing with a similar size on-disk dataset.  Can anyone give some tips on improving the performance?

 

RasterElement* pFlipped = pElement->copyShallow( flipName, pParent );

unsigned int bands = pElement->getDataDescriptor()->getBandCount();

unsigned int rows = pElement->getDataDescriptor()->getRowCount();

for( int b = 0; b < bands; b++ )

{

   FactoryResource<DataRequest> request;

   FactoryResource<DataRequest> request2;

   DimensionDescriptor bandDesc;

   bandDesc.setActiveNumber(b);

   request->setbands( bandDesc, bandDesc );

   request2->setbands( bandDesc, bandDesc );

   request2->setWritable(true);

   DataAccessor daSource = pElement->getDataAccessor(request.release());

   DataAccessor daFlip = pFlipped->getDataAccessor(request2.release());

   daSource->nextRow( rows – 1, true );

   for( unsigned int r = 0; r < rows && daSource.isValid() && daFlip.isValid(); r++ )

   {

       void* pSrc = daSource->getRow();

       void* pDest = daFlip->getRow();

       Memcpy( pDest, pSrc, daSource->getRowSize() );

       daFlip->nextRow();

       daSource->toPixel( 0, 0 );

       daSource->nextRow( rows - r – 2, true );

    }

}


This message and any enclosures are intended only for the addressee.  Please 

notify the sender by email if you are not the intended recipient.  If you are 

not the intended recipient, you may not use, copy, disclose, or distribute this 

message or its contents or enclosures to any other person and any such actions 

may be unlawful.  Ball reserves the right to monitor and review all messages 

and enclosures sent to or from this email address.

------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_d2d_feb
_______________________________________________
Opticks-devs mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/opticks-devs
Reply | Threaded
Open this post in threaded view
|

Re: RasterElement flip performance

dadkins
Administrator

I added comments below, two of which could be causing the performance issues you are seeing.

 

Typically, performance issues for reading data usually end up pointing to the pager. Are you using a custom pager, or one of the built-in pagers?

Which importer are you using?

 

 

From: Tobe, John [mailto:[hidden email]]
Sent: Wednesday, February 20, 2013 4:38 PM
To: [hidden email]
Subject: [Opticks-devs] RasterElement flip performance

 

I’m having performance issues running code on a on-disk read only dataset that I’m not experiencing with a similar size on-disk dataset.  Can anyone give some tips on improving the performance?

 

RasterElement* pFlipped = pElement->copyShallow( flipName, pParent );

unsigned int bands = pElement->getDataDescriptor()->getBandCount();

unsigned int rows = pElement->getDataDescriptor()->getRowCount();

for( int b = 0; b < bands; b++ ) // is this BSQ data? if not, this will cause serious performance degradation!

{

   FactoryResource<DataRequest> request;

   FactoryResource<DataRequest> request2;

   DimensionDescriptor bandDesc; // don’t create your own dimension descriptor -- call raster data descriptor getActiveBand instead

   bandDesc.setActiveNumber(b);

   request->setbands( bandDesc, bandDesc ); // the dimension descriptor should be unique for each raster element

   request2->setbands( bandDesc, bandDesc );

   request2->setWritable(true);

   DataAccessor daSource = pElement->getDataAccessor(request.release());

   DataAccessor daFlip = pFlipped->getDataAccessor(request2.release());

   daSource->nextRow( rows – 1, true );

   for( unsigned int r = 0; r < rows && daSource.isValid() && daFlip.isValid(); r++ )

   {

       void* pSrc = daSource->getRow();

       void* pDest = daFlip->getRow();

       Memcpy( pDest, pSrc, daSource->getRowSize() );

       daFlip->nextRow();

       daSource->toPixel( 0, 0 ); // don’t do this -- it could force a page reload and may cause cache thrashing

       daSource->nextRow( rows - r – 2, true );

    }

}

 
 
This message and any enclosures are intended only for the addressee.  Please 
 
notify the sender by email if you are not the intended recipient.  If you are 
 
not the intended recipient, you may not use, copy, disclose, or distribute this 
 
message or its contents or enclosures to any other person and any such actions 
 
may be unlawful.  Ball reserves the right to monitor and review all messages 
 
and enclosures sent to or from this email address.

This message and any enclosures are intended only for the addressee.  Please 

notify the sender by email if you are not the intended recipient.  If you are 

not the intended recipient, you may not use, copy, disclose, or distribute this 

message or its contents or enclosures to any other person and any such actions 

may be unlawful.  Ball reserves the right to monitor and review all messages 

and enclosures sent to or from this email address.

------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_d2d_feb
_______________________________________________
Opticks-devs mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/opticks-devs
Reply | Threaded
Open this post in threaded view
|

Re: RasterElement flip performance

John Tobe

I’m using a custom pager, and I assume my code will result in calling the pager with concurrent rows equaling 1, causing the performance issues when it’s moving to the start and back to the next to last row.  I’ll try using toPixel with the row I want and not calling nextRow as well.

 

From: Adkins, Dustan [mailto:[hidden email]]
Sent: Wednesday, February 20, 2013 5:34 PM
To: [hidden email]
Subject: Re: [Opticks-devs] RasterElement flip performance

 

I added comments below, two of which could be causing the performance issues you are seeing.

 

Typically, performance issues for reading data usually end up pointing to the pager. Are you using a custom pager, or one of the built-in pagers?

Which importer are you using?

 

 

From: Tobe, John [[hidden email]]
Sent: Wednesday, February 20, 2013 4:38 PM
To: [hidden email]
Subject: [Opticks-devs] RasterElement flip performance

 

I’m having performance issues running code on a on-disk read only dataset that I’m not experiencing with a similar size on-disk dataset.  Can anyone give some tips on improving the performance?

 

RasterElement* pFlipped = pElement->copyShallow( flipName, pParent );

unsigned int bands = pElement->getDataDescriptor()->getBandCount();

unsigned int rows = pElement->getDataDescriptor()->getRowCount();

for( int b = 0; b < bands; b++ ) // is this BSQ data? if not, this will cause serious performance degradation!

{

   FactoryResource<DataRequest> request;

   FactoryResource<DataRequest> request2;

   DimensionDescriptor bandDesc; // don’t create your own dimension descriptor -- call raster data descriptor getActiveBand instead

   bandDesc.setActiveNumber(b);

   request->setbands( bandDesc, bandDesc ); // the dimension descriptor should be unique for each raster element

   request2->setbands( bandDesc, bandDesc );

   request2->setWritable(true);

   DataAccessor daSource = pElement->getDataAccessor(request.release());

   DataAccessor daFlip = pFlipped->getDataAccessor(request2.release());

   daSource->nextRow( rows – 1, true );

   for( unsigned int r = 0; r < rows && daSource.isValid() && daFlip.isValid(); r++ )

   {

       void* pSrc = daSource->getRow();

       void* pDest = daFlip->getRow();

       Memcpy( pDest, pSrc, daSource->getRowSize() );

       daFlip->nextRow();

       daSource->toPixel( 0, 0 ); // don’t do this -- it could force a page reload and may cause cache thrashing

       daSource->nextRow( rows - r – 2, true );

    }

}

 
 
This message and any enclosures are intended only for the addressee.  Please 
 
notify the sender by email if you are not the intended recipient.  If you are 
 
not the intended recipient, you may not use, copy, disclose, or distribute this 
 
message or its contents or enclosures to any other person and any such actions 
 
may be unlawful.  Ball reserves the right to monitor and review all messages 
 
and enclosures sent to or from this email address.
 
 
This message and any enclosures are intended only for the addressee.  Please 
 
notify the sender by email if you are not the intended recipient.  If you are 
 
not the intended recipient, you may not use, copy, disclose, or distribute this 
 
message or its contents or enclosures to any other person and any such actions 
 
may be unlawful.  Ball reserves the right to monitor and review all messages 
 
and enclosures sent to or from this email address.

This message and any enclosures are intended only for the addressee.  Please 

notify the sender by email if you are not the intended recipient.  If you are 

not the intended recipient, you may not use, copy, disclose, or distribute this 

message or its contents or enclosures to any other person and any such actions 

may be unlawful.  Ball reserves the right to monitor and review all messages 

and enclosures sent to or from this email address.

------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_d2d_feb
_______________________________________________
Opticks-devs mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/opticks-devs
Reply | Threaded
Open this post in threaded view
|

Re: RasterElement flip performance

John Tobe

I changed my data request object to get a full band at a time (make the concurrent rows equal the number of rows in the dataset) and now it’s nearly instantaneous.  Seems silly to still only get a row of data at a time for BSQ data (which accounts for nearly all of our data).  I’m only making a single toPixel call for each row as well but that’s not a big deal since the whole band is basically in memory now.

 

From: Tobe, John [mailto:[hidden email]]
Sent: Thursday, February 21, 2013 11:22 AM
To: [hidden email]
Subject: Re: [Opticks-devs] RasterElement flip performance

 

I’m using a custom pager, and I assume my code will result in calling the pager with concurrent rows equaling 1, causing the performance issues when it’s moving to the start and back to the next to last row.  I’ll try using toPixel with the row I want and not calling nextRow as well.

 

From: Adkins, Dustan [[hidden email]]
Sent: Wednesday, February 20, 2013 5:34 PM
To: [hidden email]
Subject: Re: [Opticks-devs] RasterElement flip performance

 

I added comments below, two of which could be causing the performance issues you are seeing.

 

Typically, performance issues for reading data usually end up pointing to the pager. Are you using a custom pager, or one of the built-in pagers?

Which importer are you using?

 

 

From: Tobe, John [[hidden email]]
Sent: Wednesday, February 20, 2013 4:38 PM
To: [hidden email]
Subject: [Opticks-devs] RasterElement flip performance

 

I’m having performance issues running code on a on-disk read only dataset that I’m not experiencing with a similar size on-disk dataset.  Can anyone give some tips on improving the performance?

 

RasterElement* pFlipped = pElement->copyShallow( flipName, pParent );

unsigned int bands = pElement->getDataDescriptor()->getBandCount();

unsigned int rows = pElement->getDataDescriptor()->getRowCount();

for( int b = 0; b < bands; b++ ) // is this BSQ data? if not, this will cause serious performance degradation!

{

   FactoryResource<DataRequest> request;

   FactoryResource<DataRequest> request2;

   DimensionDescriptor bandDesc; // don’t create your own dimension descriptor -- call raster data descriptor getActiveBand instead

   bandDesc.setActiveNumber(b);

   request->setbands( bandDesc, bandDesc ); // the dimension descriptor should be unique for each raster element

   request2->setbands( bandDesc, bandDesc );

   request2->setWritable(true);

   DataAccessor daSource = pElement->getDataAccessor(request.release());

   DataAccessor daFlip = pFlipped->getDataAccessor(request2.release());

   daSource->nextRow( rows – 1, true );

   for( unsigned int r = 0; r < rows && daSource.isValid() && daFlip.isValid(); r++ )

   {

       void* pSrc = daSource->getRow();

       void* pDest = daFlip->getRow();

       Memcpy( pDest, pSrc, daSource->getRowSize() );

       daFlip->nextRow();

       daSource->toPixel( 0, 0 ); // don’t do this -- it could force a page reload and may cause cache thrashing

       daSource->nextRow( rows - r – 2, true );

    }

}

 
 
This message and any enclosures are intended only for the addressee.  Please 
 
notify the sender by email if you are not the intended recipient.  If you are 
 
not the intended recipient, you may not use, copy, disclose, or distribute this 
 
message or its contents or enclosures to any other person and any such actions 
 
may be unlawful.  Ball reserves the right to monitor and review all messages 
 
and enclosures sent to or from this email address.
 
 
This message and any enclosures are intended only for the addressee.  Please 
 
notify the sender by email if you are not the intended recipient.  If you are 
 
not the intended recipient, you may not use, copy, disclose, or distribute this 
 
message or its contents or enclosures to any other person and any such actions 
 
may be unlawful.  Ball reserves the right to monitor and review all messages 
 
and enclosures sent to or from this email address.
 
 
This message and any enclosures are intended only for the addressee.  Please 
 
notify the sender by email if you are not the intended recipient.  If you are 
 
not the intended recipient, you may not use, copy, disclose, or distribute this 
 
message or its contents or enclosures to any other person and any such actions 
 
may be unlawful.  Ball reserves the right to monitor and review all messages 
 
and enclosures sent to or from this email address.

This message and any enclosures are intended only for the addressee.  Please 

notify the sender by email if you are not the intended recipient.  If you are 

not the intended recipient, you may not use, copy, disclose, or distribute this 

message or its contents or enclosures to any other person and any such actions 

may be unlawful.  Ball reserves the right to monitor and review all messages 

and enclosures sent to or from this email address.

------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_d2d_feb
_______________________________________________
Opticks-devs mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/opticks-devs
Reply | Threaded
Open this post in threaded view
|

Re: RasterElement flip performance

dadkins
Administrator

Seems silly to still only get a row of data at a time for BSQ data”

 

This is entirely up to the pager implementation. For a CachedPager subclass (are you using CachedPager?), it will grab n rows at a time (depending on data type, interleave, etc.) no matter how many rows you request.

 

I would check into the custom pager code since any data request of concurrentRows = 1 will still have the same problem.

This type of issue is usually caused by a bug in either the getPage or fetchUnit methods.

 

From: Tobe, John [mailto:[hidden email]]
Sent: Thursday, February 21, 2013 12:17 PM
To: [hidden email]
Subject: Re: [Opticks-devs] RasterElement flip performance

 

I changed my data request object to get a full band at a time (make the concurrent rows equal the number of rows in the dataset) and now it’s nearly instantaneous.  Seems silly to still only get a row of data at a time for BSQ data (which accounts for nearly all of our data).  I’m only making a single toPixel call for each row as well but that’s not a big deal since the whole band is basically in memory now.

 

From: Tobe, John [[hidden email]]
Sent: Thursday, February 21, 2013 11:22 AM
To: [hidden email]
Subject: Re: [Opticks-devs] RasterElement flip performance

 

I’m using a custom pager, and I assume my code will result in calling the pager with concurrent rows equaling 1, causing the performance issues when it’s moving to the start and back to the next to last row.  I’ll try using toPixel with the row I want and not calling nextRow as well.

 

From: Adkins, Dustan [[hidden email]]
Sent: Wednesday, February 20, 2013 5:34 PM
To: [hidden email]
Subject: Re: [Opticks-devs] RasterElement flip performance

 

I added comments below, two of which could be causing the performance issues you are seeing.

 

Typically, performance issues for reading data usually end up pointing to the pager. Are you using a custom pager, or one of the built-in pagers?

Which importer are you using?

 

 

From: Tobe, John [[hidden email]]
Sent: Wednesday, February 20, 2013 4:38 PM
To: [hidden email]
Subject: [Opticks-devs] RasterElement flip performance

 

I’m having performance issues running code on a on-disk read only dataset that I’m not experiencing with a similar size on-disk dataset.  Can anyone give some tips on improving the performance?

 

RasterElement* pFlipped = pElement->copyShallow( flipName, pParent );

unsigned int bands = pElement->getDataDescriptor()->getBandCount();

unsigned int rows = pElement->getDataDescriptor()->getRowCount();

for( int b = 0; b < bands; b++ ) // is this BSQ data? if not, this will cause serious performance degradation!

{

   FactoryResource<DataRequest> request;

   FactoryResource<DataRequest> request2;

   DimensionDescriptor bandDesc; // don’t create your own dimension descriptor -- call raster data descriptor getActiveBand instead

   bandDesc.setActiveNumber(b);

   request->setbands( bandDesc, bandDesc ); // the dimension descriptor should be unique for each raster element

   request2->setbands( bandDesc, bandDesc );

   request2->setWritable(true);

   DataAccessor daSource = pElement->getDataAccessor(request.release());

   DataAccessor daFlip = pFlipped->getDataAccessor(request2.release());

   daSource->nextRow( rows – 1, true );

   for( unsigned int r = 0; r < rows && daSource.isValid() && daFlip.isValid(); r++ )

   {

       void* pSrc = daSource->getRow();

       void* pDest = daFlip->getRow();

       Memcpy( pDest, pSrc, daSource->getRowSize() );

       daFlip->nextRow();

       daSource->toPixel( 0, 0 ); // don’t do this -- it could force a page reload and may cause cache thrashing

       daSource->nextRow( rows - r – 2, true );

    }

}

 
 
This message and any enclosures are intended only for the addressee.  Please 
 
notify the sender by email if you are not the intended recipient.  If you are 
 
not the intended recipient, you may not use, copy, disclose, or distribute this 
 
message or its contents or enclosures to any other person and any such actions 
 
may be unlawful.  Ball reserves the right to monitor and review all messages 
 
and enclosures sent to or from this email address.
 
 
This message and any enclosures are intended only for the addressee.  Please 
 
notify the sender by email if you are not the intended recipient.  If you are 
 
not the intended recipient, you may not use, copy, disclose, or distribute this 
 
message or its contents or enclosures to any other person and any such actions 
 
may be unlawful.  Ball reserves the right to monitor and review all messages 
 
and enclosures sent to or from this email address.
 
 
This message and any enclosures are intended only for the addressee.  Please 
 
notify the sender by email if you are not the intended recipient.  If you are 
 
not the intended recipient, you may not use, copy, disclose, or distribute this 
 
message or its contents or enclosures to any other person and any such actions 
 
may be unlawful.  Ball reserves the right to monitor and review all messages 
 
and enclosures sent to or from this email address.
 
 
This message and any enclosures are intended only for the addressee.  Please 
 
notify the sender by email if you are not the intended recipient.  If you are 
 
not the intended recipient, you may not use, copy, disclose, or distribute this 
 
message or its contents or enclosures to any other person and any such actions 
 
may be unlawful.  Ball reserves the right to monitor and review all messages 
 
and enclosures sent to or from this email address.

This message and any enclosures are intended only for the addressee.  Please 

notify the sender by email if you are not the intended recipient.  If you are 

not the intended recipient, you may not use, copy, disclose, or distribute this 

message or its contents or enclosures to any other person and any such actions 

may be unlawful.  Ball reserves the right to monitor and review all messages 

and enclosures sent to or from this email address.

------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_d2d_feb
_______________________________________________
Opticks-devs mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/opticks-devs
Reply | Threaded
Open this post in threaded view
|

Re: RasterElement flip performance

tclarke
Administrator

Agree…concurrentRows simply indicates the minimum number of rows required by the requestor. The pager can prefetch as it sees fit.

 

From: Adkins, Dustan [mailto:[hidden email]]
Sent: Thursday, February 21, 2013 12:33 PM
To: [hidden email]
Subject: Re: [Opticks-devs] RasterElement flip performance

 

“Seems silly to still only get a row of data at a time for BSQ data”

 

This is entirely up to the pager implementation. For a CachedPager subclass (are you using CachedPager?), it will grab n rows at a time (depending on data type, interleave, etc.) no matter how many rows you request.

 

I would check into the custom pager code since any data request of concurrentRows = 1 will still have the same problem.

This type of issue is usually caused by a bug in either the getPage or fetchUnit methods.

 

From: Tobe, John [[hidden email]]
Sent: Thursday, February 21, 2013 12:17 PM
To: [hidden email]
Subject: Re: [Opticks-devs] RasterElement flip performance

 

I changed my data request object to get a full band at a time (make the concurrent rows equal the number of rows in the dataset) and now it’s nearly instantaneous.  Seems silly to still only get a row of data at a time for BSQ data (which accounts for nearly all of our data).  I’m only making a single toPixel call for each row as well but that’s not a big deal since the whole band is basically in memory now.

 

From: Tobe, John [[hidden email]]
Sent: Thursday, February 21, 2013 11:22 AM
To: [hidden email]
Subject: Re: [Opticks-devs] RasterElement flip performance

 

I’m using a custom pager, and I assume my code will result in calling the pager with concurrent rows equaling 1, causing the performance issues when it’s moving to the start and back to the next to last row.  I’ll try using toPixel with the row I want and not calling nextRow as well.

 

From: Adkins, Dustan [[hidden email]]
Sent: Wednesday, February 20, 2013 5:34 PM
To: [hidden email]
Subject: Re: [Opticks-devs] RasterElement flip performance

 

I added comments below, two of which could be causing the performance issues you are seeing.

 

Typically, performance issues for reading data usually end up pointing to the pager. Are you using a custom pager, or one of the built-in pagers?

Which importer are you using?

 

 

From: Tobe, John [[hidden email]]
Sent: Wednesday, February 20, 2013 4:38 PM
To: [hidden email]
Subject: [Opticks-devs] RasterElement flip performance

 

I’m having performance issues running code on a on-disk read only dataset that I’m not experiencing with a similar size on-disk dataset.  Can anyone give some tips on improving the performance?

 

RasterElement* pFlipped = pElement->copyShallow( flipName, pParent );

unsigned int bands = pElement->getDataDescriptor()->getBandCount();

unsigned int rows = pElement->getDataDescriptor()->getRowCount();

for( int b = 0; b < bands; b++ ) // is this BSQ data? if not, this will cause serious performance degradation!

{

   FactoryResource<DataRequest> request;

   FactoryResource<DataRequest> request2;

   DimensionDescriptor bandDesc; // don’t create your own dimension descriptor -- call raster data descriptor getActiveBand instead

   bandDesc.setActiveNumber(b);

   request->setbands( bandDesc, bandDesc ); // the dimension descriptor should be unique for each raster element

   request2->setbands( bandDesc, bandDesc );

   request2->setWritable(true);

   DataAccessor daSource = pElement->getDataAccessor(request.release());

   DataAccessor daFlip = pFlipped->getDataAccessor(request2.release());

   daSource->nextRow( rows – 1, true );

   for( unsigned int r = 0; r < rows && daSource.isValid() && daFlip.isValid(); r++ )

   {

       void* pSrc = daSource->getRow();

       void* pDest = daFlip->getRow();

       Memcpy( pDest, pSrc, daSource->getRowSize() );

       daFlip->nextRow();

       daSource->toPixel( 0, 0 ); // don’t do this -- it could force a page reload and may cause cache thrashing

       daSource->nextRow( rows - r – 2, true );

    }

}

 
 
This message and any enclosures are intended only for the addressee.  Please 
 
notify the sender by email if you are not the intended recipient.  If you are 
 
not the intended recipient, you may not use, copy, disclose, or distribute this 
 
message or its contents or enclosures to any other person and any such actions 
 
may be unlawful.  Ball reserves the right to monitor and review all messages 
 
and enclosures sent to or from this email address.
 
 
This message and any enclosures are intended only for the addressee.  Please 
 
notify the sender by email if you are not the intended recipient.  If you are 
 
not the intended recipient, you may not use, copy, disclose, or distribute this 
 
message or its contents or enclosures to any other person and any such actions 
 
may be unlawful.  Ball reserves the right to monitor and review all messages 
 
and enclosures sent to or from this email address.
 
 
This message and any enclosures are intended only for the addressee.  Please 
 
notify the sender by email if you are not the intended recipient.  If you are 
 
not the intended recipient, you may not use, copy, disclose, or distribute this 
 
message or its contents or enclosures to any other person and any such actions 
 
may be unlawful.  Ball reserves the right to monitor and review all messages 
 
and enclosures sent to or from this email address.
 
 
This message and any enclosures are intended only for the addressee.  Please 
 
notify the sender by email if you are not the intended recipient.  If you are 
 
not the intended recipient, you may not use, copy, disclose, or distribute this 
 
message or its contents or enclosures to any other person and any such actions 
 
may be unlawful.  Ball reserves the right to monitor and review all messages 
 
and enclosures sent to or from this email address.
 
 
This message and any enclosures are intended only for the addressee.  Please 
 
notify the sender by email if you are not the intended recipient.  If you are 
 
not the intended recipient, you may not use, copy, disclose, or distribute this 
 
message or its contents or enclosures to any other person and any such actions 
 
may be unlawful.  Ball reserves the right to monitor and review all messages 
 
and enclosures sent to or from this email address.

This message and any enclosures are intended only for the addressee.  Please 

notify the sender by email if you are not the intended recipient.  If you are 

not the intended recipient, you may not use, copy, disclose, or distribute this 

message or its contents or enclosures to any other person and any such actions 

may be unlawful.  Ball reserves the right to monitor and review all messages 

and enclosures sent to or from this email address.

------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_d2d_feb
_______________________________________________
Opticks-devs mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/opticks-devs