45 art::ServiceHandle<evd::RecoDrawingOptions const> recoOpt;
46 art::ServiceHandle<evd::AnalysisDrawingOptions const> anaOpt;
47 art::ServiceHandle<geo::Geometry const> geom;
49 for(
size_t imod = 0; imod < recoOpt->fTrackLabels.size(); ++imod) {
53 art::InputTag which = recoOpt->fTrackLabels[imod];
54 art::Handle<std::vector<recob::Track> > trackListHandle;
55 evt.getByLabel(which,trackListHandle);
56 std::vector<art::Ptr<recob::Track> > tracklist;
57 art::fill_ptr_vector(tracklist, trackListHandle);
60 for(
size_t cmod = 0; cmod < anaOpt->fCalorimetryLabels.size(); ++cmod) {
61 std::string
const callabel = anaOpt->fCalorimetryLabels[cmod];
63 art::FindMany<anab::Calorimetry> fmcal(trackListHandle,
evt, callabel);
64 if (!fmcal.isValid())
continue;
66 for(
size_t pmod = 0; pmod < anaOpt->fParticleIDLabels.size(); ++pmod) {
67 std::string
const pidlabel = anaOpt->fParticleIDLabels[pmod];
69 art::FindMany<anab::ParticleID> fmpid(trackListHandle,
evt, pidlabel);
70 if (!fmpid.isValid())
continue;
74 for(
size_t trkIter = 0; trkIter<tracklist.size(); ++trkIter){
75 if (anaOpt->fTrackID >=0
and tracklist[trkIter]->ID() != anaOpt->fTrackID)
continue;
78 std::vector<const anab::Calorimetry*> calos = fmcal.at(trkIter);
79 std::vector<const anab::ParticleID*> pids = fmpid.at(trkIter);
80 if (!calos.size())
continue;
81 if (calos.size()!=pids.size())
continue;
86 for (
size_t icalo = 0; icalo < calos.size(); ++icalo){
87 if (calos[icalo]->
dEdx().size() > nmaxhits){
88 nmaxhits = calos[icalo]->dEdx().size();
89 bestplane = calos[icalo]->PlaneID().Plane;
92 if (anaOpt->fCaloPlane>=0
and anaOpt->fCaloPlane<
int(geom->Nplanes())){
93 for (
size_t icalo = 0; icalo < calos.size(); ++icalo){
94 if (
int(calos[icalo]->
PlaneID().
Plane)==anaOpt->fCaloPlane&&
95 calos[icalo]->dEdx().size())
96 bestplane = calos[icalo]->
PlaneID().Plane;
100 for (
size_t icalo = 0; icalo < calos.size(); ++icalo){
101 if (calos[icalo]->
PlaneID().Plane==bestplane){
113 TPolyMarker& pm = view->AddPolyMarker(calos[calopl]->
dEdx().
size(),
evd::kColor[color],8,0.8);
114 for(
size_t h = 0;
h<calos[calopl]->dEdx().size();++
h){
115 double xvalue = calos[calopl]->ResidualRange().at(
h);
116 double yvalue = calos[calopl]->dEdx().at(
h);
117 pm.SetPoint(
h,xvalue,yvalue);
119 double error = yvalue*(0.04231 + 0.0001783*(yvalue*yvalue));
120 TLine& l = view->AddLine(xvalue,yvalue-
error,xvalue,yvalue+
error);
130 sprintf(trackinfo,
"Track #%d: K.E. = %.1f MeV , Range = %.1f cm",
131 int(tracklist[trkIter].key()),
132 calos[calopl]->KineticEnergy(),
133 calos[calopl]->Range());
151 double offset = (ntracks - 1)*10.0;
152 TLatex& track_tex = view->AddLatex(13.0, (46.0) - offset,trackinfo);
153 TLatex& pida_tex = view->AddLatex(13.0, (46.0-2.5) - offset,pida);
154 TLatex& proton_tex = view->AddLatex(13.0, (46.0-5.0) - offset,proton);
156 TLatex& pion_tex = view->AddLatex(13.0, (46.0-7.5) - offset,pion);
164 track_tex.SetTextSize(0.05);
165 proton_tex.SetTextSize(0.05);
167 pion_tex.SetTextSize(0.05);
169 pida_tex.SetTextSize(0.05);
BEGIN_PROLOG TPC Trig offset(g4 rise time) ProjectToHeight
BEGIN_PROLOG true icarus_rawdigitfilter FilterTools FilterPlane1 Plane
std::size_t size(FixedBins< T, C > const &) noexcept
IDparameter< geo::PlaneID > PlaneID
Member type of validated geo::PlaneID parameter.
return match has_match and(match.match_pdg==11 or match.match_pdg==-11)
float dEdx(detinfo::DetectorClocksData const &clockData, detinfo::DetectorPropertiesData const &detProp, const TCSlice &slc, TP3D &tp3d)
static const int kColor[kNCOLS]