00001
00002
00003
00004
00005
00006
00007
00008
00009 from DybPython.DybPythonAlg import DybPythonAlg
00010 from GaudiPython import SUCCESS, FAILURE
00011 from GaudiPython import gbl, loaddict
00012 from DybPython.Util import irange
00013
00014
00015 TH1F = gbl.TH1F
00016 TH2F = gbl.TH2F
00017
00018
00019
00020 loaddict("libCLHEPRflx")
00021 loaddict("libHepMCRflx")
00022 Detector = gbl.DayaBay.Detector
00023 AdPmtSensor = gbl.DayaBay.AdPmtSensor
00024 ServiceMode = gbl.ServiceMode
00025 ReconStatus = gbl.ReconStatus
00026
00027
00028 class EnergyStatsAlg(DybPythonAlg):
00029 "Algorithm to make Energy Statistics file"
00030 def __init__(self,name):
00031 DybPythonAlg.__init__(self,name)
00032 return
00033
00034 def initialize(self):
00035 status = DybPythonAlg.initialize(self)
00036 if status.isFailure(): return status
00037 self.info("initializing")
00038
00039 self.cableSvc = self.svc('ICableSvc','StaticCableSvc')
00040 if self.cableSvc == None:
00041 self.error("Failed to get StaticCableSvc")
00042 return FAILURE
00043
00044
00045 hist = TH1F("genEnergy","Generated Particle Energy",100,937.0,940.0)
00046 hist.GetXaxis().SetTitle("Particle Energy [MeV]")
00047 hist.GetYaxis().SetTitle("Generated Particles")
00048 hist.SetLineColor(4)
00049 self.stats["/file0/energy/genEnergy"] = hist
00050
00051
00052 hist = TH1F("genKineticEnergy","Generated Particle Kinetic Energy",
00053 100,0.0,10.0)
00054 hist.GetXaxis().SetTitle("Particle Kinetic Energy [MeV]")
00055 hist.GetYaxis().SetTitle("Generated Particles")
00056 hist.SetLineColor(4)
00057 self.stats["/file0/energy/genKineticEnergy"] = hist
00058
00059 hist = TH1F("simScintEnergy","Energy deposited in Scintillator",
00060 500,0.0,10.0)
00061 hist.GetXaxis().SetTitle("Ionization Energy [MeV]")
00062 hist.GetYaxis().SetTitle("Simulated Events")
00063 hist.SetLineColor(4)
00064 self.stats["/file0/energy/simScintEnergy"] = hist
00065
00066 hist = TH1F("simQuenchedEnergy","Quenched Energy in Scintillator",
00067 500,0.0,10.0)
00068 hist.GetXaxis().SetTitle("Quenched Ionization Energy [MeV]")
00069 hist.GetYaxis().SetTitle("Simulated Events")
00070 hist.SetLineColor(4)
00071 self.stats["/file0/energy/simQuenchedEnergy"] = hist
00072
00073 hist = TH2F("simQuenching",
00074 "Quenching vs. Total Energy in Scintillator",
00075 300,0.0,10.0,
00076 300,0.0,1.5)
00077 hist.GetXaxis().SetTitle("Ionization Energy [MeV]")
00078 hist.GetYaxis().SetTitle("Quenched Energy / Ionization Energy")
00079 self.stats["/file0/energy/simQuenching"] = hist
00080
00081 hist = TH1F("simHits","Number of Simulated Hits on PMTs",
00082 500,0.0,2000)
00083 hist.GetXaxis().SetTitle("Simulated Number of Photoelectrons [NPE]")
00084 hist.GetYaxis().SetTitle("Simulated Events")
00085 hist.SetLineColor(4)
00086 self.stats["/file0/energy/simHits"] = hist
00087
00088 hist = TH2F("simHitsVsQE",
00089 "Number of Simulated Hits vs. Quenched Energy",
00090 200,0.0,10.0,
00091 200,0.0,200)
00092 hist.GetXaxis().SetTitle("Quenched Energy [MeV]")
00093 hist.GetYaxis().SetTitle("Photelectrons / Quenched Energy")
00094 self.stats["/file0/energy/simHitsVsQE"] = hist
00095
00096 hist = TH2F("adcSumVsSimHits",
00097 "Sum of Raw ADC vs. Number of Simulated PMT Hits",
00098 200,0.0,2000,
00099 200,0.0,1000.0)
00100 hist.GetXaxis().SetTitle("Simulated Number of Photoelectrons [NPE]")
00101 hist.GetYaxis().SetTitle("Raw ADC Sum / Photoelectrons")
00102 self.stats["/file0/energy/adcSumVsSimHits"] = hist
00103
00104 hist = TH1F("calibAdcSum","Sum of Calibrated ADC",500,0.0,2000.)
00105 hist.GetXaxis().SetTitle("Sum of calibrated ADC values in AD [ADC_SPE]")
00106 hist.GetYaxis().SetTitle("Simulated Triggered Readouts")
00107 hist.SetLineColor(4)
00108 self.stats["/file0/energy/calibAdcSum"] = hist
00109
00110 hist = TH2F("calibAdcSumVsSimHits",
00111 "Sum of Calibrated ADC vs. Number of Simulated PMT Hits",
00112 200,0.0,2000.0,
00113 200,0.0,2.)
00114 hist.GetXaxis().SetTitle("Simulated Number of Photoelectrons [NPE]")
00115 hist.GetYaxis().SetTitle("Calibrated ADC Sum / Photoelectrons")
00116 self.stats["/file0/energy/calibAdcSumVsSimHits"] = hist
00117
00118 hist = TH1F("reconEnergy","Reconstructed Energy",500,0.0,10.0)
00119 hist.GetXaxis().SetTitle("Reconstructed Visible Energy [E_rec]")
00120 hist.GetYaxis().SetTitle("Triggered Readouts")
00121 hist.SetLineColor(4)
00122 self.stats["/file0/energy/reconEnergy"] = hist
00123
00124 hist = TH2F("calibAdcSumVsReconEnergy",
00125 "Sum of Calibrated ADC vs. Reconstructed Energy",
00126 200,0.0,10.0,
00127 200,0.0,150.)
00128 hist.GetXaxis().SetTitle("Reconstructed Visible Energy [E_rec]")
00129 hist.GetYaxis().SetTitle("Calibrated ADC Sum / Reconstructed Energy")
00130 self.stats["/file0/energy/calibAdcSumVsReconEnergy"] = hist
00131
00132 hist = TH2F("reconEnergyVsQE","Reconstructed vs. Quenched Energy",
00133 200,0.0,10.0,
00134 200,0.0,1.5)
00135 hist.GetXaxis().SetTitle("Quenched Energy [MeV]")
00136 hist.GetYaxis().SetTitle("Reconstructed Energy / Quenched Energy")
00137 self.stats["/file0/energy/reconEnergyVsQE"] = hist
00138
00139 return SUCCESS
00140
00141 def execute(self):
00142 self.info("executing")
00143
00144 evt = self.evtSvc()
00145
00146
00147 genHdr = evt["/Event/Gen/GenHeader"]
00148 if genHdr == None:
00149 self.error("Failed to get GenHeader")
00150 return FAILURE
00151
00152 totalGenEnergy = 0
00153 totalGenKineticEnergy = 0
00154 genEvt = genHdr.event()
00155 for vertex in irange(genEvt.vertices_begin(),
00156 genEvt.vertices_end()):
00157 for particle in irange(vertex.particles_out_const_begin(),
00158 vertex.particles_out_const_end()):
00159 totalGenEnergy += particle.momentum().e()
00160 totalGenKineticEnergy += (particle.momentum().e()
00161 - particle.momentum().m())
00162 self.stats["/file0/energy/genEnergy"].Fill(totalGenEnergy)
00163 self.stats["/file0/energy/genKineticEnergy"].Fill(totalGenKineticEnergy)
00164
00165
00166 simHdr = evt["/Event/Sim/SimHeader"]
00167 if simHdr == None:
00168 self.error("Failed to get SimHeader")
00169 return FAILURE
00170 statsHdr = simHdr.unobservableStatistics()
00171 simScintEnergy = 0
00172 simQuenchedEnergy = 0
00173 if statsHdr == None:
00174 self.warning("No SimStatistics for this event")
00175 else:
00176 simStats = statsHdr.stats()
00177 simScintEnergy = (simStats["EDepInGdLS"].sum()
00178 + simStats["EDepInLS"].sum())
00179 simQuenchedEnergy = (simStats["QEDepInGdLS"].sum()
00180 + simStats["QEDepInLS"].sum())
00181 self.stats["/file0/energy/simScintEnergy"].Fill( simScintEnergy )
00182 self.stats["/file0/energy/simQuenchedEnergy"].Fill(
00183 simQuenchedEnergy )
00184 if simScintEnergy > 0:
00185 self.stats["/file0/energy/simQuenching"].Fill( simScintEnergy,
00186 simQuenchedEnergy/simScintEnergy )
00187
00188 hitCollectionMap = simHdr.hits().hitCollection()
00189 detector = Detector("DayaBayAD1")
00190 hitCollection = hitCollectionMap[detector.siteDetPackedData()]
00191 if hitCollection == None:
00192 self.info("No Hit Collection for "+detector.detName())
00193 return SUCCESS
00194 hits = hitCollectionMap[detector.siteDetPackedData()].collection()
00195 nSimHits = 0
00196 for hit in hits:
00197 pmtId = AdPmtSensor( hit.sensDetId() )
00198 if pmtId.ring() < 1: continue
00199 nSimHits += 1
00200 self.stats["/file0/energy/simHits"].Fill( nSimHits )
00201 if simQuenchedEnergy > 0:
00202 self.stats["/file0/energy/simHitsVsQE"].Fill( simQuenchedEnergy,
00203 nSimHits/simQuenchedEnergy)
00204
00205
00206 readoutHdr = evt["/Event/Readout/ReadoutHeader"]
00207 if readoutHdr == None:
00208 self.error("Failed to get ReadoutHeader")
00209 return FAILURE
00210 readout = readoutHdr.readout()
00211 if readout == None:
00212 self.info("No Triggered Readout for this event")
00213 return SUCCESS
00214 adcSum = 0
00215 svcMode = ServiceMode( readoutHdr.context(), 0 )
00216 for channelPair in readout.channelReadout():
00217 channel = channelPair.second
00218 chanId = channel.channelId()
00219 pmtId = self.cableSvc.adPmtSensor( chanId, svcMode )
00220 if pmtId.ring() < 1: continue
00221
00222 adcSum += channel.peakAdc()
00223 if nSimHits > 0:
00224 self.stats["/file0/energy/adcSumVsSimHits"].Fill( nSimHits,
00225 adcSum/nSimHits )
00226
00227
00228 calibReadoutHdr = evt["/Event/CalibReadout/CalibReadoutHeader"]
00229 if calibReadoutHdr == None:
00230 self.error("Failed to get CalibReadoutHeader")
00231 return FAILURE
00232 calibReadout = calibReadoutHdr.calibReadout()
00233 if calibReadout == None:
00234 self.info("No Calibrate Readout for this event")
00235 return SUCCESS
00236 calibAdcSum = 0
00237 svcMode = ServiceMode( calibReadoutHdr.context(), 0 )
00238 for channelPair in calibReadout.channelReadout():
00239 channel = channelPair.second
00240 chanId = channel.channelId()
00241 pmtId = self.cableSvc.adPmtSensor( chanId, svcMode )
00242 if pmtId.ring() < 1: continue
00243 calibAdcSum += channel.peakAdc()
00244 self.stats["/file0/energy/calibAdcSum"].Fill( calibAdcSum )
00245 if nSimHits > 0:
00246 self.stats["/file0/energy/calibAdcSumVsSimHits"].Fill(
00247 nSimHits,
00248 calibAdcSum/nSimHits
00249 )
00250
00251 recHdr = evt["/Event/Rec/RecHeader"]
00252 if recHdr == None:
00253 self.error("Failed to get RecHeader")
00254 return FAILURE
00255 recResults = recHdr.recResults()
00256 recTrigger = recResults["AdSimple"]
00257 if recTrigger.energyStatus() == ReconStatus.kGood:
00258 reconEnergy = recTrigger.energy()
00259 self.stats["/file0/energy/reconEnergy"].Fill(reconEnergy)
00260 self.stats["/file0/energy/calibAdcSumVsReconEnergy"].Fill(
00261 reconEnergy,
00262 calibAdcSum/reconEnergy )
00263 if simQuenchedEnergy > 0:
00264 self.stats["/file0/energy/reconEnergyVsQE"].Fill(
00265 simQuenchedEnergy,
00266 reconEnergy/simQuenchedEnergy )
00267
00268 return SUCCESS
00269
00270 def finalize(self):
00271 self.info("finalizing")
00272 status = DybPythonAlg.finalize(self)
00273 return status
00274
00275
00276
00277
00278 def configure():
00279 from StatisticsSvc.StatisticsSvcConf import StatisticsSvc
00280 statsSvc = StatisticsSvc()
00281 statsSvc.Output ={"file0":"energyStats.root"}
00282 import DataSvc
00283 DataSvc.Configure()
00284 return
00285
00286 def run(app):
00287 '''
00288 Configure and add an algorithm to job
00289 '''
00290 app.ExtSvc += ["StaticCableSvc", "StatisticsSvc"]
00291 energyStatsAlg = EnergyStatsAlg("MyEnergyStats")
00292 app.addAlgorithm(energyStatsAlg)
00293 pass
00294