int main(int argc, char *argv[]) { /* * For each cigar in file, update the coordinates and write to the second file. */ struct option opts[] = { {"onlyContig1", no_argument, NULL, '1'}, {"onlyContig2", no_argument, NULL, '2'}, {0, 0, 0, 0} }; int convertContig1 = TRUE, convertContig2 = TRUE, flag; while((flag = getopt_long(argc, argv, "", opts, NULL)) != -1) { switch(flag) { case '1': convertContig2 = FALSE; break; case '2': convertContig1 = FALSE; break; } } if(!(convertContig1 || convertContig2)) { fprintf(stderr, "--onlyContig1 and --onlyContig2 options are " "mutually exclusive\n"); return 1; } assert(argc == optind + 3); FILE *fileHandleIn = fopen(argv[optind], "r"); FILE *fileHandleOut = fopen(argv[optind + 1], "w"); int64_t roundsOfConversion; int64_t i = sscanf(argv[optind + 2], "%" PRIi64 "", &roundsOfConversion); (void)i; assert(i == 1); assert(roundsOfConversion >= 1); struct PairwiseAlignment *pairwiseAlignment; while ((pairwiseAlignment = cigarRead(fileHandleIn)) != NULL) { //Correct coordinates for(int64_t j=0; j<roundsOfConversion; j++) { convertCoordinatesOfPairwiseAlignment(pairwiseAlignment, convertContig1, convertContig2); } cigarWrite(fileHandleOut, pairwiseAlignment, 0); destructPairwiseAlignment(pairwiseAlignment); } fclose(fileHandleIn); fclose(fileHandleOut); return 0; }
static void testPinchIteratorFromFile(CuTest *testCase) { for (int64_t test = 0; test < 100; test++) { stList *pairwiseAlignments = getRandomPairwiseAlignments(); st_logInfo("Doing a random pinch iterator from file test %" PRIi64 " with %" PRIi64 " alignments\n", test, stList_length(pairwiseAlignments)); //Put alignments in a file char *tempFile = "tempFileForPinchIteratorTest.cig"; FILE *fileHandle = fopen(tempFile, "w"); for (int64_t i = 0; i < stList_length(pairwiseAlignments); i++) { cigarWrite(fileHandle, stList_get(pairwiseAlignments, i), 0); } fclose(fileHandle); //Get an iterator stPinchIterator *pinchIterator = stPinchIterator_constructFromFile(tempFile); //Now test it testIterator(testCase, pinchIterator, pairwiseAlignments); //Cleanup stPinchIterator_destruct(pinchIterator); stFile_rmrf(tempFile); stList_destruct(pairwiseAlignments); } }
int main(int argc, char *argv[]) { // Parse arguments if (argc != 3) { usage(argv); return 1; } // You would load a custom HMM here if you wanted using // hmm_getStateMachine (see the realign code) StateMachine *stateMachine = stateMachine5_construct(fiveState); PairwiseAlignmentParameters *parameters = pairwiseAlignmentBandingParameters_construct(); stHash *targetSequences = readFastaFile(argv[1]); stHash *querySequences = readFastaFile(argv[2]); // For each query sequence, align it against all target sequences. stHashIterator *queryIt = stHash_getIterator(querySequences); char *queryHeader; while ((queryHeader = stHash_getNext(queryIt)) != NULL) { char *querySeq = stHash_search(querySequences, queryHeader); stHashIterator *targetIt = stHash_getIterator(targetSequences); char *targetHeader; while ((targetHeader = stHash_getNext(targetIt)) != NULL) { char *targetSeq = stHash_search(targetSequences, targetHeader); // Here we should try both the target sequence and its // reverse-complemented version // Aligns the sequences. // If you have alignment constraints (anchors) you should // replace this with getAlignedPairsUsingAnchors. stList *alignedPairs = getAlignedPairs(stateMachine, targetSeq, querySeq, parameters, true, true); // Takes into account the probability of aligning to a // gap, by transforming the posterior probability into the // AMAP objective function (see Schwartz & Pachter, 2007). alignedPairs = reweightAlignedPairs2(alignedPairs, strlen(targetSeq), strlen(querySeq), parameters->gapGamma); // I think this calculates the optimal ordered set of // alignments from the unordered set of aligned pairs, not // completely sure. alignedPairs = filterPairwiseAlignmentToMakePairsOrdered(alignedPairs, targetSeq, querySeq, // This parameter says that the minimum posterior probability we will accept has to be at least 0.9. 0.9); // After this the "aligned pairs" data structure changes, // which is a little sketchy. It's just so that the // alignment can be printed properly. stList_mapReplace(alignedPairs, convertToAnchorPair, NULL); stList_sort(alignedPairs, (int (*)(const void *, const void *)) stIntTuple_cmpFn); struct PairwiseAlignment *alignment = convertAlignedPairsToPairwiseAlignment(targetHeader, queryHeader, 0, strlen(targetSeq), strlen(querySeq), alignedPairs); // Output the cigar string cigarWrite(stdout, alignment, 0); stList_destruct(alignedPairs); destructPairwiseAlignment(alignment); } stHash_destructIterator(targetIt); } stHash_destructIterator(queryIt); // Clean up stHash_destruct(targetSequences); stHash_destruct(querySequences); pairwiseAlignmentBandingParameters_destruct(parameters); stateMachine_destruct(stateMachine); }