#include "../include/sipmscan.h"
#include "../include/workstation.h"
#include <stdio.h>
#include <stdlib.h>
// Separate functions -----------------------------------------
void GetTime(int intime, char *outtime)
{
time_t rawtime;
struct tm * timeinfo;
if(intime < 0)
time(&rawtime);
else
rawtime = (time_t)intime;
timeinfo = localtime(&rawtime);
sprintf(outtime, "%s", asctime(timeinfo));
int len = strlen(outtime);
if(len) outtime[len-1] = 0;
}
void remove_ext(char *inname, char *outname)
{
char ctemp[256];
for(int i = 0; i < (int)strlen(inname); i++)
{
if( (inname[i] == '.') && (i > (int)(strlen(inname)-6)) )
{
ctemp[i] = '\0';
sprintf(outname, "%s", ctemp);
break;
}
else
ctemp[i] = inname[i];
}
if(DBGSIG)
printf("remove_ext(): Outfile = %s\n", outname);
}
void remove_from_last(char *inname, char search, char *outname)
{
char ctemp[256];
int searchpos = -1;
for(int i = (int)strlen(inname); i >= 0; i--)
{
if(inname[i] == search)
{
searchpos = i;
break;
}
}
for(int i = 0; i < searchpos; i++)
ctemp[i] = inname[i];
ctemp[searchpos] = '\0';
sprintf(outname, "%s", ctemp);
if(DBGSIG)
printf("remove_from_last(): Outfile = %s\n", outname);
}
void remove_before_last(char *inname, char search, char *outname)
{
char ctemp[256];
int searchpos = -1;
for(int i = (int)strlen(inname); i >= 0; i--)
{
if(inname[i] == search)
{
searchpos = i;
break;
}
}
int k = 0;
for(int i = searchpos+1; i < (int)strlen(inname); i++)
{
ctemp[k] = inname[i];
k++;
}
ctemp[k] = '\0';
sprintf(outname, "%s", ctemp);
if(DBGSIG)
printf("remove_before_last(): Outfile = %s\n", outname);
}
void SeqNumber(int innum, int maxnum, char *outstr)
{
int zeronum = 5;
// Check how many zeroes we need to add to get sequential numbers
if( (maxnum > 0) && (maxnum < 1000) )
zeronum = 2;
else if( (maxnum >= 1000) && (maxnum < 10000) )
zeronum = 3;
else if( (maxnum >= 10000) && (maxnum < 100000) )
zeronum = 4;
else if( (maxnum >= 100000) && (maxnum < 1000000) )
zeronum = 5;
// Make the sequence number depending on the number of zeroes
if(zeronum == 2)
{
if(innum < 10)
sprintf(outstr, "00%d", innum);
else if( (innum >= 10) && (innum < 100) )
sprintf(outstr, "0%d", innum);
else if( (innum >= 100) && (innum < 1000) )
sprintf(outstr, "%d", innum);
}
else if(zeronum == 3)
{
if(innum < 10)
sprintf(outstr, "000%d", innum);
else if( (innum >= 10) && (innum < 100) )
sprintf(outstr, "00%d", innum);
else if( (innum >= 100) && (innum < 1000) )
sprintf(outstr, "0%d", innum);
else if( (innum >= 1000) && (innum < 10000) )
sprintf(outstr, "%d", innum);
}
else if(zeronum == 4)
{
if(innum < 10)
sprintf(outstr, "0000%d", innum);
else if( (innum >= 10) && (innum < 100) )
sprintf(outstr, "000%d", innum);
else if( (innum >= 100) && (innum < 1000) )
sprintf(outstr, "00%d", innum);
else if( (innum >= 1000) && (innum < 10000) )
sprintf(outstr, "0%d", innum);
else if( (innum >= 10000) && (innum < 100000) )
sprintf(outstr, "%d", innum);
}
else if(zeronum == 5)
{
if(innum < 10)
sprintf(outstr, "00000%d", innum);
else if( (innum >= 10) && (innum < 100) )
sprintf(outstr, "0000%d", innum);
else if( (innum >= 100) && (innum < 1000) )
sprintf(outstr, "000%d", innum);
else if( (innum >= 1000) && (innum < 10000) )
sprintf(outstr, "00%d", innum);
else if( (innum >= 10000) && (innum < 100000) )
sprintf(outstr, "0%d", innum);
else if( (innum >= 100000) && (innum < 1000000) )
sprintf(outstr, "%d", innum);
}
}
void TimeEstimate(clock_t stopw0, time_t time0, float progress, char *retEstim, int offset)
{
// Calculate the remaining time
clock_t clkt1;
char ctemp[512];
clkt1 = clock() - stopw0;
if(DBGSIG) printf("TimeEstimate(): Startclock = %d, Midclock (%f) = %f (%d), starttime = %d, curtime = %d\n", (int)stopw0, progress, (float)clkt1/CLOCKS_PER_SEC, (int)clkt1, (int)time0, (int)time(NULL));
GetTime((int)(100.*((float)clkt1/CLOCKS_PER_SEC)/progress+(int)time0+offset), ctemp);
sprintf(retEstim, "Estimated end time: %s", ctemp);
}
void TimeEstimateNew(int nr, clock_t stopw0, time_t time0, int rX, int rY, int rZ, int xWait, int yWait, int zWait, char *retEstim)
{
clock_t clkt1;
char ctemp[512];
double timeSec;
double averMeasTime;
clkt1 = clock() - stopw0;
if(nr == -1)
return;
else if(nr == 0)
averMeasTime = (double)clkt1/CLOCKS_PER_SEC;
else
averMeasTime = (averMeasTime + (double)clkt1/CLOCKS_PER_SEC)/2.0;
// calculate the time of one row
timeSec = rX*(xWait + averMeasTime);
// calculate the time of a surface scan
timeSec = timeSec + rY*(timeSec + yWait);
// calculate the time of a zscan
if(rZ == 1)
timeSec = timeSec + zWait;
else
timeSec = timeSec + rZ*(timeSec + zWait);
GetTime((int)timeSec+(int)time0, ctemp);
sprintf(retEstim, "Estimated end time: %s", ctemp);
printf("TimeEstimateNew(): Average time of measurement = %lf, Measurement time = %lf, Finishing time = %s\n", averMeasTime, timeSec, ctemp);
}
void NormateSet(int file, int nrpoint, double *min, double *max, double *setCount, double *setAcc)
{
int count = 0;
// Find minimal value in set and subtract the offset
*min = TMath::MinElement(nrpoint, setAcc);
for(int i = 0; i < nrpoint; i++)
setAcc[i] -= *min;
// Find maximal value in set and normate to 1
*max = TMath::MaxElement(nrpoint, setAcc);
for(int i = 0; i < nrpoint; i++)
{
count = file - nrpoint + i;
setCount[count] = setAcc[i]/(*max);
if(DBGSIG) printf("NormateSet(): Integral check 2 (i=%d,za=%d,j=%d): %lf\t\%lf\n", count, i, nrpoint, setCount[count], setAcc[i]/(*max));
}
}
// Estimate the next point, depending on the set of points beforehand (least squares fit) and return the error
double PointEstimate(int nrp, double *points)
{
double accx = 0, accy = 0, accxy = 0, accx2 = 0;
double A, B;
double esty;
// printf("PointEstimate points: ");
for(int i = 0; i < nrp; i++)
{
// printf("[%lf,%lf], ", points[2*i], points[2*i+1]);
accx += points[2*i];
accy += points[2*i+1];
accxy += points[2*i]*points[2*i+1];
accx2 += points[2*i]*points[2*i];
}
// printf("\n");
A = (accx2*accy - accx*accxy)/(nrp*accx2 - accx*accx);
B = (nrp*accxy - accx*accy)/(nrp*accx2 - accx*accx);
// printf("Fiting function = %lf + %lf*x\n", A, B);
esty = A + B*points[2*nrp];
if(DBGSIG) printf("PointEstimate(): A = %lf, B = %lf, estimate = %lf, real = %lf, error = %lf\n", A, B, esty, points[2*nrp+1], abs(esty - points[2*nrp+1])/points[2*nrp+1]);
return abs(esty - points[2*nrp+1])/points[2*nrp+1];
}
// Separate functions -----------------------------------------