示例#1
0
文件: config.c 项目: REC17/Polonator
/* do not call externally; used to seek file pointer to start of file
 */
void _config_reset()
{
    if(fseek(config_file, SEEK_SET, 0) != 0)
    {
        p_log_errorno("ERROR:\tconfig_reset: fseek(SEEK_SET,0)");
        exit(0);
    }
    clearerr(config_file);
}
示例#2
0
int ReceiveFCNum(char *argv, int portnum)
{

	int sock;                      // socket descriptor
	int bytesRcvd, totalBytesRcvd=0; // bytes read in single rcv() and total bytes read
	char errorString[255];
	char sendBuffer[] = "3"; //CODE OF 3 ASKS SENDER FOR FCNUM
	char rcvbyte; // return arg
	char log_string[255];


	sock = GetSock(argv, portnum);

	bytesRcvd = 0;
	totalBytesRcvd = 0;

	// tell server we're ready for the fcnum
	if(send(sock, sendBuffer, 1, 0) != 1)
	{
		p_log_errorno((char*)"send() from client to request data failed");
		exit(0);
	}

	// wait for full block to be received
	while(totalBytesRcvd < 1)
	{
		if((bytesRcvd = recv(sock, &rcvbyte, 1, 0)) <= 0)
		{
			sprintf(errorString, "recv() failed or connection closed prematurely, %d bytes received", 
					totalBytesRcvd);
			close(sock);
			p_log_errorno(errorString);
			exit(0);
		}
		totalBytesRcvd += bytesRcvd;
	}
	if(shutdown(sock, 2) < 0)
	{
		p_log_errorno((char*)"ERROR shutdown(sock)");
	}//close(sock);
	return (int) rcvbyte;
}
示例#3
0
int main(int argc, char *argv[])
{
	FILE *regfile;
	FILE *posfile;
	FILE *logfile;
	FILE *dualfcoffsetfile;

	fpos_t offsetval;

	char regfilename[200];
	char logfilename[200];
	char log_string[255];

	int i, j, k, l;
	int curr_fc, curr_array, curr_img, curr_numobjs;
	int num_fcs;

	short unsigned int *curr_img_x;
	short unsigned int *curr_img_y;
	short unsigned int *regindices;
	short unsigned int temp;

	srand((unsigned)time(NULL) );
	srandom((unsigned)time(NULL));

	start_logger((char*)"initialize_processor-log", 1);
 
	if(argc !=3 )
	{
		sprintf(log_string, "Usage: %s <Position file> <Number of flowcells>", argv[0]);
		p_log(log_string);
		exit(0);
	}

	num_fcs = atoi(argv[2]);
	if( (dualfcoffsetfile = fopen("DUAL_FC_REGOFFSET.dat", "wb"))==NULL)
	{
		sprintf(log_string, "ERROR opening offset file DUAL_FC_REGOFFSET.dat for output");
		p_log_errorno(log_string);
		exit(0);
	}

	if((curr_img_x = (short unsigned int*) malloc(MAX_BEADS_PERFRAME * sizeof(short unsigned int))) == NULL)
	{
		p_log_errorno((char*)"ERROR allocating memory for curr_img_x");
		exit(0);
	}
	if((curr_img_y = (short unsigned int*) malloc(MAX_BEADS_PERFRAME * sizeof(short unsigned int))) == NULL)
	{
		p_log_errorno((char*)"ERROR allocating memory for curr_img_y");
		exit(0);
	}
	if((regindices = (short unsigned int*) malloc(REG_PIXELS * sizeof(short unsigned int))) == NULL)
	{
		p_log_errorno((char*)"ERROR allocating memory for regindices");
		exit(0);
	}

	strcpy(regfilename, argv[1]);
	strcat(regfilename, ".reg");
	sprintf(log_string, "Generating .reg file %s from position file %s with %d beads per image (random)",
	regfilename,
	argv[1],
	REG_PIXELS);
	p_log(log_string);

	strcpy(logfilename, argv[1]);
	strcat(logfilename, ".reglog");
	sprintf(log_string, "Logging positions used to file %s", logfilename);
	p_log(log_string);
  
	if( (posfile=fopen(argv[1], "rb")) == NULL)
	{
		sprintf(log_string, "ERROR opening position file %s for input", argv[1]);
		p_log_errorno(log_string);
		exit(0);
	}
	if( (regfile=fopen(regfilename, "wb")) == NULL)
	{
		sprintf(log_string, "ERROR opening reg file %s for output", argv[2]);
		p_log_errorno(log_string);
		exit(0);
	}
	if( (logfile=fopen(logfilename, "wb")) == NULL)
	{
		sprintf(log_string, "ERROR opening reglog file %s for output", argv[2]);
		p_log_errorno(log_string);
		exit(0);
	}


	// loop through FC, ARRAY, IMAGE:
	for(i=0; i < num_fcs; i++)
	{
		for(j=0; j < ARRAYS_PER_FC; j++)
		{
			for(k=0; k < IMGS_PER_ARRAY; k++)
			{
				// load positions for current image
				// ------
				// each 'record' in the pos file is as follows:
				// 4 bytes:  -1
				// 4 bytes:  flowcell # ([0..num_fcs])
				// 4 bytes:  array #    ([0..ARRAYS_PER_FC])
				// 4 bytes:  image #    ([0..IMGS_PER_ARRAY])
				// 4 bytes:  # of beads
				// 2 bytes:  beadpos_xcol
				// 2 bytes:  beadpos_yrow
				// ...
				// 2 bytes:  0
				//
				// ------

				if( (fread(&curr_fc, sizeof(int), 1, posfile)) < 1){
					p_log_errorno((char*)"ERROR reading curr_fc(1) from posfile");
				}
				if( (fread(&curr_fc, sizeof(int), 1, posfile)) < 1){
					p_log_errorno((char*)"ERROR reading curr_fc(2) from posfile");
				}
				if( (fread(&curr_array, sizeof(int), 1, posfile)) < 1){
					p_log_errorno((char*)"ERROR reading curr_array from posfile");
				}
				if( (fread(&curr_img, sizeof(int), 1, posfile)) < 1){
					p_log_errorno((char*)"ERROR reading curr_img from posfile");
				}
				if( (fread(&curr_numobjs, sizeof(int), 1, posfile)) < 1){
					p_log_errorno((char*)"ERROR reading curr_numobjs from posfile");
				}

				// make sure we are where we think we are in the position file
				if( (curr_fc != i) || (curr_array != j)|| (curr_img != k))
				{
					sprintf(log_string, "ERROR: expecting %d %d %d from position file, and read %d %d %d",
									i, j, k,
									curr_fc, curr_array, curr_img);
					p_log(log_string);
					exit(0);
				}

				sprintf(log_string, "Position %d %d %d... %d objects", i, j, k, curr_numobjs);
				p_log(log_string);

				for(l=0; l < curr_numobjs; l++)
				{
					if((fread(curr_img_x+l, sizeof(short unsigned int), 1, posfile)) < 1)
					{
						sprintf(log_string, "ERROR reading x from posfile at %d %d %d %d",
									i, j, k, l);
						p_log_errorno(log_string);
					}
					if((fread(curr_img_y+l, sizeof(short unsigned int), 1, posfile)) < 1)
					{
						sprintf(log_string, "ERROR reading y from posfile at %d %d %d %d",
								i, j, k, l);
						p_log_errorno(log_string);
					}
				}

				// make sure we are where we think we are in the position file
				if( (fread(&temp, sizeof(short unsigned int), 1, posfile)) < 1)
				{
					p_log_errorno((char*)"ERROR reading curr_img from posfile");
				}
				if(temp != 0)
				{
					sprintf(log_string, "ERROR: expecting delimiter value of 0, read %d", temp);
					p_log(log_string);
					exit(0);
				}


				// generate list of random coords and log to reglog, 2 bytes per position
				// as we generate them, output corresponding position values to regfile
				for(l = 0; l < REG_PIXELS; l++)
				{
					if(curr_numobjs < 100)
					{
						*(regindices + l) = randdist(0, NUM_XCOLS-1);
					}
					else
					{
						*(regindices + l) = randdist(0, curr_numobjs-1);
					}
					if((fwrite(regindices+l, sizeof(short unsigned int), 1, logfile)) < 1)
					{
						sprintf(log_string, "ERROR writing to reglog at %d %d %d %d", i, j, k, l);
						p_log_errorno(log_string);
						exit(0);
					}
	  
					if((fwrite(curr_img_x+(*(regindices+l)), sizeof(short unsigned int), 1, regfile)) < 1)
					{
						sprintf(log_string, "ERROR writing x to regfile at %d %d %d %d: %d",
							i,j,k,l,*(regindices+l));
						p_log_errorno(log_string);
						exit(0);
					}
					if((fwrite(curr_img_y+(*(regindices+l)), sizeof(short unsigned int), 1, regfile)) < 1)
					{
						sprintf(log_string, "ERROR writing y to regfile at %d %d %d %d: %d",
							i,j,k,l,*(regindices+l));	
						p_log_errorno(log_string);
						exit(0);
					}
				}
			} // end for k
		} // end for j
		if( i == 0 )
		{
			fgetpos(regfile, &offsetval);
			fwrite(&offsetval, sizeof(fpos_t), 1, dualfcoffsetfile);
			fclose(dualfcoffsetfile);
		}
	} // end for i
	fclose(posfile);
	fclose(regfile);
}
示例#4
0
int GetSock(char *argv,
            int port) {

    int sock;                      // socket descriptor
    struct sockaddr_in servAddr;   // server address
    unsigned short servPort;       // server port
    char *servIP;                  // server IP address
    char errorString[255];
    struct hostent *h;
    struct in_addr a;
    int flag = 1;
    int result;

    int waiting_to_connect = 0;

    servIP = argv;
    servPort = port;

    fprintf(stdout, "GetSock:\tConnecting to server %s on port %d\n", servIP, servPort);
    if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
        perror(NULL);
        fprintf(stdout, "ERROR: socket() failed\n");
        exit(1);
    }

    fprintf(stdout, "GetSock:\tResolving hostname...\n");
    h=gethostbyname(servIP);
    bcopy(*h->h_addr_list, (char*) &a, sizeof(a));
    fprintf(stdout, "GetSock:\tHost address: %s\n", inet_ntoa(a));


    memset(&servAddr, 0, sizeof(servAddr));
    servAddr.sin_family = AF_INET;
    servAddr.sin_addr.s_addr = inet_addr(inet_ntoa(a));
    //  servAddr.sin_addr.s_addr = inet_addr(servIP);
    servAddr.sin_port = htons(servPort);

    result = setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (char*)&flag, sizeof(int));
    if(result<0) {
        p_log_errorno((char*)"ERROR SETTING TCP_NODELAY ON SOCKET");
    }

    while(connect(sock, (struct sockaddr *) & servAddr, sizeof(servAddr)) < 0) {
        if(waiting_to_connect) {
            ;
        }
        else
        {
            fprintf(stdout, "GetSock:\tWaiting to connect to server ...\n");
            waiting_to_connect = 1;
        }
    }
    /*
    if(connect(sock, (struct sockaddr *) & servAddr, sizeof(servAddr)) < 0){
    perror(NULL);
    DieWithError("connect() failed");
    }
    */

    return sock;
}
示例#5
0
void ReceiveData(char *argv, int portnum,
		 short unsigned int *reg_pix_list_xcols,
		 short unsigned int *reg_pix_list_yrows,
		 FILE *full_pixel_list,
		 short unsigned int *beadvals,
		 FILE *beadfile,
		 FILE *sumfile,
		 FILE *imgsumfile,
		 FILE *reglogfile,
		 int curr_fcnum)
{

	int sock;                      // socket descriptor
	unsigned int data_size;        // length of data block to receive
	int bytesRcvd, totalBytesRcvd=0; // bytes read in single rcv() and total bytes read
	int imagesRcvd=0;
	char errorString[255];
	char log_string[255];
	char sendBuffer[] = "18"; //CODE OF 1/8 ASKS SENDER FOR DATA

	short unsigned int *inputBuffer;//
	short unsigned int img_err_code;

	int i, j, k;

	int *offsetx_history, *offsety_history;

	clock_t time1, time2;
	int num_loops;

	int connection_isok=1;
	char command_buffer[255];
    char image_dir[255];
    sprintf(image_dir, "%s/polonator/G.007/acquisition/images", getenv("HOME"));
    sprintf(command_buffer, "mkdir -p %s", image_dir);
    system(command_buffer);

#ifdef SAVE_FL_IMAGES
	char outputfilename[255];
	FILE *imgfile;
#endif

	sock = GetSock(argv, portnum);


	data_size = ((NUM_XCOLS * NUM_YROWS)+4) * sizeof(short unsigned int);
	if( (inputBuffer=(short unsigned int *)malloc(data_size)) == NULL)
	{
		p_log_errorno((char*)"malloc() failed");
	}

	//ALLOCATE MEMORY FOR OFFSET HISTORY ARRAYS (USED BY PROCESSIMAGE_REGISTER)
	if((offsetx_history=(int*)malloc(OFFSET_HISTORY_LENGTH * sizeof(int))) == NULL)
	{
		p_log_errorno((char*)"malloc() offsetx_history failed");
		exit(0);
	}
	if((offsety_history=(int*)malloc(OFFSET_HISTORY_LENGTH * sizeof(int))) == NULL)
	{
		p_log_errorno((char*)"malloc() offsety_history failed");
		exit(0);
	}
	  for(i=0; i < OFFSET_HISTORY_LENGTH; i++)
	  {
		*(offsetx_history + i) = 0;
		*(offsety_history + i) = 0;
	  }


  //TELL SENDER WE WANT TO RECEIVE DATA
	if(send(sock, sendBuffer, 1, 0)!=1)
	{
		if(errno = EPIPE)
		{
			p_log_errorno((char*)"ERROR:\tReceivData: send() failed because connection is broken");
			connection_isok=0;
		}
		else
		{
			p_log_errorno((char*)"send() from client to request data failed");
			exit(0);
		}
	}
	if(send(sock, sendBuffer+1, 1, 0) !=1 )
	{
		if(errno = EPIPE)
		{
			p_log_errorno((char*)"ERROR:\tReceivData: send() failed because connection is broken");
			connection_isok=0;
		}
		else
		{
			p_log_errorno((char*)"send() from client to request data failed");
			exit(0);
		}
	}

	//CONSUME 'PRIMIMG' DATA SINCE FIRST IMAGE XFER
	//IS VERY SLOW
	if(connection_isok)
	{
		bytesRcvd=0;
		totalBytesRcvd=0;
		while(totalBytesRcvd < data_size)
		{
			if((bytesRcvd=recv(sock, ((char*)inputBuffer)+totalBytesRcvd, data_size-totalBytesRcvd, 0)) < 0)
			{
				sprintf(errorString, "recv() failed or connection closed prematurely, %d bytes received (%d)", totalBytesRcvd, bytesRcvd);
				close(sock);
				p_log_errorno(errorString);
				exit(0);
			}
			else if(bytesRcvd == 0)
			{
				p_log((char*)"ERROR:\tReceiveData: connection is broken");
				connection_isok = 0;
				totalBytesRcvd=data_size;
			}
			totalBytesRcvd += bytesRcvd;
		}
	}

#ifdef SAVE_FL_IMAGES
	sprintf(outputfilename, "mkdir -p %s/%s", image_dir, CYCLE_NAME);
	system(outputfilename);
#endif

	// loop through all images, receiving blocks of data (1 image + header per block)
	if(connection_isok)
	{
		for(i=curr_fcnum; i < curr_fcnum + 1; i++)
		{
			for(j=0; j < ARRAYS_PER_FC; j++)
			{
				for(k=0; k < IMGS_PER_ARRAY; k++)
				{
					bytesRcvd = 0;
					totalBytesRcvd = 0;
					// tell server we're ready for the next block
#ifdef DEBUG1
					p_log((char*)"STATUS:\tReceiveData: request data from server");
					p_log((char*)"STATUS:\tReceiveData: send first byte to request");
#endif
					if(send(sock, sendBuffer, 1, 0) != 1)
					{
						if(errno = EPIPE)
						{
							p_log_errorno((char*)"ERROR:\tsend() failed because connection is broken");
							connection_isok=0;
							totalBytesRcvd=data_size;
						}
						else
						{
							p_log_errorno((char*)"ERROR:\tsend() from client to request data failed");
							exit(0);
						}
					}
#ifdef DEBUG1
					p_log((char*)"STATUS:\tReceiveData: send second byte to request");
#endif
					if(send(sock, sendBuffer+1, 1, 0) !=1 )
					{
						if(errno = EPIPE)
						{
							p_log_errorno((char*)"ERROR:\tsend() failed because connection is broken");
							connection_isok = 0;
							totalBytesRcvd = data_size;
						}
						else
						{
							p_log_errorno((char*)"ERROR:\tsend() from client to request data failed");
							exit(0);
						}
					}

#ifdef DEBUG1
					p_log((char*)"STATUS:\tReceiveData: start receiving data");
					p_log((char*)"STATUS:\tReceiveData: wait for data to arrive");
#endif
					// wait for full block to be received
					while(totalBytesRcvd < data_size)
					{
						// was there an error during the recv?  if so, this is bad; crash
						if((bytesRcvd = recv(sock, ((char*)inputBuffer) + totalBytesRcvd, data_size-totalBytesRcvd, 0)) < 0)
						{
							sprintf(errorString, "recv() failed, %d bytes received (%d)", totalBytesRcvd, bytesRcvd);
							close(sock);
							p_log_errorno(errorString);
							// do a graceful restart here
							connection_isok = 0;
							totalBytesRcvd = data_size;
							bytesRcvd = 0;
						}

						// was the connection broken?  if so, the acq software was probably stopped prematurely; recover gracefully
						else if(bytesRcvd == 0)
						{
							sprintf(log_string, "connection to acq appears to be broken while trying to receive image %d %d %d, received %d bytes so far", i, j, k, totalBytesRcvd);
							p_log(log_string);
							connection_isok = 0;
							totalBytesRcvd = data_size;
						}
						/*
#ifdef DEBUG1
						sprintf(log_string, "STATUS:\tReceiveData: received %d bytes of image data", bytesRcvd);
						p_log(log_string);
#endif
						*/
						totalBytesRcvd += bytesRcvd;
						num_loops++;
					}

					if(!connection_isok)
					{
						i = curr_fcnum + 1;
						j = ARRAYS_PER_FC;
						k = IMGS_PER_ARRAY;
						p_log((char*)"ERROR:\tReceiveData: connection was broken; exiting");
						break;
					}

					p_log((char*)"STATUS:\tReceiveData: all data received for current image");
					imagesRcvd++;
					num_loops = 0;

					// NOW THAT WE HAVE THE IMAGE, DO SOMETHING WITH IT
#ifdef SAVE_FL_IMAGES
					if( (k % 100) == 0)
					{
						sprintf(outputfilename, "%s/%s/%02d_%04d.raw",
								image_dir, CYCLE_NAME, *(inputBuffer+1), *(inputBuffer+2));
						sprintf(log_string, "STATUS:\tReceiveData: write received data to image file %s",
								outputfilename);
						p_log(log_string);
						imgfile = fopen(outputfilename, "w");
						fwrite(inputBuffer+4, sizeof(short unsigned int), 1000000, imgfile);
						fclose(imgfile);
					}
#endif

#ifdef DEBUG1
					sprintf(log_string, "STATUS:\tReceiveData: calling ProcessImage for frame %d %d %d, expecting %d %d %d",
							*(inputBuffer),
							*(inputBuffer+1),
							*(inputBuffer+2),
							i, j, k);
					p_log(log_string);
#endif
					ProcessImage(reg_pix_list_xcols,
						reg_pix_list_yrows,
						full_pixel_list,
						inputBuffer + 4,
						inputBuffer,
						beadvals,
						beadfile,
						sumfile,
						imgsumfile,
						reglogfile,
						offsetx_history,
						offsety_history);


				} // end for k
			} // end for j
		} // end for i
	} // end if connection_isok

	// tell acq we're finished receiving all data (we don't want it to close the connection
	// before the processor finishes receiving the last image)
	if(connection_isok)
	{
		if(send(sock, sendBuffer, 1, 0) != 1)
		{
			p_log_errorno((char*)"send() from client to signal all data received failed");
		//exit(0);
		}

		if(shutdown(sock, 2) < 0)
		{
			p_log_errorno((char*)"ERROR on shutdown(sock)");
			//exit(0);
		}//close(sock);
	}

	free(offsetx_history);
	free(offsety_history);
	free(inputBuffer);
}
示例#6
0
int run_autoexp(char *argv, int cell_num) {
    FILE *full_pix_list;
    FILE *regpixfile;
    FILE *beadfile;
    FILE *sumfile;
    FILE *imgsumfile;
    FILE *reglogfile;
    FILE *bead_value_file;
    FILE *bead_sum_file;
    short unsigned int *reg_pix_list_xcols;
    short unsigned int *reg_pix_list_yrows;
    short unsigned int *beadvals;
    int fcnum =0;
    fpos_t pix_list_offset;
    int reg_X_pointer_offset;
    int reg_Y_pointer_offset;

    int portnum;// = atoi(argv[2]);
    char filename[255];
    char autoefilename[255];
    char autoefilename2[255];
    char rcvfilename[255];
    char posfilename[200];
    char reglogfilename[200];
    char temp_string[255];
    char log_string[255];
    char outputfilename[500];

    int num_regs_skipped;
    int num_fcs;

    int i;
    int h =0;


    start_logger((char*)DEFAULT_PROCESSOR_LOGFILENAME, 1);

    strcpy(posfilename, "autoexp_pos");
    portnum = PORTNUM;
    num_fcs = cell_num;

    p_log((char*)"processor:\tAllocating memory for arrays ...");
    if( (reg_pix_list_xcols=(short unsigned int*)malloc(REG_PIXELS*ARRAYS_PER_FC*15*sizeof(short unsigned int))) == NULL) {
        p_log((char*)"malloc() for reg_pixel_list_xcols failed...");
    }
    if( (reg_pix_list_yrows=(short unsigned int*)malloc(REG_PIXELS*ARRAYS_PER_FC*15*sizeof(short unsigned int))) == NULL) {
        p_log((char*)"malloc() for reg_pixel_list_yrows failed...");
    }
    if((beadvals=(short unsigned int*)malloc(MAX_BEADS_PERFRAME*sizeof(short unsigned int))) == NULL) {
        p_log((char*)"malloc() for beadvals failed...");
    }
    memset(&pix_list_offset, 0, sizeof(pix_list_offset));

    if( (full_pix_list = fopen(posfilename, "r")) == NULL) {
        sprintf(log_string, "ERROR opening pixel list file %s", posfilename);
        p_log(log_string);
        perror(NULL);
        return 1;
    }
    strcat(posfilename, ".reg");
    if( (regpixfile = fopen(posfilename, "r")) == NULL) {
        sprintf(log_string, "ERROR opening reg pixel list file %s", posfilename);
        p_log(log_string);
        exit(0);
    }


    //LOAD REGISTRATION PIXEL LIST INTO MEMORY
    //IF A SET OF COORDS IS WITHIN THE BORDER
    //OF THE IMAGE (SIZE SPECIFIED BY SEARCH_XCOLS
    //AND SEARCH_YROWS, DO NOT USE THAT POINT -- INSTEAD,
    //USE THE PREVIOUS POINT
    num_regs_skipped=0;
    sprintf(log_string, "processor:\tLoading regpix file %s ...", posfilename);
    p_log(log_string);

    sprintf(log_string, "processor:\tautoe %s ...", posfilename);
    p_log(log_string);

    for(i=0; i<(REG_PIXELS*ARRAYS_PER_FC*15); i++) {
        if((fread(reg_pix_list_xcols+i, 2, 1, regpixfile)) < 1) {
            sprintf(log_string, "ERROR reading from file regpix_list at data element %d", i);
            p_log_errorno(log_string);
            exit(0);
        }
        if((fread(reg_pix_list_yrows+i, 2, 1, regpixfile)) < 1) {
            sprintf(log_string, "ERROR reading from file regpix_list at data element %d", i);
            p_log_errorno(log_string);
            exit(0);
        }

        if( (*(reg_pix_list_xcols+i) <= (SEARCH_XCOLS+MAX_ADDITIONAL_OFFSET+1)) ||
                (*(reg_pix_list_yrows+i) <= (SEARCH_YROWS+MAX_ADDITIONAL_OFFSET+1)) ||
                ((NUM_XCOLS - *(reg_pix_list_xcols+i)) <= (SEARCH_XCOLS+MAX_ADDITIONAL_OFFSET+1)) ||
                ((NUM_YROWS - *(reg_pix_list_yrows+i)) <= (SEARCH_YROWS+MAX_ADDITIONAL_OFFSET+1)))
        {
            num_regs_skipped++;
            if(i==0) {
                *(reg_pix_list_xcols + i) = (int)(NUM_XCOLS/2);
                *(reg_pix_list_yrows + i) = (int)(NUM_YROWS/2);
            }
            else {
                *(reg_pix_list_xcols + i) = *(reg_pix_list_xcols + i - 1);
                *(reg_pix_list_yrows + i) = *(reg_pix_list_yrows + i - 1);
            }
        } // end if

    } // end for
    fclose(regpixfile);
    /*  int percentage_skipped = (int)( ((float)(num_regs_skipped) / (REG_PIXELS)) * 100);*/
    int percentage_skipped = num_regs_skipped*100.0 / (15*ARRAYS_PER_FC*REG_PIXELS);
    int avg_regpix_perframe = REG_PIXELS - (int)( ((float)(percentage_skipped)/100) * REG_PIXELS);
    sprintf(log_string, "processor:\tSkipped %d reg coords (%d%%), using avg of %d/%d reg pixels at window size %d/%d ...",
            num_regs_skipped,
            percentage_skipped,
            avg_regpix_perframe,
            REG_PIXELS,
            SEARCH_XCOLS,
            SEARCH_YROWS);
    p_log(log_string);

    ReceiveFilename(argv, portnum, rcvfilename);

    /*    p_log((char*)"processor:\tRequesting flowcell number from server ...");
     fcnum = ReceiveFCNum(argv[1], portnum); */
    strcpy(filename, "autoexp_images/beads/");
    sprintf(temp_string, "%d_", fcnum);
    strcat(filename, temp_string);
    strcat(filename, rcvfilename);
#ifdef SAVE_FL_IMAGES
    strcpy(CYCLE_NAME, temp_string);
    strcpy(CYCLE_NAME, rcvfilename);
#endif

    sprintf(log_string, "processor:\tReceived filename %s from server ...", rcvfilename);
    p_log(log_string);

    sprintf(temp_string, "autoexp_images/logs/%s.processorlog", rcvfilename);
    change_logfile(temp_string);
    p_log(log_string);


    strcat(filename, ".beads");

    if( (beadfile = fopen(filename, "wb")) == NULL) {
        sprintf(log_string, "ERROR opening output bead file %s", filename);
        p_log_errorno(log_string);
        exit(0);
    }

    strcpy(autoefilename, "autoexp_images/");
    strcat(autoefilename,CYCLE_NAME);
    strcat(autoefilename,"_bead_value_file.txt");

    if( (bead_value_file  = fopen(autoefilename, "w")) == NULL) {
        sprintf(log_string, "ERROR opening output bead file %s", filename);
        p_log_errorno(log_string);
        exit(0);
    }

    strcpy(autoefilename2, "autoexp_images/");
    strcat(autoefilename2,CYCLE_NAME);
    strcat(autoefilename2,"_bead_sum_file.txt");

    if( (bead_sum_file = fopen(autoefilename2, "w")) == NULL) {
        sprintf(log_string, "ERROR opening output bead file %s", filename);
        p_log_errorno(log_string);
        exit(0);
    }


    sprintf(temp_string, "autoexp_images/logs/%d_", fcnum);
    strcpy(reglogfilename, temp_string);
    strcat(reglogfilename, rcvfilename);
    strcat(reglogfilename, ".register-log");
    if( (reglogfile = fopen(reglogfilename, "wb")) == NULL) {
        sprintf(log_string, "ERROR opening output reglog file %s", reglogfilename);
        p_log_errorno(log_string);
        exit(0);
    }

    sprintf(log_string, "processor:\tRequesting data from server for file %s ...", filename);
    p_log(log_string);

    strcat(filename, "ums");
    if( (sumfile = fopen(filename, "wb")) == NULL) {
        sprintf(log_string, "ERROR opening output sum file %s", filename);
        p_log_errorno(log_string);
        exit(0);
    }

    strcat(filename, "_full");
    if( (imgsumfile = fopen(filename, "wb")) == NULL) {
        sprintf(log_string, "ERROR opening output imgsum file %s", filename);
        p_log_errorno(log_string);
        exit(0);
    }

    // seek to correct place in object table, and advance pointer to
    // correct place in reg object table
    if(fcnum == 0) { // fcnum is either 0 or 1
        // seek to start of object table file
        if(fseek(full_pix_list, 0, SEEK_SET)!=0) {
            p_log_errorno((char*)"ERROR ");
        }

        // set reg pointer offsets
        reg_X_pointer_offset = 0;
        reg_Y_pointer_offset = 0;
    }
    else {
        // seek to position in object table where the current flowcell starts
        // we know where to go because the last time through the loop when we
        // were on FC0, we recorded the position after ReceiveData finished
        fsetpos(full_pix_list, &pix_list_offset);

        // set reg pointer offsets
        reg_X_pointer_offset = 0;
        reg_Y_pointer_offset = 0;
    }

    p_log((char*)"READY TO RECEIVE IMAGE DATA");
    ReceiveData_new(argv, portnum, reg_pix_list_xcols + reg_X_pointer_offset,
                    reg_pix_list_yrows + reg_Y_pointer_offset, full_pix_list, beadvals, beadfile, sumfile, imgsumfile, reglogfile,bead_value_file,bead_sum_file, fcnum, pix_list_offset);

    // remember position in object table so we can get back later
    if(fcnum == 0) {
        fgetpos(full_pix_list, &pix_list_offset);
    }

    fclose(beadfile);
    fclose(sumfile);
    fclose(imgsumfile);
    fclose(reglogfile);
    fclose(bead_value_file);
    fclose(bead_sum_file);

    change_logfile((char*)DEFAULT_PROCESSOR_LOGFILENAME);

    p_log_simple((char*)"processor:\tAutoexposure exited; waiting before attempting to reconnect...");
    sleep(10);

    fclose(full_pix_list);

} // end function
// RETURN 1 ON SUCCESS,
// -1 ON MISSING IMAGE
int ProcessImage(short unsigned int *reg_pix_list_xcols,
                short unsigned int *reg_pix_list_yrows,
                FILE *full_pixel_list, 
                short unsigned int *image,
                short unsigned int *image_info,
                short unsigned int *beadvals,
                FILE *beadfile,
                FILE *sumfile,
                FILE *imgsumfile,
                FILE *reglogfile,
                int *offsetx_history, 
                int *offsety_history){
  
    // IMAGE INFO VARIABLES

    int curr_imgnum;
    int curr_arraynum;
    int curr_fcnum;


    // REGISTRATION VARIABLES
    int reg_pointer_offset;
    int offset_xcols;
    int offset_yrows;
    int score;

    // BEAD VARIABLES
    short unsigned int num_beads; // number of beads in current frame
    int i;

    double *temp_img; //gets sorted to find median pixel val  
    short unsigned int *temp_img2; //bg subtracted image passed to register
    int percentile_val;
    int temp_val;

    unsigned long long int beadsum;
    unsigned long long int imgsum;
    int index;

    char log_string[255];

    // ALLOCATE MEMORY
    if((temp_img = (double*)malloc((NUM_XCOLS*NUM_YROWS) * sizeof(double)))==NULL){
        p_log_errorno((char*)"ERROR:\tProcessImage memory allocation failed (double *temp_img)");
        exit(1);
    }
    if((temp_img2 = (short unsigned int*)malloc((NUM_XCOLS*NUM_YROWS) * sizeof(short unsigned int)))==NULL){
        p_log_errorno((char*)"ERROR:\tProcessImage memory allocation failed (short unsigned int *temp_img2)");
        exit(1);
    }

    // PARSE IMAGE INFO FIELDS
    curr_imgnum = (int)(*(image_info + 2));
    curr_arraynum = (int)(*(image_info + 1));
    curr_fcnum = (int)(*(image_info + 0));

    // ERROR WITH CURRENT IMAGE; PROBABLY FAILURE TO ACQUIRE
    if(*(image_info + 3) == 1){
        sprintf(log_string, "ERROR:\tProcessImage: image header indicates problem with image %d %d %d",
        curr_fcnum, curr_arraynum, curr_imgnum);
        p_log(log_string);
    }

    // UPDATE POINTER TO CURRENT POSITION IN REG_PIXEL_LIST
    reg_pointer_offset = ((curr_fcnum * ARRAYS_PER_FC * IMGS_PER_ARRAY) + 
            (curr_arraynum * IMGS_PER_ARRAY) + 
            curr_imgnum);
    reg_pointer_offset = reg_pointer_offset * REG_PIXELS;

    sprintf(log_string, "STATUS:\tProcessImage: started operating on image %d, array %d, fc %d", 
        curr_imgnum,
        curr_arraynum,
        curr_fcnum);
    p_log_simple(log_string);


#ifdef DEBUG1
    p_log((char*)"STATUS:\tProcessImage: calling ProcessImage_register");
    //sprintf(log_string, "STATUS:\tProcessImage: seek to position %ld", reg_pointer_offset);
    sprintf(log_string, "STATUS:\tProcessImage: seek to position %d", reg_pointer_offset);
    p_log(log_string);
#endif


    // BACKGROUND SUBTRACT IMAGE FOR REGISTRATION
    index=0;
    for(i=0; i<1000000; i+=135){
        temp_img[index] = (double)*(image + i);
        index++;
    }
        quickSort(temp_img, index);
        percentile_val = (int)temp_img[index-(int)((double)index*0.9)];
    for(i=0; i<1000000; i++){
        temp_val = (int)*(image+i) - percentile_val;
        if(temp_val<0){
            temp_img2[i]=0;
        }
        else{
            temp_img2[i] = (short unsigned int)temp_val;
        }
    }

    // Added to correct offset history for discontinuous image tracking.
    if((curr_imgnum)%218==0){
        p_log((char*)"STATUS:\tProcessImage: RESET HISTORY");
        for(i=0; i<OFFSET_HISTORY_LENGTH; i++){
            *(offsetx_history + i) = 0;
            *(offsety_history + i) = 0;
        }
    }


    // REGISTER IMAGE WITH 'BEAD PIXELS' FROM MASK IMAGE
    ProcessImage_register(reg_pix_list_xcols,
            reg_pix_list_yrows,
            //image,
            temp_img2,
            reg_pointer_offset,
            REG_PIXELS,
            SEARCH_XCOLS,
            SEARCH_YROWS,
            &offset_xcols,
            &offset_yrows,
            &score,
            *(image_info+3),
            reglogfile,
            offsetx_history,
            offsety_history);
    //fprintf(reglogfile, "=%d\t%d\t%d\t%d\t%d\n", curr_arraynum, curr_imgnum, offset_xcols, offset_yrows, score);
  
#ifdef DEBUG1
    sprintf(log_string, "STATUS:\tProcessImage: calling ProcessImage_extract w/ offsets %d %d",
        offset_xcols, offset_yrows);
    p_log(log_string);
#endif

    // PULL 'BEAD PIXELS' FROM IMAGE USING FULL MASK ON DISK
    ProcessImage_extract(image,
            offset_xcols,
            offset_yrows,
            *(image_info+3),
            full_pixel_list,
            curr_imgnum,
            curr_arraynum,
            curr_fcnum,
            &num_beads,
            beadvals,
            &beadsum);


#ifdef DEBUG1
    p_log((char*)"STATUS:\tProcessImage: writing output to files");
#endif

    if(fwrite(beadvals, sizeof(short unsigned int), num_beads, beadfile) < num_beads){
        p_log_errorno((char*)"ERROR:\tProcessImage: write to bead file failed");
        exit(1);
    }
    if(fwrite(&beadsum, sizeof(long long int), 1, sumfile) < 1){
        p_log_errorno((char*)"ERROR:\tProcessImage: write to sum file failed");
        exit(1);
    }
    imgsum=0;
    for(i=0; i<100000; i+=100){
        imgsum+=*(image+i);
    }
    if(fwrite(&imgsum, sizeof(long long int), 1, imgsumfile) < 1){
        p_log_errorno((char*)"ERROR:\tProcessImage: write to imgsum file failed");
        exit(1);
    }
  
    free(temp_img);
    free(temp_img2);

#ifdef DEBUG1
    p_log_simple((char*)"STATUS:\tProcessImage: finished image");
#endif
           
} // end function
示例#8
0
int main(int argc, char *argv[])
{
	FILE *posfile;
	FILE *infofile;
	char log_string[255];
	#ifdef SAVE_IMAGES
	char img_fcnum[255];
	#endif

	int portnum;// = atoi(argv[2]);
	char filename[12];
	int fcnum;
	int dual_flowcell = 0;

	start_logger((char*)"initialize_processor-log", 1);

	if(argc != 2 )
	{
		sprintf(log_string, "Usage: %s <Server hostname>", argv[0]);
		p_log(log_string);
		exit(0);
	}

	portnum = PORTNUM;

	p_log((char*)"processor:\tRequesting position filename from server ...");
	strcpy(filename, "");
	ReceiveFilename(argv[1], portnum, filename);
	sprintf(log_string, "processor:\treceived filename %s", filename);
	p_log(log_string);

	fcnum = ReceiveFCNum(argv[1], portnum);
	sprintf(log_string, "processor:\treceived fcnum %d", fcnum);
	p_log(log_string);
	if(fcnum > 1)
	{
		dual_flowcell = 1;
	}

#ifdef SAVE_IMAGES
	sprintf(img_fcnum, "%d", fcnum);
	strcat(CYCLE_NAME, img_fcnum);
	strcat(CYCLE_NAME, "_");
	strcat(CYCLE_NAME, filename);
#endif

	if( (posfile = fopen(filename, "wb")) == NULL)
	{
		sprintf(log_string, "ERROR opening output pos file %s", filename);
		p_log_errorno(log_string);
		exit(0);
	}
  
	sprintf(log_string, "processor:\tRequesting data from server for file %s ", filename);
	p_log(log_string);
	strcat(filename, ".info");
	if( (infofile = fopen(filename, "wb")) == NULL)
	{
		sprintf(log_string, "ERROR opening output info file %s", filename);
		p_log_errorno(log_string);
		exit(0);
	}


  /* fcnum will be == 2 if we're doing both flowcells; in this case,
     the next set of images will be the second half of the data necessary
     to generate the object table; re-request the filename, fcnum, and get
     the second half of the brightfield images
  */
	if (fcnum > 1)
	{
		p_log((char*)"RECEIVE_INIT_DATA...");
		ReceiveInitData(argv[1], portnum, posfile, infofile, fcnum-2);
		p_log((char*)"wait before attempting to reconnect");
		sleep(2);
		p_log((char*)"RECEIVE_FILENAME...");
		ReceiveFilename(argv[1], portnum, filename);
		p_log((char*)"RECEIVE_FCNUM...");
		fcnum = ReceiveFCNum(argv[1], portnum);
		p_log((char*)"RECEIVE_INIT_DATA...");
		ReceiveInitData(argv[1], portnum, posfile, infofile, fcnum-2);
	}
	else
	{
		ReceiveInitData(argv[1], portnum, posfile, infofile, fcnum);
	}

	fclose(posfile);
	fclose(infofile);
	return dual_flowcell + 1;
}
int main(int argc, char *argv[]){

  FILE *posfile;
  FILE *cy3_posfile;
  FILE *fam_posfile;
  FILE *txred_posfile;
  FILE *final_posfile;
  FILE *obj_logfile;
 
  FILE *infofile;

  fpos_t offsetval;

  char regfilename[200];
  char logfilename[200];
  char log_string[500];
  char info_filename[200];

  int i, j, k, l,m,n,o,convert,sconvert, object_count;
  int curr_fc, curr_array, curr_img;
  int num_fcs;
  int cy5_proceed, cy3_proceed, txred_proceed,fam_proceed;
  long long int found_object = 0;
  long long int total_object = 0;

  int curr_numobjs,cy3_curr_numobjs,txred_curr_numobjs,fam_curr_numobjs, max_curr_numobjs = 0;

  int **objects_array;
  int p,q;
  short unsigned int cy5_x,cy3_x,cy3_y,txred_x,txred_y,fam_x,fam_y,cy5_y;

  short unsigned int *curr_img_x;
  short unsigned int *curr_img_y;
  short unsigned int *regindices;
  short unsigned int temp;

  start_logger((char*)"initialize_processor-log", 1);

  
  system("rm 00_*.info");
  system("rm autoexp_pos.info");

  objects_array = (int**) malloc(sizeof(int) * 4000);
  for (i = 0; i < 2000; i++)
  {
    objects_array[i] = (int*) malloc(sizeof(int) * 2000);
  }

	for(p=0;p<2000;p++){
	   for(q=0;q<2000;q++){
		objects_array[p][q] = -1;
		}
	}

  if((curr_img_x = (short unsigned int*) malloc(MAX_BEADS_PERFRAME * sizeof(short unsigned int))) == NULL){
    p_log_errorno((char*)"ERROR allocating memory for curr_img_x");
    exit(0);
  }
  if((curr_img_y = (short unsigned int*) malloc(MAX_BEADS_PERFRAME * sizeof(short unsigned int))) == NULL){
    p_log_errorno((char*)"ERROR allocating memory for curr_img_y");
    exit(0);
  }
  
  if( (obj_logfile=fopen("merge.log", "w")) == NULL){
    sprintf(log_string, "ERROR opening reglog file %s for output", argv[2]);
    p_log_errorno(log_string);
    exit(0);
  }


  if((cy3_posfile=fopen("00_cy3", "rb")) == NULL){
    sprintf(log_string, "ERROR opening position file %s for input", "cy3");
    p_log_errorno(log_string);
    exit(0);
  }

  if( (txred_posfile=fopen("00_txr", "rb")) == NULL){
    sprintf(log_string, "ERROR opening position file %s for input", "txred");
    p_log_errorno(log_string);
    exit(0);
  }

  if( (fam_posfile=fopen("00_fam", "rb")) == NULL){
    sprintf(log_string, "ERROR opening position file %s for input", "fam");
    p_log_errorno(log_string);
    exit(0);
  }

  if( (posfile=fopen("00_cy5", "rb")) == NULL){
    sprintf(log_string, "ERROR opening position file %s for input", "cy5");
    p_log_errorno(log_string);
    exit(0);
  }

  if( (final_posfile=fopen(argv[1], "wb")) == NULL){
    sprintf(log_string, "ERROR opening position file %s for input", argv[1]);
    p_log_errorno(log_string);
    exit(0);
  }
  
  strcpy(info_filename,argv[1]);
  strcat(info_filename,".info");
  if( (infofile=fopen(info_filename, "wb")) == NULL){
    sprintf(log_string, "ERROR opening reg file %s for output", info_filename);
    p_log_errorno(log_string);
    exit(0);
  }


  // loop through FC, ARRAY, IMAGE:
  for(i=0; i<1; i++){
    for(j=0; j<ARRAYS_PER_FC; j++){
      for(k=0; k<IMGS_PER_ARRAY; k++){
	// load positions for current image
	// ------
	// each 'record' in the pos file is as follows:
	// 4 bytes:  -1
	// 4 bytes:  flowcell # ([0..num_fcs])
	// 4 bytes:  array #    ([0..ARRAYS_PER_FC])
  	// 4 bytes:  image #    ([0..IMGS_PER_ARRAY])
	// 4 bytes:  # of beads
	// 2 bytes:  beadpos_xcol
	// 2 bytes:  beadpos_yrow
	// ...
	// 2 bytes:  0
	//
 	// ------

	if( (fread(&curr_fc, sizeof(int), 1, posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading curr_fc(1) from posfile");
	}
	if( (fread(&curr_fc, sizeof(int), 1, posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading curr_fc(2) from posfile");
	}
	if( (fread(&curr_array, sizeof(int), 1, posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading curr_array from posfile");
	}
	if( (fread(&curr_img, sizeof(int), 1, posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading curr_img from posfile");
	}

	if( (fread(&curr_numobjs, sizeof(int), 1, posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading curr_numobjs from posfile");
	}

/*	sprintf(log_string, "flowcell %d, curr_array %d, curr_img %d",curr_fc, curr_array, curr_img);
	p_log(log_string);
*/
	if( (fread(&curr_fc, sizeof(int), 1, cy3_posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading curr_fc(1) from posfile");
	}
	if( (fread(&curr_fc, sizeof(int), 1, cy3_posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading curr_fc(2) from posfile");
	}
	if( (fread(&curr_array, sizeof(int), 1, cy3_posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading curr_array from posfile");
	}
	if( (fread(&curr_img, sizeof(int), 1, cy3_posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading curr_img from posfile");
	}

	if( (fread(&curr_fc, sizeof(int), 1, txred_posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading curr_fc(1) from posfile");
	}
	if( (fread(&curr_fc, sizeof(int), 1, txred_posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading curr_fc(2) from posfile");
	}
	if( (fread(&curr_array, sizeof(int), 1, txred_posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading curr_array from posfile");
	}
	if( (fread(&curr_img, sizeof(int), 1, txred_posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading curr_img from posfile");
	}

	if( (fread(&curr_fc, sizeof(int), 1, fam_posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading curr_fc(1) from posfile");
	}
	if( (fread(&curr_fc, sizeof(int), 1, fam_posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading curr_fc(2) from posfile");
	}
	if( (fread(&curr_array, sizeof(int), 1, fam_posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading curr_array from posfile");
	}
	if( (fread(&curr_img, sizeof(int), 1, fam_posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading curr_img from posfile");
	}

	max_curr_numobjs = 0;
	if(max_curr_numobjs<curr_numobjs) max_curr_numobjs=curr_numobjs; 

	if( (fread(&cy3_curr_numobjs, sizeof(int), 1, cy3_posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading curr_numobjs from posfile");
	}
	if(max_curr_numobjs<cy3_curr_numobjs) max_curr_numobjs=cy3_curr_numobjs;
	if( (fread(&txred_curr_numobjs, sizeof(int), 1, txred_posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading curr_numobjs from posfile");
	}
	if(max_curr_numobjs<txred_curr_numobjs) max_curr_numobjs=txred_curr_numobjs;
	if( (fread(&fam_curr_numobjs, sizeof(int), 1, fam_posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading curr_numobjs from posfile");
	}
	if(max_curr_numobjs<fam_curr_numobjs) max_curr_numobjs=fam_curr_numobjs;

        l = 0;
	m = 0;
        n = 0;
	o = 0;
        p = 0;
	q = 0;
	cy5_proceed = 1;
	cy3_proceed = 1;
	txred_proceed = 1;
	fam_proceed = 1;
	found_object = 0;
	total_object = 0;

	for(p=0;p<2000;p++){
	   for(q=0;q<2000;q++){
		objects_array[p][q] = -1;
		}
	}

	while(l<max_curr_numobjs)
	{

		if(l<curr_numobjs)
		{

			  if((fread(&cy5_x, sizeof(short unsigned int), 1, posfile)) < 1){
			    sprintf(log_string, "ERROR reading x from posfile at %d %d %d %d",
				    i, j, k, l);
			    p_log_errorno(log_string);
			  }
			  if((fread(&cy5_y, sizeof(short unsigned int), 1, posfile)) < 1){
			    sprintf(log_string, "ERROR reading y from posfile at %d %d %d %d",
				    i, j, k, l);
			    p_log_errorno(log_string);
			  }

			  if ((objects_array[(int)cy5_x][(int)cy5_y] == -1)&&((int)cy5_y!=1000 && (int)cy5_x!=1000)){
				objects_array[(int)cy5_x][(int)cy5_y] = 1;
				total_object++;
			  }

		}
		if(l<cy3_curr_numobjs)
		{
			  if((fread(&cy3_x, sizeof(short unsigned int), 1, cy3_posfile)) < 1){
			    sprintf(log_string, "ERROR reading x from posfile at %d %d %d %d",
				    i, j, k, l);
			    p_log_errorno(log_string);
			  }

			  if((fread(&cy3_y, sizeof(short unsigned int), 1, cy3_posfile)) < 1){
			    sprintf(log_string, "ERROR reading y from posfile at %d %d %d %d",
				    i, j, k, l);
			    p_log_errorno(log_string);
			  }

			  if ((objects_array[(int)cy3_x][(int)cy3_y] == -1)&&((int)cy3_y!=1000 && (int)cy3_x!=1000)){
				objects_array[(int)cy3_x][(int)cy3_y] = 1;
				total_object++;
			  }
		}

		if(l<txred_curr_numobjs)
		{
			  if((fread(&txred_x, sizeof(short unsigned int), 1, txred_posfile)) < 1){
			    sprintf(log_string, "ERROR reading x from posfile at %d %d %d %d",
				    i, j, k, l);
			    p_log_errorno(log_string);
			  }
			  if((fread(&txred_y, sizeof(short unsigned int), 1, txred_posfile)) < 1){
			    sprintf(log_string, "ERROR reading y from posfile at %d %d %d %d",
				    i, j, k, l);
			    p_log_errorno(log_string);
			  }
			  if ((objects_array[(int)txred_x][(int)txred_y] == -1)&&((int)txred_y!=1000 && (int)txred_x!=1000)){
				objects_array[(int)txred_x][(int)txred_y] = 1;
				total_object++;
			  }
		}

		if(l<fam_curr_numobjs)
		{
			  if((fread(&fam_x, sizeof(short unsigned int), 1, fam_posfile)) < 1){
			    sprintf(log_string, "ERROR reading x from posfile at %d %d %d %d",
				    i, j, k, l);
			    p_log_errorno(log_string);
			  }
			  if((fread(&fam_y, sizeof(short unsigned int), 1, fam_posfile)) < 1){
			    sprintf(log_string, "ERROR reading y from posfile at %d %d %d %d",
				    i, j, k, l);
			    p_log_errorno(log_string);
			  }
			  if ((objects_array[(int)fam_x][(int)fam_y] == -1)&&((int)fam_y!=1000 && (int)fam_x!=1000)){
				objects_array[(int)fam_x][(int)fam_y] = 1;
				total_object++;
			  }
		}
		l++;
	}

	convert=-1;

	// make sure we are where we think we are in the position file
	if( (fread(&temp, sizeof(short unsigned int), 1, posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading curr_img from posfile");
	}
	if(temp!=0){
	  sprintf(log_string, "ERROR: 1expecting delimiter value of 0, read %d", temp);
	  p_log(log_string);
	  exit(0);
	}

	// make sure we are where we think we are in the position file
	if( (fread(&temp, sizeof(short unsigned int), 1, cy3_posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading curr_img from posfile");
	}
	if(temp!=0){
	  sprintf(log_string, "ERROR: 2expecting delimiter value of 0, read %d", temp);
	  p_log(log_string);
	  exit(0);
	}

	// make sure we are where we think we are in the position file
	if( (fread(&temp, sizeof(short unsigned int), 1, txred_posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading curr_img from posfile");
	}
	if(temp!=0){
	  sprintf(log_string, "ERROR: 3expecting delimiter value of 0, read %d", temp);
	  p_log(log_string);
	  exit(0);
	}

	// make sure we are where we think we are in the position file
	if( (fread(&temp, sizeof(short unsigned int), 1, fam_posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading curr_img from posfile");
	}
	if(temp!=0){
	  sprintf(log_string, "ERROR: 4expecting delimiter value of 0, read %d", temp);
	  p_log(log_string);
	  exit(0);
	}


	//p_log((char*)"Write data to object table");
	if(fwrite(&convert, sizeof(int), 1, final_posfile) < 1){
	p_log_errorno((char*)"write of -1 to posfile failed");
	exit(0);
	}
	if(fwrite(&i, sizeof(int), 1, final_posfile) < 1){
	p_log_errorno((char*)"write of curr_fcnum to posfile failed");
	exit(0);
	}
	if(fwrite(&j, sizeof(int), 1, final_posfile) < 1){
	p_log_errorno((char*)"write of curr_arraynum to posfile failed");
	exit(0);
	}
	if(fwrite(&k, sizeof(int), 1, final_posfile) < 1){
	p_log_errorno((char*)"write of curr_imagenum to posfile failed");
	exit(0);
	}
	convert = (int)total_object;
	if(fwrite(&convert, sizeof(int), 1, final_posfile) < 1){
	p_log_errorno((char*)"write of num_beads to posfile failed");
	exit(0);
	}
        object_count=0;
	for(q=0;q<1000;q++){
	   for(p=0;p<1000;p++){
		if(objects_array[p][q] == 1){
			if(fwrite(&p, sizeof(short unsigned int), 1, final_posfile) < 1){
				p_log_errorno((char*)"write of beadpos_xcol to posfile failed");
				exit(0);
			}
			if(fwrite(&q, sizeof(short unsigned int), 1, final_posfile) < 1){
				p_log_errorno((char*)"write of beadpos_yrow to posfile failed");
				exit(0);
			}
			object_count++;
		}
	    }
	}

	//sprintf(log_string, "Position %d %d %d... %d cy5_objects, %d cy3_objects, %d txred_objects, %d fam_objects, total_object %d, total_object_count %d\n", i, j, k, curr_numobjs,cy3_curr_numobjs,txred_curr_numobjs,fam_curr_numobjs,total_object,object_count);
	sprintf(log_string, "Position %d %d %d... %d cy5_objects, %d cy3_objects, %d txred_objects, %d fam_objects, total_object %lld, total_object_count %d\n", i, j, k, curr_numobjs,cy3_curr_numobjs,txred_curr_numobjs,fam_curr_numobjs,total_object,object_count);
	p_log_simple(log_string);
	fprintf(obj_logfile,log_string);

	sconvert=0;
	if(fwrite(&sconvert, sizeof(short unsigned int), 1, final_posfile) < 1){
		p_log_errorno((char*)"write of 0 to posfile failed");
		exit(0);
	}
	//write to the info file
	sconvert = i;
	if(fwrite(&sconvert, sizeof(short unsigned int), 1, infofile) < 1){
	p_log_errorno((char*)"write of curr_fcnum to infofile failed");
	exit(0);
	}
	sconvert = j;
	if(fwrite(&sconvert, sizeof(short unsigned int), 1, infofile) < 1){
	p_log_errorno((char*)"write of curr_arraynum to infofile failed");
	exit(0);
	}
	sconvert = k;
	if(fwrite(&sconvert, sizeof(short unsigned int), 1, infofile) < 1){
	p_log_errorno((char*)"write of curr_imagenum to infofile failed");
	exit(0);
	}
	sconvert = (int)total_object;
	if(fwrite(&sconvert, sizeof(short unsigned int), 1, infofile) < 1){
	p_log_errorno((char*)"write of num_beads to infofile failed");
	exit(0);
	}
      }
    }
  }
  fclose(posfile);
  fclose(cy3_posfile);
  fclose(fam_posfile);
  fclose(txred_posfile);
  fclose(final_posfile);
  fclose(infofile);
  fclose(obj_logfile);

//merge the autoexp object table

  if((cy3_posfile=fopen("autoexp_pos_cy3", "rb")) == NULL){
    sprintf(log_string, "ERROR opening position file %s for input", "autoexp_pos_cy3");
    p_log_errorno(log_string);
    exit(0);
  }

  if( (txred_posfile=fopen("autoexp_pos_txr", "rb")) == NULL){
    sprintf(log_string, "ERROR opening position file %s for input", "autoexp_pos_txred");
    p_log_errorno(log_string);
    exit(0);
  }

  if( (fam_posfile=fopen("autoexp_pos_fam", "rb")) == NULL){
    sprintf(log_string, "ERROR opening position file %s for input", "autoexp_pos_fam");
    p_log_errorno(log_string);
    exit(0);
  }

  if( (posfile=fopen("autoexp_pos_cy5", "rb")) == NULL){
    sprintf(log_string, "ERROR opening position file %s for input", "autoexp_pos_cy5");
    p_log_errorno(log_string);
    exit(0);
  }

  if( (final_posfile=fopen("autoexp_pos", "wb")) == NULL){
    sprintf(log_string, "ERROR opening position file %s for input", argv[1]);
    p_log_errorno(log_string);
    exit(0);
  }
  
  strcpy(info_filename,"autoexp_pos");
  strcat(info_filename,".info");
  if( (infofile=fopen(info_filename, "wb")) == NULL){
    sprintf(log_string, "ERROR opening reg file %s for output", info_filename);
    p_log_errorno(log_string);
    exit(0);
  }


        i = 0;
	j = 0;
        k = 0;
    for(j=0; j<ARRAYS_PER_FC; j++){
      for(k = 0;k<15;k++){
	if( (fread(&curr_fc, sizeof(int), 1, posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading autoe curr_fc(1) from posfile");
	}
	if( (fread(&curr_fc, sizeof(int), 1, posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading autoe curr_fc(2) from posfile");
	}
	if( (fread(&curr_array, sizeof(int), 1, posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading autoe curr_array from posfile");
	}
	if( (fread(&curr_img, sizeof(int), 1, posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading curr_img from posfile");
	}

	if( (fread(&curr_numobjs, sizeof(int), 1, posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading curr_numobjs from posfile");
	}

	if( (fread(&curr_fc, sizeof(int), 1, cy3_posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading curr_fc(1) from posfile");
	}
	if( (fread(&curr_fc, sizeof(int), 1, cy3_posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading curr_fc(2) from posfile");
	}
	if( (fread(&curr_array, sizeof(int), 1, cy3_posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading curr_array from posfile");
	}
	if( (fread(&curr_img, sizeof(int), 1, cy3_posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading curr_img from posfile");
	}

	if( (fread(&curr_fc, sizeof(int), 1, txred_posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading curr_fc(1) from posfile");
	}
	if( (fread(&curr_fc, sizeof(int), 1, txred_posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading curr_fc(2) from posfile");
	}
	if( (fread(&curr_array, sizeof(int), 1, txred_posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading curr_array from posfile");
	}
	if( (fread(&curr_img, sizeof(int), 1, txred_posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading curr_img from posfile");
	}

	if( (fread(&curr_fc, sizeof(int), 1, fam_posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading curr_fc(1) from posfile");
	}
	if( (fread(&curr_fc, sizeof(int), 1, fam_posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading curr_fc(2) from posfile");
	}
	if( (fread(&curr_array, sizeof(int), 1, fam_posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading curr_array from posfile");
	}
	if( (fread(&curr_img, sizeof(int), 1, fam_posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading curr_img from posfile");
	}

	max_curr_numobjs = 0;
	if(max_curr_numobjs<curr_numobjs) max_curr_numobjs=curr_numobjs; 

	if( (fread(&cy3_curr_numobjs, sizeof(int), 1, cy3_posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading curr_numobjs from posfile");
	}
	if(max_curr_numobjs<cy3_curr_numobjs) max_curr_numobjs=cy3_curr_numobjs;
	if( (fread(&txred_curr_numobjs, sizeof(int), 1, txred_posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading curr_numobjs from posfile");
	}
	if(max_curr_numobjs<txred_curr_numobjs) max_curr_numobjs=txred_curr_numobjs;
	if( (fread(&fam_curr_numobjs, sizeof(int), 1, fam_posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading curr_numobjs from posfile");
	}
	if(max_curr_numobjs<fam_curr_numobjs) max_curr_numobjs=fam_curr_numobjs;

        l = 0;
	m = 0;
        n = 0;
	o = 0;
        p = 0;
	q = 0;
	cy5_proceed = 1;
	cy3_proceed = 1;
	txred_proceed = 1;
	fam_proceed = 1;
	found_object = 0;
	total_object = 0;

	for(p=0;p<2000;p++){
	   for(q=0;q<2000;q++){
		objects_array[p][q] = -1;
		}
	}

	while(l<max_curr_numobjs)
	{

		if(l<curr_numobjs)
		{

			  if((fread(&cy5_x, sizeof(short unsigned int), 1, posfile)) < 1){
			    sprintf(log_string, "ERROR reading x from autoe posfile at %d %d %d %d",
				    i, j, k, l);
			    p_log_errorno(log_string);
			  }
			  if((fread(&cy5_y, sizeof(short unsigned int), 1, posfile)) < 1){
			    sprintf(log_string, "ERROR reading y from autoe posfile at %d %d %d %d",
				    i, j, k, l);
			    p_log_errorno(log_string);
			  }

			  if ((objects_array[(int)cy5_x][(int)cy5_y] == -1)&&((int)cy5_y!=1000 && (int)cy5_x!=1000)){
				objects_array[(int)cy5_x][(int)cy5_y] = 1;
				total_object++;
			  }

		}
		if(l<cy3_curr_numobjs)
		{
			  if((fread(&cy3_x, sizeof(short unsigned int), 1, cy3_posfile)) < 1){
			    sprintf(log_string, "ERROR reading x from autoe posfile at %d %d %d %d",
				    i, j, k, l);
			    p_log_errorno(log_string);
			  }

			  if((fread(&cy3_y, sizeof(short unsigned int), 1, cy3_posfile)) < 1){
			    sprintf(log_string, "ERROR reading y from autoe posfile at %d %d %d %d",
				    i, j, k, l);
			    p_log_errorno(log_string);
			  }

			  if ((objects_array[(int)cy3_x][(int)cy3_y] == -1)&&((int)cy3_y!=1000 && (int)cy3_x!=1000)){
				objects_array[(int)cy3_x][(int)cy3_y] = 1;
				total_object++;
			  }
		}

		if(l<txred_curr_numobjs)
		{
			  if((fread(&txred_x, sizeof(short unsigned int), 1, txred_posfile)) < 1){
			    sprintf(log_string, "ERROR reading x from autoe posfile at %d %d %d %d",
				    i, j, k, l);
			    p_log_errorno(log_string);
			  }
			  if((fread(&txred_y, sizeof(short unsigned int), 1, txred_posfile)) < 1){
			    sprintf(log_string, "ERROR reading y from autoe posfile at %d %d %d %d",
				    i, j, k, l);
			    p_log_errorno(log_string);
			  }
			  if ((objects_array[(int)txred_x][(int)txred_y] == -1)&&((int)txred_y!=1000 && (int)txred_x!=1000)){
				objects_array[(int)txred_x][(int)txred_y] = 1;
				total_object++;
			  }
		}

		if(l<fam_curr_numobjs)
		{
			  if((fread(&fam_x, sizeof(short unsigned int), 1, fam_posfile)) < 1){
			    sprintf(log_string, "ERROR reading x from autoe posfile at %d %d %d %d",
				    i, j, k, l);
			    p_log_errorno(log_string);
			  }
			  if((fread(&fam_y, sizeof(short unsigned int), 1, fam_posfile)) < 1){
			    sprintf(log_string, "ERROR reading y from autoe posfile at %d %d %d %d",
				    i, j, k, l);
			    p_log_errorno(log_string);
			  }
			  if ((objects_array[(int)fam_x][(int)fam_y] == -1)&&((int)fam_y!=1000 && (int)fam_x!=1000)){
				objects_array[(int)fam_x][(int)fam_y] = 1;
				total_object++;
			  }
		}
		l++;
	}

	// make sure we are where we think we are in the position file
	if( (fread(&temp, sizeof(short unsigned int), 1, posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading curr_img from autoe posfile");
	}
	if(temp!=0){
	  sprintf(log_string, "ERROR: 1expecting delimiter value of 0, read %d", temp);
	  p_log(log_string);
	  exit(0);
	}

	// make sure we are where we think we are in the position file
	if( (fread(&temp, sizeof(short unsigned int), 1, cy3_posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading curr_img from autoe posfile");
	}
	if(temp!=0){
	  sprintf(log_string, "ERROR: 2expecting delimiter value of 0, read %d", temp);
	  p_log(log_string);
	  exit(0);
	}

	// make sure we are where we think we are in the position file
	if( (fread(&temp, sizeof(short unsigned int), 1, txred_posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading curr_img from posfile");
	}
	if(temp!=0){
	  sprintf(log_string, "ERROR: 3expecting delimiter value of 0, read %d", temp);
	  p_log(log_string);
	  exit(0);
	}

	// make sure we are where we think we are in the position file
	if( (fread(&temp, sizeof(short unsigned int), 1, fam_posfile)) < 1){
	  p_log_errorno((char*)"ERROR reading curr_img from posfile");
	}
	if(temp!=0){
	  sprintf(log_string, "ERROR: 4expecting delimiter value of 0, read %d", temp);
	  p_log(log_string);
	  exit(0);
	}


	convert=-1;
	//p_log((char*)"Write data to object table");
	if(fwrite(&convert, sizeof(int), 1, final_posfile) < 1){
	p_log_errorno((char*)"write of -1 to posfile failed");
	exit(0);
	}
	if(fwrite(&i, sizeof(int), 1, final_posfile) < 1){
	p_log_errorno((char*)"write of curr_fcnum to posfile failed");
	exit(0);
	}
	if(fwrite(&j, sizeof(int), 1, final_posfile) < 1){
	p_log_errorno((char*)"write of curr_arraynum to posfile failed");
	exit(0);
	}
	if(fwrite(&k, sizeof(int), 1, final_posfile) < 1){
	p_log_errorno((char*)"write of curr_imagenum to posfile failed");
	exit(0);
	}
	convert = (int)total_object;
	if(fwrite(&convert, sizeof(int), 1, final_posfile) < 1){
	p_log_errorno((char*)"write of num_beads to posfile failed");
	exit(0);
	}
        object_count=0;
	for(q=0;q<1000;q++){
	   for(p=0;p<1000;p++){
		if(objects_array[p][q] == 1){
			if(fwrite(&p, sizeof(short unsigned int), 1, final_posfile) < 1){
				p_log_errorno((char*)"write of beadpos_xcol to posfile failed");
				exit(0);
			}
			if(fwrite(&q, sizeof(short unsigned int), 1, final_posfile) < 1){
				p_log_errorno((char*)"write of beadpos_yrow to posfile failed");
				exit(0);
			}
			object_count++;
		}
	    }
	}

	sprintf(log_string, "autoe1 Position %d %d %d... %d cy5_objects, %d cy3_objects, %d txred_objects, %d fam_objects, total_object %lld, total_object_count %d\n", curr_fc, curr_array, curr_img, curr_numobjs,cy3_curr_numobjs,txred_curr_numobjs,fam_curr_numobjs,total_object,object_count);
	p_log_simple(log_string);

	sconvert=0;
	if(fwrite(&sconvert, sizeof(short unsigned int), 1, final_posfile) < 1){
		p_log_errorno((char*)"write of 0 to posfile failed");
		exit(0);
	}
	//write to the info file
	sconvert = i;
	if(fwrite(&sconvert, sizeof(short unsigned int), 1, infofile) < 1){
	p_log_errorno((char*)"write of curr_fcnum to infofile failed");
	exit(0);
	}
	sconvert = j;
	if(fwrite(&sconvert, sizeof(short unsigned int), 1, infofile) < 1){
	p_log_errorno((char*)"write of curr_arraynum to infofile failed");
	exit(0);
	}
	sconvert = k;
	if(fwrite(&sconvert, sizeof(short unsigned int), 1, infofile) < 1){
	p_log_errorno((char*)"write of curr_imagenum to infofile failed");
	exit(0);
	}
	sconvert = (int)total_object;
	if(fwrite(&sconvert, sizeof(short unsigned int), 1, infofile) < 1){
	p_log_errorno((char*)"write of num_beads to infofile failed");
	exit(0);
	}
      }
    }
	
  fclose(posfile);
  fclose(cy3_posfile);
  fclose(fam_posfile);
  fclose(txred_posfile);
  fclose(final_posfile);
  fclose(infofile);
  //system("rm 00_*");
}
示例#10
0
int main(int argc, char *argv[])
{
    int m_sock,i,j, autoexp_gain;
    char autoe_filename[500];
    char autoe_dirname[500];
    char command_buffer[255]; // buffer for commands to be executed
    char image_dir[255];

    sprintf(image_dir, "%s/polonator/G.007/acquisition", getenv("HOME"));
    sprintf(command_buffer, "mkdir -p %s", image_dir);
    system(command_buffer);


    if(argc < 2)
    {
        fprintf(stdout, "%s must be called w/ one of the following arguments:\n", argv[0]);
        fprintf(stdout, "\treset\t\t -- restart software on controller and home all axes\n");
        fprintf(stdout, "\tunlock\t\t -- 'unlock' stage for manual movement\n");
        fprintf(stdout, "\tlock\t\t -- 'lock' stage for servo movement\n");
        fprintf(stdout, "\tlive\t\t -- display live darkfield image (%s live <integration in seconds> <EM gain>)\n", argv[0]);
        fprintf(stdout, "\tsnap\t\t -- snap image and save to disk (%s snap <color[fam, cy5, cy3, txred, spare, or none]> <integration in seconds> <EM gain>)\n", argv[0]);
        fprintf(stdout, "\tcolorsnap\t -- snap images in all 4 channels and save to disk (%s colorsnap <integration in seconds> <fam gain> <cy5 gain> <cy3 gain> <txred gain>)\n", argv[0]);
        fprintf(stdout, "\tstatus\t\t -- get motion controller status and last errors, if any\n");
        fprintf(stdout, "\tcomplete-scan\t -- if scanning was interrupted, and reset the controller software gracefully to its starting state\n");
        fprintf(stdout, "\tdarkfield-off\t -- turn the darkfield ring illuminator off\n");
        fprintf(stdout, "\tdarkfield-on\t -- turn the darkfield ring illuminator on\n");
        fprintf(stdout, "\thometheta\t -- 'lock' theta (filter cube) axis and re-home\n");
        fprintf(stdout, "\tunlocktheta\t -- 'unlock' theta (filter cube) axis\n");
        fprintf(stdout, "\tpower-on\t -- turn camera and fluorescence light source on\n");
        fprintf(stdout, "\tpower-off\t -- turn camera and fluorescence light source off\n");
        fprintf(stdout, "\tgotostagealignpos\t -- goto position used for stage alignment (%s gotostagealignpos <flowcell> <lane>)\n", argv[0]);
        fprintf(stdout, "\tgetfocus\t -- get current 'focus' value from Z axis (this is the offset applied to focus error signal)\n");
        fprintf(stdout, "\tsetfocus\t -- set focus value for Z axis; note this DOES NOT write to non-volatile memory (%s setfocus <focus_value>)\n", argv[0]);
        fprintf(stdout, "\twritefocus\t -- write current focus value to non-volatile memory; should be used after correct value is found with setfocus\n");
        exit(1);
    }
    /* Reset the controller software and re-home the stage */
    if(strcmp(argv[1], "reset") == 0) {
        maestro_open(&m_sock);
        maestro_reset(m_sock);
    }

    else if(strcmp(argv[1], "unlock") == 0) {
        maestro_open(&m_sock);
        maestro_unlock(m_sock);
    }

    else if(strcmp(argv[1], "lock") == 0) {
        maestro_open(&m_sock);
        maestro_lock(m_sock);
    }

    else if(strcmp(argv[1], "getfocus") == 0) {
        maestro_open(&m_sock);
        return maestro_getfocus(m_sock);
    }

    else if(strcmp(argv[1], "setfocus") == 0) {
        maestro_open(&m_sock);
        maestro_setfocus(m_sock, atoi(argv[2]));
    }

    else if(strcmp(argv[1], "writefocus") == 0) {
        maestro_open(&m_sock);
        maestro_writefocus(m_sock);
    }

    /* Display a live darkfield image */
    else if((strcmp(argv[1], "live") == 0) && ((argc == 4)||(argc == 5))) {
        maestro_open(&m_sock);

        maestro_darkfield_on(m_sock);
        maestro_setcolor(m_sock, "none");

        if(argc == 4)
        {
            camera_live(argc, argv);
        }
        else {
            camera_live(argc, argv);
        }
        maestro_darkfield_off(m_sock);
    }

    else if((strcmp(argv[1], "live_new") == 0) && ((argc == 5)||(argc == 6)))
    {
        maestro_open(&m_sock);
        maestro_setcolor(m_sock, argv[4]);

        if(strcmp(argv[4],"none") == 0)
        {
            maestro_darkfield_on(m_sock);
            maestro_shutterclose(m_sock);
        }
        else
        {
            maestro_darkfield_off(m_sock);
            maestro_shutteropen(m_sock);
        }
        fprintf(stdout, "Live view starting");
        if(argc==5) {
            fprintf(stdout, "Live view argc == 5");
            camera_live(argc, argv);
        }
        else {
            fprintf(stdout, "Live view argc != 5");
            camera_live(argc, argv);
        }
        fprintf(stdout, "Live view done");
        if(strcmp(argv[4],"none")==0) {
            maestro_darkfield_off(m_sock);
        }
        else {
            maestro_shutterclose(m_sock);
        }
    }

    else if (strcmp(argv[1],"shutter_close")==0)
    {
        maestro_open(&m_sock);
        maestro_shutterclose(m_sock);
    }
    /* Acquire an image at the current stage position */
    else if((strcmp(argv[1], "snap") == 0) && (argc == 5)) {
        sprintf(command_buffer, "%s/snap-image.raw", image_dir);
        snap(atof(argv[3]), atof(argv[4]), argv[2], command_buffer);
    }

    else if((strcmp(argv[1], "snap1") == 0) && (argc == 6))
    {
        sprintf(command_buffer, "mkdir -p %s/autoexp_FL_images/cy3", image_dir);
        system(command_buffer);
        sprintf(command_buffer, "mkdir -p %s/autoexp_FL_images/fam", image_dir);
        system(command_buffer);
        sprintf(command_buffer, "mkdir -p %s/autoexp_FL_images/cy5", image_dir);
        system(command_buffer);
        sprintf(command_buffer, "mkdir -p %s/autoexp_FL_images/txred", image_dir);
        system(command_buffer);

        for(j = 0; j < atoi(argv[5]); j++)
        {
            maestro_open(&m_sock);
            maestro_gotostagealign_position(m_sock, 0, j);

            for(i = 0; i < 15; i++)
            {
                attempt_counter = 0;
                autoexp_gain = atoi(argv[4])+i*10;
                sprintf(autoe_filename, "   ... start acquring FL image in lane %d, for %s with autoexposure gain of %d ...   ",j, argv[2],autoexp_gain);
                p_log_simple(autoe_filename);
                sprintf(autoe_filename, "%s/autoexp_FL_images/%s/%d_image_%d.raw", image_dir,argv[2],j,autoexp_gain);
                p_log_simple(autoe_filename);
                wait_counter = 0;
                snap(atof(argv[3]), autoexp_gain, argv[2], autoe_filename);
                sprintf(autoe_filename, "   ... acquired FL image in %d ms ...\n", wait_counter);
                p_log_simple(autoe_filename);

                while((attempt_counter < 4) && (attempt_counter > 0))
                {
                    sprintf(autoe_filename, "... ACQUIRING FAILED !!! Re-acquring FL image in lane %d, for %s with autoexposure gain of %d ...\n",atoi(argv[5]), argv[2],atoi(argv[4]));
                    p_log_errorno(autoe_filename);
                    snap(atof(argv[3]), atof(argv[4]), argv[2], autoe_filename);
                }
            } // end for i
        } // end for j
    } // end else if

    /* Acquire 4 fluorescence images */
    else if((strcmp(argv[1], "colorsnap") == 0) && (argc == 7)) {
        sprintf(command_buffer, "%s/colorsnap-fam.raw", image_dir);
        snap(atof(argv[2]), atof(argv[3]), "fam", command_buffer);
        sprintf(command_buffer, "%s/colorsnap-cy5.raw", image_dir);
        snap(atof(argv[2]), atof(argv[4]), "cy5", command_buffer);
        sprintf(command_buffer, "%s/colorsnap-cy3.raw", image_dir);
        snap(atof(argv[2]), atof(argv[5]), "cy3", command_buffer);
        sprintf(command_buffer, "%s/colorsnap-txr.raw", image_dir);
        snap(atof(argv[2]), atof(argv[6]), "txred", command_buffer);
    }

    else if(strcmp(argv[1], "complete-scan") == 0) {
        maestro_open(&m_sock);
        maestro_stop(m_sock);
    }

    else if(strcmp(argv[1], "darkfield-off") == 0) {
        maestro_open(&m_sock);
        maestro_darkfield_off(m_sock);
    }

    else if(strcmp(argv[1], "darkfield-on") == 0) {
        maestro_open(&m_sock);
        maestro_darkfield_on(m_sock);
    }

    else if(strcmp(argv[1], "hometheta") == 0) {
        maestro_open(&m_sock);
        maestro_hometheta(m_sock);
    }

    else if(strcmp(argv[1], "unlocktheta") == 0) {
        maestro_open(&m_sock);
        maestro_unlocktheta(m_sock);
    }

    else if(strcmp(argv[1], "status") == 0) {
        maestro_open(&m_sock);
        maestro_getstatus(m_sock);
    }

    else if(strcmp(argv[1], "power-on") == 0) {
        network_iboot_on(&m_sock);
    }

    else if(strcmp(argv[1], "power-off") == 0) {
        network_iboot_off(&m_sock);
    }

    else if(strcmp(argv[1], "gotostagealignpos") == 0) {
        maestro_open(&m_sock);
        maestro_gotostagealign_position(m_sock, atoi(argv[2]), atoi(argv[3]));
    }

    else
    {
        main(1, argv);
    }
} // end function