00001
00015 #include <cassert>
00016 #include <TFile.h>
00017 #include <TCanvas.h>
00018
00019 #include "AltModuleSliceQualityCheck.h"
00020 #include "RecoBase/CandSliceListHandle.h"
00021 #include "RecoBase/CandSliceList.h"
00022 #include "RecoBase/CandSliceHandle.h"
00023 #include "DataUtil/TruthHelper.h"
00024 #include "JobControl/JobCModuleRegistry.h"
00025 #include "JobControl/JobCommand.h"
00026 #include "MessageService/MsgService.h"
00027 #include "MinosObjectMap/MomNavigator.h"
00028 #include "RecoBase/CandStripHandle.h"
00029
00030 ClassImp(AltModuleSliceQualityCheck)
00031
00032
00033 CVSID("$Id: AltModuleSliceQualityCheck.cxx,v 1.4 2004/07/26 12:22:52 west Exp $");
00034
00035 JOBMODULE(AltModuleSliceQualityCheck, "AltModuleSliceQualityCheck", "slc QC");
00036
00037 AltModuleSliceQualityCheck::AltModuleSliceQualityCheck() :
00038 fSlicePurity ("fSlicePurity", "Slice Purity",
00039 50, 0.0, 1.0),
00040 fSliceCompleteness ("fSliceCompleteness", "Slice Completeness",
00041 50, 0.0, 1.0),
00042 fSlicePurityVsCompleteness ("fSlicePurityVsCompleteness", "Pur. Vs. Compl.",
00043 50, 0.0, 1.0, 50, 0.0, 1.0),
00044 fSlicePurityVsEnu ("fSlicePurityVsEnu", "Purity vs Enu",
00045 50, 0.0, 1.0, 30, 0.0, 30.0),
00046 fSliceCompletenessVsEnu ("fSliceCompletenessVsEnu", "Completeness vs Enu",
00047 50, 0.0, 1.0, 30, 0.0, 30.0),
00048 fSlicePurityVsEvis ("fSlicePurityVsEvis", "Purity vs Evis",
00049 50, 0.0, 1.0, 30, 0.0, 30.0),
00050 fSliceCompletenessVsEvis ("fSliceCompletenessVsEvis", "Completeness vs Evis",
00051 50, 0.0, 1.0, 30, 0.0, 30.0),
00052 fSlicePurityVsVtxX ("fSlicePurityVsVtxX", "Purity vs x-vtx",
00053 50, 0.0, 1.0, 200, -5.0, 5.0),
00054 fSliceCompletenessVsVtxX ("fSliceCompletenessVsVtxX", "Completeness vs x-vtx",
00055 50, 0.0, 1.0, 200, -5.0, 5.0),
00056 fSlicePurityVsVtxY ("fSlicePurityVsVtxY", "Purity vs y-vtx",
00057 50, 0.0, 1.0, 200, -5.0, 5.0),
00058 fSliceCompletenessVsVtxY ("fSliceCompletenessVsVtxY", "Completeness vs y-vtx",
00059 50, 0.0, 1.0, 200, -5.0, 5.0),
00060 fSlicePurityVsVtxZ ("fSlicePurityVsVtxZ", "Purity vs z-vtx",
00061 50, 0.0, 1.0, 200, 0.0, 10.0),
00062 fSliceCompletenessVsVtxZ ("fSliceCompletenessVsVtxZ", "Completeness vs z-vtx",
00063 50, 0.0, 1.0, 200, 0.0, 10.0),
00064 fSlicePurityVsKinX ("fSlicePurityVsKinX", "Purity vs x",
00065 50, 0.0, 1.0, 50, 0.0, 1.0),
00066 fSliceCompletenessVsKinX ("fSliceCompletenessVsKinX", "Completeness vs x",
00067 50, 0.0, 1.0, 50, 0.0, 1.0),
00068 fSlicePurityVsKinY ("fSlicePurityVsKinY", "Purity vs y",
00069 50, 0.0, 1.0, 50, 0.0, 1.0),
00070 fSliceCompletenessVsKinY ("fSliceCompletenessVsKinY", "Completeness vs y",
00071 50, 0.0, 1.0, 50, 0.0, 1.0),
00072 fSlicePurityVsKinQ2 ("fSlicePurityVsKinQ2", "Purity vs Q2",
00073 50, 0.0, 1.0, 30, 0.0, 30.0),
00074 fSliceCompletenessVsKinQ2 ("fSliceCompletenessVsKinQ2","Completeness vs Q2",
00075 50, 0.0, 1.0, 30, 0.0, 30.0),
00076 fSlicePurityVsKinW ("fSlicePurityVsKinW", "Purity vs Q2",
00077 50, 0.0, 1.0, 30, 0.0, 30.0),
00078 fSliceCompletenessVsKinW ("fSliceCompletenessVsKinW", "Completeness vs Q2",
00079 50, 0.0, 1.0, 30, 0.0, 30.0),
00080 fWriteHistos (true),
00081 fDrawHistos (false),
00082 fRootFileName ("slice_quality.root")
00083 {
00084 MSG("AltModule", Msg::kVerbose) << "AltModuleSliceQualityCheck::Ctor\n";
00085 }
00086
00087 AltModuleSliceQualityCheck::~AltModuleSliceQualityCheck()
00088 {
00089 MSG("AltModule", Msg::kVerbose) << "AltModuleSliceQualityCheck::Dtor\n";
00090 }
00091
00092 void AltModuleSliceQualityCheck::BeginJob()
00093 {
00094 MSG("AltModule", Msg::kVerbose) << "AltModuleSliceQualityCheck::BeginJob\n";
00095 }
00096
00097 const Registry & AltModuleSliceQualityCheck::DefaultConfig() const
00098 {
00099 MSG("AltModule", Msg::kDebug)
00100 << "AltModuleSliceQualityCheck::DefaultConfig" << endl;
00101 static Registry r;
00102
00103 r.UnLockValues();
00104 r.Set("WriteHistos", true);
00105 r.Set("DrawHistos", false);
00106 r.Set("RootFileName", "slice_quality.root");
00107 r.LockValues();
00108
00109 return r;
00110 }
00111
00112 void AltModuleSliceQualityCheck::Config(const Registry & r)
00113 {
00114 int tmpi = 0;
00115 const char * tmpc = 0;
00116
00117
00118 if (r.Get("fWriteHistos", tmpi)) fWriteHistos = tmpi;
00119 if (r.Get("fDrawHistos", tmpi)) fDrawHistos = tmpi;
00120 if (r.Get("fRootFileName", tmpc)) fRootFileName = string(tmpc);
00121 }
00122
00123 JobCResult AltModuleSliceQualityCheck::Ana(const MomNavigator * mom)
00124 {
00125 MSG("AltModule", Msg::kVerbose) << "AltModuleSliceQualityCheck::Ana\n";
00126
00127 JobCResult result(JobCResult::kPassed);
00128
00129
00130
00131 CandRecord *cdrec = dynamic_cast<CandRecord *>
00132 (mom->GetFragment("CandRecord", "PrimaryCandidateRecord"));
00133 if (cdrec == 0) {
00134 MSG("AltModule", Msg::kWarning)
00135 << "NULL PrimaryCandidateRecord pointer" << endl;
00136 result.SetWarning().SetFailed();
00137 return result;
00138 }
00139
00140
00141
00142 MSG("AltModule", Msg::kDebug)
00143 << "Asking PrimaryCandidateRecord for CaldSliceSRListHandle" << endl;
00144
00145 CandSliceListHandle * cslh = dynamic_cast<CandSliceListHandle *>
00146 (cdrec->FindCandHandle("CandSliceSRListHandle"));
00147
00148
00149
00150 if (!cslh) {
00151 MSG("AltModule", Msg::kDebug) << "NULL CandSliceListHandle ptr" << endl;
00152 result.SetFailed();
00153 return result;
00154
00155 } else {
00156 if(cslh->GetNDaughters() < 1) {
00157 MSG("AltModule", Msg::kDebug) << "Empty CandSlice list." << endl;
00158 result.SetFailed();
00159 return result;
00160 }
00161 }
00162
00163
00164
00165 TruthHelper truth_helper(mom);
00166
00167
00168
00169 CandSliceHandleItr slice_iter ( cslh->GetDaughterIterator() );
00170
00171 int islice = 0;
00172
00173 while( CandSliceHandle * slice = slice_iter.Ptr() ) {
00174
00175 if( !IsRubbishSlice(slice) ) {
00176
00177 int neu_id = truth_helper.GetBestSliceNeuMatch(*slice);
00178
00179 float purity = truth_helper.SlicePurity(*slice);
00180 float completeness = truth_helper.SliceCompleteness(*slice);
00181 float E = (truth_helper.GetP4Neu(neu_id))[3];
00182 float Evis = 0;
00183 float vtx_x = 0;
00184 float vtx_y = 0;
00185 float vtx_z = 0;
00186 float x = 0;
00187 float y = 0;
00188 float Q2 = 0;
00189 float W = 0;
00190
00191 MSG("AltModule", Msg::kVerbose)
00192 << "- slice[" << islice++ << "] purity = " << purity
00193 << ", completeness = " << completeness << endl;
00194
00195 fSlicePurity. Fill ( purity );
00196 fSliceCompleteness. Fill ( completeness );
00197 fSlicePurityVsCompleteness.Fill ( purity, completeness );
00198 fSlicePurityVsEnu. Fill ( purity , E );
00199 fSliceCompletenessVsEnu. Fill ( completeness , E );
00200 fSlicePurityVsEvis. Fill ( purity , Evis );
00201 fSliceCompletenessVsEvis. Fill ( completeness , Evis );
00202 fSlicePurityVsVtxX. Fill ( purity , vtx_x );
00203 fSliceCompletenessVsVtxX. Fill ( completeness , vtx_x );
00204 fSlicePurityVsVtxY. Fill ( purity , vtx_y );
00205 fSliceCompletenessVsVtxY. Fill ( completeness , vtx_y );
00206 fSlicePurityVsVtxZ. Fill ( purity , vtx_z );
00207 fSliceCompletenessVsVtxZ. Fill ( completeness , vtx_z );
00208 fSlicePurityVsKinX. Fill ( purity , x );
00209 fSliceCompletenessVsKinX. Fill ( completeness , x );
00210 fSlicePurityVsKinY. Fill ( purity , y );
00211 fSliceCompletenessVsKinY. Fill ( completeness , y );
00212 fSlicePurityVsKinQ2. Fill ( purity , Q2 );
00213 fSliceCompletenessVsKinQ2. Fill ( completeness , Q2 );
00214 fSlicePurityVsKinW. Fill ( purity , W );
00215 fSliceCompletenessVsKinW. Fill ( completeness , W );
00216 }
00217 slice_iter.Next();
00218 }
00219
00220 if(fWriteHistos) WriteHistos();
00221 if(fDrawHistos) DrawHistos ();
00222
00223 return result;
00224 }
00225
00226 void AltModuleSliceQualityCheck::HandleCommand(JobCommand * cmd)
00227 {
00228
00229 MSG("AltModule", Msg::kDebug)
00230 << "AltModuleSliceQualityCheck::HandleCommand" << endl;
00231
00232 if (cmd->HaveCmd() ) {
00233 MSG("AltModule", Msg::kWarning)
00234 << "Use Config(const Registry & r) instead" << endl;
00235 }
00236 }
00237
00238 void AltModuleSliceQualityCheck::WriteHistos(void)
00239 {
00240 TFile root_file(fRootFileName.c_str(), "RECREATE");
00241
00242 fSlicePurity. Write ("slice_purity");
00243 fSliceCompleteness. Write ("slice_completeness");
00244 fSlicePurityVsCompleteness.Write ("slice_purity_vs_completeness");
00245 fSlicePurityVsEnu. Write ("slice_purity_Enu");
00246 fSliceCompletenessVsEnu. Write ("slice_completeness_Enu");
00247 fSlicePurityVsEvis. Write ("slice_purity_Evis");
00248 fSliceCompletenessVsEvis. Write ("slice_completeness_Evis");
00249 fSlicePurityVsVtxX. Write ("slice_purity_vtxx");
00250 fSliceCompletenessVsVtxX. Write ("slice_completeness_vtxx");
00251 fSlicePurityVsVtxY. Write ("slice_purity_vtxy");
00252 fSliceCompletenessVsVtxY. Write ("slice_completeness_vtxy");
00253 fSlicePurityVsVtxZ. Write ("slice_purity_vtxz");
00254 fSliceCompletenessVsVtxZ. Write ("slice_completeness_vtxz");
00255 fSlicePurityVsKinX. Write ("slice_purity_x");
00256 fSliceCompletenessVsKinX. Write ("slice_completeness_x");
00257 fSlicePurityVsKinY. Write ("slice_purity_y");
00258 fSliceCompletenessVsKinY. Write ("slice_completeness_y");
00259 fSlicePurityVsKinQ2. Write ("slice_purity_Q2");
00260 fSliceCompletenessVsKinQ2. Write ("slice_completeness_Q2");
00261 fSlicePurityVsKinW. Write ("slice_purity_W");
00262 fSliceCompletenessVsKinW. Write ("slice_completeness_W");
00263
00264 root_file.Close();
00265 }
00266
00267 void AltModuleSliceQualityCheck::DrawHistos(void)
00268 {
00269 TCanvas * canvas = new TCanvas("canvas","purity/completeness",20,20,600,600);
00270
00271 canvas->SetFillColor(0);
00272 canvas->SetBorderMode(0);
00273
00274 canvas->Divide(1,2);
00275
00276 canvas->cd(1);
00277 fSlicePurity.Draw();
00278 fSlicePurity.GetXaxis()->SetTitle("slice purity");
00279
00280 canvas->cd(2);
00281 fSliceCompleteness.Draw();
00282 fSlicePurity.GetXaxis()->SetTitle("slice completeness");
00283
00284 canvas->Update();
00285
00286 delete canvas;
00287 }
00288
00289 bool AltModuleSliceQualityCheck::IsRubbishSlice(CandSliceHandle * slice)
00290 {
00291
00292
00293
00294
00295
00296
00297
00298
00299 bool is_rubbish = true;
00300
00301 CandStripHandleItr strip_iter ( slice->GetDaughterIterator() );
00302
00303 while( CandStripHandle * strip = strip_iter.Ptr() ) {
00304
00305 if(strip->GetPlane() < 120) return false;
00306
00307 strip_iter.Next();
00308 }
00309
00310 return is_rubbish;
00311 }
00312
00313