modified: src1/worker.c
[GalaxyCodeBases.git] / c_cpp / salusFstReCoord / src1 / worker.c
blob79c5ed95e7184fc50bf8b5b9de0d48f7bcad743b
1 #include <float.h> // DBL_MAX
2 #include <math.h> // floor, nextafter, INFINITY
4 #include "common.h"
6 FORCE_INLINE void transCorrd(double *restrict ChipXY, const double *restrict FovXY, const int_least16_t *restrict FovRowCol) {
7 double new_x = (FovRowCol[1] - (CenterFOV_COL - 1)) * FOV_USED_WIDTH - FovXY[1] - 1;
8 double new_y = FovXY[0] + (FovRowCol[0] - (CenterFOV_ROW - 1) - 1) * FOV_USED_HEIGHT;
9 ChipXY[0] = floor(nextafter(new_x * RECIPROCALPRECISION, DBL_MAX)) * OUTPUTPRECISION;
10 ChipXY[1] = floor(nextafter(new_y * RECIPROCALPRECISION, DBL_MAX)) * OUTPUTPRECISION;
13 FORCE_INLINE char *strncpy_no_colon(char *restrict dest, const char *restrict src, size_t n) {
14 size_t j = 0; // destination index
15 for (size_t i = 0; i < n && src[i] != '\0'; i++) {
16 if (src[i] != ':') dest[j++] = src[i];
18 // for ( ; j < n; j++) dest[j] = '\0';
19 if (j < n) dest[j] = '\0';
20 return dest;
23 void worker(int_least16_t worker_id) {
24 workerArray_t *worker = &Parameters.worksQuene[worker_id];
25 regmatch_t matches[2];
26 char **splitSets = worker->tokens;
27 // char* readName = malloc(91); // for testing CHARsCPYSTR
28 char readName[MAXFQIDLEN + 1] = {0}; // 81 => [0,80]
29 char fovRC[9] = {0}; // R123C567
30 double GIVENunZoomRatio = (double)Parameters.unZoomRatio;
31 double unZoomRatio = 0;
32 for (uint64_t index = 0; index < JOBITEMSIZE; index++) {
33 fstBCdata_t *fstBCdata_p = &worker->jobDatArray[index];
34 if (fstBCdata_p->name[0] == 0) {
35 break;
37 // fstBCoutput_t *fstBCoutput_p = &worker->output_array[index];
38 ARRAYcpySTR(readName, fstBCdata_p->name);
39 assert(readName[sizeof(fstBCdata_p->name)] == '\0');
40 #ifndef RELEASE
41 fprintf(stderr, "###### %llu\t[%s] %d <--\n", index, readName, readName[sizeof(fstBCdata_p->name)]);
42 #endif
43 int_least16_t RowCol[2] = {0};
44 double oldXY[2] = {0.0};
45 double newXY[2] = {0.0};
46 char *delim = ":";
47 if (regexec(&Parameters.regex, readName, 2, matches, 0) != 0) {
48 fstBCdata_p->name[0] = 0;
49 continue;
51 //__builtin_dump_struct(&matches[0], &printf);
52 //__builtin_dump_struct(&matches[1], &printf);
53 size_t relen = matches[0].rm_eo - matches[0].rm_so;
54 strncpy_no_colon(fovRC, readName + matches[0].rm_so, relen);
55 // fovRC[relen-1] = '\0';
56 assert(fovRC[sizeof(fovRC) - 1] == '\0');
57 // memcpy(fstBCdata_p->RowCol, fovRC, relen-1);
58 fstBCdata_p->fov_row = (uint8_t)(RowCol[0] = atoi(fovRC + 1));
59 fstBCdata_p->fov_column = (uint8_t)(RowCol[1] = atoi(fovRC + 5));
60 if (unlikely(matches[1].rm_so == -1)) {
61 delim = "_";
62 unZoomRatio = 1.0;
63 } else {
64 delim = ":";
65 unZoomRatio = GIVENunZoomRatio;
67 assert(relen == (delim[0] == ':' ? sizeof(fovRC) : sizeof(fovRC) - 1));
68 // printf("%llu\t[%s], delim:[%s], fov[%s]\n", index, readName, delim, fovRC);
69 const char *theDelim = delim;
70 char *saveptr = NULL;
71 char *token = strtok_r(readName, theDelim, &saveptr);
72 // printf("-f- [%zu] [%zu] [%s]\n", readName, token, token);
73 if (unlikely(token == NULL)) {
74 // printf("-b->\t[%s], delim:[%s]\n", readName, theDelim);
75 fstBCdata_p->name[0] = 0;
76 break;
77 } else {
78 int_least16_t idx = 0;
79 for (idx = 0; likely(token != NULL); token = strtok_r(NULL, theDelim, &saveptr), idx++) {
80 splitSets[idx] = token;
81 // printf("-s- %d:[%zu] [%s]\n", idx, splitSets[idx], token);
83 oldXY[1] = atof(splitSets[idx - 1]);
84 oldXY[0] = atof(splitSets[idx - 2]);
85 #ifdef DEBUG
86 fprintf(stderr, "oldXY: [%s],[%s] as [%.2f %.2f]\n", splitSets[idx - 2], splitSets[idx - 1], oldXY[0], oldXY[1]);
87 /* for (idx = 0; idx < MAXDELIMITEMS; idx++) {
88 printf("-t- %d:[%zu] [%s]\n", idx, (void *)splitSets[idx], splitSets[idx]);
89 } */
90 #endif
92 if (unlikely(unZoomRatio != 1.0f)) {
93 oldXY[0] /= unZoomRatio;
94 oldXY[1] /= unZoomRatio;
96 #ifdef DEBUG
97 fprintf(stderr, "[%s]->[%s]=RC(%d,%d), X:%f Y:%f\n", readName, fovRC, RowCol[0], RowCol[1], oldXY[0], oldXY[1]);
98 #endif
99 if ((FOV_X_MIN < oldXY[0] && oldXY[0] <= FOV_X_MAX) && (FOV_Y_MIN < oldXY[1] && oldXY[1] <= FOV_Y_MAX)) {
100 oldXY[0] -= FOV_X_MIN;
101 oldXY[1] -= FOV_Y_MIN;
102 transCorrd(newXY, oldXY, RowCol);
103 // printf("-->gX:%.2f gY:%.2f\n", newXY[0], newXY[1]);
104 memcpy(fstBCdata_p->newXY, newXY, sizeof(newXY));
105 #ifdef DEBUG
106 char readSeq[BARCODELEN + 1];
107 ARRAYcpySTR(readSeq, fstBCdata_p->seq);
108 fprintf(stderr, "->SpatiaStr:[%s %.2f %.2f]\n", readSeq, fstBCdata_p->newXY[0], fstBCdata_p->newXY[1]);
109 #endif
110 } else {
111 fstBCdata_p->name[0] = 0;