Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

AltModuleSliceQualityCheck.cxx

Go to the documentation of this file.
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   //double       tmpd = 0;
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   //-- Find PrimaryCandidateRecord fragment in MOM & check it is not null.
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   //-- Get a handle to CandSliceList (previous step reconstruction objects).
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   //-- Require CandSliceList to exist & number of CandSlices to be non-zero
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   //-- Get a Truth Helper -- obviously only use this module with Monte Carlo
00164   
00165   TruthHelper truth_helper(mom);
00166   
00167   //-- Get an iterator over slices, loop over them and fill in histograms
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;   // get these
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   // Process configuration commands
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 // Returns true if all hit strips in this slice are in the muon spectrometer.
00292 // This can only happen for the 'rubbish slice' I am using to pass unmatched
00293 // muon spectrometer hits to subsequent reconstructon stages.
00294 // The user can switch off this 'feature' and make proper slices out of these
00295 // hits... but since they are of no significance and they are not reconstructed,
00296 // anyway, at later reco. stages, the default action is to pack them into the
00297 // 'rubbish slice'. For the quality check purposes this slice is excluded.
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 

Generated on Mon Feb 15 11:06:21 2010 for loon by  doxygen 1.3.9.1