/***************************************************************************** - - - POLONY SEQUENCER ACQUISITION SUITE - - Church Lab - - Harvard Medical School - - - - Free software for running a Polony Sequencing automated microscope - - - - ========================================================================= - - - - - - acquisition.cpp - - - - Class for acquiring single or multiple images; interacts with camera, - - filter wheels, and shutters - - - - Written by Greg Porreca, 02-15-2006 - - - - Revised - - - - - - This software may be used, modified, and distributed freely, but this - - header may not be modified and must appear at the top of this file. - - - - - *****************************************************************************/ #include "Acquisition.h" Acquisition::Acquisition(Reporter* rep, CHamCam* cHamCam, CFilter* cFilter){ r = rep; this_camera = cHamCam; this_filter = cFilter; exposure = 0; sensitivity = 0; } Acquisition::~Acquisition(){;} bool Acquisition::acquire_expose_shutter(double exp, double sens){ if(exposure!=exp){ exposure = exp; this_camera->SetExposure(exposure); } if(sensitivity!=sens){ sensitivity = sens; this_camera->SetSensitivity((float)sensitivity); } sprintf(log_string, "Exposing with exposure=%f, sensitivity=%f", exposure, sensitivity); r->log(log_string, 5); this_filter->OpenShutterA(); if(!this_camera->Trigger()){//TRIGGER BLOCKS UNTIL EXPOSURE FINISHES r->error("software trigger1 failed\n",0); return false; } this_filter->CloseShutterA(); while(!this_camera->DataReady()){;}//wait for image to transfer return true; } bool Acquisition::acquire_expose_noshutter(double exp, double sens){ if(exposure!=exp){ exposure = exp; this_camera->SetExposure(exposure); } if(sensitivity!=sens){ sensitivity = sens; this_camera->SetSensitivity((float)sensitivity); } if(!this_camera->Trigger()){//TRIGGER BLOCKS UNTIL EXPOSURE FINISHES r->error("fire software trigger failed", 0); return false; } r->log("Waiting for image transfer",5); while(!this_camera->DataReady()){;}//wait for image to transfer return true; } short unsigned int* Acquisition::acquire_getdata(){ return this_camera->GetMultiple(1); } short unsigned int* Acquisition::acquire_getdata(int framenum){ return this_camera->GetMultiple(framenum); } bool Acquisition::acquire_expose_4color(int X1, int X2, int X3, int X4, int M1, int M2, int M3, int M4, double exp1, double exp2, double exp3, double exp4, double sens1, double sens2, double sens3, double sens4){ //COLOR 1: this_camera->SetExposure(exp1); this_camera->SetSensitivity((float)sens1); this_filter->SetPosition(2, X1, M1); this_filter->OpenShutterA(); if(!this_camera->Trigger()){//TRIGGER BLOCKS UNTIL EXPOSURE FINISHES r->error("fire software trigger1 failed", 0); return false; } this_filter->CloseShutterA(); //COLOR 2 this_camera->SetExposure(exp2); this_camera->SetSensitivity((float)sens2); this_filter->SetPosition(2, X2, M2); while(!this_camera->DataReady()){;}//wait for image to transfer this_filter->OpenShutterA(); if(!this_camera->Trigger()){//TRIGGER BLOCKS UNTIL EXPOSURE FINISHES r->error("fire software trigger2 failed", 0); return false; } this_filter->CloseShutterA(); //COLOR 3 this_camera->SetExposure(exp3); this_camera->SetSensitivity((float)sens3); this_filter->SetPosition(2, X3, M3); while(!this_camera->DataReady()){;}//wait for image to transfer this_filter->OpenShutterA(); if(!this_camera->Trigger()){//TRIGGER BLOCKS UNTIL EXPOSURE FINISHES r->error("fire software trigger3 failed", 0); return false; } this_filter->CloseShutterA(); //COLOR 4 this_camera->SetExposure(exp4); this_camera->SetSensitivity((float)sens4); this_filter->SetPosition(2, X4, M4); while(!this_camera->DataReady()){;}//wait for image to transfer this_filter->OpenShutterA(); if(!this_camera->Trigger()){//TRIGGER BLOCKS UNTIL EXPOSURE FINISHES r->error("fire software trigger4 failed", 0); return false; } this_filter->CloseShutterA(); while(!this_camera->DataReady()){;}//wait for image to transfer return true; } bool Acquisition::acquire_expose_3color(int X1, int X2, int X3, int M1, int M2, int M3, double exp1, double exp2, double exp3, double sens1, double sens2, double sens3){ //COLOR 1: this_camera->SetExposure(exp1); this_camera->SetSensitivity((float)sens1); this_filter->SetPosition(2, X1, M1); this_filter->OpenShutterA(); if(!this_camera->Trigger()){//TRIGGER BLOCKS UNTIL EXPOSURE FINISHES r->error("fire software trigger1 failed", 0); return false; } this_filter->CloseShutterA(); //COLOR 2 this_camera->SetExposure(exp2); this_camera->SetSensitivity((float)sens2); this_filter->SetPosition(2, X2, M2); while(!this_camera->DataReady()){;}//wait for image to transfer this_filter->OpenShutterA(); if(!this_camera->Trigger()){//TRIGGER BLOCKS UNTIL EXPOSURE FINISHES r->error("fire software trigger2 failed", 0); return false; } this_filter->CloseShutterA(); //COLOR 3 this_camera->SetExposure(exp3); this_camera->SetSensitivity((float)sens3); this_filter->SetPosition(2, X3, M3); while(!this_camera->DataReady()){;}//wait for image to transfer this_filter->OpenShutterA(); if(!this_camera->Trigger()){//TRIGGER BLOCKS UNTIL EXPOSURE FINISHES r->error("fire software trigger3 failed", 0); return false; } this_filter->CloseShutterA(); while(!this_camera->DataReady()){;}//wait for image to transfer return true; } bool Acquisition::acquire_expose_2color(int X1, int X2, int M1, int M2, double exp1, double exp2, double sens1, double sens2){ //COLOR 1: this_camera->SetExposure(exp1); this_camera->SetSensitivity((float)sens1); this_filter->SetPosition(2, X1, M1); this_filter->OpenShutterA(); if(!this_camera->Trigger()){//TRIGGER BLOCKS UNTIL EXPOSURE FINISHES r->error("fire software trigger1 failed", 0); return false; } this_filter->CloseShutterA(); //COLOR 2 this_camera->SetExposure(exp2); this_camera->SetSensitivity((float)sens2); this_filter->SetPosition(2, X2, M2); while(!this_camera->DataReady()){;}//wait for image to transfer this_filter->OpenShutterA(); if(!this_camera->Trigger()){//TRIGGER BLOCKS UNTIL EXPOSURE FINISHES r->error("fire software trigger2 failed", 0); return false; } this_filter->CloseShutterA(); while(!this_camera->DataReady()){;}//wait for image to transfer return true; }