module unp_mod ! Uses use precision_mod use det_geom_mod, ONLY: max_planes_d, max_wires_d, max_planes_p, max_wires_p, max_scints, first_adc_plane, last_adc_plane, first_adc_wire, last_adc_wire, max_planes_t, max_wires_t, max_wires_sc, ndplanes, npplanes, ntplanes use tdc_mod use chambers_mod use namelist_mod use tdcmap_mod use calibrations_mod use hists_mod ! Variables integer, private, EXTERNAL :: blocat integer, private, EXTERNAL :: bdlen integer (kind=i4), public, PARAMETER :: dc_mngw = max_wires_d * max_planes_d * 2 integer (kind=i4), public, PARAMETER :: pc_mngw = max_wires_p * max_planes_p * 2 integer (kind=i4), public, PARAMETER :: tc_mngw = max_wires_t * max_planes_t * 8 integer (kind=i4), public, PARAMETER :: sc_mngw = max_scints * 8 type (tdc_TYPE), public, TARGET, dimension (dc_mngw) :: dctdc type (tdc_TYPE), public, TARGET, dimension (pc_mngw) :: pctdc type (tdc_SC_type), public, TARGET, dimension (sc_mngw) :: sctdc type (tdc_type), public, TARGET, dimension (tc_mngw) :: tctdc type (adc_PC_type), public, TARGET, dimension (pc_mngw) :: pcadc type (adc_SC_type), public, TARGET, dimension (sc_mngw) :: scadc type (tdcraw_TYPE), public, TARGET, dimension (dc_mngw) :: dctdc_raw type (tdcraw_TYPE), public, TARGET, dimension (pc_mngw) :: pctdc_raw type (tdcraw_TYPE), public, TARGET, dimension (sc_mngw) :: sctdc_raw type (tdcraw_TYPE), public, TARGET, dimension (pc_mngw) :: pcadc_raw type (tdcraw_TYPE), public, TARGET, dimension (sc_mngw) :: scadc_raw type (tdcraw_TYPE), public, TARGET, dimension (sc_mngw) :: PuTdc_Raw type (tdcraw_TYPE), private, TARGET, dimension (tc_mngw) :: tctdc_raw integer, public :: dc_ihits integer, public :: pc_ihits integer, public :: sc_ihits integer, public :: pcadc_ihits integer, public :: scadc_ihits integer, public :: tc_ihits integer, public :: nerr_hit_dc integer, public :: nerr_hit_pc integer, public :: nerr_hit_pcadc integer, public :: letime_max integer, public :: tetime_min integer (kind=i4), public, TARGET :: dctdcraw_ihits integer (kind=i4), public, TARGET :: pctdcraw_ihits integer (kind=i4), public, TARGET :: sctdcraw_ihits integer (kind=i4), public, TARGET :: scadcraw_ihits integer (kind=i4), public, TARGET :: pcadcraw_ihits integer (kind=i4), public, TARGET :: putdcraw_ihits integer (kind=i4), private, TARGET :: tctdcraw_ihits integer (kind=i4), public, TARGET, dimension (max_planes_d) :: dc_nphits integer (kind=i4), public, TARGET, dimension (max_planes_p) :: pc_nphits integer (kind=i4), public, TARGET, dimension (max_scints) :: sc_nphits integer (kind=i4), private, TARGET, dimension (max_planes_t) :: tc_nphits integer (kind=i4), public, TARGET, dimension (max_planes_p) :: pcadc_nphits integer (kind=i4), public, TARGET, dimension (max_scints) :: scadc_nphits integer (kind=i4), public, TARGET :: dc_nwhits integer (kind=i4), public, TARGET :: pc_nwhits integer (kind=i4), public, TARGET :: sc_nwhits integer (kind=i4), private, TARGET :: tc_nwhits integer (kind=i4), public, TARGET :: pcadc_nwhits integer (kind=i4), public, TARGET :: scadc_nwhits type (whits_TYPE), public, TARGET, dimension (max_planes_d,max_wires_d) :: dcwhits type (whits_TYPE), public, TARGET, dimension (max_planes_p,max_wires_p) :: pcwhits type (whits_TYPE), public, TARGET, dimension (max_scints,max_wires_sc) :: scwhits type (whits_TYPE), public, TARGET, dimension (max_planes_p,max_wires_p) :: pcadc_whits type (whits_TYPE), public, TARGET, dimension (max_scints,max_wires_sc) :: scadc_whits type (whits_TYPE), private, TARGET, dimension (max_planes_t,max_wires_t) :: tcwhits integer (kind=i4), public, dimension (mbank) :: nWordsFBC integer (kind=i4), private :: max_crate_tdc logical, public, dimension (mbank) :: PulserHit = .FALSE. integer (kind=I4), private :: ib integer (kind=I4), public, dimension (mbank) :: NpulserHits = 0 integer (kind=i4), private :: versionno integer (kind=i4), public, dimension (mbank) :: first_tdc_slot integer (kind=i4), public, dimension (mbank) :: last_tdc_slot integer (kind=i4), public, dimension (nslot,mbank) :: nw_slot logical, private, dimension (mbank) :: sparsified integer (kind=i4), private, dimension (mbank) :: nstarters integer (kind=i4), private, dimension (mbank,5) :: startslots real (kind=R4), public :: m1adc real (kind=R4), public :: m2adc real (kind=R4), public :: m12adc logical, private, PARAMETER :: FillFastbusMapHist = .TRUE. integer, private, PARAMETER :: IDH_RAWTDCFBU1 = IDH_TDCUNP_RAW + 1 integer, private, PARAMETER :: IDH_RAWTDCFBU2 = IDH_TDCUNP_RAW + 2 integer, private, PARAMETER :: IDH_RAWTDCFBU3 = IDH_TDCUNP_RAW + 3 integer, private, PARAMETER :: IDH_RAWPACT13 = IDH_TDCUNP_RAW + 13 integer, private, PARAMETER :: IDH_RAWPACT23 = IDH_TDCUNP_RAW + 23 integer, private, PARAMETER :: IDH_RAWTDCFBU1_ERR = IDH_TDCUNP_RAW + 100 integer, private, PARAMETER :: IDH_RAWTDCFBU2_ERR = IDH_TDCUNP_RAW + 200 integer, private, PARAMETER :: IDH_EVENT_LENGTH = IDH_TDCUNP_RAW + 301 integer, private, PARAMETER :: IDH_EVENT_DCTDC = IDH_TDCUNP_RAW + 310 integer, private, PARAMETER :: IDH_EVENT_PCTDC = IDH_TDCUNP_RAW + 311 integer, private, PARAMETER :: IDH_EVENT_PCADC = IDH_TDCUNP_RAW + 312 logical, private, PARAMETER :: debugPrint = .false. ! Subroutines and functions public function tdcunp (PRINT) private function tdcunp_bank (indat, lendat, PRINT) public subroutine UnpTDCP (banknum) private subroutine DumpFbcmap () public subroutine tdc_listhits () end module unp_mod Date 1 Dec 00 Gets data from ybos banks and creates and fills data structures for tdc's and adc's. History records move to unpmc_mod. Modified to handle tdc's in common-start mode Modified to fill tec data ---------------------------------------------------------------------------Author: Art Olin
Version: April 03
integer, private, EXTERNAL :: blocat
integer, private, EXTERNAL :: bdlen
integer (kind=i4), public, PARAMETER :: dc_mngw = max_wires_d * max_planes_d * 2 Each scintillator is hooked up to a TDC which
integer (kind=i4), public, PARAMETER :: pc_mngw = max_wires_p * max_planes_p * 2 Each scintillator is hooked up to a TDC which
integer (kind=i4), public, PARAMETER :: tc_mngw = max_wires_t * max_planes_t * 8 Each scintillator is hooked up to a TDC which
integer (kind=i4), public, PARAMETER :: sc_mngw = max_scints * 8 Each scintillator is hooked up to a TDC which
type (tdc_TYPE), public, TARGET, dimension (dc_mngw) :: dctdc can handle 8 complete signals.
type (tdc_TYPE), public, TARGET, dimension (pc_mngw) :: pctdc can handle 8 complete signals.
type (tdc_SC_type), public, TARGET, dimension (sc_mngw) :: sctdc
type (tdc_type), public, TARGET, dimension (tc_mngw) :: tctdc
type (adc_PC_type), public, TARGET, dimension (pc_mngw) :: pcadc
type (adc_SC_type), public, TARGET, dimension (sc_mngw) :: scadc
type (tdcraw_TYPE), public, TARGET, dimension (dc_mngw) :: dctdc_raw
type (tdcraw_TYPE), public, TARGET, dimension (pc_mngw) :: pctdc_raw
type (tdcraw_TYPE), public, TARGET, dimension (sc_mngw) :: sctdc_raw
type (tdcraw_TYPE), public, TARGET, dimension (pc_mngw) :: pcadc_raw
type (tdcraw_TYPE), public, TARGET, dimension (sc_mngw) :: scadc_raw
type (tdcraw_TYPE), public, TARGET, dimension (sc_mngw) :: PuTdc_Raw
type (tdcraw_TYPE), private, TARGET, dimension (tc_mngw) :: tctdc_raw
integer, public :: dc_ihits
integer, public :: pc_ihits
integer, public :: sc_ihits
integer, public :: pcadc_ihits
integer, public :: scadc_ihits
integer, public :: tc_ihits
integer, public :: nerr_hit_dc
integer, public :: nerr_hit_pc
integer, public :: nerr_hit_pcadc
integer, public :: letime_max
integer, public :: tetime_min
integer (kind=i4), public, TARGET :: dctdcraw_ihits
integer (kind=i4), public, TARGET :: pctdcraw_ihits
integer (kind=i4), public, TARGET :: sctdcraw_ihits
integer (kind=i4), public, TARGET :: scadcraw_ihits
integer (kind=i4), public, TARGET :: pcadcraw_ihits
integer (kind=i4), public, TARGET :: putdcraw_ihits
integer (kind=i4), private, TARGET :: tctdcraw_ihits
integer (kind=i4), public, TARGET, dimension (max_planes_d) :: dc_nphits
integer (kind=i4), public, TARGET, dimension (max_planes_p) :: pc_nphits
integer (kind=i4), public, TARGET, dimension (max_scints) :: sc_nphits
integer (kind=i4), private, TARGET, dimension (max_planes_t) :: tc_nphits
integer (kind=i4), public, TARGET, dimension (max_planes_p) :: pcadc_nphits
integer (kind=i4), public, TARGET, dimension (max_scints) :: scadc_nphits
integer (kind=i4), public, TARGET :: dc_nwhits
integer (kind=i4), public, TARGET :: pc_nwhits
integer (kind=i4), public, TARGET :: sc_nwhits
integer (kind=i4), private, TARGET :: tc_nwhits
integer (kind=i4), public, TARGET :: pcadc_nwhits
integer (kind=i4), public, TARGET :: scadc_nwhits
type (whits_TYPE), public, TARGET, dimension (max_planes_d,max_wires_d) :: dcwhits
type (whits_TYPE), public, TARGET, dimension (max_planes_p,max_wires_p) :: pcwhits
type (whits_TYPE), public, TARGET, dimension (max_scints,max_wires_sc) :: scwhits
type (whits_TYPE), public, TARGET, dimension (max_planes_p,max_wires_p) :: pcadc_whits
type (whits_TYPE), public, TARGET, dimension (max_scints,max_wires_sc) :: scadc_whits
type (whits_TYPE), private, TARGET, dimension (max_planes_t,max_wires_t) :: tcwhits
integer (kind=i4), public, dimension (mbank) :: nWordsFBC # TDC words in banks per event
integer (kind=i4), private :: max_crate_tdc # TDC words in banks per event
logical, public, dimension (mbank) :: PulserHit = .FALSE.
integer (kind=I4), private :: ib
integer (kind=I4), public, dimension (mbank) :: NpulserHits = 0
integer (kind=i4), private :: versionno
integer (kind=i4), public, dimension (mbank) :: first_tdc_slot
integer (kind=i4), public, dimension (mbank) :: last_tdc_slot
integer (kind=i4), public, dimension (nslot,mbank) :: nw_slot
logical, private, dimension (mbank) :: sparsified
integer (kind=i4), private, dimension (mbank) :: nstarters
integer (kind=i4), private, dimension (mbank,5) :: startslots
real (kind=R4), public :: m1adc
real (kind=R4), public :: m2adc
real (kind=R4), public :: m12adc
logical, private, PARAMETER :: FillFastbusMapHist = .TRUE.
integer, private, PARAMETER :: IDH_RAWTDCFBU1 = IDH_TDCUNP_RAW + 1
integer, private, PARAMETER :: IDH_RAWTDCFBU2 = IDH_TDCUNP_RAW + 2
integer, private, PARAMETER :: IDH_RAWTDCFBU3 = IDH_TDCUNP_RAW + 3
integer, private, PARAMETER :: IDH_RAWPACT13 = IDH_TDCUNP_RAW + 13
integer, private, PARAMETER :: IDH_RAWPACT23 = IDH_TDCUNP_RAW + 23
integer, private, PARAMETER :: IDH_RAWTDCFBU1_ERR = IDH_TDCUNP_RAW + 100
integer, private, PARAMETER :: IDH_RAWTDCFBU2_ERR = IDH_TDCUNP_RAW + 200
integer, private, PARAMETER :: IDH_EVENT_LENGTH = IDH_TDCUNP_RAW + 301
integer, private, PARAMETER :: IDH_EVENT_DCTDC = IDH_TDCUNP_RAW + 310
integer, private, PARAMETER :: IDH_EVENT_PCTDC = IDH_TDCUNP_RAW + 311
integer, private, PARAMETER :: IDH_EVENT_PCADC = IDH_TDCUNP_RAW + 312
logical, private, PARAMETER :: debugPrint = .false. set this to TRUE to get "iflag" debug info
public function tdcunp (PRINT) logical :: PRINT $ Local variables integer (kind=I4) :: tdcunp ! Calls: hbook1, hbook2, hf1, kerror, kerror2 end function tdcunp $--------------------------------------------------------------------- $ Decode TDC DATA from 1877 TDC $--------------------------------------------------------------------- $ Input: $ PRINT-LOG*4 - PRINT flag (TRUE = PRINT on, FALSE = PRINT off) $ RETURN Status code : $ 0 = no problems $ 1 = fatal problem, no DATA available $ 2 = DATA FORMAT error, some DATA might be available $ 3 = DATA size too large, DATA was truncated $--------------------------------------------------------------------- $ Modified and expanded : 23-oct-1998 Renee Poutissou $---------------------------------------------------------------------
private function tdcunp_bank (indat, lendat, PRINT) integer (kind=I4), INTENT(IN) :: indat integer (kind=I4), INTENT(IN) :: lendat logical :: PRINT integer (kind=I4) :: tdcunp_bank ! Calls: hf2, init_tdc_loop, kerror, kerror2 end function tdcunp_bank --------------------------------------------------------------------- Decode TDC data from any one bank of 1877 TDC data --------------------------------------------------------------------- Input: indat - INT*4 lendat - INT*4 print -LOG*4 - Print flag (TRUE = print on, FALSE = print off) Output : tdcunp_bank - INT*4 - Return Status code 0 = no problems 1 = fatal problem, no data available 2 = data format error, some data might be availab 3 = data size too large, data was truncated 4 = strange triggerend gate time 5 = no trigger endgate 10 = tdc header missing --------------------------------------------------------------------- 1877 and 1877S TDC data format The TDC records edges and has a bit to identify if it is a rising edge or a falling edge. These edges are referred to as TE (trailing edge) and LE (leading edge) | | | ________ _________ | | | | | |______| |___________| |_____________| time goes ---------> earlier time reads larger value 1 0 9 8 5 3 0 0 0 0 0 0 0 LE TE LE TE Stop readout goes the opposite way <----------------------- The latest TE value always comes first in the data buffer The Te has the bit 0x10000 turned on =========================================================================== Present tdc error functionality: iflag > 0 is set for error conditions missing a leading or trailing edge which indicates questionable data but occurs legitimately - when a leading or trailing edge occurs outside the tdc range or the difference between two pulses is less than the required 10 ns. iflag < 0 events are less usual and more likely to indicate tdc malfunctions. All iflag \=0 hits are presently eliminated from the regular data structures and therefore not analyzed. (We should discuss this.) They are stored in the raw tdc structures. An occurance of an iflag < 0 hit is sufficient to kill an event. At present, monitoring these tdc errors with qod will require raw_out >0 instead of raw_out = 0 As explained above the sequence of edges in a TDC should be TE LE TE LE TE LE .... There should always be a pair of TE LE with the same channel ID iflag kerr do_record description: 1 Yes a trailing edge following another trailing edge in same channel 2 Yes a trailing edge following another trailing edge from different channel 3 Yes Last hit in TDC, but it is a trailing edge. 4 Yes this is the first hit, but it is a leading edge. 5 Yes this is a leading edge following another leading edge. 6 Yes this is a leading edge following a trailing edge from a different channel. This error always generates a pair of hits. 7 Yes if iwid < 0, probably indicates previous pulse was missing LE and this pulse was missing TE. Impossible to spot this condition. Set w = 0 8 Yes No no valid mapping for this channel 9 Yes Yes no valid mapping for this channel and last data word was a trailing edge from a different channel, Register the previous trailing edge 10 Yes No tdc channel number out of range 0..95 The following only apply to PACT (common START channels) 11 Yes its not the first te on this channel therefore not what we expect for sparse mode 14 Yes a trailing edge following another trailing edge, NOT what we expect in start mode 17 Yes this is the first hit, but it is a leading edge. 18 Yes a leading edge following another leading edge. 19 Yes this is a leading edge following a trailing edge from a different channel. 20 Yes if iwid < 0, probably indicates previous pulse was missing LE and this pulse was missing TE. Impossible to spot this condition if iwid >= 0. =========================================================================
public subroutine UnpTDCP (banknum) integer (kind=I4), INTENT(OUT) :: banknum ! Calls: kerror, rite end subroutine UnpTDCP ======================================================================= Unpacks tdc header data from begin run records. These headers are used to check that all tdc's are actually unpacked. common-start-mode TDC's are now specified in the header file =======================================================================Author: Art Olin
Version: Nov 2001
private subroutine DumpFbcmap () end subroutine DumpFbcmap
public subroutine tdc_listhits () ! Calls: rite end subroutine tdc_listhits ======================================================== Date: October 1998 Revised for new data structures: Art Olin 1999 -------------------------------------------------------- Description: Print out all TDC hit information if raw_out = 2. For raw_out =1 the raw tdc structure is filled but not printed April 25, 2001 - Roy Wilds - Altered printout format. Now accomodates addtional TDC and ADC structures ========================================================Author: Renee Poutisou