MODULE LCIO4TPC #define PTRTYPE integer USE LCIOapi USE TPCdata PRIVATE ! OpenReadLCIO(CHFILE,IOS) ! ReadLCIOnTbin(nTbin) ! ReadLCIOComment(chComment,chDate) ! CloseReadLCIO() PUBLIC :: OpenReadLCIO,CloseReadLCIO,ReadLCIOComment,ReadLCIOnTbin ! ReadLCIONextEvent(IERR) PUBLIC :: ReadLCIONextEvent ! OpenWriteLCIO() ! CloseWriteLCIO() ! WriteLCIOHeader(chComment,chDate) ! WriteLCIOEvent(iflag) PUBLIC :: OpenWriteLCIO,CloseWriteLCIO,WriteLCIOHeader,WriteLCIOEvent PRIVATE :: ReadLCIOTPChit,ReadLCIOMCtrack PTRTYPE,PRIVATE :: reader, writer CONTAINS SUBROUTINE OpenReadLCIO(CHFILE,IOS) CHARACTER(LEN=*),INTENT(IN) :: CHFILE INTEGER,INTENT(OUT) :: IOS INTEGER :: status LOGICAL,SAVE :: first=.TRUE. IF( first )THEN reader = lcrdrcreate() first = .FALSE. ELSE status = lcrdrclose( reader ) ENDIF status = lcrdropen( reader, CHFILE ) IF( status == LCIO_SUCCESS )THEN IOS = 0 ELSE IOS = 1 ENDIF END SUBROUTINE OpenReadLCIO SUBROUTINE ReadLCIOnTbin(nTbin) INTEGER,INTENT(OUT) :: nTbin PTRTYPE :: event,tphcol,tphit INTEGER :: nTb,iHit,nHits,ievent,iflag LOGICAL,SAVE :: first=.TRUE. IF( .not.first )THEN nTbin = -1 RETURN ENDIF nTbin = -2 first = .FALSE. event_loop: DO ievent=1,10 event = lcrdrreadnextevent(reader,LCIO_READ_ONLY) IF( event==0 ) cycle event_loop tphcol = lcevtgetcollection(event,LCIO_TPCHIT) IF( tphcol==0 ) cycle event_loop iflag = lccolgetflag(tphcol) IF( .NOT.BTEST(iflag,LCIO_TPCBIT_RAW) )THEN ! no raw data stored nTbin = 0 RETURN ENDIF nHits = lccolgetnumberofelements( tphcol ) hit_loop: DO iHit=1,nHits tphit = lccolgetelementat(tphcol,iHit) IF(tphit==0) cycle hit_loop nTb = lctphgetnrawdatawords(tphit) IF( nTb > 0 )THEN nTbin = nTb exit event_loop ENDIF ENDDO hit_loop ENDDO event_loop END SUBROUTINE ReadLCIOnTbin SUBROUTINE ReadLCIOComment(chComment,chDate) CHARACTER(LEN=*),INTENT(OUT) :: chComment,chDate PTRTYPE :: runhdr runhdr = lcrdrreadnextrunheader( reader, LCIO_READ_ONLY ) chComment = lcrhdgetdetectorname( runHdr ) chDate = lcrhdgetdescription( runHdr ) END SUBROUTINE ReadLCIOComment SUBROUTINE ReadLCIONextEvent(IERR) INTEGER,INTENT(OUT) :: IERR PTRTYPE :: event IERR = 0 event = lcrdrreadnextevent( reader,LCIO_READ_ONLY ) IF( event==0 ) THEN IERR = -1 RETURN ENDIF RunNumber = lcevtgetrunnumber(event) EventNumber = lcevtgeteventnumber(event) CALL ReadLCIOTPChit(event) CALL ReadLCIOMCtrack(event) END SUBROUTINE ReadLCIONextEvent SUBROUTINE ReadLCIOTPChit(event) PTRTYPE,INTENT(IN) :: event PTRTYPE :: tphcol,tphit INTEGER :: iflag,nHits,iHit,iGroup,iP,iPad,nTb,i,rawData REAL :: Amplitude,Time0 tphcol = lcevtgetcollection(event, LCIO_TPCHIT ) IF( tphcol==0 ) RETURN nHits = lccolgetnumberofelements( tphcol ) iflag = lccolgetflag(tphcol) IF( nTbin>0 .AND. BTEST(iflag,LCIO_TPCBIT_RAW)& .AND. .NOT.BTEST(iflag,1) )THEN ! nTbin ==0: no space for RawData ! BTEST(iflag,LCIO_TPCBIT_RAW): RawData not in LCIO ! BTEST(iflag,1): use Amplitude / Time0 instead IADC = -1 DO iHit=1,nHits tphit = lccolgetelementat(tphcol,iHit) IF( tphit==0 ) cycle iGroup = lctphgetcellid(tphit) nTb = lctphgetnrawdatawords(tphit) IF( nTb>0 .AND. nTb/=nTbin )THEN PRINT*,"WARNING, ReadLCIOEvent> time bins of this channel doesnt match nTbin" PRINT*,"EventNumber:",EventNumber," Group:",iGroup," nTb:",nTb," nTbin:",nTbin IF( nTb>nTbin ) nTb=nTbin ENDIF DO i=1,nTb ! LCIO feature: timebins run from [0,nTb-1] rawData = lctphgetrawdataword(tphit,i-1) IF( rawData < 0 )THEN PRINT*,"WARNING, ReadLCIOEvent> IADC is negative" rawData = 0 ELSEIF( rawData > huge(IADC(1,1)) )THEN PRINT*,"WARNING, ReadLCIOEvent> IADC >",huge(IADC(1,1)) PRINT*,"What FADC do you have? Increase kind for IADC." rawData = huge(IADC(1,1)) ENDIF IADC(i,iGroup) = rawData ENDDO ! in case nTb