MODULE MYanalyzer USE IOunits USE Threshold USE TPCdata USE TPCpaw USE TPCcalcAmplitude USE TPCtrack USE MyMinuit USE Space PRIVATE PUBLIC :: DenseData PUBLIC :: analyzEvent,MY_book PRIVATE :: NF_analysis,HF_test,HF_over PRIVATE :: noOverflow CONTAINS SUBROUTINE analyzEvent(iEvent) INTEGER,INTENT(IN) :: iEvent INTEGER :: IERR,IVETO,nOver REAL,DIMENSION(100) :: Xdata TYPE(Line_type) :: seedTrack,Ztrack REAL(KIND=spPrec) :: X0Start,PhiStart,z,theta REAL :: time0,deltaT INTEGER,DIMENSION(10) :: iGroupV=(/8,14,20,26,32,34,40,46,52,58/) INTEGER,DIMENSION(1) :: iRowSeed1=(/2/),iRowSeed2=(/6/) INTEGER,DIMENSION(5) :: iRowT=(/2,3,4,5,6/) ! Where am I? ! PRINT*,"Event: ",iEvent,EventNumber," Run:",RunNumber ! get the signal amplitudes CALL calcAmplitudeFoil() CALL HF_amplitude(iRowT) CALL NF_event() ! preselection CALL eventVeto(iGroupV,iRowSeed1,iRowSeed2,iRowT,IVETO) CALL HF_veto(IVETO) IF( IVETO /= 0 )RETURN nOver = noOverflow(iRowT) CALL HF_over(nOver) IF( nOver /= 0 )RETURN ! plain event dispay and plot pulse shapes ! CALL NF_event() ! CALL plotPulseRow(iRowT) CALL plotPulseEvent() ! call hf_test(iEvent) ! find seed track and NF for event display CALL findSeedTrack(iRowSeed1,iRowSeed2,iRowT,seedTrack,IERR) CALL HF_seedTrack(IERR+1) ! CALL NF_event(seedTrack) IF( IERR /= 0 ) RETURN ! Z-Y track, linear regression or fit CALL TimeLine(iRowT,time0,deltaT) CALL TrackFitZ(iRowT,ZTrack) CALL getLine(ZTrack,Z,THETA) ! fill ntuple for analysis CALL getLine(seedTrack,X0Start,PhiStart) Xdata = -1.0E6 Xdata(1) = RunNumber Xdata(2) = EventNumber Xdata(3) = X0Start Xdata(4) = PhiStart Xdata(5) = time0 Xdata(6) = deltat Xdata(7) = z Xdata(8) = theta CALL NF_analysis(Xdata) END SUBROUTINE analyzEvent FUNCTION noOverflow(iRowT) RESULT(nOver) INTEGER,DIMENSION(:),INTENT(IN) :: iRowT INTEGER :: nOver,iR,iRow,iG,iGroup nOver = 0 ! reject events with overflow DO iR=1,size(iRowT) iRow = iRowT(iR) DO iG=1,nGroupsinRow(iRow) iGroup = iGroupofRow(iG,iRow) IF( minval(IADC(1:nTbGroup(iGroup),iGroup)) <= 0 ) nOver = nOver+1 ENDDO ENDDO END FUNCTION noOverflow SUBROUTINE MY_book() ! book histograms & Ntuples for analyzEvent CHARACTER(LEN=8),DIMENSION(1000) :: CHtag CHARACTER(LEN=20) :: CHtitle INTEGER :: ntag,i ! Histograms, numbers >1039 CALL HBOOK1(1040,"test",64,0.5,64.5,0.0) call hbook1(1041,"t0",400,0.0,4000.0,0.0) call hbook1(1050,"nOver",40,-0.5,39.5,0.0) ! do i=1,ngroups ! WRITE(UNIT=CHtitle,FMT=*) "mean amplitude",i ! CALL HBPROF(1100+i,CHtitle,50,0.0,10000.0,-0.5,4000.0,' ') ! enddo CALL HBOOK2(1046,"time difference",40,0.0,0.5,40,-50.0,350.0,0.0) CALL HBOOK2(1047,"shape",40,0.0,0.5,40,0.0,1.0,0.0) CALL HBOOK2(1048,"shape",40,-50.0,350.0,40,0.0,1.0,0.0) CHtag(1) = "RUN" CHtag(2) = "EVENT" CHtag(3) = "X0START" CHtag(4) = "PHISTART" CHtag(5) = "TIME0" CHtag(6) = "DELTAT" CHtag(7) = "Z" CHtag(8) = "THETA" ntag = 8 CALL NT_book(951,"Analysis",ntag,CHtag) END SUBROUTINE MY_book ! NTUPLE fill ********************************************** SUBROUTINE NF_analysis(Xdata) REAL,DIMENSION(:),INTENT(IN) :: Xdata CALL HFN(951,Xdata) END SUBROUTINE NF_analysis ! HISTOGRAM fill ********************************************** SUBROUTINE HF_test(iEvent) INTEGER,INTENT(IN) :: iEvent integer:: iRow,iG,iGroup,nHitRow,iTmax,iT0 real :: amplitude,t0,amplsum,amplratio,ampllate,amplmax DO iGroup=1,nGroups CALL getSignalGroup(iGroup,Amplitude,T0) if( amplitude>1.0 )then CALL HFILL(1040,real(iGroup),0.0,amplitude) call hfill(1041,t0,0.0,1.0) endif ! call hfill(1100+iGroup,REAL(iEvent),amplitude,1.0) enddo DO iRow=1,nRows amplsum = 0.0 amplmax = 0.0 nHitRow = 0 DO iG=1,nGroupsinRow(iRow) iGroup = iGroupofRow(iG,iRow) CALL getSignalGroup(iGroup,Amplitude,T0) amplsum = amplsum + Amplitude IF( Amplitude > amplmax )THEN iTmax = T0 amplmax = Amplitude ENDIF IF( Amplitude > 0.0 ) nHitRow = nHitRow + 1 ENDDO IF( nHitRow > 1 )THEN DO iG=1,nGroupsinRow(iRow) iGroup = iGroupofRow(iG,iRow) CALL getSignalGroup(iGroup,Amplitude,T0) IF( Amplitude > 0.0 )THEN amplratio = Amplitude / amplsum iT0 = T0 IF( nTbin/=0 )THEN ampllate = sum(ADC(iT0+81:iT0+130,iGroup)) / 50.0 ampllate = -ampllate / Amplitude ELSE ampllate = 0.0 ENDIF CALL HF2(1046,amplratio,REAL(iT0-iTmax),1.0) CALL HF2(1047,amplratio,ampllate,1.0) CALL HF2(1048,REAL(iT0-iTmax),ampllate,1.0) ENDIF ENDDO ENDIF ENDDO END SUBROUTINE HF_test SUBROUTINE HF_over(nOver) INTEGER,INTENT(IN) :: nOver CALL HF1(1050,REAL(nOver),1.0) END SUBROUTINE HF_over ! >>>> WRITE DENSE DATA >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> SUBROUTINE DenseData() USE DataFormats, only : WriteDenseData ! INTEGER :: IVETO ! get the signal amplitudes CALL calcAmplitudeFoil() ! preselection ! CALL eventVeto(IVETO) ! IF( IVETO /= 0 )RETURN CALL WriteDenseData() END SUBROUTINE DenseData END MODULE MYanalyzer