コード例 #1
0
def changeFileIdsInLocFile(locFileName, fileIdList):
    """Change fileIDs in location header to provided id list"""

    # define signature of location file
    global LOCSIGNATURE
    pds_utils.LOCSIGNATURE = LOCSIGNATURE

    fileDesc = open(locFileName, 'r+w+b')
    headerHeader = array.array('I')
    headerHeader.fromfile(fileDesc, 3)

    global locSignature
    locSignature = headerHeader[0] >> 8
    pds_utils.locSignature = pdsSignature
    if locSignature != LOCSIGNATURE: headerHeader.byteswap()

    nFiles = array.array('I')
    nFiles.fromfile(fileDesc, 1)
    pos = fileDesc.tell()
    if locSignature != LOCSIGNATURE: nFiles.byteswap()

    fileIDs = array.array('I')
    fileIDs.fromfile(fileDesc, 2 * nFiles[0])
    if locSignature != LOCSIGNATURE: fileIDs.byteswap()

    # change file ids by new offset
    #    fileIDList = []
    #    i = 0
    #    while i<len(fileIDs):
    #        lower = fileIDs[i]
    #        i+=1
    #        upper = fileIDs[i]
    #        i+=1
    #        fileId = gen_util.form64BitNumber(lower,upper)
    #        newLower, newUpper = gen_util.lowerUpperBitsOfUID(fileId+fileIdOffset)
    #        fileIDList.append(newLower)
    #        fileIDList.append(newUpper)
    idList = []
    for fileId in fileIdList:
        lower, upper = gen_util.lowerUpperBitsOfUID(fileId)
        idList.append(lower)
        idList.append(upper)

    # seek back to fileID position in order to write new fileIDs
    fileDesc.seek(pos, 0)

    # write new fileIDs
    fileArr = array.array('I')
    fileArr.fromlist(idList)
    if locSignature != LOCSIGNATURE: fileArr.byteswap()
    fileArr.tofile(fileDesc)
    fileDesc.close()
    return
コード例 #2
0
def changeFileIdsInLocFile(locFileName,fileIdList):
    """Change fileIDs in location header to provided id list"""
    
    # define signature of location file
    global LOCSIGNATURE
    pds_utils.LOCSIGNATURE=LOCSIGNATURE

    fileDesc = open(locFileName,'r+w+b')
    headerHeader = array.array('I')
    headerHeader.fromfile(fileDesc, 3)

    global locSignature
    locSignature=headerHeader[0]>>8
    pds_utils.locSignature=pdsSignature
    if locSignature != LOCSIGNATURE: headerHeader.byteswap()

    nFiles = array.array('I')
    nFiles.fromfile(fileDesc,1)
    pos = fileDesc.tell()
    if locSignature != LOCSIGNATURE: nFiles.byteswap()
	    
    fileIDs = array.array('I')
    fileIDs.fromfile(fileDesc,2*nFiles[0])
    if locSignature != LOCSIGNATURE: fileIDs.byteswap()
	
    # change file ids by new offset
#    fileIDList = []
#    i = 0
#    while i<len(fileIDs):
#        lower = fileIDs[i]
#        i+=1
#        upper = fileIDs[i]
#        i+=1
#        fileId = gen_util.form64BitNumber(lower,upper)
#        newLower, newUpper = gen_util.lowerUpperBitsOfUID(fileId+fileIdOffset)
#        fileIDList.append(newLower)
#        fileIDList.append(newUpper)
    idList = []
    for fileId in fileIdList:
	lower, upper = gen_util.lowerUpperBitsOfUID(fileId)
        idList.append(lower)
        idList.append(upper)
	
    # seek back to fileID position in order to write new fileIDs
    fileDesc.seek(pos,0)

    # write new fileIDs
    fileArr = array.array('I')
    fileArr.fromlist(idList)
    if locSignature != LOCSIGNATURE: fileArr.byteswap()
    fileArr.tofile(fileDesc)
    fileDesc.close()
    return
コード例 #3
0
def buildLocationHeaderFromDict(streamDataKeysDict, fileIDList):
    """Build a PDS location header, from given components"""
    locationHeader = array.array('I')
    locationHeader.fromlist([LOCSIGNATURE * 256])
    # file id for master index
    locationHeader.append(0)
    # remaining number of words in of header
    locationHeader.append(0)
    # associated file list
    fList = []
    for fileId in fileIDList:
        lowerMostId, upperMostId = gen_util.lowerUpperBitsOfUID(fileId)
        fList.append(lowerMostId)
        fList.append(upperMostId)
    fileList = array.array('I')
    # for now only set the low word for the file ID
    fileList.fromlist([len(fileIDList)] + fList)
    locationHeader += fileList

    # put streamNames into header
    streamNames = streamDataKeysDict.keys()
    nameWords = pds_utils.charArrayOfStreams(streamNames)
    sortedStreamNames = list(streamNames)
    sortedStreamNames.sort()
    #    streamNameString =""
    #    for name in sortedStreamNames:
    #        streamNameString = streamNameString+name +"\0"
    #    streamNameString = streamNameString[:-1]
    #    while 0 != len(streamNameString) % 4:
    #        streamNameString = streamNameString + "\0"
    #    nameWords = array.array('I')
    #    nameWords.fromstring(streamNameString)

    nWords = array.array('I')
    nWords.fromlist([len(nameWords)])
    locationHeader += nWords + nameWords

    # add dataKeys and hash into header
    dataKeyArray = array.array('I')
    nProxies = array.array('I')
    nProxies.fromlist([0])
    for stream in sortedStreamNames:
        dataKeys = streamDataKeysDict[stream]
        nProxies[0] = len(dataKeys)
        dataKeyArray += nProxies
        dataKeyString = ""
        for dataKey in dataKeys:
            dataKeyString += dataKey[0] + "\0" + dataKey[1] + "\0" + dataKey[
                2] + "\0"
            while (len(dataKeyString) % 4):
                dataKeyString += "\0"
        dataStringArray = array.array('I')
        dataStringArray.fromstring(dataKeyString)
        dataKeyArray += dataStringArray


#    emptyHashArray = array.array('I')
#    emptyHashArray.fromlist([0]*5)
    hash = sha.new(dataKeyArray.tostring()).digest()
    #    tempArray = array.array('I')
    #    tempArray.fromstring(hash)
    #    print "hash1",tempArray.tolist()
    #    hash = sha.new( (emptyHashArray+dataKeyArray).tostring() ).digest()
    #    tempArray = array.array('I')
    #    tempArray.fromstring(hash)
    #    print "hash2",tempArray.tolist()
    hashWords = array.array('I')
    hashWords.fromstring(hash)
    locationHeader += hashWords + dataKeyArray

    # pad header so Records begin on 8 byte boundary
    if not (len(locationHeader) % 2):
        locationHeader.fromlist([0])
    headerLength = len(locationHeader) + 1 - 3
    locationHeader.fromlist([headerLength])
    locationHeader[2] = headerLength

    return locationHeader
コード例 #4
0
ファイル: key_dump.py プロジェクト: JeffersonLab/HDEventStore
def stripKeyFile(keyFileName,iNewFileName,newFileId,skimKeyFileName):
    """From given key file name, new file id and fake sv list recreate key file.
    Return new file name and write out the file."""

    print "stripKeyFile called - look at this code!"
    sys.exit(1)

    newFileName = string.split(iNewFileName,"-esdb")[0]+"-esdb.ikey"
    pos,needToSwap,nRecordNames,sNames,nSV=keyFileHeaderReader(keyFileName)
    origKeyFile = open(keyFileName,'r')
    origKeyFile.seek(pos)

    # read information from skimKeyFileName
    skimPos,skimSwap,skimRecords,skimStreamNames,skimNumberSV=keyFileHeaderReader(skimKeyFileName)
    skimKeyFile = open(skimKeyFileName,'r')
    skimKeyFile.seek(skimPos)
    
    streamNameString =""
    for name in sNames:
        streamNameString = streamNameString+name +"\0"
    streamNameString = streamNameString[:-1]
    while 0 != len(streamNameString) % 4:
        streamNameString = streamNameString + "\0"
    nameWords = array.array('I')
    nameWords.fromstring(streamNameString)

    nameList   = nameWords.tolist()
    number32BitWordsInNameList = len(nameList)
    nWordsInHeader = len(sNames)+number32BitWordsInNameList+1+1+1
    headerList = [2718281*256,newFileId,nWordsInHeader,len(sNames)]
    headerList+= [number32BitWordsInNameList]+nameList+[nSV,nWordsInHeader]
    keyFile    = open(newFileName,'w+b')
    keyHeader  = array.array('I')
    keyHeader.fromlist(headerList)
    keyHeader.tofile(keyFile)
    
    # loop over all sv's in original key file and write out those which are not in fakeSVList
    i       = 0
    fakeIdx = 0
    counter = 0
    skimSV,skimIdxList = decodeKeyRecord(skimKeyFile,skimSwap,skimRecords)
    print "orig",origKeyFile.name
    print "skim",skimKeyFile.name
    while i<nSV:
       if not skimSV: break
       sv,recIdxList = decodeKeyRecord(origKeyFile,needToSwap,nRecordNames)
       if not sv: break
       i+=1
       # we event number from parent key file is become larger then from skim, advance the skim
       if sv[1]>skimSV[1]:
          try:
             skimSV,skimIdxList = decodeKeyRecord(skimKeyFile,skimSwap,skimRecords)
          except:
             skimSV=()
             break
       if skimSV!=sv:
          continue
       else: # write out
          run = sv[0]
          evt = sv[1]
          lowerId, upperId = gen_util.lowerUpperBitsOfUID(sv[2])
          recordArray = array.array('I')
          recordHeader = [sv[0],sv[1],lowerId,upperId]+skimIdxList
          recordArray.fromlist(recordHeader)
          recordArray.tofile(keyFile)
          counter+=1
          # read one more event from skim file
          try:
             skimSV,skimIdxList = decodeKeyRecord(skimKeyFile,skimSwap,skimRecords)
          except:
             skimSV=()
    # seek to position where total SV's written and fix it to new number of SV's
    keyFile.seek(pos-2*4)
    pos = keyFile.tell()
    nSVHeader = array.array('I')
    nSVHeader.fromfile(keyFile,1)
    if nSVHeader[0]!=nSV:
       print "nSVHeader[0]",nSVHeader[0],nSV
       print "Miss position of nSyncValues in a file"
       return ""
    keyFile.seek(pos)
    nSVHeader[0]=counter
    nSVHeader.tofile(keyFile)
    keyFile.close()

    return newFileName
コード例 #5
0
ファイル: key_dump.py プロジェクト: JeffersonLab/HDEventStore
def stripKeyFile(keyFileName, iNewFileName, newFileId, skimKeyFileName):
    """From given key file name, new file id and fake sv list recreate key file.
    Return new file name and write out the file."""

    print "stripKeyFile called - look at this code!"
    sys.exit(1)

    newFileName = string.split(iNewFileName, "-esdb")[0] + "-esdb.ikey"
    pos, needToSwap, nRecordNames, sNames, nSV = keyFileHeaderReader(
        keyFileName)
    origKeyFile = open(keyFileName, 'r')
    origKeyFile.seek(pos)

    # read information from skimKeyFileName
    skimPos, skimSwap, skimRecords, skimStreamNames, skimNumberSV = keyFileHeaderReader(
        skimKeyFileName)
    skimKeyFile = open(skimKeyFileName, 'r')
    skimKeyFile.seek(skimPos)

    streamNameString = ""
    for name in sNames:
        streamNameString = streamNameString + name + "\0"
    streamNameString = streamNameString[:-1]
    while 0 != len(streamNameString) % 4:
        streamNameString = streamNameString + "\0"
    nameWords = array.array('I')
    nameWords.fromstring(streamNameString)

    nameList = nameWords.tolist()
    number32BitWordsInNameList = len(nameList)
    nWordsInHeader = len(sNames) + number32BitWordsInNameList + 1 + 1 + 1
    headerList = [2718281 * 256, newFileId, nWordsInHeader, len(sNames)]
    headerList += [number32BitWordsInNameList
                   ] + nameList + [nSV, nWordsInHeader]
    keyFile = open(newFileName, 'w+b')
    keyHeader = array.array('I')
    keyHeader.fromlist(headerList)
    keyHeader.tofile(keyFile)

    # loop over all sv's in original key file and write out those which are not in fakeSVList
    i = 0
    fakeIdx = 0
    counter = 0
    skimSV, skimIdxList = decodeKeyRecord(skimKeyFile, skimSwap, skimRecords)
    print "orig", origKeyFile.name
    print "skim", skimKeyFile.name
    while i < nSV:
        if not skimSV: break
        sv, recIdxList = decodeKeyRecord(origKeyFile, needToSwap, nRecordNames)
        if not sv: break
        i += 1
        # we event number from parent key file is become larger then from skim, advance the skim
        if sv[1] > skimSV[1]:
            try:
                skimSV, skimIdxList = decodeKeyRecord(skimKeyFile, skimSwap,
                                                      skimRecords)
            except:
                skimSV = ()
                break
        if skimSV != sv:
            continue
        else:  # write out
            run = sv[0]
            evt = sv[1]
            lowerId, upperId = gen_util.lowerUpperBitsOfUID(sv[2])
            recordArray = array.array('I')
            recordHeader = [sv[0], sv[1], lowerId, upperId] + skimIdxList
            recordArray.fromlist(recordHeader)
            recordArray.tofile(keyFile)
            counter += 1
            # read one more event from skim file
            try:
                skimSV, skimIdxList = decodeKeyRecord(skimKeyFile, skimSwap,
                                                      skimRecords)
            except:
                skimSV = ()
    # seek to position where total SV's written and fix it to new number of SV's
    keyFile.seek(pos - 2 * 4)
    pos = keyFile.tell()
    nSVHeader = array.array('I')
    nSVHeader.fromfile(keyFile, 1)
    if nSVHeader[0] != nSV:
        print "nSVHeader[0]", nSVHeader[0], nSV
        print "Miss position of nSyncValues in a file"
        return ""
    keyFile.seek(pos)
    nSVHeader[0] = counter
    nSVHeader.tofile(keyFile)
    keyFile.close()

    return newFileName
コード例 #6
0
def buildLocationHeaderFromDict(streamDataKeysDict, fileIDList):
    """Build a PDS location header, from given components"""
    locationHeader = array.array('I')
    locationHeader.fromlist([LOCSIGNATURE*256])
    # file id for master index
    locationHeader.append(0)
    # remaining number of words in of header
    locationHeader.append(0)
    # associated file list
    fList = []
    for fileId in fileIDList:
        lowerMostId,upperMostId = gen_util.lowerUpperBitsOfUID(fileId)
        fList.append(lowerMostId)
        fList.append(upperMostId)
    fileList = array.array('I')
    # for now only set the low word for the file ID
    fileList.fromlist([len(fileIDList)]+fList)
    locationHeader += fileList

    # put streamNames into header
    streamNames=streamDataKeysDict.keys()
    nameWords  = pds_utils.charArrayOfStreams(streamNames) 
    sortedStreamNames=list(streamNames)
    sortedStreamNames.sort()
#    streamNameString =""
#    for name in sortedStreamNames:
#        streamNameString = streamNameString+name +"\0"
#    streamNameString = streamNameString[:-1]
#    while 0 != len(streamNameString) % 4:
#        streamNameString = streamNameString + "\0"
#    nameWords = array.array('I')
#    nameWords.fromstring(streamNameString)

    nWords = array.array('I')
    nWords.fromlist([len(nameWords)])
    locationHeader += nWords+nameWords

    # add dataKeys and hash into header
    dataKeyArray= array.array('I')
    nProxies = array.array('I')
    nProxies.fromlist([0])
    for stream in sortedStreamNames:
        dataKeys = streamDataKeysDict[stream]
	nProxies[0]   = len(dataKeys)
        dataKeyArray += nProxies
        dataKeyString = ""
        for dataKey in dataKeys:
            dataKeyString+= dataKey[0]+"\0"+dataKey[1]+"\0"+dataKey[2]+"\0"
	    while( len(dataKeyString) % 4 ):
               dataKeyString+="\0"
        dataStringArray= array.array('I')
        dataStringArray.fromstring(dataKeyString)
        dataKeyArray  += dataStringArray

#    emptyHashArray = array.array('I')
#    emptyHashArray.fromlist([0]*5)
    hash = sha.new( dataKeyArray.tostring() ).digest()
#    tempArray = array.array('I')
#    tempArray.fromstring(hash)
#    print "hash1",tempArray.tolist()
#    hash = sha.new( (emptyHashArray+dataKeyArray).tostring() ).digest()
#    tempArray = array.array('I')
#    tempArray.fromstring(hash)
#    print "hash2",tempArray.tolist()
    hashWords = array.array('I')
    hashWords.fromstring(hash)
    locationHeader += hashWords+dataKeyArray

    # pad header so Records begin on 8 byte boundary
    if not (len(locationHeader) % 2):
       locationHeader.fromlist([0])
    headerLength = len(locationHeader)+1-3
    locationHeader.fromlist([headerLength])
    locationHeader[2] = headerLength

    return locationHeader