/* This file is part of MAUS: http://micewww.pp.rl.ac.uk:8080/projects/maus
*
* MAUS is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* MAUS is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with MAUS. If not, see .
*
*/
#include "src/map/MapCppTrackerRadiationNoiseModel/MapCppTrackerRadiationNoiseModel.hh"
#include
#include "src/common_cpp/API/PyWrapMapBase.hh"
namespace MAUS {
PyMODINIT_FUNC init_MapCppTrackerRadiationNoiseModel(void) {
PyWrapMapBase::PyWrapMapBaseModInit
("MapCppTrackerRadiationNoiseModel", "", "", "", "");
}
MapCppTrackerRadiationNoiseModel::MapCppTrackerRadiationNoiseModel()
: MapBase("MapCppTrackerRadiationNoiseModel") {
// Do nothing
}
MapCppTrackerRadiationNoiseModel::~MapCppTrackerRadiationNoiseModel() {
delete _random;
// Do nothing
}
void MapCppTrackerRadiationNoiseModel::_birth(const std::string& argJsonConfigDocument) {
// Pull out the global settings
if (!Globals::HasInstance()) {
GlobalsManager::InitialiseGlobals(argJsonConfigDocument);
}
Json::Value* json = Globals::GetConfigurationCards();
// _clusters_on = (*json)["SciFiClusterReconOn"].asBool();
_random = new TRandom3();
// Build the geometery helper instance
MiceModule* module = Globals::GetReconstructionMiceModules();
std::vector modules =
module->findModulesByPropertyString("SensitiveDetector", "SciFi");
_geometry_helper = SciFiGeometryHelper(modules);
_geometry_helper.Build();
_cavityBrightness = (*json)["SciFiRadiationNoise_CavityBrightness"].asDouble();
// Make a list of the cavities in the experment
std::vector cavityPositions;
std::vector cavity_modules =
module->findModulesByPropertyExists("string", "CavityMode");
for (std::vector::const_iterator it = cavity_modules.begin();
it != cavity_modules.end(); ++it) {
cavityPositions.push_back((*it)->globalPosition().z());
}
if (cavityPositions.size() == 0) {
std::cerr << "No cavities found. No RF noise will be modelled.\n";
} else {
// Cycle through planes, find the nearest cavity and apply 1/r^2 reduction to
// the nominal rate.
for (std::vector::const_iterator it = modules.begin();
it != modules.end(); ++it) {
int tracker = (*it)->propertyInt("Tracker");
int station = (*it)->propertyInt("Station");
int plane = (*it)->propertyInt("Plane");
int plane_id = (station-1)*3+plane+1;
if (tracker == 0) plane_id *= -1;
double plane_z = (*it)->globalPosition().z();
double nearestCavity = 1.0e300;
for (std::vector::iterator cav_it = cavityPositions.begin();
cav_it != cavityPositions.end(); ++cav_it) {
double separation = fabs((*cav_it) - plane_z);
if (separation < nearestCavity) {
nearestCavity = separation;
}
}
// 1/r^2 losses assuming spherical emission
double planeRadius = (*it)->propertyDouble("ActiveRadius");
_planeNoiseRates[plane_id] = _cavityBrightness*planeRadius*planeRadius /
(4.0*nearestCavity*nearestCavity);
}
}
// Need a more precise determination - this will do for now!
// for (int plane_it = -15; plane_it <= 15; ++plane_it) {
// _planeNoiseRates[plane_it] = 100.0;
// }
_npe_mean = 10.0;
_npe_rms = 5.0;
_centralFibre = 106.5;
}
void MapCppTrackerRadiationNoiseModel::_death() {
// Do nothing
}
void MapCppTrackerRadiationNoiseModel::_process(Data* data) const {
Spill& spill = *(data->GetSpill());
/* return if not physics spill */
if (spill.GetDaqEventType() != "physics_event")
return;
if (spill.GetReconEvents()) {
for (unsigned int k = 0; k < spill.GetReconEvents()->size(); k++) {
SciFiEvent *event = spill.GetReconEvents()->at(k)->GetSciFiEvent();
if (!event) {
continue;
}
int spillNum = spill.GetSpillNumber();
int eventNum = spill.GetReconEvents()->at(k)->GetPartEventNumber();
for (std::map::const_iterator plane_it = _planeNoiseRates.begin();
plane_it != _planeNoiseRates.end(); ++plane_it) {
int plane_id = plane_it->first;
int tracker = (plane_id < 0?0:1);
int temp_plane_id = abs(plane_id);
int station = ((temp_plane_id - 1) / 3) + 1;
int plane = (temp_plane_id - 1) % 3;
int number_digits = _getNumberDigits(plane_id);
for (int digit_num = 0; digit_num < number_digits; ++digit_num) {
int channel = _getRandomChannel();
double npe = fabs(_random->Gaus(_npe_mean, _npe_rms));
double time = 0.0;
SciFiDigit* digit = new SciFiDigit(spillNum, eventNum,
tracker, station, plane, channel, npe, time);
event->add_digit(digit);
}
}
}
} else {
std::cout << "No recon events found\n";
}
}
int MapCppTrackerRadiationNoiseModel::_getNumberDigits(int plane) const {
std::map::const_iterator result = _planeNoiseRates.find(plane);
if (result == _planeNoiseRates.end()) {
throw Exceptions::Exception(Exceptions::nonRecoverable,
"Looking for a plane that doesn't exist!",
"MapCppTrackerRadiationNoiseModel::_getNumberDigits(int plane)");
}
double rate = _planeNoiseRates.find(plane)->second;
return _random->Poisson(rate);
}
int MapCppTrackerRadiationNoiseModel::_getRandomChannel() const {
return static_cast(_random->Uniform(0.0, _centralFibre*2.0));
}
} // ~namespace MAUS