118 ,
fFlatEngine(art::ServiceHandle<rndm::NuRandomService>()->createEngine(*
this,
"HepJamesRandom",
"GenVertex"))
129 produces< std::vector<simb::MCTruth> >();
132 _debug =
p.get<
unsigned short>(
"DebugMode",0);
134 _t0 =
p.get<
double>(
"G4Time");
136 if(_t0_sigma < 0) this->
abort(
"Cannot have a negative value for G4 time jitter");
141 _tpc_v =
p.get<std::vector<std::vector<unsigned short> > >(
"TPCRange");
142 auto const xrange =
p.get<std::vector<double> > (
"XRange");
143 auto const yrange =
p.get<std::vector<double> > (
"YRange");
144 auto const zrange =
p.get<std::vector<double> > (
"ZRange");
146 auto const part_cfg =
p.get<fhicl::ParameterSet>(
"ParticleParameter");
149 auto const pdg_v = part_cfg.get<std::vector<std::vector<int> > > (
"PDGCode");
150 auto const minmult_v = part_cfg.get<std::vector<unsigned short> > (
"MinMulti");
151 auto const maxmult_v = part_cfg.get<std::vector<unsigned short> > (
"MaxMulti");
152 auto const weight_v = part_cfg.get<std::vector<double> > (
"ProbWeight");
154 auto kerange_v = part_cfg.get<std::vector<std::vector<double> > > (
"KERange");
155 auto momrange_v = part_cfg.get<std::vector<std::vector<double> > > (
"MomRange");
157 if( (kerange_v.empty() && momrange_v.empty()) ||
158 (!kerange_v.empty() && !momrange_v.empty()) ) {
159 this->
abort(
"Only one of KERange or MomRange must be empty!");
162 bool use_mom =
false;
163 if(kerange_v.empty()){
164 kerange_v = momrange_v;
168 if( pdg_v.size() != kerange_v.size() ||
169 pdg_v.size() != minmult_v.size() ||
170 pdg_v.size() != maxmult_v.size() ||
171 pdg_v.size() != weight_v.size() )
172 this->
abort(
"configuration parameters have incompatible lengths!");
175 for(
auto const&
r : pdg_v ) {
if(
r.empty() ) this->
abort(
"PDG code not given!"); }
176 for(
auto const&
r : kerange_v) {
if(
r.size()!=2) this->
abort(
"Incompatible legnth @ KE vector!"); }
178 size_t multi_min = 0;
179 for(
size_t idx=0; idx<minmult_v.size(); ++idx) {
180 if(minmult_v[idx] > maxmult_v[idx]) this->
abort(
"Particle MinMulti > Particle MaxMulti!");
181 if(minmult_v[idx] > _multi_max) this->
abort(
"Particle MinMulti > overall MultiMax!");
182 multi_min += minmult_v[idx];
185 if(_multi_max <
_multi_min) this->
abort(
"Overall MultiMax <= overall MultiMin!");
201 if(!xrange.empty() && xrange.size() >2) this->
abort(
"Incompatible legnth @ X vector!" );
202 if(!yrange.empty() && yrange.size() >2) this->
abort(
"Incompatible legnth @ Y vector!" );
203 if(!zrange.empty() && zrange.size() >2) this->
abort(
"Incompatible legnth @ Z vector!" );
206 double xmin,xmax,ymin,ymax,zmin,zmax;
207 xmin = ymin = zmin = 1.e20;
208 xmax = ymax = zmax = -1.e20;
210 auto geop = lar::providerFrom<geo::Geometry>();
211 for(
auto const& tpc_id : _tpc_v) {
212 assert(tpc_id.size() == 2);
213 size_t cid = tpc_id[0];
214 size_t tid = tpc_id[1];
215 auto const& cryostat = geop->Cryostat(cid);
216 assert(cryostat.HasTPC(tid));
218 auto const& tpc = cryostat.TPC(tid);
219 auto const& tpcabox = tpc.ActiveBoundingBox();
220 xmin = std::min(tpcabox.MinX(),
xmin);
221 ymin = std::min(tpcabox.MinY(), ymin);
222 zmin = std::min(tpcabox.MinZ(), zmin);
223 xmax = std::max(tpcabox.MaxX(), xmax);
224 ymax = std::max(tpcabox.MaxY(), ymax);
225 zmax = std::max(tpcabox.MaxZ(), zmax);
228 std::cout <<
"Using Cryostat " << tpc_id[0] <<
" TPC " << tpc_id[1]
229 <<
" ... X " << xmin <<
" => " << xmax
230 <<
" ... Y " << ymin <<
" => " << ymax
231 <<
" ... Z " << zmin <<
" => " << zmax
240 if(xrange.size()==2) {
_xrange[0] = xrange[0];
_xrange[1] = xrange[1]; }
241 if(yrange.size()==2) {
_yrange[0] = yrange[0];
_yrange[1] = yrange[1]; }
242 if(zrange.size()==2) {
_zrange[0] = zrange[0];
_zrange[1] = zrange[1]; }
245 _xrange[1] = xmax - _xrange[1];
247 _yrange[1] = ymax - _yrange[1];
249 _zrange[1] = zmax - _zrange[1];
252 assert(_xrange[0] <= _xrange[1]);
253 assert(_yrange[0] <= _yrange[1]);
254 assert(_zrange[0] <= _zrange[1]);
257 std::cout<<
"Particle generation world boundaries..."<<std::endl
258 <<
"X " << _xrange[0] <<
" => " << _xrange[1] << std::endl
259 <<
"Y " << _yrange[0] <<
" => " << _yrange[1] << std::endl
260 <<
"Z " << _zrange[0] <<
" => " << _zrange[1] << std::endl;
266 auto db = TDatabasePDG::Instance();
267 for(
size_t idx=0; idx<pdg_v.size(); ++idx) {
268 auto const&
pdg = pdg_v[idx];
269 auto const& kerange = kerange_v[idx];
276 param.
multi[0] = minmult_v[idx];
277 param.
multi[1] = maxmult_v[idx];
278 param.
weight = weight_v[idx];
279 for(
size_t i=0; i<
pdg.size(); ++i)
280 param.
mass[i] =
db->GetParticle(param.
pdg[i])->Mass();
283 if(kerange[0]<0 || kerange[1]<0)
284 this->
abort(
"You provided negative energy? Fuck off Mr. Trump.");
293 << (param.
use_mom ?
" KE range ....... " :
" Mom range ....... ")
294 << param.
kerange[0] <<
" => " << param.
kerange[1] <<
" MeV" << std::endl
std::vector< std::vector< unsigned short > > _tpc_v
CLHEP::HepRandomEngine & fFlatEngine
produces< sumdata::RunData, art::InRun >()
std::unique_ptr< CLHEP::RandFlat > fFlatRandom
std::array< double, 2 > _xrange
std::vector< PartGenParam > _param_v
process_name pandoraGausCryo1 vertexChargeCryo1 vertexStubCryo1 xmin
std::array< double, 2 > _zrange
std::vector< double > mass
std::array< double, 2 > kerange
void abort(const std::string msg) const
height to which particles are projected pnfs larsoft persistent physics cosmics Fermilab CORSIKA standard He_showers_ * db
std::unique_ptr< CLHEP::RandGauss > fNormalRandom
std::array< size_t, 2 > multi
BEGIN_PROLOG could also be cout
std::array< double, 2 > _yrange