* * $Id: tpc_ionization_centers.F,v 1.2 2004/05/28 16:11:45 dpp Exp $ * * $Log: tpc_ionization_centers.F,v $ * Revision 1.2 2004/05/28 16:11:45 dpp * -> move constants to common, initialized in tpc_init_det_response * * Revision 1.1 2004/01/23 21:10:02 dpp * -> NEW * -> create the iozization centers used by tpc_pad_response * -> add tag to argument of tpc_ionization centers * -> add tag to argument of tpc_add_hit * * * #include "sys/CLEO_machine.h" #include "pilot.h" SUBROUTINE TPC_IONIZATION_CENTERS(ILCD, 2 PHI_EXIT,PHI_ENTR,Z_EXIT,Z_ENTR,TAG) C....................................................................... C. C. TPC_IONIZATION_CENTERS - create ionizations centers, C. create pad response at the ionization centers C. C. COMMON : C. CALLS : C. CALLED : C. AUTHOR : D. Peterson C. C. VERSION : 1.00 C. CREATED : 01-Dec-2003 C. C....................................................................... #if defined(CLEO_TYPCHK) IMPLICIT NONE #endif SAVE C arguments INTEGER ILCD REAL PHI_EXIT REAL PHI_ENTR REAL Z_EXIT REAL Z_ENTR INTEGER TAG #if defined(CLEO_DOITTPC) #include "doit/duseq/tfconspa.inc" #include "doit/duseq/tfindpar.inc" C which includes C #include "cl3seq/cdgm3/cdgeompa.inc" C #include "doit/duseq/tfgeompa.inc" #include "doit/duseq/tfctlcde.inc" #include "doit/duseq/tfgeomcd.inc" #include "cl3seq/cdgm3/cdgeomcd.inc" #include "doit/duseq/cdscrtcd.inc" #include "doit/duseq/tpccom.inc" #include "doit/duseq/tftrakcd.inc" #include "/home/dpp/lcd_simulation/cornell/hep/lcd/io/fortran/lcdevt.inc" C local REAL Z_DIF REAL Z_NOW REAL PHI_DIF REAL PHI_STRT REAL PHI_STOP REAL PHI_NOW REAL PH_HIT REAL PHIREL REAL CELCALC_R_STRT,CELCALC_DIF_STRT REAL CELCALC_R_STOP,CELCALC_DIF_STOP INTEGER CELCALC_I_STRT INTEGER CELCALC_I_STOP REAL CELL_FRAC REAL PHI_REMAIN REAL NORM_TRACK_LENGTH INTEGER M_PHI_ION PARAMETER (M_PHI_ION=1000) REAL PHI_ION(M_PHI_ION),REL_PH_ION(M_PHI_ION) INTEGER N_PHI_ION INTEGER I_PHI_ION C arguments of tpc_pad_response INTEGER IADR INTEGER NEXT_CELL REAL PH_FRAC C function REAL Z2PI c23456789 123456789 123456789 123456789 123456789 123456789 123456789 12 * ----------Executable code starts here--------------------------------- C----------------------------------------------------------------------- C determine overall phi limits; C PHI_STRT -> PHI_STOP is alway in the +phi direction but may cross 2pi C----------------------------------------------------------------------- Z_DIF=Z_EXIT-Z_ENTR PHI_DIF=PHI_EXIT-PHI_ENTR IF(PHI_DIF.GE.0.)THEN IF(PHI_DIF.LE.PI)THEN PHI_STRT=PHI_ENTR PHI_STOP=PHI_EXIT ELSE PHI_STRT=PHI_EXIT PHI_STOP=PHI_ENTR +twopi ENDIF ELSE IF(PHI_DIF.GE.-PI)THEN PHI_STRT=PHI_EXIT PHI_STOP=PHI_ENTR ELSE PHI_STRT=PHI_ENTR PHI_STOP=PHI_EXIT +twopi ENDIF ENDIF PHI_DIF=PHI_STOP-PHI_STRT C----------------------------------------------------------------------- C determine if cell boundaries are crossed C in preparation to create ionization centers C after calulating the relative location as in tpc_pad_response C add .5 to provide a location relative to the low cell edge C----------------------------------------------------------------------- C <----(phi direction) C ----------------------------------------------------------------------- C | | | | | | | | C | | | | | | | | C | | | | | | | | C | | | | | | | | C | | | | | | | | C ----------------------------------------------------------------------- C cell 5 4 3 2 1 0 ncell-1 C ^ ^ ^ C | | | C | | PHIFCD C if PHI is here if PHI is here C CELLCALC_R=4.8 CELLCALC_R=2.3 C CELLCALC_I=5 CELLCALC_I=2 C CELLCALC_DIF=+.3 CELLCALC_DIF=.8 C _STRT position PHIREL=Z2PI(PHI_STRT-PHIFCD(ILCD)) CELCALC_R_STRT=PHIREL/CELLCD(ILCD) CELCALC_I_STRT=CELCALC_R_STRT+.5 CELCALC_DIF_STRT=CELCALC_R_STRT-CELCALC_I_STRT +.5 C _STOP position PHIREL=Z2PI(PHI_STOP-PHIFCD(ILCD)) CELCALC_R_STOP=PHIREL/CELLCD(ILCD) CELCALC_I_STOP=CELCALC_R_STOP+.5 CELCALC_DIF_STOP=CELCALC_R_STOP-CELCALC_I_STOP +.5 C----------------------------------------------------------------------- C create ionization centers C C ph normilization is 1 unit per {x,y} track length equal to 1 cell height C NOTE: z component of track length is not accounted for in total ionization C----------------------------------------------------------------------- NORM_TRACK_LENGTH=SQRT((PHI_DIF*RCD(ILCD))**2+CELRCD(1,ILCD)**2) 2 /CELRCD(1,ILCD) C cell boundary not crossed IF( 1 (CELCALC_I_STRT.EQ.CELCALC_I_STOP).OR. 2 (ABS(PHI_DIF).LE.1.E-6))THEN N_PHI_ION=1 PHI_ION(N_PHI_ION)=PHI_STRT+(PHI_STOP-PHI_STRT)/2. REL_PH_ION(N_PHI_ION)=1. C cell boundary crossed ELSE C add the entering cell and advance to the far edge of the entering cell PHI_NOW=PHI_STRT N_PHI_ION=1 CELL_FRAC=1.-CELCALC_DIF_STRT PHI_ION(N_PHI_ION)=PHI_NOW+CELL_FRAC*CELLCD(ILCD)/2. REL_PH_ION(N_PHI_ION)=CELL_FRAC*CELLCD(ILCD)/ABS(PHI_DIF) 2 *NORM_TRACK_LENGTH PHI_NOW=PHI_NOW+CELL_FRAC*CELLCD(ILCD) C test if there is still a full cell width remaining and C add the full cell at the center of the cell C and advance to the far edge of the current cell 103 PHI_REMAIN=PHI_STOP-PHI_NOW IF(PHI_REMAIN.GE.CELLCD(ILCD))THEN N_PHI_ION=N_PHI_ION+1 CELL_FRAC=1. PHI_ION(N_PHI_ION)=PHI_NOW+CELL_FRAC*CELLCD(ILCD)/2. REL_PH_ION(N_PHI_ION)=CELL_FRAC*CELLCD(ILCD)/ABS(PHI_DIF) 2 *NORM_TRACK_LENGTH PHI_NOW=PHI_NOW+CELLCD(ILCD) GO TO 103 ENDIF C add the exiting cell IF(PHI_REMAIN.GT. 0.)THEN N_PHI_ION=N_PHI_ION+1 CELL_FRAC=PHI_REMAIN/CELLCD(ILCD) PHI_ION(N_PHI_ION)=PHI_NOW+CELL_FRAC*CELLCD(ILCD)/2. REL_PH_ION(N_PHI_ION)=CELL_FRAC*CELLCD(ILCD)/ABS(PHI_DIF) 2 *NORM_TRACK_LENGTH ENDIF ENDIF C----------------------------------------------------------------------- C loop over the ionization centers C----------------------------------------------------------------------- I_PHI_ION=0 105 I_PHI_ION=I_PHI_ION+1 IF(I_PHI_ION.LE.N_PHI_ION)THEN PHI_NOW=PHI_ION(I_PHI_ION) IF(ABS(PHI_DIF).GT.1.E-6)THEN Z_NOW=Z_ENTR+Z_DIF*(PHI_NOW-PHI_ENTR)/PHI_DIF ELSE Z_NOW=Z_ENTR+Z_DIF*.5 ENDIF C----------------------------------------------------------------------- C get the pad hits C----------------------------------------------------------------------- CALL TPC_PAD_RESPONSE(0,ILCD,PHI_NOW, 2 IADR,PH_FRAC,NEXT_CELL) 111 CONTINUE IF(NEXT_CELL.GT.0)THEN CALL TPC_PAD_RESPONSE(1,ILCD,PHI_NOW, 2 IADR,PH_FRAC,NEXT_CELL) PH_HIT=PH_FRAC *TPC_min_ion_PH *REL_PH_ION(I_PHI_ION) c IF(IADR.EQ.65097)THEN c print 9901,ILCD,IADR,Z_NOW,Z_DIF,PH_HIT,TAG c 9901 format(' tpc_ionization_centers: diag:',' ilcd=',I3, c 1 ' iadr=',I7,' Z_NOW=',F7.3,' z_dif=',F7.3, c 2 ' phi_now=',F7.3,' tag=',I7) c ENDIF CALL TPC_ADD_HIT(ILCD,IADR,Z_NOW,Z_DIF,PH_HIT,TAG) C end of condition that there are more cells GO TO 111 ENDIF C end of loop over ionization centers GO TO 105 ENDIF C end of compliation flag CLEO_DOITTPC #endif RETURN END