// parse pattern string in one of two formats: // "repeats,color1,color1time,led1,color2,color2time,led2,..." // "repeats,color1,color1time,color2,color2time,..." // returns true if parsing was succesful, false if not bool Blink1Pattern::fromPatternStr(QString tmp) { //qDebug() << "fromPatternStr: "<<tmp; tmp.replace(" ",""); // remove any whitepsace from mucking up parsing QStringList list=tmp.split(","); int lcount = list.count()-1; // determine format type: // if 3-tuple, then every 3rd entry has a '#' // if 2-type, then every 2nd entry has a '#' int count2=0, count3=0; for( int i=1; i<list.count(); i+=2 ) { if( list.at(i).contains('#') ) count2++; } for( int i=1; i<list.count(); i+=3 ) { if( list.at(i).contains('#') ) count3++; } int format = (count3>count2) ? 3 : (count3==count2) ? 0 : 2; // for pattern string "reps,color,time", min is 3 elemnets & pair count must be even if( lcount % 2 == 0 && ((format==2 && lcount >= 2) || format==0) ) { for(int i=1;i<list.count();i+=2){ QString colorstr = list.at(i); double time = list.at(i+1).toDouble(); if( !colorstr.contains('#') ) // color must be in hexcode #cccccc format return false; // (might not need this with format check above addColorAndTime( colorstr, time ); } setRepeats(list.at(0).toInt()); return true; } // for pattern string "reps,color,time,led", min is 4 elemnets & pair count must be 3-tuple else if( lcount % 3 == 0 && ((format==3 && lcount >= 3) || format==0) ) { for(int i=1;i<list.count();i+=3) { QString colorstr = list.at(i); double time = list.at(i+1).toDouble(); int ledn = list.at(i+2).toInt(); if( !colorstr.contains('#') ) // color must be in hexcode #cccccc format return false; addColorAndTime( colorstr, time ); editLed(colors.count()-1, ledn); } setRepeats(list.at(0).toInt()); return true; } return false; }
void Blink1Pattern::fromJson( QJsonObject obj) { setName( obj.value("name").toString() ); setRepeats(obj.value("repeats").toInt()); QString tmp=obj.value("pattern").toString(); fromPatternStr(tmp); setDate(obj.value("date").toDouble()); setReadOnly(obj.value("readonly").toBool()); setSystem(obj.value("system").toBool()); }
static void getRepeatsUnsplitTable(struct sqlConnection *conn, struct hash *chromHash, char *table) /* Return a tree of ranges for sequence gaps all chromosomes, * from specified table */ { struct sqlResult *sr; char **row; struct rbTreeNode **stack = lmAlloc(qLm, 256 * sizeof(stack[0])); struct rbTree *allTree = rbTreeNewDetailed(simpleRangeCmp, qLm, stack); struct rbTreeNode **newstack = lmAlloc(qLm, 256 * sizeof(newstack[0])); struct rbTree *newTree = rbTreeNewDetailed(simpleRangeCmp, qLm, newstack); char *prevChrom = NULL; struct simpleRange *prevRange = NULL, *prevNewRange = NULL; char query[256]; sqlSafef(query, ArraySize(query), "select chrom,chromStart,chromEnd from %s " "order by chrom,chromStart", table); sr = sqlGetResult(conn, query); while ((row = sqlNextRow(sr)) != NULL) { struct simpleRange *range; if (prevChrom == NULL) prevChrom = cloneString(row[0]); else if (! sameString(prevChrom, row[0])) { rbTreeAdd(allTree, prevRange); if (prevNewRange != NULL) rbTreeAdd(newTree, prevNewRange); setRepeats(prevChrom, chromHash, allTree, newTree); freeMem(prevChrom); prevRange = prevNewRange = NULL; stack = lmAlloc(qLm, 256 * sizeof(stack[0])); allTree = rbTreeNewDetailed(simpleRangeCmp, qLm, stack); prevChrom = cloneString(row[0]); } lmAllocVar(allTree->lm, range); range->start = sqlUnsigned(row[1]); range->end = sqlUnsigned(row[2]); if (prevRange == NULL) prevRange = range; else if (overlap(range, prevRange)) { /* merge r into prevR & discard; prevR gets passed forward. */ if (range->end > prevRange->end) prevRange->end = range->end; if (range->start < prevRange->start) prevRange->start = range->start; } else { rbTreeAdd(allTree, prevRange); prevRange = range; } } if (prevChrom != NULL) { rbTreeAdd(allTree, prevRange); if (prevNewRange != NULL) rbTreeAdd(newTree, prevNewRange); setRepeats(prevChrom, chromHash, allTree, newTree); freeMem(prevChrom); } sqlFreeResult(&sr); } /* void getRepeatsUnsplitTable() */
static void getRepeatsUnsplit(struct sqlConnection *conn, struct hash *chromHash, struct hash *arHash) /* Return a tree of ranges for sequence gaps all chromosomes, * assuming an unsplit table -- when the table is unsplit, it's * probably for a scaffold assembly where we *really* don't want * to do one query per scaffold! */ { struct sqlResult *sr; char **row; struct rbTreeNode **stack = lmAlloc(qLm, 256 * sizeof(stack[0])); struct rbTree *allTree = rbTreeNewDetailed(simpleRangeCmp, qLm, stack); struct rbTreeNode **newstack = lmAlloc(qLm, 256 * sizeof(newstack[0])); struct rbTree *newTree = rbTreeNewDetailed(simpleRangeCmp, qLm, newstack); char *prevChrom = NULL; struct simpleRange *prevRange = NULL, *prevNewRange = NULL; sr = sqlGetResult(conn, "NOSQLINJ select genoName,genoStart,genoEnd,repName,repClass,repFamily from rmsk " "order by genoName,genoStart"); while ((row = sqlNextRow(sr)) != NULL) { struct simpleRange *range; char arKey[512]; if (prevChrom == NULL) prevChrom = cloneString(row[0]); else if (! sameString(prevChrom, row[0])) { rbTreeAdd(allTree, prevRange); if (prevNewRange != NULL) rbTreeAdd(newTree, prevNewRange); setRepeats(prevChrom, chromHash, allTree, newTree); freeMem(prevChrom); prevRange = prevNewRange = NULL; stack = lmAlloc(qLm, 256 * sizeof(stack[0])); allTree = rbTreeNewDetailed(simpleRangeCmp, qLm, stack); if (arHash != NULL) { stack = lmAlloc(qLm, 256 * sizeof(stack[0])); newTree = rbTreeNewDetailed(simpleRangeCmp, qLm, stack); } prevChrom = cloneString(row[0]); } lmAllocVar(allTree->lm, range); range->start = sqlUnsigned(row[1]); range->end = sqlUnsigned(row[2]); if (prevRange == NULL) prevRange = range; else if (overlap(range, prevRange)) { /* merge r into prevR & discard; prevR gets passed forward. */ if (range->end > prevRange->end) prevRange->end = range->end; if (range->start < prevRange->start) prevRange->start = range->start; } else { rbTreeAdd(allTree, prevRange); prevRange = range; } sprintf(arKey, "%s.%s.%s", row[3], row[4], row[5]); if (arHash != NULL && hashLookup(arHash, arKey)) { lmAllocVar(newTree->lm, range); range->start = sqlUnsigned(row[1]); range->end = sqlUnsigned(row[2]); if (prevNewRange == NULL) prevNewRange = range; else if (overlap(range, prevNewRange)) { /* merge r into prevR & discard; prevR gets passed forward. */ if (range->end > prevNewRange->end) prevNewRange->end = range->end; if (range->start < prevNewRange->start) prevNewRange->start = range->start; } else { rbTreeAdd(newTree, prevNewRange); prevNewRange = range; } } } if (prevChrom != NULL) { rbTreeAdd(allTree, prevRange); if (prevNewRange != NULL) rbTreeAdd(newTree, prevNewRange); setRepeats(prevChrom, chromHash, allTree, newTree); freeMem(prevChrom); } sqlFreeResult(&sr); }