All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Classes | Public Member Functions | Private Types | Private Member Functions | Private Attributes | List of all members
SpacePointAnalysisMC::SpacePointAnalysisMC Class Reference
Inheritance diagram for SpacePointAnalysisMC::SpacePointAnalysisMC:
IHitEfficiencyHistogramTool

Classes

struct  ideCompare
 

Public Member Functions

 SpacePointAnalysisMC (fhicl::ParameterSet const &pset)
 Constructor. More...
 
 ~SpacePointAnalysisMC ()
 Destructor. More...
 
void configure (fhicl::ParameterSet const &pset) override
 
void initializeHists (art::ServiceHandle< art::TFileService > &, const std::string &) override
 Interface for initializing the histograms to be filled. More...
 
void initializeTuple (TTree *) override
 Interface for initializing the tuple variables. More...
 
void endJob (int numEvents) override
 Interface for method to executve at the end of run processing. More...
 
void fillHistograms (const art::Event &) const override
 Interface for filling histograms. More...
 
- Public Member Functions inherited from IHitEfficiencyHistogramTool
virtual ~IHitEfficiencyHistogramTool () noexcept=default
 Virtual Destructor. More...
 
virtual ~IHitEfficiencyHistogramTool () noexcept=default
 Virtual Destructor. More...
 

Private Types

using SimIDESet = std::set< const sim::IDE *, ideCompare >
 
using IDEToVoxelIDMap = std::unordered_map< const sim::IDE *, sim::LArVoxelID >
 
using VoxelIDToIDESetMap = std::map< sim::LArVoxelID, SimIDESet >
 
using TDCToIDEMap = std::map< unsigned short, SimIDESet >
 
using ChanToTDCToIDEMap = std::map< raw::ChannelID_t, TDCToIDEMap >
 
using VoxelIDSet = std::set< sim::LArVoxelID >
 
using TDCToIDESetMap = std::unordered_map< unsigned short, SimIDESet >
 
using PlaneToTDCToIDESetMap = std::map< unsigned short, TDCToIDESetMap >
 
using VoxelIDToPlaneTDCIDEMap = std::map< sim::LArVoxelID, PlaneToTDCToIDESetMap >
 
using TDCIDEPair = std::pair< unsigned short, const sim::IDE * >
 
using TickTDCIDEVec = std::vector< TDCIDEPair >
 
using ChanToTDCIDEMap = std::unordered_map< raw::ChannelID_t, TickTDCIDEVec >
 
using TrackIDChanToTDCIDEMap = std::unordered_map< int, ChanToTDCIDEMap >
 
using ChargeDeposit = std::tuple< TDCIDEPair, TDCIDEPair, TDCIDEPair, float, float >
 
using ChargeDepositVec = std::vector< ChargeDeposit >
 
using ChanToChargeMap = std::map< raw::ChannelID_t, ChargeDepositVec >
 
using TrackToChanChargeMap = std::unordered_map< int, ChanToChargeMap >
 
using HitPointerVec = std::vector< const recob::Hit * >
 
using RecobHitToVoxelIDMap = std::unordered_map< const recob::Hit *, VoxelIDSet >
 
using HitSimObjVec = std::vector< HitSimulationTupleObj >
 

Private Member Functions

void clear () const
 
void makeTrackToChanChargeMap (const TrackIDChanToTDCIDEMap &, TrackToChanChargeMap &, float &, int &) const
 
void compareHitsToSim (const art::Event &, const ChanToTDCToIDEMap &, const ChanToChargeMap &, const ChanToTDCIDEMap &, const IDEToVoxelIDMap &, RecobHitToVoxelIDMap &) const
 
void matchHitSim (const detinfo::DetectorClocksData &clockData, const HitPointerVec &, const ChanToTDCToIDEMap &, const ChargeDepositVec &, const ChanToTDCIDEMap &, const IDEToVoxelIDMap &, RecobHitToVoxelIDMap &) const
 
void compareSpacePointsToSim (const art::Event &, const detinfo::DetectorClocksData &clockData, const RecobHitToVoxelIDMap &, const VoxelIDToPlaneTDCIDEMap &) const
 

Private Attributes

std::vector< art::InputTag > fRecobHitLabelVec
 
std::vector< art::InputTag > fSpacePointLabelVec
 
art::InputTag fMCParticleProducerLabel
 
art::InputTag fSimChannelProducerLabel
 
art::InputTag fSimEnergyProducerLabel
 
art::InputTag fBadChannelProducerLabel
 
std::vector< int > fOffsetVec
 Allow offsets for each plane. More...
 
float fSimChannelMinEnergy
 
float fSimEnergyMinEnergy
 
TTree * fTree
 
std::vector< int > fTPCVec
 
std::vector< int > fCryoVec
 
std::vector< int > fPlaneVec
 
HitSimObjVec fHitSimObjVec
 
HitSpacePointObj fHitSpacePointObj
 
const geo::GeometryCorefGeometry
 pointer to Geometry service More...
 

Detailed Description

Definition at line 311 of file SpacePointAnalysisMC_tool.cc.

Member Typedef Documentation

Definition at line 389 of file SpacePointAnalysisMC_tool.cc.

Definition at line 383 of file SpacePointAnalysisMC_tool.cc.

Definition at line 372 of file SpacePointAnalysisMC_tool.cc.

Definition at line 387 of file SpacePointAnalysisMC_tool.cc.

Definition at line 388 of file SpacePointAnalysisMC_tool.cc.

Definition at line 396 of file SpacePointAnalysisMC_tool.cc.

Definition at line 426 of file SpacePointAnalysisMC_tool.cc.

Definition at line 369 of file SpacePointAnalysisMC_tool.cc.

Definition at line 377 of file SpacePointAnalysisMC_tool.cc.

Definition at line 397 of file SpacePointAnalysisMC_tool.cc.

Definition at line 368 of file SpacePointAnalysisMC_tool.cc.

using SpacePointAnalysisMC::SpacePointAnalysisMC::TDCIDEPair = std::pair<unsigned short, const sim::IDE*>
private

Definition at line 381 of file SpacePointAnalysisMC_tool.cc.

using SpacePointAnalysisMC::SpacePointAnalysisMC::TDCToIDEMap = std::map<unsigned short, SimIDESet>
private

Definition at line 371 of file SpacePointAnalysisMC_tool.cc.

using SpacePointAnalysisMC::SpacePointAnalysisMC::TDCToIDESetMap = std::unordered_map<unsigned short,SimIDESet>
private

Definition at line 376 of file SpacePointAnalysisMC_tool.cc.

Definition at line 382 of file SpacePointAnalysisMC_tool.cc.

Definition at line 384 of file SpacePointAnalysisMC_tool.cc.

Definition at line 390 of file SpacePointAnalysisMC_tool.cc.

Definition at line 373 of file SpacePointAnalysisMC_tool.cc.

Definition at line 370 of file SpacePointAnalysisMC_tool.cc.

Definition at line 378 of file SpacePointAnalysisMC_tool.cc.

Constructor & Destructor Documentation

SpacePointAnalysisMC::SpacePointAnalysisMC::SpacePointAnalysisMC ( fhicl::ParameterSet const &  pset)
explicit

Constructor.

Parameters
psetConstructor.

Arguments:

pset - Fcl parameters.

Definition at line 442 of file SpacePointAnalysisMC_tool.cc.

442  : fTree(nullptr)
443 {
444  fGeometry = lar::providerFrom<geo::Geometry>();
445 
446  configure(pset);
447 
448  // Report.
449  mf::LogInfo("SpacePointAnalysisMC") << "SpacePointAnalysisMC configured\n";
450 }
const geo::GeometryCore * fGeometry
pointer to Geometry service
void configure(fhicl::ParameterSet const &pset) override
SpacePointAnalysisMC::SpacePointAnalysisMC::~SpacePointAnalysisMC ( )

Destructor.

Definition at line 454 of file SpacePointAnalysisMC_tool.cc.

455 {}

Member Function Documentation

void SpacePointAnalysisMC::SpacePointAnalysisMC::clear ( ) const
private

Definition at line 520 of file SpacePointAnalysisMC_tool.cc.

521 {
522  fTPCVec.clear();
523  fCryoVec.clear();
524  fPlaneVec.clear();
525 
527 
528  for(auto& hitObj : fHitSimObjVec) hitObj.clear();
529 
530  return;
531 }
void SpacePointAnalysisMC::SpacePointAnalysisMC::compareHitsToSim ( const art::Event &  event,
const ChanToTDCToIDEMap chanToTDCToIDEMap,
const ChanToChargeMap chanToChargeMap,
const ChanToTDCIDEMap chanToTDCIDEMap,
const IDEToVoxelIDMap ideToVoxelIDMap,
RecobHitToVoxelIDMap recobHitToVoxelIDMap 
) const
private

Definition at line 701 of file SpacePointAnalysisMC_tool.cc.

707 {
708  // We start by building a mapping between channels and lists of hits on that channel (ordered by time)
709  using HitPointerVec = std::vector<const recob::Hit*>;
710  using ChanToHitVecMap = std::map<raw::ChannelID_t,HitPointerVec>;
711 
712  ChanToHitVecMap chanToHitVecMap;
713 
714  // And now fill it
715  for(const auto& hitLabel : fRecobHitLabelVec)
716  {
717  art::Handle< std::vector<recob::Hit> > hitHandle;
718  event.getByLabel(hitLabel, hitHandle);
719 
720  // If no hits then skip
721  if ((*hitHandle).empty()) continue;
722 
723  for(const auto& hit : *hitHandle) chanToHitVecMap[hit.Channel()].emplace_back(&hit);
724  }
725 
726  // Now go through and order each vector of hits by time
727  for(auto& chanToHitPair : chanToHitVecMap)
728  {
729  HitPointerVec& hitPtrVec = chanToHitPair.second;
730 
731  std::sort(hitPtrVec.begin(),
732  hitPtrVec.end(),
733  [](const auto& left, const auto& right){return left->Channel() == right->Channel() ? left->PeakTime() < right->PeakTime() : left->Channel() < right->Channel();});
734  }
735 
736  auto const clockData = art::ServiceHandle<detinfo::DetectorClocksService const>()->DataFor(event);
737 
738  // The idea is to loop over the input sim information so we can look at efficiency as well as resolution issues
739  for(const auto& chanToChargePair : chanToChargeMap)
740  {
741  // Recover the channel
742  raw::ChannelID_t channel = chanToChargePair.first;
743 
744  // Look up the hits associated to this channel
745  ChanToHitVecMap::const_iterator chanToHitVecItr = chanToHitVecMap.find(channel);
746 
747  // For now we simply punt...
748  if (chanToHitVecItr == chanToHitVecMap.end()) continue;
749 
750  // Recover channel information based on this hit
751  const ChargeDepositVec& chargeDepositVec = chanToChargePair.second;
752 
753  // Get the hits...
754  const HitPointerVec& hitPtrVec = chanToHitVecItr->second;
755 
756  short int lastSnippetStart(-1);
757 
758  HitPointerVec hitVec;
759 
760  // Outer loop over hits in this hit collection
761  for(const auto& hitPtr : hitPtrVec)
762  {
763  // We want to collect together the hits that are on the same snippet. Hits will come grouped and in order
764  // along the snippet, so we simply keep them in a local vector until we hit the end of the snippet...
765  //
766  // ** It is worth noting this scheme as implemented will miss the last snippet of hits... so think about
767  // that for the future
768  short int snippetStart = hitPtr->StartTick();
769 
770  if (snippetStart == lastSnippetStart)
771  {
772  lastSnippetStart = snippetStart;
773 
774  hitVec.emplace_back(hitPtr);
775 
776  continue;
777  }
778 
779  // Process the current list of hits (which will be on the same snippet)
780  matchHitSim(clockData, hitVec, chanToTDCToIDEMap, chargeDepositVec, chanToTDCIDEMap, ideToVoxelIDMap, recobHitToVoxelIDMap);
781 
782  hitVec.clear();
783  hitVec.emplace_back(hitPtr);
784  lastSnippetStart = snippetStart;
785  }
786 
787  // Make sure to catch the last set of hits in the group
788  if (!hitVec.empty()) matchHitSim(clockData, hitVec, chanToTDCToIDEMap, chargeDepositVec, chanToTDCIDEMap, ideToVoxelIDMap, recobHitToVoxelIDMap);
789  }
790 
791  return;
792 }
walls no right
Definition: selectors.fcl:105
void matchHitSim(const detinfo::DetectorClocksData &clockData, const HitPointerVec &, const ChanToTDCToIDEMap &, const ChargeDepositVec &, const ChanToTDCIDEMap &, const IDEToVoxelIDMap &, RecobHitToVoxelIDMap &) const
process_name hit
Definition: cheaterreco.fcl:51
walls no left
Definition: selectors.fcl:105
unsigned int ChannelID_t
Type representing the ID of a readout channel.
Definition: RawTypes.h:28
void SpacePointAnalysisMC::SpacePointAnalysisMC::compareSpacePointsToSim ( const art::Event &  event,
const detinfo::DetectorClocksData clockData,
const RecobHitToVoxelIDMap recobHitToVoxelIDMap,
const VoxelIDToPlaneTDCIDEMap voxelToPlaneTDCIDEMap 
) const
private

Definition at line 960 of file SpacePointAnalysisMC_tool.cc.

964 {
965  // Armed with these maps we can now process the SpacePoints...
966  if (!recobHitToVoxelIDMap.empty())
967  {
968  // Diagnostics
969  using Triplet = std::tuple<const recob::Hit*, const recob::Hit*, const recob::Hit*>;
970  using TripletMap = std::map<Triplet,std::vector<const recob::SpacePoint*>>;
971 
972  TripletMap tripletMap;
973 
974  // So now we loop through the various SpacePoint sources
975  for(const auto& spacePointLabel : fSpacePointLabelVec)
976  {
977  art::Handle< std::vector<recob::SpacePoint>> spacePointHandle;
978  event.getByLabel(spacePointLabel, spacePointHandle);
979 
980  if (!spacePointHandle.isValid()) continue;
981 
982  // Look up assocations to hits
983  art::FindManyP<recob::Hit> spHitAssnVec(spacePointHandle, event, spacePointLabel);
984 
985  // And now, without further adieu, here we begin the loop that will actually produce some useful output.
986  // Loop over all space points and find out their true nature
987  for(size_t idx = 0; idx < spacePointHandle->size(); idx++)
988  {
989  art::Ptr<recob::SpacePoint> spacePointPtr(spacePointHandle,idx);
990 
991  std::vector<art::Ptr<recob::Hit>> associatedHits(spHitAssnVec.at(spacePointPtr.key()));
992 
993  if (associatedHits.size() != 3)
994  {
995  mf::LogDebug("SpacePointAnalysisMC") << "I am certain this cannot happen... but here you go, space point with " << associatedHits.size() << " hits" << std::endl;
996  continue;
997  }
998 
999  // Retrieve the magic numbers from the space point
1000  float spQuality = spacePointPtr->Chisq();
1001  float spCharge = spacePointPtr->ErrXYZ()[1];
1002  float spAsymmetry = spacePointPtr->ErrXYZ()[3];
1003  float smallestPH = std::numeric_limits<float>::max();
1004  float largestPH = 0.;
1005  int numHits = 0;
1006  float averagePH = 0.;
1007  float averagePT = 0.;
1008  float largestDelT = 0.;
1009 
1010  std::vector<int> numIDEsHitVec;
1011  std::vector<int> simHitDeltaTVec = {0,0,0};
1012  std::vector<float> hitPeakTimeVec = {-100.,-100.,-100.};
1013  std::vector<float> bigElecDepVec = {0.,0.,0.};
1014  std::vector<unsigned short> bigTDCVec = {0,0,0};
1015  int numIDEsSpacePoint(0);
1016  int numLongHits(0);
1017  int numIntersections(0);
1018 
1019  std::vector<RecobHitToVoxelIDMap::const_iterator> recobHitToVoxelIterVec;
1020 
1021  std::vector<const recob::Hit*> recobHitVec(3,nullptr);
1022 
1023  // Now we can use our maps to find out if the hits making up the SpacePoint are truly related...
1024  for(const auto& hitPtr : associatedHits)
1025  {
1026  RecobHitToVoxelIDMap::const_iterator hitToVoxelItr = recobHitToVoxelIDMap.find(hitPtr.get());
1027 
1028  float peakAmplitude = hitPtr->PeakAmplitude();
1029  float peakTime = hitPtr->PeakTime();
1030  int plane = hitPtr->WireID().Plane;
1031 
1032  recobHitVec[plane] = hitPtr.get();
1033 
1034  numHits++;
1035  averagePH += peakAmplitude;
1036  averagePT += peakTime;
1037 
1038  smallestPH = std::min(peakAmplitude,smallestPH);
1039  largestPH = std::max(peakAmplitude,largestPH);
1040 
1041  if (hitPtr->DegreesOfFreedom() < 2) numLongHits++;
1042 
1043  if (hitToVoxelItr == recobHitToVoxelIDMap.end())
1044  {
1045  numIDEsHitVec.push_back(0);
1046  continue;
1047  }
1048 
1049  recobHitToVoxelIterVec.push_back(hitToVoxelItr);
1050  numIDEsHitVec.push_back(hitToVoxelItr->second.size());
1051 
1052  hitPeakTimeVec[plane] = clockData.TPCTick2TDC(peakTime);
1053  }
1054 
1055  Triplet hitTriplet(recobHitVec[0],recobHitVec[1],recobHitVec[2]);
1056 
1057  tripletMap[hitTriplet].emplace_back(spacePointPtr.get());
1058 
1059  averagePH /= float(numHits);
1060  averagePT /= float(numHits);
1061 
1062  for(const auto& hitPtr : associatedHits)
1063  {
1064  float delT = hitPtr->PeakTime() - averagePT;
1065 
1066  if (std::abs(delT) > std::abs(largestDelT)) largestDelT = delT;
1067  }
1068 
1069  // If a SpacePoint is made from "true" MC hits then we will have found the relations to the MC info for all three
1070  // hits. If this condition is not satisfied it means one or more hits making the SpacePoint are noise hits
1071  if (recobHitToVoxelIterVec.size() == 3)
1072  {
1073  // Find the intersection of the vectors of IDEs for the first two hits
1074  std::vector<sim::LArVoxelID> firstIntersectionVec(recobHitToVoxelIterVec[0]->second.size()+recobHitToVoxelIterVec[1]->second.size());
1075 
1076  std::vector<sim::LArVoxelID>::iterator firstIntersectionItr = std::set_intersection(recobHitToVoxelIterVec[0]->second.begin(),recobHitToVoxelIterVec[0]->second.end(),
1077  recobHitToVoxelIterVec[1]->second.begin(),recobHitToVoxelIterVec[1]->second.end(),
1078  firstIntersectionVec.begin());
1079 
1080  firstIntersectionVec.resize(firstIntersectionItr - firstIntersectionVec.begin());
1081 
1082  // No intersection means, of course, the hits did not come from the same MC energy deposit
1083  if (!firstIntersectionVec.empty())
1084  {
1085  // Now find the intersection of the resultant intersection above and the third hit
1086  std::vector<sim::LArVoxelID> secondIntersectionVec(firstIntersectionVec.size()+recobHitToVoxelIterVec[2]->second.size());
1087 
1088  std::vector<sim::LArVoxelID>::iterator secondIntersectionItr = std::set_intersection(firstIntersectionVec.begin(), firstIntersectionVec.end(),
1089  recobHitToVoxelIterVec[2]->second.begin(),recobHitToVoxelIterVec[2]->second.end(),
1090  secondIntersectionVec.begin());
1091 
1092  secondIntersectionVec.resize(secondIntersectionItr - secondIntersectionVec.begin());
1093 
1094  numIntersections++;
1095 
1096  // Again, no IDEs in the intersection means it is a ghost space point but, of course, we are hoping
1097  // there are common IDEs so we can call it a real SpacePoint
1098  if (!secondIntersectionVec.empty())
1099  {
1100  for(const sim::LArVoxelID& voxelID : secondIntersectionVec)
1101  {
1102  VoxelIDToPlaneTDCIDEMap::const_iterator planeToTDCToIDESetMap = voxelToPlaneTDCIDEMap.find(voxelID);
1103 
1104  if (planeToTDCToIDESetMap->second.size() > 2)
1105  {
1106  numIDEsSpacePoint += 1;
1107 
1108  for(const auto& planeInfoPair : planeToTDCToIDESetMap->second)
1109  {
1110  unsigned short plane = planeInfoPair.first;
1111  float phBig = 0.;
1112  unsigned short tdcBig = 0;
1113 
1114  for(const auto& tdcIDEPair : planeInfoPair.second)
1115  {
1116  for(const auto& ide : tdcIDEPair.second)
1117  {
1118  if (phBig < ide->numElectrons)
1119  {
1120  phBig = ide->numElectrons;
1121  tdcBig = tdcIDEPair.first;
1122  }
1123  }
1124  }
1125 
1126  bigElecDepVec[plane] = phBig;
1127  bigTDCVec[plane] = tdcBig;
1128  }
1129  }
1130  else std::cout << " --> Not matching all three planes" << std::endl;
1131  }
1132 
1133  numIntersections++;
1134  }
1135  }
1136  }
1137 
1138  // Fill for "all" cases
1139  fHitSpacePointObj.fSPQualityVec.push_back(spQuality);
1140  fHitSpacePointObj.fSPTotalChargeVec.push_back(spCharge);
1141  fHitSpacePointObj.fSPAsymmetryVec.push_back(spAsymmetry);
1142  fHitSpacePointObj.fSmallestPHVec.push_back(smallestPH);
1143  fHitSpacePointObj.fLargestPHVec.push_back(largestPH);
1144  fHitSpacePointObj.fAveragePHVec.push_back(averagePH);
1145  fHitSpacePointObj.fLargestDelTVec.push_back(largestDelT);
1146 
1147  fHitSpacePointObj.fNumIDEsHit0Vec.push_back(numIDEsHitVec[0]);
1148  fHitSpacePointObj.fNumIDEsHit1Vec.push_back(numIDEsHitVec[1]);
1149  fHitSpacePointObj.fNumIDEsHit2Vec.push_back(numIDEsHitVec[2]);
1150  fHitSpacePointObj.fNumIDEsSpacePointVec.push_back(numIDEsSpacePoint);
1151 
1152  fHitSpacePointObj.fNumLongHitsVec.emplace_back(numLongHits);
1153  fHitSpacePointObj.fNumPlanesSimMatchVec.emplace_back(recobHitToVoxelIterVec.size());
1154  fHitSpacePointObj.fNumIntersectSetVec.emplace_back(numIntersections);
1155  fHitSpacePointObj.fSimHitDeltaT0Vec.emplace_back(bigTDCVec[0] - hitPeakTimeVec[0]);
1156  fHitSpacePointObj.fSimHitDeltaT1Vec.emplace_back(bigTDCVec[1] - hitPeakTimeVec[1]);
1157  fHitSpacePointObj.fSimHitDeltaT2Vec.emplace_back(bigTDCVec[2] - hitPeakTimeVec[2]);
1158 
1159  fHitSpacePointObj.fSimDelta10Vec.emplace_back(bigTDCVec[1] - bigTDCVec[0]);
1160  fHitSpacePointObj.fSimDelta21Vec.emplace_back(bigTDCVec[2] - bigTDCVec[1]);
1161  fHitSpacePointObj.fHitDelta10Vec.emplace_back(hitPeakTimeVec[1] - hitPeakTimeVec[0]);
1162  fHitSpacePointObj.fHitDelta21Vec.emplace_back(hitPeakTimeVec[2] - hitPeakTimeVec[1]);
1163  fHitSpacePointObj.fBigElecDep0Vec.emplace_back(bigElecDepVec[0]);
1164  fHitSpacePointObj.fBigElecDep1Vec.emplace_back(bigElecDepVec[1]);
1165  fHitSpacePointObj.fBigElecDep2Vec.emplace_back(bigElecDepVec[2]);
1166  }
1167  }
1168 
1169  // Can we check to see if we have duplicates?
1170  std::vector<int> numSpacePointVec = {0,0,0,0,0};
1171  for(const auto& tripletPair : tripletMap)
1172  {
1173  int numSpacePoints = std::min(numSpacePointVec.size()-1,tripletPair.second.size());
1174  numSpacePointVec[numSpacePoints]++;
1175  }
1176  std::cout << "====>> Found " << tripletMap.size() << " SpacePoints, numbers: ";
1177  for(const auto& count : numSpacePointVec) std::cout << count << " ";
1178  std::cout << std::endl;
1179  }
1180 
1181  return;
1182 }
T abs(T value)
std::size_t count(Cont const &cont)
double TPCTick2TDC(double const tick) const
BEGIN_PROLOG could also be cout
void SpacePointAnalysisMC::SpacePointAnalysisMC::configure ( fhicl::ParameterSet const &  pset)
overridevirtual

Reconfigure method.

Arguments:

pset - Fcl parameter set.

Implements IHitEfficiencyHistogramTool.

Definition at line 464 of file SpacePointAnalysisMC_tool.cc.

465 {
466  fRecobHitLabelVec = pset.get< std::vector<art::InputTag>>("HitLabelVec", std::vector<art::InputTag>() = {"cluster3d"});
467  fSpacePointLabelVec = pset.get< std::vector<art::InputTag>>("SpacePointLabelVec", std::vector<art::InputTag>() = {"cluster3d"});
468  fMCParticleProducerLabel = pset.get< art::InputTag >("MCParticleLabel", "largeant");
469  fSimChannelProducerLabel = pset.get< art::InputTag >("SimChannelLabel", "largeant");
470  fSimEnergyProducerLabel = pset.get< art::InputTag >("SimEnergyLabel", "largeant");
471  fOffsetVec = pset.get<std::vector<int> >("OffsetVec", std::vector<int>()={0,0,0});
472  fSimChannelMinEnergy = pset.get<float >("SimChannelMinEnergy", std::numeric_limits<float>::epsilon());
473  fSimEnergyMinEnergy = pset.get<float >("SimEnergyMinEnergy", std::numeric_limits<float>::epsilon());
474 
475  return;
476 }
std::vector< int > fOffsetVec
Allow offsets for each plane.
void SpacePointAnalysisMC::SpacePointAnalysisMC::endJob ( int  numEvents)
overridevirtual

Interface for method to executve at the end of run processing.

Parameters
intnumber of events to use for normalization

Implements IHitEfficiencyHistogramTool.

Definition at line 1186 of file SpacePointAnalysisMC_tool.cc.

1187 {
1188  return;
1189 }
void SpacePointAnalysisMC::SpacePointAnalysisMC::fillHistograms ( const art::Event &  event) const
overridevirtual

Interface for filling histograms.

Implements IHitEfficiencyHistogramTool.

Definition at line 533 of file SpacePointAnalysisMC_tool.cc.

534 {
535  // Ok... this is starting to grow too much and get out of control... we will need to break it up directly...
536 
537  // Always clear the tuple
538  clear();
539 
540  art::Handle<std::vector<sim::SimChannel>> simChannelHandle;
541  event.getByLabel(fSimChannelProducerLabel, simChannelHandle);
542 
543  if (!simChannelHandle.isValid() || simChannelHandle->empty() ) return;
544 
545  art::Handle<std::vector<sim::SimEnergyDeposit>> simEnergyHandle;
546  event.getByLabel(fSimEnergyProducerLabel, simEnergyHandle);
547 
548 // if (!simEnergyHandle.isValid() || simEnergyHandle->empty()) return;
549 
550  art::Handle<std::vector<simb::MCParticle>> mcParticleHandle;
551  event.getByLabel(fMCParticleProducerLabel, mcParticleHandle);
552 
553  // If there is no sim channel informaton then exit
554  if (!mcParticleHandle.isValid()) return;
555 
556  mf::LogDebug("SpacePointAnalysisMC") << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" << std::endl;
557 
558  // First task is to build a map between ides and voxel ids (that we calcualate based on position)
559  // and also get the reverse since it will be useful in the end.
560  // At the same time should also build a mapping of ides per channel so we can do quick hit lookup
561  IDEToVoxelIDMap ideToVoxelIDMap;
562  VoxelIDToIDESetMap voxelIDToIDEMap;
563  ChanToTDCToIDEMap chanToTDCToIDEMap;
564  VoxelIDSet simChannelVoxelIDSet;
565  VoxelIDToPlaneTDCIDEMap voxelIDToPlaneTDCIDEMap;
566 
567  TrackIDChanToTDCIDEMap trackIDChanToTDCIDEMap;
568 
569  // Fill the above maps/structures
570  for(const auto& simChannel : *simChannelHandle)
571  {
572  raw::ChannelID_t channel = simChannel.Channel();
573 
574  geo::WireID wireID = fGeometry->ChannelToWire(channel).front();
575 
576  for(const auto& tdcide : simChannel.TDCIDEMap())
577  {
578  for(const auto& ide : tdcide.second) //chanToTDCToIDEMap[simChannel.Channel()][tdcide.first] = ide;
579  {
580  if (ide.energy < fSimChannelMinEnergy) continue;
581 
582  sim::LArVoxelID voxelID(ide.x,ide.y,ide.z,0.);
583 
584  ideToVoxelIDMap[&ide] = voxelID;
585  voxelIDToIDEMap[voxelID].insert(&ide);
586  chanToTDCToIDEMap[simChannel.Channel()][tdcide.first].insert(&ide);
587  simChannelVoxelIDSet.insert(voxelID);
588 
589  trackIDChanToTDCIDEMap[ide.trackID][simChannel.Channel()].emplace_back(tdcide.first,&ide);
590 
591  voxelIDToPlaneTDCIDEMap[voxelID][wireID.Plane][tdcide.first].insert(&ide);
592 
593  if (ide.energy < std::numeric_limits<float>::epsilon()) mf::LogDebug("SpacePointAnalysisMC") << ">> epsilon simchan deposited energy: " << ide.energy << std::endl;
594  }
595  }
596  }
597 
598  // More data structures, here we want to keep track of the start/peak/end of the charge deposit along a wire for a given track
599  TrackToChanChargeMap trackToChanChargeMap;
600 
601  // Go through the list of track to ides and get the total deposited energy per track
602  float bestTotDepEne(0.);
603  int bestTrackID(0);
604 
605  makeTrackToChanChargeMap(trackIDChanToTDCIDEMap, trackToChanChargeMap, bestTotDepEne, bestTrackID);
606 
607  // Ok, for my next trick I want to build a mapping between hits and voxel IDs. Note that any given hit can be associated to more than one voxel...
608  // We do this on the entire hit collection, ultimately we will want to consider SpacePoint efficiency (this could be done in the loop over SpacePoints
609  // using the associated hits and would save time/memory)
610  using VoxelIDSet = std::set<sim::LArVoxelID>;
611  using RecobHitToVoxelIDMap = std::unordered_map<const recob::Hit*, VoxelIDSet>;
612 
613  RecobHitToVoxelIDMap recobHitToVoxelIDMap;
614 
615  ChanToTDCIDEMap& chanToTDCIDEMap = trackIDChanToTDCIDEMap[bestTrackID];
616 
617  // Recover the "best" track info to start
618  TrackToChanChargeMap::const_iterator chanToChargeMapItr = trackToChanChargeMap.find(bestTrackID);
619 
620  // Process the hit/simulation
621  compareHitsToSim(event, chanToTDCToIDEMap, chanToChargeMapItr->second, chanToTDCIDEMap, ideToVoxelIDMap, recobHitToVoxelIDMap);
622 
623  // Now do the space points
624  auto const clockData = art::ServiceHandle<detinfo::DetectorClocksService const>()->DataFor(event);
625  compareSpacePointsToSim(event, clockData, recobHitToVoxelIDMap, voxelIDToPlaneTDCIDEMap);
626 
627  // Make sure the output tuples are filled
629 
630  for(auto& hitObj : fHitSimObjVec) hitObj.fill();
631 
632  return;
633 }
std::unordered_map< int, ChanToChargeMap > TrackToChanChargeMap
std::unordered_map< int, ChanToTDCIDEMap > TrackIDChanToTDCIDEMap
std::vector< geo::WireID > ChannelToWire(raw::ChannelID_t const channel) const
Returns a list of wires connected to the specified TPC channel.
void compareHitsToSim(const art::Event &, const ChanToTDCToIDEMap &, const ChanToChargeMap &, const ChanToTDCIDEMap &, const IDEToVoxelIDMap &, RecobHitToVoxelIDMap &) const
std::map< sim::LArVoxelID, PlaneToTDCToIDESetMap > VoxelIDToPlaneTDCIDEMap
void compareSpacePointsToSim(const art::Event &, const detinfo::DetectorClocksData &clockData, const RecobHitToVoxelIDMap &, const VoxelIDToPlaneTDCIDEMap &) const
const geo::GeometryCore * fGeometry
pointer to Geometry service
std::map< raw::ChannelID_t, TDCToIDEMap > ChanToTDCToIDEMap
PlaneID_t Plane
Index of the plane within its TPC.
Definition: geo_types.h:493
std::unordered_map< const sim::IDE *, sim::LArVoxelID > IDEToVoxelIDMap
std::map< sim::LArVoxelID, SimIDESet > VoxelIDToIDESetMap
std::unordered_map< raw::ChannelID_t, TickTDCIDEVec > ChanToTDCIDEMap
unsigned int ChannelID_t
Type representing the ID of a readout channel.
Definition: RawTypes.h:28
void makeTrackToChanChargeMap(const TrackIDChanToTDCIDEMap &, TrackToChanChargeMap &, float &, int &) const
std::unordered_map< const recob::Hit *, VoxelIDSet > RecobHitToVoxelIDMap
void SpacePointAnalysisMC::SpacePointAnalysisMC::initializeHists ( art::ServiceHandle< art::TFileService > &  tfs,
const std::string &  dirName 
)
overridevirtual

Interface for initializing the histograms to be filled.

Begin job method.

Parameters
TFileServicehandle to the TFile service
stringsubdirectory to store the hists in

Implements IHitEfficiencyHistogramTool.

Definition at line 480 of file SpacePointAnalysisMC_tool.cc.

481 {
482  // Make a directory for these histograms
483 // art::TFileDirectory dir = tfs->mkdir(dirName.c_str());
484 
485  return;
486 }
void SpacePointAnalysisMC::SpacePointAnalysisMC::initializeTuple ( TTree *  tree)
overridevirtual

Interface for initializing the tuple variables.

Parameters
TTreepointer to a TTree object to which to add variables

Implements IHitEfficiencyHistogramTool.

Definition at line 488 of file SpacePointAnalysisMC_tool.cc.

489 {
490  // Access ART's TFileService, which will handle creating and writing
491  // histograms and n-tuples for us.
492  art::ServiceHandle<art::TFileService> tfs;
493 
494  fTree = tree;
495 
496  fTree->Branch("CryostataVec", "std::vector<int>", &fCryoVec);
497  fTree->Branch("TPCVec", "std::vector<int>", &fTPCVec);
498  fTree->Branch("PlaneVec", "std::vector<int>", &fPlaneVec);
499 
500  // Set up specific branch for space points
501  TTree* locTree = tfs->makeAndRegister<TTree>("SpacePoint_t","SpacePoint Tuple");
502 
504 
505  fHitSimObjVec.resize(fGeometry->Nplanes());
506 
507  for(size_t plane = 0; plane < fGeometry->Nplanes(); plane++)
508  {
509  // Set up specific branch for space points
510  locTree = tfs->makeAndRegister<TTree>("MatchedHits_P"+std::to_string(plane),"Matched Hits Tuple plane "+std::to_string(plane));
511 
512  fHitSimObjVec[plane].setBranches(locTree);
513  }
514 
515  clear();
516 
517  return;
518 }
unsigned int Nplanes(unsigned int tpc=0, unsigned int cstat=0) const
Returns the total number of wire planes in the specified TPC.
const geo::GeometryCore * fGeometry
pointer to Geometry service
std::string to_string(WindowPattern const &pattern)
art::ServiceHandle< art::TFileService > tfs
void SpacePointAnalysisMC::SpacePointAnalysisMC::makeTrackToChanChargeMap ( const TrackIDChanToTDCIDEMap trackIDChanToTDCIDEMap,
TrackToChanChargeMap trackToChanChargeMap,
float &  bestTotDepEne,
int &  bestTrackID 
) const
private

Definition at line 635 of file SpacePointAnalysisMC_tool.cc.

639 {
640  // Pretty straightforward looping here...
641  for(const auto& trackIDEPair : trackIDChanToTDCIDEMap)
642  {
643  ChanToChargeMap& chanToChargeMap = trackToChanChargeMap[trackIDEPair.first];
644 
645  float trackTotDepE(0.);
646 
647  for(const auto& chanTDCIDEPair : trackIDEPair.second)
648  {
649  ChargeDepositVec& chargeDepositVec = chanToChargeMap[chanTDCIDEPair.first];
650 
651  // Keep track of first,peak,last/ene
652  TDCIDEPair firstPair = chanTDCIDEPair.second.front();
653  TDCIDEPair peakPair = firstPair;
654  TDCIDEPair lastPair = chanTDCIDEPair.second.back();
655 
656  // Keep watch for gaps
657  TDCIDEPair prevPair = firstPair;
658 
659  // Keep track of deposited energy on a snippet
660  float snippetDepEne(0.);
661  float snippetNumElectrons(0.);
662 
663  for(const auto& tdcIDEPair : chanTDCIDEPair.second)
664  {
665  float depEne = tdcIDEPair.second->energy;
666 
667  trackTotDepE += depEne;
668 
669  // Watch for a gap...
670  if (tdcIDEPair.first - prevPair.first > 1)
671  {
672  chargeDepositVec.emplace_back(firstPair,peakPair,prevPair,snippetDepEne,snippetNumElectrons);
673 
674  firstPair = tdcIDEPair;
675  peakPair = firstPair;
676  snippetDepEne = 0.;
677  snippetNumElectrons = 0.;
678  }
679 
680  snippetDepEne += depEne;
681  snippetNumElectrons += tdcIDEPair.second->numElectrons;
682 
683  if (depEne > peakPair.second->energy) peakPair = tdcIDEPair;
684 
685  prevPair = tdcIDEPair;
686  }
687 
688  chargeDepositVec.emplace_back(firstPair,peakPair,lastPair,snippetDepEne,snippetNumElectrons);
689  }
690 
691  if (trackTotDepE > bestTotDepEne)
692  {
693  bestTrackID = trackIDEPair.first;
694  bestTotDepEne = trackTotDepE;
695  }
696  }
697 
698  return;
699 }
std::pair< unsigned short, const sim::IDE * > TDCIDEPair
std::map< raw::ChannelID_t, ChargeDepositVec > ChanToChargeMap
void SpacePointAnalysisMC::SpacePointAnalysisMC::matchHitSim ( const detinfo::DetectorClocksData clockData,
const HitPointerVec hitPointerVec,
const ChanToTDCToIDEMap chanToTDCToIDEMap,
const ChargeDepositVec chargeDepositVec,
const ChanToTDCIDEMap chanToTDCIDEMap,
const IDEToVoxelIDMap ideToVoxelIDMap,
RecobHitToVoxelIDMap recobHitToVoxelIDMap 
) const
private

Definition at line 794 of file SpacePointAnalysisMC_tool.cc.

801 {
802  // Data structure to allow ordering of multiple hits in a snippet
803  using HitPeakTimeChargeTuple = std::tuple<int,const recob::Hit*,ChargeDepositVec::const_iterator>;
804  using HitPeakTimeChargeVec = std::vector<HitPeakTimeChargeTuple>;
805 
806  HitPeakTimeChargeVec hitPeakTimeChargeVec;
807  float maxPulseHeight(1.); // Don't let this be zero
808 
809  // If here then we are on to the next hit, so we need to process our current list
810  for(const auto& hit : hitPointerVec)
811  {
812  // Recover hit time range (in ticks), cast a wide net here
813  int peakTick = std::round(hit->PeakTime());
814  int startTick = std::max( 0,int(std::floor(hit->PeakTime() - 3. * hit->RMS())));
815  int endTick = std::min(4096,int(std::ceil(hit->PeakTime() + 3. * hit->RMS())));
816 
817  int startTDC = clockData.TPCTick2TDC(startTick - fOffsetVec[hit->WireID().Plane]);
818  int peakTDC = clockData.TPCTick2TDC(peakTick - fOffsetVec[hit->WireID().Plane]);
819  int endTDC = clockData.TPCTick2TDC(endTick - fOffsetVec[hit->WireID().Plane]);
820 
821  maxPulseHeight = std::max(maxPulseHeight,hit->PeakAmplitude());
822 
823  // If we have a match then this iterator gets set to the matching values
824  ChargeDepositVec::const_iterator chargeMatchItr = chargeDepositVec.end();
825 
826  int bestPeakDiff = std::numeric_limits<int>::max();
827 
828  // Match the hit (if there is one)
829  for(ChargeDepositVec::const_iterator chargeInfoItr = chargeDepositVec.begin(); chargeInfoItr != chargeDepositVec.end(); chargeInfoItr++)
830  {
831  // Require some amount of overlap between the hit and the sim info
832  if (endTDC > std::get<0>(*chargeInfoItr).first && startTDC < std::get<2>(*chargeInfoItr).first)
833  {
834  const TDCIDEPair& peakTDCIDE = std::get<1>(*chargeInfoItr);
835 
836  int peakDiff = peakTDC - int(peakTDCIDE.first);
837 
838  if (std::abs(peakDiff) < std::abs(bestPeakDiff))
839  {
840  bestPeakDiff = peakDiff;
841  chargeMatchItr = chargeInfoItr;
842  }
843  }
844  }
845 
846  // If no match then skip
847  if (chargeMatchItr == chargeDepositVec.end()) continue;
848 
849  hitPeakTimeChargeVec.emplace_back(std::make_tuple(bestPeakDiff,hit,chargeMatchItr));
850  }
851 
852  if (!hitPeakTimeChargeVec.empty())
853  {
854  // Ok, now we sort this vector by smallest peak time
855  std::sort(hitPeakTimeChargeVec.begin(),hitPeakTimeChargeVec.end(),[](const auto& left,const auto& right){return std::abs(std::get<0>(left)) < std::abs(std::get<0>(right));});
856 
857  // Keep track of hit ordering on this snippet
858  int hitOrder(0);
859 
860  HitSimulationTupleObj& hitObj = fHitSimObjVec[std::get<1>(hitPeakTimeChargeVec.front())->WireID().Plane];
861 
862  // Now loop through
863  for(const auto& hitPeakCharge : hitPeakTimeChargeVec)
864  {
865  const recob::Hit* hit = std::get<1>(hitPeakCharge);
866  const ChargeDeposit& chargeDeposit = *std::get<2>(hitPeakCharge);
867 
868  // Recover hit time range (in ticks), cast a wide net here
869  int peakTick = std::round(hit->PeakTime());
870  int startTick = std::max( 0,int(std::floor(hit->PeakTime() - 3. * hit->RMS())));
871  int endTick = std::min(4096,int(std::ceil(hit->PeakTime() + 3. * hit->RMS())));
872 
873  int startTDC = clockData.TPCTick2TDC(startTick - fOffsetVec[hit->WireID().Plane]);
874  int peakTDC = clockData.TPCTick2TDC(peakTick - fOffsetVec[hit->WireID().Plane]);
875  int endTDC = clockData.TPCTick2TDC(endTick - fOffsetVec[hit->WireID().Plane]);
876 
877  int firstSimTick(std::get<0>(chargeDeposit).first);
878  int lastSimTick(std::get<2>(chargeDeposit).first);
879  int maxDepTick(std::get<1>(chargeDeposit).first);
880  float maxDepEneTick(std::get<1>(chargeDeposit).second->energy);
881  float bestNumElectrons(std::get<4>(chargeDeposit));
882  float bestDepEne(std::get<3>(chargeDeposit));
883  float totDepEne(0.);
884  float totNumElectrons(0.);
885  int bestTicks(lastSimTick - firstSimTick + 1);
886 
887  // We want to get the total energy deposit from all particles in the ticks for this hit
888  const TDCToIDEMap& tdcToIDEMap = chanToTDCToIDEMap.find(hit->Channel())->second;
889  for(const auto& tdcToIDEPair : tdcToIDEMap)
890  {
891  for(const auto& ide : tdcToIDEPair.second)
892  {
893  totDepEne += ide->energy;
894  totNumElectrons += ide->numElectrons;
895  }
896  }
897 
898  // One final time through to find sim ticks that "matter"
899  // We define this as the collection of IDE's that make up to 90% of the total deposit
900  ChanToTDCIDEMap::const_iterator tickToTDCIDEVecItr = chanToTDCIDEMap.find(hit->Channel());
901 
902  if (tickToTDCIDEVecItr == chanToTDCIDEMap.end()) continue;
903 
904  const TickTDCIDEVec& tickToTDCIDEVec = tickToTDCIDEVecItr->second;
905  TickTDCIDEVec tickIDEVec;
906 
907  for(const auto& tickInfo : tickToTDCIDEVec)
908  {
909  //if (tickInfo.first >= firstSimTick && tickInfo.first <= lastSimTick) tickIDEVec.emplace_back(tickInfo);
910  if (tickInfo.first >= startTDC && tickInfo.first <= endTDC) tickIDEVec.emplace_back(tickInfo);
911  }
912 
913  std::sort(tickIDEVec.begin(),tickIDEVec.end(),[](const auto& left,const auto& right){return left.second->energy > right.second->energy;});
914 
915  // Grab the voxelID set for this tick
916  VoxelIDSet voxelIDSet;
917 
918  int bestTicksGood(0);
919  float sumEne(0.);
920 
921  for(const auto& tickInfo : tickIDEVec)
922  {
923  // At the same time we can keep track of the voxels associated to the best track
924  IDEToVoxelIDMap::const_iterator ideToVoxelIDMapItr = ideToVoxelIDMap.find(tickInfo.second);
925 
926  if (ideToVoxelIDMapItr == ideToVoxelIDMap.end()) continue;
927 
928  const sim::LArVoxelID& voxelID = ideToVoxelIDMapItr->second;
929 
930  sumEne += tickInfo.second->energy;
931  bestTicksGood++;
932 
933  voxelIDSet.insert(voxelID);
934 
935  if (sumEne > 0.9 * bestDepEne) break;
936  }
937 
938  // Finally, grab the voxels from the track leaving the most energy
939  recobHitToVoxelIDMap[hit] = voxelIDSet;
940 
941  hitObj.fillSimInfo(bestTicks, bestTicksGood, totDepEne, totNumElectrons, bestDepEne, bestNumElectrons, maxDepEneTick);
942  hitObj.fillMixedInfo(endTick-startTick+1, maxDepTick-startTDC, peakTDC-maxDepTick);
943  hitObj.fillHitInfo(hit,hitOrder++);
944  }
945 
946  // Resort in pulse height order (largest to smallest)
947  std::sort(hitPeakTimeChargeVec.begin(),hitPeakTimeChargeVec.end(),[](const auto& left,const auto& right){return std::get<1>(left)->PeakAmplitude() > std::get<1>(right)->PeakAmplitude();});
948 
949  // Now loop through
950  for(const auto& hitPeakCharge : hitPeakTimeChargeVec)
951  {
952  hitObj.fPHOrderHitVec.emplace_back(std::get<1>(hitPeakCharge)->LocalIndex());
953  hitObj.fPHFractionVec.emplace_back(std::get<1>(hitPeakCharge)->PeakAmplitude() / maxPulseHeight);
954  }
955  }
956 
957  return;
958 }
geo::WireID WireID() const
Definition: Hit.h:233
float RMS() const
RMS of the hit shape, in tick units.
Definition: Hit.h:220
std::tuple< TDCIDEPair, TDCIDEPair, TDCIDEPair, float, float > ChargeDeposit
std::vector< int > fOffsetVec
Allow offsets for each plane.
walls no right
Definition: selectors.fcl:105
std::pair< unsigned short, const sim::IDE * > TDCIDEPair
process_name hit
Definition: cheaterreco.fcl:51
T abs(T value)
std::map< unsigned short, SimIDESet > TDCToIDEMap
IDparameter< geo::WireID > WireID
Member type of validated geo::WireID parameter.
walls no left
Definition: selectors.fcl:105
PlaneID_t Plane
Index of the plane within its TPC.
Definition: geo_types.h:493
float PeakTime() const
Time of the signal peak, in tick units.
Definition: Hit.h:218
2D representation of charge deposited in the TDC/wire plane
Definition: Hit.h:48
raw::ChannelID_t Channel() const
ID of the readout channel the hit was extracted from.
Definition: Hit.h:230
double TPCTick2TDC(double const tick) const

Member Data Documentation

art::InputTag SpacePointAnalysisMC::SpacePointAnalysisMC::fBadChannelProducerLabel
private

Definition at line 414 of file SpacePointAnalysisMC_tool.cc.

std::vector<int> SpacePointAnalysisMC::SpacePointAnalysisMC::fCryoVec
mutableprivate

Definition at line 423 of file SpacePointAnalysisMC_tool.cc.

const geo::GeometryCore* SpacePointAnalysisMC::SpacePointAnalysisMC::fGeometry
private

pointer to Geometry service

Definition at line 432 of file SpacePointAnalysisMC_tool.cc.

HitSimObjVec SpacePointAnalysisMC::SpacePointAnalysisMC::fHitSimObjVec
mutableprivate

Definition at line 428 of file SpacePointAnalysisMC_tool.cc.

HitSpacePointObj SpacePointAnalysisMC::SpacePointAnalysisMC::fHitSpacePointObj
mutableprivate

Definition at line 429 of file SpacePointAnalysisMC_tool.cc.

art::InputTag SpacePointAnalysisMC::SpacePointAnalysisMC::fMCParticleProducerLabel
private

Definition at line 411 of file SpacePointAnalysisMC_tool.cc.

std::vector<int> SpacePointAnalysisMC::SpacePointAnalysisMC::fOffsetVec
private

Allow offsets for each plane.

Definition at line 415 of file SpacePointAnalysisMC_tool.cc.

std::vector<int> SpacePointAnalysisMC::SpacePointAnalysisMC::fPlaneVec
mutableprivate

Definition at line 424 of file SpacePointAnalysisMC_tool.cc.

std::vector<art::InputTag> SpacePointAnalysisMC::SpacePointAnalysisMC::fRecobHitLabelVec
private

Definition at line 409 of file SpacePointAnalysisMC_tool.cc.

float SpacePointAnalysisMC::SpacePointAnalysisMC::fSimChannelMinEnergy
private

Definition at line 416 of file SpacePointAnalysisMC_tool.cc.

art::InputTag SpacePointAnalysisMC::SpacePointAnalysisMC::fSimChannelProducerLabel
private

Definition at line 412 of file SpacePointAnalysisMC_tool.cc.

float SpacePointAnalysisMC::SpacePointAnalysisMC::fSimEnergyMinEnergy
private

Definition at line 417 of file SpacePointAnalysisMC_tool.cc.

art::InputTag SpacePointAnalysisMC::SpacePointAnalysisMC::fSimEnergyProducerLabel
private

Definition at line 413 of file SpacePointAnalysisMC_tool.cc.

std::vector<art::InputTag> SpacePointAnalysisMC::SpacePointAnalysisMC::fSpacePointLabelVec
private

Definition at line 410 of file SpacePointAnalysisMC_tool.cc.

std::vector<int> SpacePointAnalysisMC::SpacePointAnalysisMC::fTPCVec
mutableprivate

Definition at line 422 of file SpacePointAnalysisMC_tool.cc.

TTree* SpacePointAnalysisMC::SpacePointAnalysisMC::fTree
mutableprivate

Definition at line 420 of file SpacePointAnalysisMC_tool.cc.


The documentation for this class was generated from the following file: