int CTGDataset::ReadImagery() { if (bHasReadImagery) return TRUE; bHasReadImagery = TRUE; char szLine[81]; char szField[11]; szLine[80] = 0; int nLine = HEADER_LINE_COUNT; VSIFSeekL(fp, nLine * 80, SEEK_SET); int nCells = nRasterXSize * nRasterYSize; while(VSIFReadL(szLine, 1, 80, fp) == 80) { int nZone = atoi(ExtractField(szField, szLine, 0, 3)); if (nZone != nUTMZone) { CPLError(CE_Failure, CPLE_AppDefined, "Read error at line %d, %s. Did not expected UTM zone %d", nLine, szLine, nZone); return FALSE; } int nX = atoi(ExtractField(szField, szLine, 3, 8)) - nCellSize / 2; int nY = atoi(ExtractField(szField, szLine, 11, 8)) + nCellSize / 2; int nDiffX = nX - nNWEasting; int nDiffY = nNWNorthing - nY; if (nDiffX < 0 || (nDiffX % nCellSize) != 0 || nDiffY < 0 || (nDiffY % nCellSize) != 0) { CPLError(CE_Failure, CPLE_AppDefined, "Read error at line %d, %s. Unexpected cell coordinates", nLine, szLine); return FALSE; } int nCellX = nDiffX / nCellSize; int nCellY = nDiffY / nCellSize; if (nCellX >= nRasterXSize || nCellY >= nRasterYSize) { CPLError(CE_Failure, CPLE_AppDefined, "Read error at line %d, %s. Unexpected cell coordinates", nLine, szLine); return FALSE; } int i; for(i=0;i<6;i++) { int nVal = atoi(ExtractField(szField, szLine, 20 + 10*i, 10)); if (nVal >= 2000000000) nVal = 0; ((int*)pabyImage)[i * nCells + nCellY * nRasterXSize + nCellX] = nVal; } nLine ++; } return TRUE; }
/*>BOOL blGetSpeciesWholePDBMolID(WHOLEPDB *wpdb, int molid, PDBSOURCE *source) ----------------------------------------------------------- *//** \param[in] *wpdb WHOLEPDB structure \param[in] molid MOL_ID from PDB-format SOURCE record. \param[out] *source SOURCE information for chain \return Success (chain found?) Extracts the SOURCE data for a specified MOL_ID. Returns FALSE if not found. - 12.05.15 Original based on blGetSpeciesWholePDBChain(). By: CTP */ BOOL blGetSpeciesWholePDBMolID(WHOLEPDB *wpdb, int molid, PDBSOURCE *source) { STRINGLIST *s, *molidFirst = NULL, *molidStart = NULL, *molidStop = NULL; /* reset source */ source->scientificName[0] = '\0'; source->commonName[0] = '\0'; source->strain[0] = '\0'; source->taxid = 0; /* find start of source records */ molidFirst = FindNextMolIDRecord(wpdb->header, "SOURCE"); /* get source record */ for(molidStart=molidFirst; molidStart!=NULL; molidStart=molidStop) { molidStop = FindNextMolIDRecord(molidStart, "SOURCE"); for(s=molidStart; s!=molidStop; NEXT(s)) { char buffer[MAXPDBANNOTATION]; int thisMolid = 0; ExtractField(molidStart, molidStop, buffer, "SOURCE", "MOL_ID:"); sscanf(buffer,"%d", &thisMolid); if(thisMolid == molid) { ExtractField(molidStart, molidStop, source->scientificName, "SOURCE","ORGANISM_SCIENTIFIC:"); ExtractField(molidStart, molidStop, source->commonName, "SOURCE", "ORGANISM_COMMON:"); ExtractField(molidStart, molidStop, source->strain, "SOURCE", "STRAIN:"); ExtractField(molidStart, molidStop, buffer, "SOURCE", "ORGANISM_TAXID:"); sscanf(buffer,"%d",&source->taxid); return(TRUE); } } } return(FALSE); }
int CTGDataset::Identify( GDALOpenInfo * poOpenInfo ) { CPLString osFilename(poOpenInfo->pszFilename); GDALOpenInfo* poOpenInfoToDelete = NULL; /* GZipped grid_cell.gz files are common, so automagically open them */ /* if the /vsigzip/ has not been explicitely passed */ const char* pszFilename = CPLGetFilename(poOpenInfo->pszFilename); if ((EQUAL(pszFilename, "grid_cell.gz") || EQUAL(pszFilename, "grid_cell1.gz") || EQUAL(pszFilename, "grid_cell2.gz")) && !EQUALN(poOpenInfo->pszFilename, "/vsigzip/", 9)) { osFilename = "/vsigzip/"; osFilename += poOpenInfo->pszFilename; poOpenInfo = poOpenInfoToDelete = new GDALOpenInfo(osFilename.c_str(), GA_ReadOnly, poOpenInfo->papszSiblingFiles); } if (poOpenInfo->nHeaderBytes < HEADER_LINE_COUNT * 80) { delete poOpenInfoToDelete; return FALSE; } /* -------------------------------------------------------------------- */ /* Chech that it looks roughly as a CTG dataset */ /* -------------------------------------------------------------------- */ const char* pszData = (const char*)poOpenInfo->pabyHeader; int i; for(i=0;i<4 * 80;i++) { if (!((pszData[i] >= '0' && pszData[i] <= '9') || pszData[i] == ' ' || pszData[i] == '-')) { delete poOpenInfoToDelete; return FALSE; } } char szField[11]; int nRows = atoi(ExtractField(szField, pszData, 0, 10)); int nCols = atoi(ExtractField(szField, pszData, 20, 10)); int nMinColIndex = atoi(ExtractField(szField, pszData+80, 0, 5)); int nMinRowIndex = atoi(ExtractField(szField, pszData+80, 5, 5)); int nMaxColIndex = atoi(ExtractField(szField, pszData+80, 10, 5)); int nMaxRowIndex = atoi(ExtractField(szField, pszData+80, 15, 5)); if (nRows <= 0 || nCols <= 0 || nMinColIndex != 1 || nMinRowIndex != 1 || nMaxRowIndex != nRows || nMaxColIndex != nCols) { delete poOpenInfoToDelete; return FALSE; } delete poOpenInfoToDelete; return TRUE; }
/*>int blFindMolID(WHOLEPDB *wpdb, char *chain) -------------------------------------------- *//** \param[in] *wpdb WHOLEPDB structure \param[in] *chain Chain label \return MOL_ID or 0 if chain not found Finds the MOL_ID for a specified chain - 28.04.15 Original By: ACRM - 04.06.15 Modified to use the ExtractField() routine instead of duplicating code here. Fixes a bug in dealing with compounds where the referenced chains span more than one line */ int blFindMolID(WHOLEPDB *wpdb, char *chain) { STRINGLIST *molidFirst, *molidStart, *molidStop; molidFirst = FindNextMolIDRecord(wpdb->header, "COMPND"); for(molidStart=molidFirst; molidStart!=NULL; molidStart=molidStop) { char buffer[MAXPDBANNOTATION], *chp, word[MAXWORD]; molidStop = FindNextMolIDRecord(molidStart, "COMPND"); ExtractField(molidStart, molidStop, buffer, "COMPND", "CHAIN:"); /* Check the chains to see if our chain is there */ chp = buffer; do { int molid = 0; chp=blGetWord(chp, word, MAXWORD); if(!strcmp(word, chain)) { ExtractField(molidStart, molidStop, buffer, "COMPND", "MOL_ID:"); sscanf(buffer,"%d", &molid); return(molid); } } while(chp!=NULL); } return(0); }
int CallCommand :: CallOnFields( CSVRow & row, char * buffer ) { string fields; int fc = 0; for ( unsigned int i = 0; i < row.size(); i++ ) { if ( mFields.size() == 0 || ALib::Contains( mFields, i ) ) { fields += row[i]; fields += '\0'; fc++; } } int ofc = 0; int rv = mFunc( fc, fields.c_str(), &ofc, buffer, mOutBufSize ); if ( rv == 0 ) { int pos = 0; while( ofc-- ) { string field = ExtractField( buffer, pos ); pos++; row.push_back( field ); } } return rv; }
OGRFeature *OGRSEGP1Layer::GetNextRawFeature() { if( bEOF ) return nullptr; const char* pszLine = nullptr; while( true ) { pszLine = CPLReadLine2L(fp,81,nullptr); if (pszLine == nullptr || STARTS_WITH_CI(pszLine, "EOF")) { bEOF = true; return nullptr; } int nLineLen = static_cast<int>(strlen(pszLine)); while(nLineLen > 0 && pszLine[nLineLen-1] == ' ') { ((char*)pszLine)[nLineLen-1] = '\0'; nLineLen --; } char* pszExpandedLine = ExpandTabs(pszLine); pszLine = pszExpandedLine; nLineLen = static_cast<int>(strlen(pszLine)); OGRFeature* poFeature = new OGRFeature(poFeatureDefn); poFeature->SetFID(nNextFID ++); OGRGeometry* poGeom = nullptr; if (nLatitudeCol-1 + 19 <= nLineLen) { char szDeg[3+1]; char szMin[2+1]; char szSec[4+1]; ExtractField(szDeg, pszLine, nLatitudeCol-1, 2); ExtractField(szMin, pszLine, nLatitudeCol+2-1, 2); ExtractField(szSec, pszLine, nLatitudeCol+2+2-1, 4); double dfLat = atoi(szDeg) + atoi(szMin) / 60.0 + atoi(szSec) / 100.0 / 3600.0; if (pszLine[nLatitudeCol+2+2+4-1] == 'S') dfLat = -dfLat; poFeature->SetField(SEGP1_FIELD_LATITUDE, dfLat); ExtractField(szDeg, pszLine, nLatitudeCol+9-1, 3); ExtractField(szMin, pszLine, nLatitudeCol+9+3-1, 2); ExtractField(szSec, pszLine, nLatitudeCol+9+3+2-1, 4); double dfLon = atoi(szDeg) + atoi(szMin) / 60.0 + atoi(szSec) / 100.0 / 3600.0; if (pszLine[nLatitudeCol+9+3+2+4-1] == 'W') dfLon = -dfLon; poFeature->SetField(SEGP1_FIELD_LONGITUDE, dfLon); if (!bUseEastingNorthingAsGeometry) poGeom = new OGRPoint(dfLon, dfLat); } /* Normal layout -> extract other fields */ if (nLatitudeCol == 27 && nLineLen >= 26-1+1) { char szLineName[16 + 1]; ExtractField(szLineName, pszLine, 2-1, 16); int i = 15; while (i >= 0) { if (szLineName[i] == ' ') szLineName[i] = '\0'; else break; i --; } poFeature->SetField(SEGP1_FIELD_LINENAME, szLineName); char szPointNumber[8+1]; ExtractField(szPointNumber, pszLine, 18-1, 8); poFeature->SetField(SEGP1_FIELD_POINTNUMBER, atoi(szPointNumber)); char szReshootCode[1+1]; ExtractField(szReshootCode, pszLine, 26-1, 1); poFeature->SetField(SEGP1_FIELD_RESHOOTCODE, szReshootCode); if (nLineLen >= 61) { char szEasting[8+1]; ExtractField(szEasting, pszLine, 46-1, 8); double dfEasting = CPLAtof(szEasting); poFeature->SetField(SEGP1_FIELD_EASTING, dfEasting); char szNorthing[8+1]; ExtractField(szNorthing, pszLine, 54-1, 8); double dfNorthing = CPLAtof(szNorthing); poFeature->SetField(SEGP1_FIELD_NORTHING, dfNorthing); if (bUseEastingNorthingAsGeometry) poGeom = new OGRPoint(dfEasting, dfNorthing); } if (nLineLen >= 66) { char szDepth[5+1]; ExtractField(szDepth, pszLine, 62-1, 5); double dfDepth = CPLAtof(szDepth); poFeature->SetField(SEGP1_FIELD_DEPTH, dfDepth); } } if (poGeom) { if (poSRS) poGeom->assignSpatialReference(poSRS); poFeature->SetGeometryDirectly(poGeom); } CPLFree(pszExpandedLine); return poFeature; } }
OGRFeature *OGRUKOOAP190Layer::GetNextRawFeature() { if( bEOF ) return nullptr; while( true ) { const char* pszLine = CPLReadLine2L(fp, 81, nullptr); if (pszLine == nullptr || STARTS_WITH_CI(pszLine, "EOF")) { bEOF = true; return nullptr; } int nLineLen = static_cast<int>(strlen(pszLine)); while(nLineLen > 0 && pszLine[nLineLen-1] == ' ') { ((char*)pszLine)[nLineLen-1] = '\0'; nLineLen --; } if (pszLine[0] == 'H' || nLineLen < 46) continue; OGRFeature* poFeature = new OGRFeature(poFeatureDefn); poFeature->SetFID(nNextFID ++); char szLineName[12 + 1]; ExtractField(szLineName, pszLine, 2-1, 12); int i = 11; while (i >= 0) { if (szLineName[i] == ' ') szLineName[i] = '\0'; else break; i --; } poFeature->SetField(FIELD_LINENAME, szLineName); char szVesselId[1+1]; szVesselId[0] = pszLine[17-1]; if (szVesselId[0] != ' ') { szVesselId[1] = '\0'; poFeature->SetField(FIELD_VESSEL_ID, szVesselId); } char szSourceId[1+1]; szSourceId[0] = pszLine[18-1]; if (szSourceId[0] != ' ') { szSourceId[1] = '\0'; poFeature->SetField(FIELD_SOURCE_ID, szSourceId); } char szOtherId[1+1]; szOtherId[0] = pszLine[19-1]; if (szOtherId[0] != ' ') { szOtherId[1] = '\0'; poFeature->SetField(FIELD_OTHER_ID, szOtherId); } char szPointNumber[6+1]; ExtractField(szPointNumber, pszLine, 20-1, 6); poFeature->SetField(4, atoi(szPointNumber)); char szDeg[3+1]; char szMin[2+1]; char szSec[5+1]; ExtractField(szDeg, pszLine, 26-1, 2); ExtractField(szMin, pszLine, 26+2-1, 2); ExtractField(szSec, pszLine, 26+2+2-1, 5); double dfLat = atoi(szDeg) + atoi(szMin) / 60.0 + CPLAtof(szSec) / 3600.0; if (pszLine[26+2+2+5-1] == 'S') dfLat = -dfLat; poFeature->SetField(FIELD_LATITUDE, dfLat); ExtractField(szDeg, pszLine, 36-1, 3); ExtractField(szMin, pszLine, 36+3-1, 2); ExtractField(szSec, pszLine, 36+3+2-1, 5); double dfLon = atoi(szDeg) + atoi(szMin) / 60.0 + CPLAtof(szSec) / 3600.0; if (pszLine[36+3+2+5-1] == 'W') dfLon = -dfLon; poFeature->SetField(FIELD_LONGITUDE, dfLon); OGRGeometry* poGeom = nullptr; if (!bUseEastingNorthingAsGeometry) poGeom = new OGRPoint(dfLon, dfLat); if (nLineLen >= 64) { char szEasting[9+1]; ExtractField(szEasting, pszLine, 47-1, 9); double dfEasting = CPLAtof(szEasting); poFeature->SetField(FIELD_EASTING, dfEasting); char szNorthing[9+1]; ExtractField(szNorthing, pszLine, 56-1, 9); double dfNorthing = CPLAtof(szNorthing); poFeature->SetField(FIELD_NORTHING, dfNorthing); if (bUseEastingNorthingAsGeometry) poGeom = new OGRPoint(dfEasting, dfNorthing); } if (poGeom) { if (poSRS) poGeom->assignSpatialReference(poSRS); poFeature->SetGeometryDirectly(poGeom); } if (nLineLen >= 70) { char szDepth[6+1]; ExtractField(szDepth, pszLine, 65-1, 6); double dfDepth = CPLAtof(szDepth); poFeature->SetField(FIELD_DEPTH, dfDepth); } int nDayOfYear = 0; if (nLineLen >= 73) { char szDayOfYear[3+1]; ExtractField(szDayOfYear, pszLine, 71-1, 3); nDayOfYear = atoi(szDayOfYear); poFeature->SetField(FIELD_DAYOFYEAR, nDayOfYear); } if (nLineLen >= 79) { char szH[2+1], szM[2+1], szS[2+1]; ExtractField(szH, pszLine, 74-1, 2); ExtractField(szM, pszLine, 74-1+2, 2); ExtractField(szS, pszLine, 74-1+2+2, 2); poFeature->SetField(FIELD_TIME, 0, 0, 0, atoi(szH), atoi(szM), static_cast<float>(atoi(szS)) ); if( nYear != 0 ) { constexpr int mon_lengths[2][12] = { {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} } ; const bool bIsLeap = isleap(nYear); int nMonth = 0; int nDays = 0; if ((bIsLeap && nDayOfYear >= 1 && nDayOfYear <= 366) || (!bIsLeap && nDayOfYear >= 1 && nDayOfYear <= 365)) { const int leap_offset = bIsLeap ? 1 : 0; while( nDayOfYear > nDays + mon_lengths[leap_offset][nMonth] ) { nDays += mon_lengths[leap_offset][nMonth]; nMonth ++; } const int nDayOfMonth = nDayOfYear - nDays; nMonth++; poFeature->SetField(FIELD_DATETIME, nYear, nMonth, nDayOfMonth, atoi(szH), atoi(szM), static_cast<float>(atoi(szS)) ); } } } return poFeature; } }
void OGRUKOOAP190Layer::ParseHeaders() { while( true ) { const char* pszLine = CPLReadLine2L(fp,81,nullptr); if (pszLine == nullptr || STARTS_WITH_CI(pszLine, "EOF")) { break; } int nLineLen = static_cast<int>(strlen(pszLine)); while(nLineLen > 0 && pszLine[nLineLen-1] == ' ') { ((char*)pszLine)[nLineLen-1] = '\0'; nLineLen --; } if (pszLine[0] != 'H') break; if (nLineLen < 33) continue; if (!bUseEastingNorthingAsGeometry && STARTS_WITH(pszLine, "H1500") && poSRS == nullptr) { if (STARTS_WITH(pszLine + 33 - 1, "WGS84") || STARTS_WITH(pszLine + 33 - 1, "WGS-84")) { poSRS = new OGRSpatialReference(SRS_WKT_WGS84_LAT_LONG); poSRS->SetAxisMappingStrategy(OAMS_TRADITIONAL_GIS_ORDER); } else if (STARTS_WITH(pszLine + 33 - 1, "WGS72")) { poSRS = new OGRSpatialReference(); poSRS->SetAxisMappingStrategy(OAMS_TRADITIONAL_GIS_ORDER); poSRS->SetFromUserInput("WGS72"); } } else if (!bUseEastingNorthingAsGeometry && STARTS_WITH(pszLine, "H1501") && poSRS != nullptr && nLineLen >= 32 + 6 * 6 + 10) { char aszParams[6][6+1]; char szZ[10+1]; for( int i = 0; i < 6; i++ ) { ExtractField(aszParams[i], pszLine, 33 - 1 + i * 6, 6); } ExtractField(szZ, pszLine, 33 - 1 + 6 * 6, 10); poSRS->SetTOWGS84(CPLAtof(aszParams[0]), CPLAtof(aszParams[1]), CPLAtof(aszParams[2]), CPLAtof(aszParams[3]), CPLAtof(aszParams[4]), CPLAtof(aszParams[5]), CPLAtof(szZ)); } else if (STARTS_WITH(pszLine, "H0200")) { char** papszTokens = CSLTokenizeString(pszLine + 33 - 1); for(int i = 0; papszTokens[i] != nullptr; i++) { if (strlen(papszTokens[i]) == 4) { int nVal = atoi(papszTokens[i]); if (nVal >= 1900) { if( nYear != 0 && nYear != nVal ) { CPLDebug("SEGUKOOA", "Several years found in H0200. Ignoring them!"); nYear = 0; break; } nYear = nVal; } } } CSLDestroy(papszTokens); } } VSIFSeekL( fp, 0, SEEK_SET ); }
void OGRUKOOAP190Layer::ParseHeaders() { while(TRUE) { const char* pszLine = CPLReadLine2L(fp,81,NULL); if (pszLine == NULL || EQUALN(pszLine, "EOF", 3)) { break; } int nLineLen = strlen(pszLine); while(nLineLen > 0 && pszLine[nLineLen-1] == ' ') { ((char*)pszLine)[nLineLen-1] = '\0'; nLineLen --; } if (pszLine[0] != 'H') break; if (nLineLen < 33) continue; if (!bUseEastingNorthingAsGeometry && strncmp(pszLine, "H1500", 5) == 0 && poSRS == NULL) { if (strncmp(pszLine + 33 - 1, "WGS84", 5) == 0 || strncmp(pszLine + 33 - 1, "WGS-84", 6) == 0) { poSRS = new OGRSpatialReference(SRS_WKT_WGS84); } else if (strncmp(pszLine + 33 - 1, "WGS72", 5) == 0) { poSRS = new OGRSpatialReference(); poSRS->SetFromUserInput("WGS72"); } } else if (!bUseEastingNorthingAsGeometry && strncmp(pszLine, "H1501", 5) == 0 && poSRS != NULL && nLineLen >= 32 + 6 * 6 + 10) { char aszParams[6][6+1]; char szZ[10+1]; int i; for(i=0;i<6;i++) { ExtractField(aszParams[i], pszLine, 33 - 1 + i * 6, 6); } ExtractField(szZ, pszLine, 33 - 1 + 6 * 6, 10); poSRS->SetTOWGS84(CPLAtof(aszParams[0]), CPLAtof(aszParams[1]), CPLAtof(aszParams[2]), CPLAtof(aszParams[3]), CPLAtof(aszParams[4]), CPLAtof(aszParams[5]), CPLAtof(szZ)); } else if (strncmp(pszLine, "H0200", 5) == 0) { char** papszTokens = CSLTokenizeString(pszLine + 33 - 1); for(int i = 0; papszTokens[i] != NULL; i++) { if (strlen(papszTokens[i]) == 4) { int nVal = atoi(papszTokens[i]); if (nVal >= 1900) { if (nYear != 0 && nYear != nVal) { CPLDebug("SEGUKOOA", "Several years found in H0200. Ignoring them!"); nYear = 0; break; } nYear = nVal; } } } CSLDestroy(papszTokens); } } VSIFSeekL( fp, 0, SEEK_SET ); }
/*>BOOL blGetCompoundWholePDBMolID(WHOLEPDB *wpdb, int molid, COMPND *compnd) ------------------------------------------------------------ *//** \param[in] *wpdb WHOLEPDB structure \param[in] molid MOL_ID from PDB-format COMPND record. \param[out] *compnd Data from the COMPND records \return BOOL Success Extracts the COMPND data for a specified MOL_ID. Returns FALSE if the MOL_ID isn't found - 13.05.15 Original based on blGetCompoundWholePDBChain(). By: CTP */ BOOL blGetCompoundWholePDBMolID(WHOLEPDB *wpdb, int molid, COMPND *compnd) { STRINGLIST *molidFirst, *molidStart, *molidStop, *s; /* reset compnd */ compnd->molid = 0; compnd->molecule[0] = '\0'; compnd->chain[0] = '\0'; compnd->fragment[0] = '\0'; compnd->synonym[0] = '\0'; compnd->ec[0] = '\0'; compnd->engineered[0] = '\0'; compnd->mutation[0] = '\0'; compnd->other[0] = '\0'; /* find start of compnd records */ molidFirst = FindNextMolIDRecord(wpdb->header, "COMPND"); /* get compound record */ for(molidStart=molidFirst; molidStart!=NULL; molidStart=molidStop) { molidStop = FindNextMolIDRecord(molidStart, "COMPND"); for(s=molidStart; s!=molidStop; NEXT(s)) { char buffer[MAXPDBANNOTATION]; int thisMolid = 0; ExtractField(molidStart, molidStop, buffer, "COMPND", "MOL_ID:"); sscanf(buffer,"%d", &thisMolid); if(thisMolid == molid) { ExtractField(molidStart, molidStop, compnd->molecule, "COMPND","MOLECULE:"); ExtractField(molidStart, molidStop, compnd->chain, "COMPND", "CHAIN:"); ExtractField(molidStart, molidStop, compnd->fragment, "COMPND", "FRAGMENT:"); ExtractField(molidStart, molidStop, compnd->synonym, "COMPND", "SYNONYM:"); ExtractField(molidStart, molidStop, compnd->ec, "COMPND", "EC:"); ExtractField(molidStart, molidStop, compnd->engineered, "COMPND", "ENGINEERED:"); ExtractField(molidStart, molidStop, compnd->mutation, "COMPND", "MUTATION:"); ExtractField(molidStart, molidStop, compnd->other, "COMPND", "OTHER_DETAILS:"); ExtractField(molidStart, molidStop, buffer, "COMPND", "MOL_ID:"); sscanf(buffer,"%d", &(compnd->molid)); return(TRUE); } } } return(FALSE); }
/*>BOOL blGetCompoundWholePDBChain(WHOLEPDB *wpdb, char *chain, COMPND *compnd) ------------------------------------------------------------ *//** \param[in] *wpdb WHOLEPDB structure \param[in] *chain Chain label of interest \param[out] *compnd Data from the COMPND records \return BOOL Success Extracts the COMPND data for a specified chain. Returns FALSE if the chain isn't found - 28.04.15 Original By: ACRM - 04.06.15 Modified to use the ExtractField() routine instead of duplicating code here. Fixes a bug in dealing with compounds where the referenced chains span more than one line */ BOOL blGetCompoundWholePDBChain(WHOLEPDB *wpdb, char *chain, COMPND *compnd) { STRINGLIST *molidFirst, *molidStart, *molidStop; int molid; compnd->molid = 0; compnd->molecule[0] = '\0'; compnd->chain[0] = '\0'; compnd->fragment[0] = '\0'; compnd->synonym[0] = '\0'; compnd->ec[0] = '\0'; compnd->engineered[0] = '\0'; compnd->mutation[0] = '\0'; compnd->other[0] = '\0'; #ifdef DEBUG molid = blFindMolID(wpdb, chain); fprintf(stderr,"DEBUG: Chain %s molid %d\n", chain, molid); if(molid == 0) return(FALSE); #else if((molid = blFindMolID(wpdb, chain)) == 0) return(FALSE); #endif molidFirst = FindNextMolIDRecord(wpdb->header, "COMPND"); for(molidStart=molidFirst; molidStart!=NULL; molidStart=molidStop) { char buffer[MAXPDBANNOTATION]; int thisMolid = 0; molidStop = FindNextMolIDRecord(molidStart, "COMPND"); ExtractField(molidStart, molidStop, buffer, "COMPND", "MOL_ID:"); sscanf(buffer,"%d", &thisMolid); if(thisMolid == molid) { ExtractField(molidStart, molidStop, compnd->molecule, "COMPND","MOLECULE:"); ExtractField(molidStart, molidStop, compnd->chain, "COMPND", "CHAIN:"); ExtractField(molidStart, molidStop, compnd->fragment, "COMPND", "FRAGMENT:"); ExtractField(molidStart, molidStop, compnd->synonym, "COMPND", "SYNONYM:"); ExtractField(molidStart, molidStop, compnd->ec, "COMPND", "EC:"); ExtractField(molidStart, molidStop, compnd->engineered, "COMPND", "ENGINEERED:"); ExtractField(molidStart, molidStop, compnd->mutation, "COMPND", "MUTATION:"); ExtractField(molidStart, molidStop, compnd->other, "COMPND", "OTHER:"); ExtractField(molidStart, molidStop, buffer, "COMPND", "MOL_ID:"); sscanf(buffer,"%d", &(compnd->molid)); return(TRUE); } } return(FALSE); }
GDALDataset *CTGDataset::Open( GDALOpenInfo * poOpenInfo ) { int i; if (!Identify(poOpenInfo)) return NULL; CPLString osFilename(poOpenInfo->pszFilename); /* GZipped grid_cell.gz files are common, so automagically open them */ /* if the /vsigzip/ has not been explicitely passed */ const char* pszFilename = CPLGetFilename(poOpenInfo->pszFilename); if ((EQUAL(pszFilename, "grid_cell.gz") || EQUAL(pszFilename, "grid_cell1.gz") || EQUAL(pszFilename, "grid_cell2.gz")) && !EQUALN(poOpenInfo->pszFilename, "/vsigzip/", 9)) { osFilename = "/vsigzip/"; osFilename += poOpenInfo->pszFilename; } if (poOpenInfo->eAccess == GA_Update) { CPLError( CE_Failure, CPLE_NotSupported, "The CTG driver does not support update access to existing" " datasets.\n" ); return NULL; } /* -------------------------------------------------------------------- */ /* Find dataset characteristics */ /* -------------------------------------------------------------------- */ VSILFILE* fp = VSIFOpenL(osFilename.c_str(), "rb"); if (fp == NULL) return NULL; char szHeader[HEADER_LINE_COUNT * 80+1]; szHeader[HEADER_LINE_COUNT * 80] = 0; if (VSIFReadL(szHeader, 1, HEADER_LINE_COUNT * 80, fp) != HEADER_LINE_COUNT * 80) { VSIFCloseL(fp); return NULL; } for(i=HEADER_LINE_COUNT * 80 - 1;i>=0;i--) { if (szHeader[i] == ' ') szHeader[i] = 0; else break; } char szField[11]; int nRows = atoi(ExtractField(szField, szHeader, 0, 10)); int nCols = atoi(ExtractField(szField, szHeader, 20, 10)); /* -------------------------------------------------------------------- */ /* Create a corresponding GDALDataset. */ /* -------------------------------------------------------------------- */ CTGDataset *poDS; poDS = new CTGDataset(); poDS->fp = fp; fp = NULL; poDS->nRasterXSize = nCols; poDS->nRasterYSize = nRows; poDS->SetMetadataItem("TITLE", szHeader + 4 * 80); poDS->nCellSize = atoi(ExtractField(szField, szHeader, 35, 5)); if (poDS->nCellSize <= 0 || poDS->nCellSize >= 10000) { delete poDS; return NULL; } poDS->nNWEasting = atoi(ExtractField(szField, szHeader + 3*80, 40, 10)); poDS->nNWNorthing = atoi(ExtractField(szField, szHeader + 3*80, 50, 10)); poDS->nUTMZone = atoi(ExtractField(szField, szHeader, 50, 5)); if (poDS->nUTMZone <= 0 || poDS->nUTMZone > 60) { delete poDS; return NULL; } OGRSpatialReference oSRS; oSRS.importFromEPSG(32600 + poDS->nUTMZone); oSRS.exportToWkt(&poDS->pszProjection); if (!GDALCheckDatasetDimensions(poDS->nRasterXSize, poDS->nRasterYSize)) { delete poDS; return NULL; } /* -------------------------------------------------------------------- */ /* Read the imagery */ /* -------------------------------------------------------------------- */ GByte* pabyImage = (GByte*)VSICalloc(nCols * nRows, 6 * sizeof(int)); if (pabyImage == NULL) { delete poDS; return NULL; } poDS->pabyImage = pabyImage; /* -------------------------------------------------------------------- */ /* Create band information objects. */ /* -------------------------------------------------------------------- */ poDS->nBands = 6; for( i = 0; i < poDS->nBands; i++ ) { poDS->SetBand( i+1, new CTGRasterBand( poDS, i+1 ) ); poDS->GetRasterBand(i+1)->SetDescription(apszBandDescription[i]); } /* -------------------------------------------------------------------- */ /* Initialize any PAM information. */ /* -------------------------------------------------------------------- */ poDS->SetDescription( poOpenInfo->pszFilename ); poDS->TryLoadXML(); /* -------------------------------------------------------------------- */ /* Support overviews. */ /* -------------------------------------------------------------------- */ poDS->oOvManager.Initialize( poDS, poOpenInfo->pszFilename ); return( poDS ); }