26 #include "nusimdata/SimulationBase/MCParticle.h" 
   27 #include "nusimdata/SimulationBase/MCTruth.h" 
   30 #include "art/Framework/Core/EDAnalyzer.h" 
   31 #include "art/Framework/Principal/Event.h" 
   32 #include "art/Framework/Principal/Handle.h" 
   33 #include "art/Framework/Services/Registry/ServiceHandle.h" 
   34 #include "art_root_io/TFileService.h" 
   35 #include "art/Framework/Core/ModuleMacros.h" 
   36 #include "canvas/Persistency/Common/FindManyP.h" 
   37 #include "canvas/Utilities/Exception.h" 
   42 #include "messagefacility/MessageLogger/MessageLogger.h" 
   43 #include "fhiclcpp/ParameterSet.h" 
   44 #include "fhiclcpp/types/Table.h" 
   45 #include "fhiclcpp/types/Atom.h" 
   46 #include "cetlib/pow.h"  
   73         Name(
"SimModuleLabel"),
 
   74         Comment(
"tag of particle simulation data product")
 
   78         Name(
"SimChannelModuleLabel"),
 
   79         Comment(
"tag of channel simulation data product")
 
   84         Comment(
"tag of CRT simulation data product")
 
   89         Comment(
"Print information about what's going on")
 
  101         Name(
"ClockSpeedCRT"),
 
  102         Comment(
"Clock speed of the CRT system [MHz]")
 
  106         Name(
"CrtBackTrack"),
 
  120     virtual void analyze(
const art::Event& event) 
override;
 
  123     virtual void endJob() 
override;
 
  138     std::map<std::string, TH1D*> 
hADC;
 
  139     std::map<std::string, TH1D*> 
hNpe;
 
  174     , fSimModuleLabel       (config().SimModuleLabel())
 
  175     , fSimChannelModuleLabel(config().SimChannelModuleLabel())
 
  176     , fCRTSimLabel          (config().CRTSimLabel())
 
  177     , fVerbose              (config().
Verbose())
 
  178     , fQPed                 (config().QPed())
 
  179     , fQSlope               (config().QSlope())
 
  180     , fClockSpeedCRT        (config().ClockSpeedCRT())
 
  181     , fCrtBackTrack         (config().CrtBackTrack())
 
  190     art::ServiceHandle<art::TFileService> 
tfs;
 
  193       hADC[tagger]          = tfs->make<TH1D>(Form(
"ADC_%s", tagger.c_str()),       
"", 40, 0, 10000);
 
  194       hNpe[tagger]          = tfs->make<TH1D>(Form(
"Npe_%s", tagger.c_str()),       
"", 40, 0, 300);
 
  195       hNpeRatio[tagger]     = tfs->make<TH1D>(Form(
"NpeRatio_%s", tagger.c_str()),  
"", 40, 0, 10);
 
  196       hTime[tagger]         = tfs->make<TH1D>(Form(
"Time_%s", tagger.c_str()),      
"", 40, -5000, 5000);
 
  197       hStripDist[tagger]    = tfs->make<TH1D>(Form(
"StripDist_%s", tagger.c_str()), 
"", 40, 0,     450);
 
  198       hSipmDist[tagger]     = tfs->make<TH1D>(Form(
"SipmDist_%s", tagger.c_str()),  
"", 40, 0,     11.2);
 
  200       hEffSipmDistTotal[tagger]  = tfs->make<TH1D>(Form(
"EffSipmDistTotal_%s", tagger.c_str()),  
"", 20, 0, 11.2);
 
  201       hEffSipmDistReco[tagger]   = tfs->make<TH1D>(Form(
"EffSipmDistReco_%s", tagger.c_str()),   
"", 20, 0, 11.2);
 
  202       hEffStripDistTotal[tagger] = tfs->make<TH1D>(Form(
"EffStripDistTotal_%s", tagger.c_str()), 
"", 20, 0, 450);
 
  203       hEffStripDistReco[tagger]  = tfs->make<TH1D>(Form(
"EffStripDistReco_%s", tagger.c_str()),  
"", 20, 0, 450);
 
  204       hEffEDepTotal[tagger]      = tfs->make<TH1D>(Form(
"EffEdepTotal_%s", tagger.c_str()),      
"", 20, 0, 0.01);
 
  205       hEffEDepReco[tagger]       = tfs->make<TH1D>(Form(
"EffEdepReco_%s", tagger.c_str()),       
"", 20, 0, 0.01);
 
  206       hEffLengthTotal[tagger]    = tfs->make<TH1D>(Form(
"EffLengthTotal_%s", tagger.c_str()),    
"", 20, 0, 10);
 
  207       hEffLengthReco[tagger]     = tfs->make<TH1D>(Form(
"EffLengthReco_%s", tagger.c_str()),     
"", 20, 0, 10);
 
  209       hStripDistADC[tagger] = tfs->make<TH2D>(Form(
"StripDistADC_%s", tagger.c_str()), 
"", 20, 0, 450,  20, 0, 10000);
 
  210       hSipmDistADC[tagger]  = tfs->make<TH2D>(Form(
"SipmDistADC_%s", tagger.c_str()),  
"", 20, 0, 11.2, 20, 0, 10000);
 
  211       hStripDistNpe[tagger] = tfs->make<TH2D>(Form(
"StripDistNpe_%s", tagger.c_str()), 
"", 20, 0, 450,  20, 0, 300);
 
  212       hSipmDistNpe[tagger]  = tfs->make<TH2D>(Form(
"SipmDistNpe_%s", tagger.c_str()),  
"", 20, 0, 11.2, 20, 0, 300);
 
  213       hSipmDistNpeRatio[tagger]  = tfs->make<TH2D>(Form(
"SipmDistNpeRatio_%s", tagger.c_str()),  
"", 20, 0, 11.2, 20, 0, 10);
 
  218     std::cout<<
"----------------- Full CRT Detector Simulation Analysis Module -------------------"<<std::endl;
 
  227       std::cout<<
"============================================"<<std::endl
 
  228                <<
"Run = "<<
event.run()<<
", SubRun = "<<
event.subRun()<<
", Event = "<<
event.id().event()<<std::endl
 
  229                <<
"============================================"<<std::endl;
 
  238     art::ServiceHandle<cheat::ParticleInventoryService> pi_serv;
 
  239     auto particleHandle = 
event.getValidHandle<std::vector<simb::MCParticle>>(
fSimModuleLabel);
 
  242     art::Handle< std::vector<sbnd::crt::CRTData>> crtDataHandle;
 
  243     std::vector<art::Ptr<sbnd::crt::CRTData> > crtDataList;
 
  245       art::fill_ptr_vector(crtDataList, crtDataHandle);
 
  247     art::FindManyP<sim::AuxDetIDE> findManyIdes(crtDataHandle, event, 
fCRTSimLabel);
 
  250     art::Handle<std::vector<sim::AuxDetSimChannel> > channels;
 
  257     std::map<int, simb::MCParticle> particles;
 
  259     for (
auto const& particle: (*particleHandle)){
 
  262       int partID = particle.TrackId();
 
  263       particles[partID] = particle;
 
  271     std::map<int, std::vector<sbnd::crt::CRTData>> crtData;
 
  272     for(
size_t i  = 0; i < crtDataList.size(); i++){
 
  276       for(
auto const& 
id : trueIDs){
 
  277         crtData[id].push_back(*crtDataList[i]);
 
  282       if(particles.find(trueID) == particles.end()) 
continue;
 
  283       if(!(
std::abs(particles[trueID].PdgCode()) == 13 && particles[trueID].Mother() == 0)) 
continue;
 
  286       std::vector<art::Ptr<sim::AuxDetIDE>> ides = findManyIdes.at(i);
 
  288       double x = 0, 
y = 0, 
z = 0;
 
  289       for(
auto const& ide : ides){
 
  290         x += (ide->entryX + ide->exitX)/2.;
 
  291         y += (ide->entryY + ide->exitY)/2.;
 
  292         z += (ide->entryZ + ide->exitZ)/2.;
 
  299       int channel = crtDataList[i]->Channel();
 
  303       double npe = ((double)crtDataList[i]->ADC() - 
fQPed)/
fQSlope;
 
  308       hSipmDistADC[tagger]->Fill(sipmDist, crtDataList[i]->ADC());
 
  311       if(channel % 2 == 0){
 
  312         double npe1 = ((double)crtDataList[i+1]->ADC() - 
fQPed)/
fQSlope;
 
  320       hStripDistADC[tagger]->Fill(stripDist, crtDataList[i]->ADC());
 
  323       hADC[tagger]->Fill(crtDataList[i]->ADC());
 
  324       hNpe[tagger]->Fill(npe);
 
  329       hTime[tagger]->Fill(time);
 
  336     for (
auto& adsc : *channels) {
 
  338       if(adsc.AuxDetSensitiveID() == UINT_MAX) {
 
  339         mf::LogWarning(
"CRTDetSimAna") << 
"AuxDetSimChannel with ID: UINT_MAX\n" 
  340                                        << 
"skipping channel...";
 
  346       std::vector<sim::AuxDetIDE> ides = adsc.AuxDetIDEs();
 
  348       for(
auto const& ide : ides){
 
  350                           (ide.entryY + ide.exitY)/2, 
 
  351                           (ide.entryZ + ide.exitZ)/2};
 
  352         int trueID = ide.trackID;
 
  354         double length = std::sqrt(std::pow(ide.entryX - ide.exitX, 2)
 
  355                                   + std::pow(ide.entryY - ide.exitY, 2)
 
  356                                   + std::pow(ide.entryZ - ide.exitZ, 2));
 
  362         if(particles.find(trueID) == particles.end()) 
continue;
 
  363         if(!(
std::abs(particles[trueID].PdgCode()) == 13 && particles[trueID].Mother() == 0)) 
continue;
 
  372         if(crtData.find(trueID) == crtData.end()) 
continue;
 
  375         for(
auto const& data : crtData[trueID]){
 
  377           if(stripName == stripNameData) match = 
true;
 
art::EDAnalyzer::Table< Config > Parameters
process_name opflash particleana ie ie ie z
fhicl::Atom< double > QSlope
std::vector< int > AllTrueIds(const art::Event &event, const sbnd::crt::CRTData &data)
Utilities related to art service access. 
process_name opflash particleana ie x
std::map< std::string, TH1D * > hEffStripDistReco
std::map< std::string, TH1D * > hSipmDist
CRTTaggerGeo GetTagger(std::string taggerName) const 
CRTBackTracker fCrtBackTrack
std::map< std::string, TH1D * > hEffStripDistTotal
fhicl::Atom< art::InputTag > SimModuleLabel
fhicl::Atom< double > QPed
std::map< std::string, TH1D * > hEffLengthTotal
art::InputTag fCRTSimLabel
name of CRT producer 
bool fVerbose
print information about what's going on 
fhicl::Atom< art::InputTag > CRTSimLabel
std::map< std::string, TH1D * > hNpe
int TrueIdFromTotalEnergy(const art::Event &event, const sbnd::crt::CRTData &data)
art::InputTag fSimModuleLabel
name of MCParticle producer in g4 
fhicl::Table< CRTBackTracker::Config > CrtBackTrack
CRTDetSimAna(Parameters const &config)
virtual void beginJob() override
Access the description of detector geometry. 
object containing MC truth information necessary for making RawDigits and doing back tracking ...
process_name opflash particleana ie ie y
virtual void analyze(const art::Event &event) override
std::string ChannelToStripName(size_t channel) const 
art framework interface to geometry description for auxiliary detectors 
double DistanceDownStrip(geo::Point_t position, std::string stripName) const 
BEGIN_PROLOG vertical distance to the surface Name
CRTStripGeo GetStrip(std::string stripName) const 
std::map< std::string, TH2D * > hSipmDistNpeRatio
fhicl::Atom< double > ClockSpeedCRT
size_t NumTaggers() const 
Description of geometry of one entire detector. 
Definition of data types for geometry description. 
std::string GetTaggerName(std::string name) const 
std::map< std::string, TH1D * > hNpeRatio
fhicl::Atom< art::InputTag > SimChannelModuleLabel
std::map< std::string, TH2D * > hSipmDistNpe
std::map< std::string, TH1D * > hADC
std::map< std::string, TH1D * > hEffSipmDistReco
virtual void endJob() override
std::map< std::string, TH1D * > hEffEDepTotal
fhicl::Atom< bool > Verbose
std::map< std::string, TH2D * > hSipmDistADC
stream1 can override from command line with o or output services user sbnd
std::map< std::string, TH1D * > hEffEDepReco
art::ServiceHandle< art::TFileService > tfs
std::map< std::string, TH2D * > hStripDistADC
std::map< std::string, TH1D * > hStripDist
art::InputTag fSimChannelModuleLabel
name of SimChannel producer in g4 
Vector cross(Vector const &a, Vector const &b)
Return cross product of two vectors. 
ROOT::Math::PositionVector3D< ROOT::Math::Cartesian3D< double >, ROOT::Math::GlobalCoordinateSystemTag > Point_t
Type for representation of position in physical 3D space. 
std::map< std::string, TH1D * > hTime
std::map< std::string, TH1D * > hEffLengthReco
std::map< std::string, TH1D * > hEffSipmDistTotal
std::map< std::string, TH2D * > hStripDistNpe
art framework interface to geometry description 
BEGIN_PROLOG could also be cout
geo::GeometryCore const * fGeometryService
double DistanceBetweenSipms(geo::Point_t position, size_t channel) const