*--------1---------2---------3---------4---------5---------6---------7-- * * inputs: * ----- * BTRI (data base) - trigger masks to describe the system response * BRPE - all triggered pads in the event * outputs: * ------- * SITR - raw data, * - L2 and L1 topological data (theta and phi), * - L1 trigger elements: TRIG, VETO, B2B subroutine PADSIM include './Include/bcs.inc' include './Include/bosmdl.inc' integer NBTRI, MASK(200), FLAG(200), NMASKS integer NBRPE, NCOl, NROW, BCOPY(512), BWORDS integer RING, SECT, PLAN, NBIT, NSECHIT(12), PATTERN(12) integer BIT, PAD, COINC, TRMATCH(12, 200) integer RAN1(8), RAN2(4), RAN3(2), WHOLE integer SUM8, SUM4, SUM2 integer TRACK(12), SPROJ(12), HMULT(12) integer TDATA(12), SPINN, SPOUT, VETO integer NSITR logical Fevent common /MASKS/ MASK, FLAG data Fevent /.TRUE./ * BTRI database access *---------------------------------- if (Fevent) call MASKDB Fevent = .False. * BRPE bank access *---------------------------------- NBRPE = IW(NAMIND('BRPE')) if (NBRPE.eq.0) return * Copy bank content into array *---------------------------------- BWORDS = IW(NBRPE) if (BWORDS.gt.256) return do I = 1, 512 BCOPY(I) = 0 end do do I = 1, BWORDS J = 2 * I - 1 K = 2 * I BCOPY(J) = iand(65535, IW(NBRPE + I)) BCOPY(K) = iand(65535, ishft(IW(NBRPE + I), -16)) end do * Separate phi-sectors (raw data) *---------------------------------- do I = 1, 12 NSECHIT(I) = 0 PATTERN(I) = 0 end do do I = 1, (BWORDS * 2) RING = IBITS(BCOPY(I), 0, 3) SECT = IBITS(BCOPY(I), 3, 4) PLAN = IBITS(BCOPY(I), 7, 3) if (PLAN.ge.2) then NBIT = 8 * (PLAN - 2) + RING SECT = SECT + 1 NSECHIT(SECT) = NSECHIT(SECT) + 1 PATTERN(SECT) = PATTERN(SECT) + 2**NBIT end if end do * Track validation in each sector * with the soft or firm criteria *---------------------------------- do I = 1, 12 do J = 1, 200 TRMATCH(I, J) = 0 end do end do NMASKS = 0 do I = 1, 200 if (MASK(I).ne.0) NMASKS = NMASKS + 1 end do do I = 1, 12 do J = 1, NMASKS if (FLAG(J).eq.1) then COINC = 0 do K = 1, 32 BIT = IBITS(MASK(J), (K-1), 1) PAD = IBITS(PATTERN(I), (K-1), 1) if ((BIT.eq.1).and.(PAD.eq.1)) COINC = COINC + 1 end do if (COINC.ge.3) TRMATCH(I, J) = 1 else if (MASK(J).eq.PATTERN(I)) TRMATCH(I, J) = 1 end if end do end do * Track trigger *---------------------------------- do I = 1, 12 TRACK(I) = 0 end do do I = 1, 12 do J = 1, 200 if (TRMATCH(I, J).eq.1) TRACK(I) = 1 end do end do * Track projection onto SPACAL * (the front-end description) *---------------------------------- do I = 1, 12 SPROJ(I) = 0 end do SPINN = 0 SPOUT = 0 do I = 1, 12 do J = 1, 8 RAN1(J) = 0 end do do J = 1, 4 RAN2(J) = 0 end do do J = 1, 2 RAN3(J) = 0 end do WHOLE = 0 SUM8 = 0 SUM4 = 0 SUM2 = 0 L = 0 do J = 1, 8 do K = 1, 16 L = L + 1 if ((L.le.NMASKS).and.(TRMATCH(I, L).eq.1)) RAN1(J) = 1 end do end do L = 0 do J = 1, 4 do K = 1, 2 L = L + 1 if (RAN1(L).eq.1) RAN2(J) = 1 end do end do L = 0 do J = 1, 2 do K = 1, 2 L = L + 1 if (RAN2(L).eq.1) RAN3(J) = 1 end do end do do J = 1, 2 if (RAN3(J).eq.1) WHOLE = 1 end do do J = 1, 8 SUM8 = SUM8 + RAN1(J) * 2**I end do do J = 1, 4 SUM4 = SUM4 + RAN2(J) * 2**I end do do J = 1, 2 SUM2 = SUM2 + RAN3(J) * 2**I end do if (SUM8.eq.1) then SPROJ(I) = 1 SPINN = 1 else if (SUM8.eq.2) then SPROJ(I) = 2 SPINN = 1 else if (SUM8.eq.4) then SPROJ(I) = 3 SPINN = 1 else if (SUM8.eq.8) then SPROJ(I) = 4 SPINN = 1 else if (SUM8.eq.16) then SPROJ(I) = 5 SPOUT = 1 else if (SUM8.eq.32) then SPROJ(I) = 6 SPOUT = 1 else if (SUM8.eq.64) then SPROJ(I) = 7 SPOUT = 1 else if (SUM8.eq.128) then SPROJ(I) = 8 SPOUT = 1 else if (SUM4.eq.1) then SPROJ(I) = 9 SPINN = 1 else if (SUM4.eq.2) then SPROJ(I) = 10 SPINN = 1 else if (SUM4.eq.4) then SPROJ(I) = 11 SPOUT = 1 else if (SUM4.eq.8) then SPROJ(I) = 12 SPOUT = 1 else if (SUM2.eq.1) then SPROJ(I) = 13 SPINN = 1 else if (SUM2.eq.2) then SPROJ(I) = 14 SPOUT = 1 else if (WHOLE.eq.1) then SPROJ(I) = 15 SPINN = 1 SPOUT = 1 end if end do * Hit multiplicity check *---------------------------------- VETO = 0 do I = 1, 12 if (NSECHIT(I).gt.7) then HMULT(I) = 1 VETO = 1 else HMULT(I) = 0 end if end do * Build topological data *---------------------------------- do I = 1, 12 if (TRACK(I).eq.1) then TDATA(I) = TRACK(I)*2**7 + HMULT(I)*2**6 + SPROJ(I)*2 else TDATA(I) = HMULT(I)*2**6 + IBITS(NSECHIT(I),0,4)*2 end if end do * Create a SITR bank #1 with *---------------------------------- NSITR = NBANK('SITR', 1, 19) IW(NSITR + 1) = 25 * 2**24 + ! ID: day + 6 * 2**20 + ! ID: month + 6 * 2**16 + ! ID: year - 2000 + (2**1-1) * 2**12 + ! TC power + (2**2-1) * 2**8 + ! RC 1&2 power + (2**6-1) * 2**0 ! FE 0...5 ready IW(NSITR + 2) = (2**6 -1) * 2**26 + ! Sector 15..10 enable + (2**6 -1) * 2**16 + ! Sector 5..0 enable + (2**16-1) * 2**0 ! ASICS are OK IW(NSITR + 3) = (2**32-1) * 2**0 ! ASICS are OK do I = 1, 12 J = I + 3 IW(NSITR + J) = PATTERN(I) !raw data as they are end do IW(NSITR + 16) = TDATA(1) * 2**24 + TDATA(2) * 2**16 + + TDATA(3) * 2**8 + TDATA(4) * 2**0 IW(NSITR + 17) = TDATA(5) * 2**24 + TDATA(6) * 2**16 + + TDATA(7) * 2**8 + TDATA(8) * 2**0 IW(NSITR + 18) = TDATA(9) * 2**24 + TDATA(10) * 2**16 + + TDATA(11) * 2**8 + TDATA(12) * 2**0 IW(NSITR + 19) = VETO * 2**3 + SPOUT * 2**1 + SPINN * 2**0 return end