예제 #1
0
    def write_root(self, path):
        gROOT.ProcessLine('struct TreeStruct {\
				int runNo;\
				int layer;\
				int gemroc;\
				int tiger;\
				int channel;\
				int tac;\
				float tcoarse;\
				float tcoarse_10b;\
				float ecoarse;\
				float tfine;\
				float efine;\
				float charge_SH;\
				int count;\
				int count_ori;\
				int count_new;\
				int timestamp;\
				int l1ts_min_tcoarse;\
				int lasttigerframenum;\
				int local_l1_count;\
				int count_mismatch;\
				float delta_coarse;\
				int count_missing_trailer;\
				int subRunNo;\
                                int l1_framenum;\
                                int trailer_tiger;\
				};')
        from ROOT import TreeStruct

        rname = path.replace(".dat", ".root")

        # subRunNo = int(path.split("_")[7])
        subRunNo = self.SUBRUN

        # run = int(path.split("_")[6].split("/")[0])
        # print run

        rootFile = ROOT.TFile(rname, 'recreate')
        tree = ROOT.TTree('tree', '')
        mystruct = TreeStruct()

        for key in TreeStruct.__dict__.keys():
            if '__' not in key:
                formstring = '/F'
                if isinstance(mystruct.__getattribute__(key), int):
                    formstring = '/I'
                tree.Branch(key, AddressOf(mystruct, key), key + formstring)

        statinfo = os.stat(path)
        packet_header = -1
        packet_tailer = -1
        packet_udp = -1
        l1count = -1

        l1count_new = []
        lschannel = []
        lstac = []
        lstcoarse = []
        lstcoarse_10b = []
        lsecoarse = []
        lstfine = []
        lsefine = []
        lscharge_SH = []
        lstigerid = []
        lsl1ts_min_tcoarse = []
        lslasttigerframenum = []
        lscount_mismatch = []
        lsdelta_coarse = []
        l1timestamp = -1
        gemroc = -1
        l1framenum = -1
        trailer_tiger = -1

        pre_timestamp = 0
        pre_pretimestamp = 0

        tiger_framenum = -1
        prev_tiger_framenum = -1
        prev2_tiger_framenum = -1
        prev3_tiger_framenum = -1

        count_missing_trailer = 0

        hitcounter = 0
        max_hitcount = 1000000000
        flag_swap1 = False
        flag_swap2 = False
        firstPacket = True

        firstData = False
        print_debug = False

        with open(path, 'rb') as f:
            for i in range(0, statinfo.st_size // 8):
                data = f.read(8)
                # hexdata = binascii.hexlify(data)
                if sys.version_info[0] == 2:
                    hexdata = str(binascii.hexlify(data))
                else:
                    hexdata = str(binascii.hexlify(data), 'ascii')
                string = "{:064b}".format(int(hexdata, 16))
                inverted = []
                for i in range(8, 0, -1):
                    inverted.append(string[(i - 1) * 8:i * 8])
                string_inv = "".join(inverted)
                int_x = int(string_inv, 2)

                # for x in range(0, len(hexdata) - 1, 16):
                #     int_x = 0
                #     for b in range(7, 0, -1):
                #         hex_to_int = (int(str(hexdata[x + b * 2]), 16)) * 16 + int(str(hexdata[x + b * 2 + 1]), 16)
                #         int_x = (int_x + hex_to_int) << 8
                #
                #     hex_to_int = (int(str(hexdata[x]), 16)) * 16 + int(str(hexdata[x + 1]), 16)  # acr 2017-11-17 this should fix the problem
                #     int_x = (int_x + hex_to_int)

                ##############################################################################################
                ##																							##
                ##								TRIGGER-LESS DECODE											##
                ##																							##
                ##############################################################################################

                if (((int_x & 0xFF00000000000000) >> 59) == 0x00
                        and self.MODE == 0):
                    mystruct.runNo = self.RUN
                    mystruct.gemroc = self.GEMROC_ID
                    mystruct.tiger = (int_x >> 56) & 0x7
                    mystruct.channel = (int_x >> 48) & 0x3F
                    mystruct.tac = (int_x >> 46) & 0x3
                    mystruct.tcoarse = (int_x >> 30) & 0xFFFF
                    mystruct.ecoarse = (int_x >> 20) & 0x3FF
                    mystruct.tfine = (int_x >> 10) & 0x3FF
                    mystruct.efine = int_x & 0x3FF
                    mystruct.tcoarse_10b = (int_x >> 30) & 0x3FF

                    if (((int_x >> 20) & 0x3FF) - ((int_x >> 30) & 0x3FF)) > 0:
                        mystruct.delta_coarse = (((int_x >> 20) & 0x3FF) -
                                                 ((int_x >> 30) & 0x3FF))
                    else:
                        mystruct.delta_coarse = (((int_x >> 20) & 0x3FF) - (
                            (int_x >> 30) & 0x3FF)) + 1024
                    temp_ecoarse = mystruct.ecoarse
                    mystruct.charge_SH = int_x & 0x3FF

                    if (self.GEMROC_ID < 4):
                        mystruct.layer = 1
                    elif (self.GEMROC_ID > 3):
                        mystruct.layer = 2
                    if (self.GEMROC_ID > 11):
                        mystruct.layer = 0

                    tree.Fill()

                ##############################################################################################
                ##############################################################################################
                ##############################################################################################
                ##############################################################################################

                ##############################################################################################
                ##																							##
                ##								TRIGGER-MATCH DECODE										##
                ##																							##
                ##############################################################################################

                if (self.MODE == 1):
                    if (((int_x & 0xE000000000000000) >> 61) == 0x6):
                        # print "enter header"
                        packet_header = 1
                        LOCAL_L1_COUNT_31_6 = int_x >> 32 & 0x3FFFFFF
                        LOCAL_L1_COUNT_5_0 = int_x >> 24 & 0x3F
                        LOCAL_L1_COUNT = (
                            LOCAL_L1_COUNT_31_6 << 6) + LOCAL_L1_COUNT_5_0
                        LOCAL_L1_TIMESTAMP = int_x & 0xFFFF
                        # print("local l1 count {}".format(LOCAL_L1_COUNT))
                        pre_pretimestamp = pre_timestamp
                        pre_timestamp = l1timestamp
                        # pre_l1count = l1count
                        l1count = LOCAL_L1_COUNT
                        l1timestamp = LOCAL_L1_TIMESTAMP

                        if firstData:
                            if print_debug:
                                print(
                                    "WARNING: not able to record last tiger frame number of previous packet: no hits from TIGER 0-3 (L1_count={})!!!!!!!!!!!!!!!"
                                    .format(LOCAL_L1_COUNT))

                        firstData = True  ## Header flags that next line will be first data word of the packet

                        if len(lschannel) > 0:
                            lschannel = []
                            lstac = []
                            lstcoarse = []
                            lsecoarse = []
                            lstfine = []
                            lsefine = []
                            lstcoarse_10b = []
                            lscharge_SH = []
                            lstigerid = []
                            lsl1ts_min_tcoarse = []
                            lslasttigerframenum = []
                            lscount_mismatch = []
                            l1count_new = []
                            lsdelta_coarse = []

                    if (((int_x & 0xC000000000000000) >> 62) == 0x0
                            and packet_header == 1
                            and packet_udp != 1):  ## DATA word
                        LOCAL_L1_TS_minus_TIGER_COARSE_TS = LOCAL_L1_TIMESTAMP - (
                            (int_x >> 32) & 0xFFFF)
                        # print "enter DATA"
                        lstigerid.append((int_x >> 59) & 0x7)
                        lschannel.append((int_x >> 50) & 0x3F)
                        lstac.append((int_x >> 48) & 0x3)
                        lsecoarse.append((int_x >> 20) & 0x3FF)
                        lstfine.append((int_x >> 10) & 0x3FF)
                        lsefine.append(int_x & 0x3FF)
                        lslasttigerframenum.append((int_x >> 56) & 0x7)

                        lscharge_SH.append(int_x & 0x3FF)
                        temp_ecoarse = (int_x >> 20) & 0x3FF
                        lstcoarse_10b.append(((int_x >> 32) & 0x3FF))
                        temp_tcoarse = ((int_x >> 32) & 0x3FF)

                        tcoarse = (int_x >> 32) & 0xFFFF
                        ecoarse = (int_x >> 20) & 0x3FF
                        if (((int_x >> 20) & 0x3FF) -
                            ((int_x >> 32) & 0x3FF)) > 0:
                            lsdelta_coarse.append(((int_x >> 20) & 0x3FF) -
                                                  ((int_x >> 32) & 0x3FF))
                        else:
                            lsdelta_coarse.append(((int_x >> 20) & 0x3FF) -
                                                  ((int_x >> 32) & 0x3FF) +
                                                  1024)

                        lstcoarse.append(tcoarse)

                        count_mismatch = 0

                        lsl1ts_min_tcoarse_to_append = LOCAL_L1_TIMESTAMP - tcoarse
                        l1count_new_to_append = l1count

                        if int_x == 0:
                            print(
                                "WARNING: DATA with all zeros (subRun = {}, L1_count = {})"
                                .format(subRunNo, LOCAL_L1_COUNT))
                        else:
                            tiger_framenum = (int_x >> 56) & 0x7
                            if firstData:
                                prev3_tiger_framenum = prev2_tiger_framenum
                                prev2_tiger_framenum = prev_tiger_framenum
                                if (
                                        int_x >> 59
                                ) & 0x7 < 4:  ## store 2 previous tiger frame number (only from TIGER 0-3)
                                    prev_tiger_framenum = tiger_framenum
                                else:
                                    if print_debug:
                                        print(
                                            "WARNING: not able to record last tiger frame number of this packet: no hits from TIGER 0-3 (L1_count={})!!!!!!!!!!!!!!!"
                                            .format(LOCAL_L1_COUNT))

                                firstData = False

                            ########################################
                            ##         PACKETS MATCHING           ##
                            ########################################

                            ## Start from alignment of previous packet
                            if ((int_x >> 59) & 0x7 > 3):
                                if flag_swap1:
                                    temp_diff = pre_timestamp - tcoarse
                                elif flag_swap2:
                                    temp_diff = pre_pretimestamp - tcoarse
                                else:
                                    temp_diff = LOCAL_L1_TIMESTAMP - tcoarse
                            else:
                                temp_diff = lsl1ts_min_tcoarse_to_append  ## TIGER 0-3 always take the current l1ts

                            ## Find correct packet
                            ## performed only when lsl1ts_min_tcoarse is not inside the trigger window (roll-over taken into account)
                            if (not (
                                (temp_diff > 1299 and temp_diff < 1567) or
                                (temp_diff < -63960 and temp_diff > -64240))):

                                if firstPacket:  ## avoid packets correction for first packet
                                    pass  ## wrong entries in first packet should be discarded since they cannot be corrected
                                else:
                                    # print("Try SWAP 0")         					## try swap packets by 0
                                    temp_diff = LOCAL_L1_TIMESTAMP - tcoarse
                                    if ((temp_diff > 1299 and temp_diff < 1567)
                                            or (temp_diff < -63960
                                                and temp_diff > -64240)):
                                        if flag_swap1 == True or flag_swap2 == True:
                                            print(
                                                "SWAP 0 activated (L1_count={})"
                                                .format(LOCAL_L1_COUNT))
                                        flag_swap1 = False
                                        flag_swap2 = False
                                    else:
                                        # print("Try SWAP 1")         					## try swap packets by 1
                                        temp_diff = pre_timestamp - tcoarse
                                        if ((temp_diff > 1299
                                             and temp_diff < 1567)
                                                or (temp_diff < -63960
                                                    and temp_diff > -64240)):
                                            if flag_swap1 == False:
                                                print(
                                                    "SWAP 1 activated (L1_count={})"
                                                    .format(LOCAL_L1_COUNT))
                                            flag_swap1 = True
                                            flag_swap2 = False
                                        else:
                                            # print("Try SWAP 2")       					## try swap packets by 2
                                            temp_diff = pre_pretimestamp - tcoarse
                                            if ((temp_diff > 1299
                                                 and temp_diff < 1567) or
                                                (temp_diff < -63960
                                                 and temp_diff > -64240)):
                                                if flag_swap2 == False:
                                                    print(
                                                        "SWAP 2 activated (L1_count={})"
                                                        .format(
                                                            LOCAL_L1_COUNT))
                                                flag_swap1 = False
                                                flag_swap2 = True
                                            else:
                                                if self.warning_print_MAX != 0:
                                                    print(
                                                        "WARNING: not able to correct packet (L1_count={}) !!!!!!!!!!!!!!!"
                                                        .format(
                                                            LOCAL_L1_COUNT))
                                                    self.warning_print_MAX = self.warning_print_MAX - 1

                            ## Apply packet correction to data of TIGER 4-7
                            if ((int_x >> 59) & 0x7 > 3
                                ):  ## correct packet for data of TIGER 4-7
                                if not (flag_swap1 or
                                        flag_swap2):  ## apply SWAP by 0 packet
                                    lsl1ts_min_tcoarse_to_append = LOCAL_L1_TIMESTAMP - tcoarse  ## use l1ts of current packet
                                    l1count_new_to_append = l1count  ## use l1count of current packet
                                    count_mismatch = 0
                                elif flag_swap1:  ## apply SWAP by 1 packet
                                    lsl1ts_min_tcoarse_to_append = pre_timestamp - tcoarse  ## use l1ts of previous packet
                                    l1count_new_to_append = l1count - 1  ## use l1count of previous packet
                                    count_mismatch = 1
                                    if tiger_framenum != prev2_tiger_framenum:
                                        if print_debug:
                                            print(
                                                "TIGER framecount not matched (SWAP1: L1_count={}: {} vs {}) !!!!!!!!!!!!!!!"
                                                .format(
                                                    LOCAL_L1_COUNT,
                                                    tiger_framenum,
                                                    prev2_tiger_framenum))
                                elif flag_swap2:  ## apply SWAP by 2 packets
                                    lsl1ts_min_tcoarse_to_append = pre_pretimestamp - tcoarse  ## use l1ts of 2 previous packet
                                    l1count_new_to_append = l1count - 2  ## use l1count of 2 previous packet
                                    count_mismatch = 2
                                    if tiger_framenum != prev3_tiger_framenum:
                                        if print_debug:
                                            print(
                                                "TIGER framecount not matched (SWAP2: L1_count={}: {} vs {}) !!!!!!!!!!!!!!!"
                                                .format(
                                                    LOCAL_L1_COUNT,
                                                    tiger_framenum,
                                                    prev3_tiger_framenum))
                                else:
                                    print(
                                        "Swap ERROR: a problem occurred in swap logic (subRun={}, L1_count={}) !!!!!!!!!!!!!!!"
                                        .format(subRunNo, LOCAL_L1_COUNT))

                            ## Correct counters roll-over
                            if (lsl1ts_min_tcoarse_to_append < 0):
                                if ((int_x >> 59) & 0x7 > 3):
                                    if flag_swap1:
                                        lsl1ts_min_tcoarse_to_append = pre_timestamp - tcoarse + 2**16
                                    if flag_swap2:
                                        lsl1ts_min_tcoarse_to_append = pre_pretimestamp - tcoarse + 2**16
                                    if not (flag_swap1 or flag_swap2):
                                        lsl1ts_min_tcoarse_to_append = LOCAL_L1_TIMESTAMP - tcoarse + 2**16
                                else:
                                    lsl1ts_min_tcoarse_to_append = LOCAL_L1_TIMESTAMP - tcoarse + 2**16

                        #####################################################################################################################
                        #####################################################################################################################
                        #####################################################################################################################

                        lsl1ts_min_tcoarse.append(lsl1ts_min_tcoarse_to_append)
                        l1count_new.append(l1count_new_to_append)

                        lscount_mismatch.append(count_mismatch)

                    if (
                        ((int_x & 0xE000000000000000) >> 61) == 0x7
                    ):  ## TRAILER WORD --> sometimes is missing --> DO NOT USE
                        # print "enter trailer"
                        packet_tailer = 1
                        l1framenum = (int_x >> 37) & 0xFFFFFF
                        trailer_tiger = (int_x >> 27) & 0x7
                        gemroc = (int_x >> 32) & 0x1F

                    if (((int_x & 0xF000000000000000) >> 60
                         ) == 0x4):  ## UDP WORD --> used to flag end of packet
                        # print "enter UDP"
                        if packet_tailer == 0:
                            count_missing_trailer = count_missing_trailer + 1
                            print(
                                "WARNING: missing trailer word (subRun = {}, L1 count = {})!!!!!!!!!!!!!!!"
                                .format(subRunNo, LOCAL_L1_COUNT))
                        packet_udp = 1
                    # pre_udp_packet = udp_packet
                    # udp_packet = (((int_x >> 32)&0xFFFFF) + ((int_x >> 0) & 0xFFFFFFF))

                    if (packet_header == 1
                            and packet_udp == 1):  ## Fill ROOT file
                        for x in range(len(lstac)):
                            mystruct.channel = lschannel.pop()
                            mystruct.tac = lstac.pop()
                            mystruct.tcoarse = lstcoarse.pop()
                            mystruct.ecoarse = lsecoarse.pop()
                            mystruct.tfine = lstfine.pop()
                            mystruct.efine = lsefine.pop()
                            mystruct.tcoarse_10b = lstcoarse_10b.pop()
                            mystruct.charge_SH = lscharge_SH.pop()
                            mystruct.tiger = lstigerid.pop()
                            mystruct.l1ts_min_tcoarse = lsl1ts_min_tcoarse.pop(
                            )
                            mystruct.lasttigerframenum = lslasttigerframenum.pop(
                            )
                            mystruct.count_mismatch = lscount_mismatch.pop()
                            mystruct.count_new = l1count_new.pop()
                            mystruct.delta_coarse = lsdelta_coarse.pop()

                            mystruct.count_missing_trailer = count_missing_trailer
                            mystruct.local_l1_count = LOCAL_L1_COUNT
                            mystruct.count_ori = l1count
                            mystruct.count = mystruct.count_new
                            mystruct.timestamp = l1timestamp
                            mystruct.gemroc = self.GEMROC_ID  # previously was gemroc value from trailer word
                            mystruct.runNo = self.RUN
                            mystruct.subRunNo = subRunNo
                            mystruct.l1_framenum = l1framenum
                            mystruct.trailer_tiger = trailer_tiger
                            """
                            if(gemrocid<4):
                                mystruct.layer_id = 1
                            elif(gemrocid>3):
                                mystruct.layer_id = 2
                            if(gemrocid>11):
                                mystruct.layer_id = 0
                            """

                            if (self.GEMROC_ID < 4):
                                mystruct.layer = 1
                            elif (self.GEMROC_ID > 3):
                                mystruct.layer = 2
                            if (self.GEMROC_ID > 11):
                                mystruct.layer = 0

                            hitcounter = hitcounter + 1
                            if (hitcounter > max_hitcount):
                                sys.stderr.write("Increase max hit counter \n")
                                continue
                            # print "PRE FILL"
                            tree.Fill()
                        # print "POST FILL"
                        packet_header = 0
                        packet_tailer = 0
                        packet_udp = 0
                        firstPacket = False

        # print("Writing to ROOT file...")
        rootFile.Write()
        rootFile.Close()
예제 #2
0
import sys
import time
import array
import numpy as np
import os

gROOT.ProcessLine(
"struct TreeStruct {\
Float_t sf_ptWeight;\
}")

##############################################################################

from ROOT import TreeStruct

treestruct = TreeStruct()


def main(options,args):
        
  ifile = options.ifile
  tf = ROOT.TFile(ifile);
  tt = tf.Get("Events");
  nent = int(tt.GetEntries())

  histfile = ROOT.TFile(options.weightfile)#ratio histogram
  hist = histfile.Get(options.uhist)


  Apply = True;
예제 #3
0
    def write_root(self, path):
        gROOT.ProcessLine('struct TreeStruct {\
                int runNo;\
                int layer_id;\
                int gemroc_id;\
                int tiger_id;\
                int channel_id;\
                int tac_id;\
                float tcoarse;\
                float tcoarse_10b;\
                float ecoarse;\
                float tfine;\
                float efine;\
                float charge_SH;\
                int count;\
                int count_ori;\
                int count_new;\
                int timestamp;\
                int l1ts_min_tcoarse;\
                int lasttigerframenum;\
                int local_l1_count;\
                int count_mismatch;\
                float delta_coarse;\
                };')
        from ROOT import TreeStruct

        rname = path.replace(".dat", ".root")

        rootFile = ROOT.TFile(rname, 'recreate')
        tree = ROOT.TTree('tree', '')
        mystruct = TreeStruct()

        for key in TreeStruct.__dict__.keys():
            if '__' not in key:
                formstring = '/F'
                if isinstance(mystruct.__getattribute__(key), int):
                    formstring = '/I'
                tree.Branch(key, AddressOf(mystruct, key), key + formstring)

        statinfo = os.stat(path)
        packet_header = -1
        packet_tailer = -1
        l1count = -1

        l1count_new = []
        lschannel_id = []
        lstac_id = []
        lstcoarse = []
        lstcoarse_10b = []
        lsecoarse = []
        lstfine = []
        lsefine = []
        lscharge_SH = []
        lstigerid = []
        lsl1ts_min_tcoarse = []
        lslasttigerframenum = []
        lscount_mismatch = []
        lsdelta_coarse = []
        l1timestamp = -1
        gemrocid = -1

        pre_timestamp = 0

        hitcounter = 0
        max_hitcount = 1000000000000
        flag_swap1 = False
        flag_swap2 = False

        with open(path, 'rb') as f:
            for i in range(0, statinfo.st_size // 8):
                data = f.read(8)
                #hexdata = binascii.hexlify(data)
                if sys.version_info[0] == 2:
                    hexdata = str(binascii.hexlify(data))
                else:
                    hexdata = str(binascii.hexlify(data), 'ascii')
                string = "{:064b}".format(int(hexdata, 16))
                inverted = []
                for i in range(8, 0, -1):
                    inverted.append(string[(i - 1) * 8:i * 8])
                string_inv = "".join(inverted)
                int_x = int(string_inv, 2)

                # for x in range(0, len(hexdata) - 1, 16):
                #     int_x = 0
                #     for b in range(7, 0, -1):
                #         hex_to_int = (int(str(hexdata[x + b * 2]), 16)) * 16 + int(str(hexdata[x + b * 2 + 1]), 16)
                #         int_x = (int_x + hex_to_int) << 8
                #
                #     hex_to_int = (int(str(hexdata[x]), 16)) * 16 + int(str(hexdata[x + 1]), 16)  # acr 2017-11-17 this should fix the problem
                #     int_x = (int_x + hex_to_int)

                if (((int_x & 0xFF00000000000000) >> 59) == 0x00
                        and self.MODE == 0):
                    mystruct.runNo = self.RUN
                    mystruct.gemroc_id = self.GEMROC_ID
                    mystruct.tiger_id = (int_x >> 56) & 0x7
                    mystruct.channel_id = (int_x >> 48) & 0x3F
                    mystruct.tac_id = (int_x >> 46) & 0x3
                    mystruct.tcoarse = (int_x >> 30) & 0xFFFF
                    mystruct.ecoarse = (int_x >> 20) & 0x3FF
                    mystruct.tfine = (int_x >> 10) & 0x3FF
                    mystruct.efine = int_x & 0x3FF
                    mystruct.tcoarse_10b = (int_x >> 30) & 0x3FF

                    if (((int_x >> 20) & 0x3FF) - ((int_x >> 30) & 0x3FF)) > 0:
                        mystruct.delta_coarse = (((int_x >> 20) & 0x3FF) -
                                                 ((int_x >> 30) & 0x3FF))
                    else:
                        mystruct.delta_coarse = (((int_x >> 20) & 0x3FF) - (
                            (int_x >> 30) & 0x3FF)) + 1024
                    temp_ecoarse = mystruct.ecoarse
                    mystruct.charge_SH = int_x & 0x3FF

                    if (self.GEMROC_ID < 4):
                        mystruct.layer_id = 1
                    elif (self.GEMROC_ID > 3):
                        mystruct.layer_id = 2
                    if (self.GEMROC_ID > 11):
                        mystruct.layer_id = 0

                    tree.Fill()

                if (self.MODE == 1):
                    if (((int_x & 0xE000000000000000) >> 61) == 0x6):
                        packet_header = 1
                        LOCAL_L1_COUNT_31_6 = int_x >> 32 & 0x3FFFFFF
                        LOCAL_L1_COUNT_5_0 = int_x >> 24 & 0x3F
                        LOCAL_L1_COUNT = (
                            LOCAL_L1_COUNT_31_6 << 6) + LOCAL_L1_COUNT_5_0
                        LOCAL_L1_TIMESTAMP = int_x & 0xFFFF
                        pre_pretimestamp = pre_timestamp
                        pre_timestamp = l1timestamp
                        pre_l1count = l1count
                        l1count = LOCAL_L1_COUNT
                        l1timestamp = LOCAL_L1_TIMESTAMP

                    if (((int_x & 0xC000000000000000) >> 62) == 0x0
                            and packet_header == 1 and packet_tailer == 0):
                        LOCAL_L1_TS_minus_TIGER_COARSE_TS = LOCAL_L1_TIMESTAMP - (
                            (int_x >> 32) & 0xFFFF)

                        lstigerid.append((int_x >> 59) & 0x7)
                        lschannel_id.append((int_x >> 50) & 0x3F)
                        lstac_id.append((int_x >> 48) & 0x3)
                        lsecoarse.append((int_x >> 20) & 0x3FF)
                        lstfine.append((int_x >> 10) & 0x3FF)
                        lsefine.append(int_x & 0x3FF)
                        lslasttigerframenum.append((int_x >> 56) & 0x7)

                        temp_ecoarse = (int_x >> 20) & 0x3FF
                        lstcoarse_10b.append(((int_x >> 32) & 0x3FF))
                        temp_tcoarse = ((int_x >> 32) & 0x3FF)

                        tcoarse = (int_x >> 32) & 0xFFFF
                        ecoarse = (int_x >> 20) & 0x3FF
                        if (((int_x >> 20) & 0x3FF) -
                            ((int_x >> 32) & 0x3FF)) > 0:
                            lsdelta_coarse.append(((int_x >> 20) & 0x3FF) -
                                                  ((int_x >> 32) & 0x3FF))
                        else:
                            lsdelta_coarse.append(((int_x >> 20) & 0x3FF) -
                                                  ((int_x >> 32) & 0x3FF) +
                                                  1024)
                        #lsl1ts_min_tcoarse.append(LOCAL_L1_TIMESTAMP-tcoarse)

                        count_mismatch = 0
                        #if(l1timestamp < 1566):
                        #if(tcoarse > 64150):
                        # tcoarse = tcoarse - 2**16

                        #if((LOCAL_L1_TIMESTAMP-tcoarse) < 1300 or (LOCAL_L1_TIMESTAMP-tcoarse) > 1600):
                        #    if((pre_timestamp-tcoarse) < 1300 or (pre_timestamp-tcoarse) > 1600):
                        #        count_mismatch = 2
                        #        lsl1ts_min_tcoarse.append(pre_pretimestamp-tcoarse)
                        #        l1count_new.append(l1count-2)
                        #    else:
                        #        count_mismatch = 1
                        #        lsl1ts_min_tcoarse.append(pre_timestamp-tcoarse)
                        #        l1count_new.append(l1count-1)
                        #else:
                        #    lsl1ts_min_tcoarse.append(LOCAL_L1_TIMESTAMP-tcoarse)
                        #    l1count_new.append(l1count)

                        lsl1ts_min_tcoarse_to_append = LOCAL_L1_TIMESTAMP - tcoarse
                        l1count_new_to_append = l1count

                        if (not (((LOCAL_L1_TIMESTAMP - tcoarse) > 1299 and
                                  (LOCAL_L1_TIMESTAMP - tcoarse) < 1567) or
                                 (LOCAL_L1_TIMESTAMP - tcoarse) < -63970)):
                            flag_swap1 = True
                        if (flag_swap1):
                            if ((int_x >> 59) & 0x7 > 3):
                                lsl1ts_min_tcoarse_to_append = pre_timestamp - tcoarse
                                l1count_new_to_append = l1count - 1
                                count_mismatch = 1
                                if (not (
                                    ((lsl1ts_min_tcoarse_to_append) > 1299 and
                                     (lsl1ts_min_tcoarse_to_append) < 1567) or
                                    (lsl1ts_min_tcoarse_to_append) < -63970)):
                                    flag_swap2 = True

                        if (flag_swap2):
                            if ((int_x >> 59) & 0x7 > 3):
                                lsl1ts_min_tcoarse_to_append = pre_pretimestamp - tcoarse
                                l1count_new_to_append = l1count - 2
                                count_mismatch = 2

                        if (lsl1ts_min_tcoarse_to_append < 0):
                            tcoarse = tcoarse - 2**16
                            if ((int_x >> 59) & 0x7 > 3):
                                if flag_swap1:
                                    lsl1ts_min_tcoarse_to_append = pre_timestamp - tcoarse
                                if flag_swap2:
                                    lsl1ts_min_tcoarse_to_append = pre_pretimestamp - tcoarse
                                if not (flag_swap1 or flag_swap2):
                                    lsl1ts_min_tcoarse_to_append = LOCAL_L1_TIMESTAMP - tcoarse
                            else:
                                lsl1ts_min_tcoarse_to_append = LOCAL_L1_TIMESTAMP - tcoarse

                        lsl1ts_min_tcoarse.append(lsl1ts_min_tcoarse_to_append)
                        l1count_new.append(l1count_new_to_append)

                        lscount_mismatch.append(count_mismatch)
                        lstcoarse.append(tcoarse)

                        lscharge_SH.append(int_x & 0x3FF)

                    if (((int_x & 0xE000000000000000) >> 61) == 0x7):
                        packet_tailer = 1
                        gemrocid = (int_x >> 32) & 0x1F

                    #if(((int_x & 0xF000000000000000)>>60) == 0x4):
                    #pre_udp_packet = udp_packet
                    #udp_packet = (((int_x >> 32)&0xFFFFF) + ((int_x >> 0) & 0xFFFFFFF))

                    if (packet_header == 1 and packet_tailer == 1):
                        for x in range(len(lstac_id)):
                            mystruct.channel_id = lschannel_id.pop()
                            mystruct.tac_id = lstac_id.pop()
                            mystruct.tcoarse = lstcoarse.pop()
                            mystruct.ecoarse = lsecoarse.pop()
                            mystruct.tfine = lstfine.pop()
                            mystruct.efine = lsefine.pop()
                            mystruct.tcoarse_10b = lstcoarse_10b.pop()
                            mystruct.charge_SH = lscharge_SH.pop()
                            mystruct.tiger_id = lstigerid.pop()
                            mystruct.l1ts_min_tcoarse = lsl1ts_min_tcoarse.pop(
                            )
                            mystruct.lasttigerframenum = lslasttigerframenum.pop(
                            )
                            mystruct.count_mismatch = lscount_mismatch.pop()
                            mystruct.count_new = l1count_new.pop()
                            mystruct.delta_coarse = lsdelta_coarse.pop()

                            mystruct.local_l1_count = LOCAL_L1_COUNT
                            mystruct.count_ori = l1count
                            mystruct.count = mystruct.count_new
                            mystruct.timestamp = l1timestamp
                            mystruct.gemroc_id = gemrocid
                            mystruct.runNo = self.RUN
                            if (gemrocid < 4):
                                mystruct.layer_id = 1
                            elif (gemrocid > 3):
                                mystruct.layer_id = 2

                            hitcounter = hitcounter + 1
                            if (hitcounter > max_hitcount):
                                continue
                            tree.Fill()
                        packet_header = 0
                        packet_tailer = 0

        rootFile.Write()
        rootFile.Close()
예제 #4
0
    def write_root(self, path):
        gROOT.ProcessLine('struct TreeStruct {\
                int runNo;\
                int layer_id;\
                int gemroc_id;\
                int tiger_id;\
                int channel_id;\
                int tac_id;\
                float tcoarse;\
                float tcoarse_10b;\
                float ecoarse;\
                float tfine;\
                float efine;\
                float charge_SH;\
                int count;\
                int count_ori;\
                int count_new;\
                int timestamp;\
                int l1ts_min_tcoarse;\
                int lasttigerframenum;\
                int local_l1_count;\
                int count_mismatch;\
                float delta_coarse;\
                int count_missing_trailer;\
                int subRunNo;\
                };')
        from ROOT import TreeStruct

        rname = path.replace(".dat", ".root")

        subRunNo = int(path.split("_")[7])
        print subRunNo

        rootFile = ROOT.TFile(rname, 'recreate')
        tree = ROOT.TTree('tree', '')
        mystruct = TreeStruct()

        for key in TreeStruct.__dict__.keys():
            if '__' not in key:
                formstring = '/F'
                if isinstance(mystruct.__getattribute__(key), int):
                    formstring = '/I'
                tree.Branch(key, AddressOf(mystruct, key), key + formstring)

        statinfo = os.stat(path)
        packet_header = -1
        packet_tailer = -1
        packet_udp = -1
        l1count = -1

        l1count_new = []
        lschannel_id = []
        lstac_id = []
        lstcoarse = []
        lstcoarse_10b = []
        lsecoarse = []
        lstfine = []
        lsefine = []
        lscharge_SH = []
        lstigerid = []
        lsl1ts_min_tcoarse = []
        lslasttigerframenum = []
        lscount_mismatch = []
        lsdelta_coarse = []
        l1timestamp = -1
        gemrocid = -1

        pre_timestamp = 0

        count_missing_trailer = 0

        hitcounter = 0
        max_hitcount = 1000000000000
        flag_swap1 = False
        flag_swap2 = False
        firstPacket = True

        with open(path, 'rb') as f:
            for i in range(0, statinfo.st_size // 8):
                data = f.read(8)
                #hexdata = binascii.hexlify(data)
                if sys.version_info[0] == 2:
                    hexdata = str(binascii.hexlify(data))
                else:
                    hexdata = str(binascii.hexlify(data), 'ascii')
                string = "{:064b}".format(int(hexdata, 16))
                inverted = []
                for i in range(8, 0, -1):
                    inverted.append(string[(i - 1) * 8:i * 8])
                string_inv = "".join(inverted)
                int_x = int(string_inv, 2)

                # for x in range(0, len(hexdata) - 1, 16):
                #     int_x = 0
                #     for b in range(7, 0, -1):
                #         hex_to_int = (int(str(hexdata[x + b * 2]), 16)) * 16 + int(str(hexdata[x + b * 2 + 1]), 16)
                #         int_x = (int_x + hex_to_int) << 8
                #
                #     hex_to_int = (int(str(hexdata[x]), 16)) * 16 + int(str(hexdata[x + 1]), 16)  # acr 2017-11-17 this should fix the problem
                #     int_x = (int_x + hex_to_int)

                if (((int_x & 0xFF00000000000000) >> 59) == 0x00
                        and self.MODE == 0):
                    mystruct.runNo = self.RUN
                    mystruct.gemroc_id = self.GEMROC_ID
                    mystruct.tiger_id = (int_x >> 56) & 0x7
                    mystruct.channel_id = (int_x >> 48) & 0x3F
                    mystruct.tac_id = (int_x >> 46) & 0x3
                    mystruct.tcoarse = (int_x >> 30) & 0xFFFF
                    mystruct.ecoarse = (int_x >> 20) & 0x3FF
                    mystruct.tfine = (int_x >> 10) & 0x3FF
                    mystruct.efine = int_x & 0x3FF
                    mystruct.tcoarse_10b = (int_x >> 30) & 0x3FF

                    if (((int_x >> 20) & 0x3FF) - ((int_x >> 30) & 0x3FF)) > 0:
                        mystruct.delta_coarse = (((int_x >> 20) & 0x3FF) -
                                                 ((int_x >> 30) & 0x3FF))
                    else:
                        mystruct.delta_coarse = (((int_x >> 20) & 0x3FF) - (
                            (int_x >> 30) & 0x3FF)) + 1024
                    temp_ecoarse = mystruct.ecoarse
                    mystruct.charge_SH = int_x & 0x3FF

                    if (self.GEMROC_ID < 4):
                        mystruct.layer_id = 1
                    elif (self.GEMROC_ID > 3):
                        mystruct.layer_id = 2
                    if (self.GEMROC_ID > 11):
                        mystruct.layer_id = 0

                    tree.Fill()

                if (self.MODE == 1):
                    if (((int_x & 0xE000000000000000) >> 61) == 0x6):
                        #print "enter header"
                        packet_header = 1
                        LOCAL_L1_COUNT_31_6 = int_x >> 32 & 0x3FFFFFF
                        LOCAL_L1_COUNT_5_0 = int_x >> 24 & 0x3F
                        LOCAL_L1_COUNT = (
                            LOCAL_L1_COUNT_31_6 << 6) + LOCAL_L1_COUNT_5_0
                        LOCAL_L1_TIMESTAMP = int_x & 0xFFFF
                        #print("local l1 count {}".format(LOCAL_L1_COUNT))
                        pre_pretimestamp = pre_timestamp
                        pre_timestamp = l1timestamp
                        pre_l1count = l1count
                        l1count = LOCAL_L1_COUNT
                        l1timestamp = LOCAL_L1_TIMESTAMP

                        if len(lschannel_id) > 0:
                            count_missing_trailer = count_missing_trailer + 1

                            lschannel_id = []
                            lstac_id = []
                            lstcoarse = []
                            lsecoarse = []
                            lstfine = []
                            lsefine = []
                            lstcoarse_10b = []
                            lscharge_SH = []
                            lstigerid = []
                            lsl1ts_min_tcoarse = []
                            lslasttigerframenum = []
                            lscount_mismatch = []
                            l1count_new = []
                            lsdelta_coarse = []

                    if (((int_x & 0xC000000000000000) >> 62) == 0x0
                            and packet_header == 1 and packet_udp != 1):
                        LOCAL_L1_TS_minus_TIGER_COARSE_TS = LOCAL_L1_TIMESTAMP - (
                            (int_x >> 32) & 0xFFFF)
                        #print "enter DATA"
                        lstigerid.append((int_x >> 59) & 0x7)
                        lschannel_id.append((int_x >> 50) & 0x3F)
                        lstac_id.append((int_x >> 48) & 0x3)
                        lsecoarse.append((int_x >> 20) & 0x3FF)
                        lstfine.append((int_x >> 10) & 0x3FF)
                        lsefine.append(int_x & 0x3FF)
                        lslasttigerframenum.append((int_x >> 56) & 0x7)

                        temp_ecoarse = (int_x >> 20) & 0x3FF
                        lstcoarse_10b.append(((int_x >> 32) & 0x3FF))
                        temp_tcoarse = ((int_x >> 32) & 0x3FF)

                        tcoarse = (int_x >> 32) & 0xFFFF
                        ecoarse = (int_x >> 20) & 0x3FF
                        if (((int_x >> 20) & 0x3FF) -
                            ((int_x >> 32) & 0x3FF)) > 0:
                            lsdelta_coarse.append(((int_x >> 20) & 0x3FF) -
                                                  ((int_x >> 32) & 0x3FF))
                        else:
                            lsdelta_coarse.append(((int_x >> 20) & 0x3FF) -
                                                  ((int_x >> 32) & 0x3FF) +
                                                  1024)
                        #lsl1ts_min_tcoarse.append(LOCAL_L1_TIMESTAMP-tcoarse)

                        count_mismatch = 0
                        #if(l1timestamp < 1566):
                        #if(tcoarse > 64150):
                        # tcoarse = tcoarse - 2**16

                        #if((LOCAL_L1_TIMESTAMP-tcoarse) < 1300 or (LOCAL_L1_TIMESTAMP-tcoarse) > 1600):
                        #    if((pre_timestamp-tcoarse) < 1300 or (pre_timestamp-tcoarse) > 1600):
                        #        count_mismatch = 2
                        #        lsl1ts_min_tcoarse.append(pre_pretimestamp-tcoarse)
                        #        l1count_new.append(l1count-2)
                        #    else:
                        #        count_mismatch = 1
                        #        lsl1ts_min_tcoarse.append(pre_timestamp-tcoarse)
                        #        l1count_new.append(l1count-1)
                        #else:
                        #    lsl1ts_min_tcoarse.append(LOCAL_L1_TIMESTAMP-tcoarse)
                        #    l1count_new.append(l1count)

                        lsl1ts_min_tcoarse_to_append = LOCAL_L1_TIMESTAMP - tcoarse
                        l1count_new_to_append = l1count

                        if (not ((lsl1ts_min_tcoarse_to_append > 1299
                                  and lsl1ts_min_tcoarse_to_append < 1567) or
                                 (lsl1ts_min_tcoarse_to_append < -63960
                                  and lsl1ts_min_tcoarse_to_append > -64240))):

                            if flag_swap2 == False and firstPacket == False:  ## avoid packets correction for first packet

                                temp_diff = pre_timestamp - tcoarse
                                if ((temp_diff > 1299 and temp_diff < 1567)
                                        or (temp_diff < -63960
                                            and temp_diff > -64240)):
                                    if flag_swap1 == False:
                                        print("SWAP 1 activated")
                                    flag_swap1 = True
                                else:
                                    print("We have a problem (1)")

                            if (flag_swap1):
                                if ((int_x >> 59) & 0x7 > 3):
                                    lsl1ts_min_tcoarse_to_append = pre_timestamp - tcoarse
                                    l1count_new_to_append = l1count - 1
                                    count_mismatch = 1

                                    if (not (
                                        ((lsl1ts_min_tcoarse_to_append) > 1299
                                         and
                                         (lsl1ts_min_tcoarse_to_append) < 1567)
                                            or ((lsl1ts_min_tcoarse_to_append)
                                                < -63960 and
                                                (lsl1ts_min_tcoarse_to_append)
                                                > -64240))):
                                        temp_diff = pre_pretimestamp - tcoarse
                                        if ((temp_diff > 1299
                                             and temp_diff < 1567)
                                                or (temp_diff < -63960
                                                    and temp_diff > -64240)):

                                            print("SWAP 2 activated")
                                            flag_swap2 = True
                                            flag_swap1 = False
                                            #print "{} and {}".format(lsl1ts_min_tcoarse_to_append, l1count)
                                        else:
                                            print("We have a problem (2)")

                            if (flag_swap2):
                                if ((int_x >> 59) & 0x7 > 3):
                                    lsl1ts_min_tcoarse_to_append = pre_pretimestamp - tcoarse
                                    l1count_new_to_append = l1count - 2
                                    count_mismatch = 2
                                    #print ("{} and {}".format(self.GEMROC_ID,run))
                                    #sys.exit()

                        if (lsl1ts_min_tcoarse_to_append < 0):
                            #tcoarse = lsl1ts_min_tcoarse_to_append + 2**16
                            if ((int_x >> 59) & 0x7 > 3):
                                if flag_swap1:
                                    lsl1ts_min_tcoarse_to_append = pre_timestamp - tcoarse + 2**16
                                if flag_swap2:
                                    lsl1ts_min_tcoarse_to_append = pre_pretimestamp - tcoarse + 2**16
                                if not (flag_swap1 or flag_swap2):
                                    lsl1ts_min_tcoarse_to_append = LOCAL_L1_TIMESTAMP - tcoarse + 2**16
                            else:
                                #if(lsl1ts_min_tcoarse_to_append > -60000):
                                #print ("{} and {}".format(lsl1ts_min_tcoarse_to_append, l1count))
                                lsl1ts_min_tcoarse_to_append = LOCAL_L1_TIMESTAMP - tcoarse + 2**16

                        lsl1ts_min_tcoarse.append(lsl1ts_min_tcoarse_to_append)
                        l1count_new.append(l1count_new_to_append)

                        lscount_mismatch.append(count_mismatch)
                        lstcoarse.append(tcoarse)

                        #if flag_swap1 and flag_swap2:
                        #print "ERROR ON SWAP {}".format(count_mismatch)

                        lscharge_SH.append(int_x & 0x3FF)

                    if (((int_x & 0xE000000000000000) >> 61) == 0x7):
                        #print "enter trailer"
                        packet_tailer = 1
                        gemrocid = (int_x >> 32) & 0x1F

                    if (((int_x & 0xF000000000000000) >> 60) == 0x4):
                        #print "enter UDP"
                        packet_udp = 1
                        #pre_udp_packet = udp_packet
                        #udp_packet = (((int_x >> 32)&0xFFFFF) + ((int_x >> 0) & 0xFFFFFFF))

                    if (packet_header == 1 and packet_udp == 1):
                        for x in range(len(lstac_id)):
                            mystruct.channel_id = lschannel_id.pop()
                            mystruct.tac_id = lstac_id.pop()
                            mystruct.tcoarse = lstcoarse.pop()
                            mystruct.ecoarse = lsecoarse.pop()
                            mystruct.tfine = lstfine.pop()
                            mystruct.efine = lsefine.pop()
                            mystruct.tcoarse_10b = lstcoarse_10b.pop()
                            mystruct.charge_SH = lscharge_SH.pop()
                            mystruct.tiger_id = lstigerid.pop()
                            mystruct.l1ts_min_tcoarse = lsl1ts_min_tcoarse.pop(
                            )
                            mystruct.lasttigerframenum = lslasttigerframenum.pop(
                            )
                            mystruct.count_mismatch = lscount_mismatch.pop()
                            mystruct.count_new = l1count_new.pop()
                            mystruct.delta_coarse = lsdelta_coarse.pop()

                            mystruct.count_missing_trailer = count_missing_trailer
                            mystruct.local_l1_count = LOCAL_L1_COUNT
                            mystruct.count_ori = l1count
                            mystruct.count = mystruct.count_new
                            mystruct.timestamp = l1timestamp
                            mystruct.gemroc_id = self.GEMROC_ID  # previously was gemrocid value from trailer word
                            mystruct.runNo = self.RUN
                            mystruct.subRunNo = subRunNo
                            """
                                if(gemrocid<4):
                                    mystruct.layer_id = 1
                                elif(gemrocid>3):
                                    mystruct.layer_id = 2
                                if(gemrocid>11):
                                    mystruct.layer_id = 0
                                """
                            if (self.GEMROC_ID < 4):
                                mystruct.layer_id = 1
                            elif (self.GEMROC_ID > 3):
                                mystruct.layer_id = 2
                            if (self.GEMROC_ID > 11):
                                mystruct.layer_id = 0

                            hitcounter = hitcounter + 1
                            if (hitcounter > max_hitcount):
                                continue
                            #print "PRE FILL"
                            tree.Fill()
                            #print "POST FILL"
                        packet_header = 0
                        packet_tailer = 0
                        packet_udp = 0
                        firstPacket = False

        print("Writing to ROOT file...")
        rootFile.Write()
        rootFile.Close()
        print("ROOT file written and closed.\n")