00001
00002 '''
00003 Usage:
00004 '''
00005
00006 from UserTagging.UserTaggingAlg import UserTaggingAlg
00007 from UserTagging.Models import Tag, Data, Int, Float, IntArray, FloatArray
00008 from GaudiPython import SUCCESS, FAILURE
00009 from GaudiPython import gbl, loaddict
00010 from DybPython.Util import irange
00011 import GaudiKernel.SystemOfUnits as units
00012 import PyCintex
00013
00014 loaddict("libCLHEPRflx")
00015 loaddict("libHepMCRflx")
00016
00017 class GenData(UserTaggingAlg):
00018 '''Add Generator Info to UserData'''
00019
00020
00021 def initTagList(self):
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 self.addTag('Dummy', ''
00044 ).addData('GenData', '/Event/UserData/General/GenData'
00045 ).addInt('nGen', 'nVtxTotal', 'nOutTotal'
00046 ).addIntArray('genType', 'nVtx'
00047 ).addFloatArray('genX', 'genY', 'genZ'
00048 ).addIntArray('nIn', 'nOut', 'in_pid', 'out_pid'
00049 ).addFloatArray('in_x', 'in_y', 'in_z', 'in_t', 'in_KE', 'in_px', 'in_py', 'in_pz'
00050 ).addFloatArray('out_x', 'out_y', 'out_z', 'out_t', 'out_KE', 'out_px', 'out_py', 'out_pz')
00051
00052 self.target_de_name = '/dd/Structure/AD/db-ade1/db-sst1/db-oil1'
00053
00054 self.genTypes = {
00055 "IBD_gds":11, "IBD_lso":12, "IBD_oil":13, "IBD_acrylic":14,
00056 "U238_gds":21, "U238_lso":22, "U238_PMT":23, "U238_sst":24,
00057 "Th232_gds":31, "Th232_lso":32, "Th232_PMT":33, "Th232_sst":34,
00058 "K40_gds":41, "K40_lso":42, "K40_PMT":43, "K40_sst":44,
00059 "Co60_sst":54,
00060 }
00061
00062
00063 def check(self, evt):
00064
00065 readoutHdr = evt['/Event/Readout/ReadoutHeader']
00066 if not readoutHdr:
00067 self.warning('cannot find readoutHdr')
00068 return
00069
00070 genHdrs = readoutHdr.findHeaders(gbl.DayaBay.GenHeader.classID())
00071 self.SaveGenData(genHdrs)
00072
00073 self.tagIt('Dummy')
00074
00075
00076 def SaveGenData(self, genHdrs):
00077
00078 myData = self.getTag('Dummy').getData('GenData')
00079
00080 de = self.getDet(self.target_de_name)
00081 if not de:
00082 self.info('Failed to get DE' + self.target_de_name)
00083 return FAILURE
00084 Gaudi = PyCintex.makeNamespace('Gaudi')
00085
00086
00087
00088 nGen = len(genHdrs)
00089
00090 nVtxTotal = 0
00091
00092 nOutTotal = 0
00093
00094 for genHdr in genHdrs:
00095 genName = genHdr.generatorName()
00096 self.debug("genName:" + genName)
00097 myData.append('genType', self.genTypes.get(genName, 0))
00098
00099 nVtx = 0
00100 genEvt = genHdr.event()
00101 for vtx in irange(genEvt.vertices_begin(), genEvt.vertices_end()):
00102
00103 nVtx += 1
00104 nVtxTotal += 1
00105 position = vtx.position()
00106 genGlbPoint = Gaudi.XYZPoint(
00107 position.x(),
00108 position.y(),
00109 position.z()
00110 )
00111 genLclPoint = de.geometry().toLocal(genGlbPoint)
00112 myData.append('in_x', genLclPoint.x()/units.mm)
00113 myData.append('in_y', genLclPoint.y()/units.mm)
00114 myData.append('in_z', genLclPoint.z()/units.mm)
00115 myData.append('in_t', vtx.position().t()/units.microsecond)
00116
00117 if nVtx == 1:
00118 myData.append('genX', genLclPoint.x()/units.mm)
00119 myData.append('genY', genLclPoint.y()/units.mm)
00120 myData.append('genZ', genLclPoint.z()/units.mm)
00121
00122 nIn = 0
00123 for particle in irange(vtx.particles_in_const_begin(),
00124 vtx.particles_in_const_end()):
00125
00126 nIn += 1
00127 if nIn == 1:
00128 myData.append('in_pid', particle.pdg_id())
00129 momentum = particle.momentum()
00130 myData.append('in_KE', (momentum.e() - momentum.m())/units.MeV)
00131 myData.append('in_px', momentum.px()/units.MeV)
00132 myData.append('in_py', momentum.py()/units.MeV)
00133 myData.append('in_pz', momentum.pz()/units.MeV)
00134 myData.append('nIn', nIn)
00135
00136 nOut = 0
00137 for particle in irange(vtx.particles_out_const_begin(),
00138 vtx.particles_out_const_end()):
00139
00140 nOut += 1
00141 nOutTotal += 1
00142 myData.append('out_pid', particle.pdg_id())
00143 momentum = particle.momentum()
00144 myData.append('out_KE', (momentum.e() - momentum.m())/units.MeV)
00145 myData.append('out_px', momentum.px()/units.MeV)
00146 myData.append('out_py', momentum.py()/units.MeV)
00147 myData.append('out_pz', momentum.pz()/units.MeV)
00148
00149 myData.append('nOut', nOut)
00150
00151 myData.append('nVtx', nVtx)
00152
00153
00154 myData.set("nGen", nGen
00155 ).set("nVtxTotal", nVtxTotal
00156 ).set("nOutTotal", nOutTotal)
00157
00158
00159
00160
00161
00162 def configure(argv=[]):
00163 pass
00164
00165 def run(app):
00166 myAlg = GenData("UserData::GenData")
00167 app.addAlgorithm(myAlg)
00168 pass