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

FitTrackCamAnalysisModule.cxx

Go to the documentation of this file.
00001 
00002 // Analysis Module for CandFitTrackCam
00003 //
00004 // For analysis and display of TrackFitting results
00005 // Note the Pause() function which can be included or excluded in line 401
00006 //
00007 // marshall@hep.phy.cam.ac.uk
00009 #include "MessageService/MsgService.h"
00010 #include "MinosObjectMap/MomNavigator.h"
00011 #include "JobControl/JobCModuleRegistry.h"
00012 
00013 #include "Validity/VldContext.h"
00014 
00015 // Reconstruction includes
00016 #include "RecoBase/CandStripHandle.h"
00017 #include "RecoBase/CandSliceListHandle.h"
00018 #include "RecoBase/CandSliceHandle.h"
00019 #include "RecoBase/CandShowerListHandle.h"
00020 #include "RecoBase/CandShowerHandle.h"
00021 #include "RecoBase/CandTrackListHandle.h"
00022 #include "RecoBase/CandTrackHandle.h"
00023 
00024 #include "CandDigit/CandDeMuxDigitHandle.h"
00025 #include "CandDigit/CandDeMuxDigit.h"
00026 
00027 #include "CandFitTrackCam/CandFitTrackCamHandle.h"
00028 #include "CandFitTrackCam/CandFitTrackCamListHandle.h"
00029 #include "CandFitTrackCam/FitTrackCamAnalysisModule.h"
00030 
00031 // For Truth info
00032 #include "Record/SimSnarlRecord.h"
00033 #include "Record/SimSnarlHeader.h"
00034 #include "REROOT_Classes/REROOT_NeuKin.h"
00035 #include "CandData/CandHeader.h"
00036 #include "DataUtil/Truthifier.h"
00037 
00038 // ROOT includes
00039 #include "TH2F.h"
00040 #include "TCanvas.h"
00041 #include "TPad.h"
00042 #include "TApplication.h"
00043 #include "TSystem.h"
00044 #include "TMarker.h"
00045 
00046 // For pause function
00047 #include <fcntl.h>
00048 #include <unistd.h>
00049 
00050 // for fabs()
00051 #include <cmath>
00052 
00053 using std::cout;
00054 using std::endl;
00055 
00056 JOBMODULE(FitTrackCamAnalysisModule, "FitTrackCamAnalysisModule", "Analyses track fit results");
00057 CVSID("$Id: FitTrackCamAnalysisModule.cxx,v 1.12 2007/11/11 08:43:39 rhatcher Exp $");
00058 
00060 FitTrackCamAnalysisModule::FitTrackCamAnalysisModule()
00061 {
00062   isMC=0;
00063 
00064   fListInSlc="CandSliceList";
00065   fListInShw="CandShowerList";
00066   fListInTrk="CandTrackSRList";
00067   fListInFitTrk="CandFitTrackCamList";
00068 
00069   fTrackCanvas = new TCanvas("fTrackCanvas","TrackView",800,500);
00070   fTrackCanvas->Draw();
00071   
00072   // Pads
00073   fUZPad   = new TPad("upad","U pad",0.010,0.505,0.495,0.990);
00074   fVZPad   = new TPad("vpad","V pad",0.010,0.010,0.495,0.495);
00075   fUZMCPad   = new TPad("uMCpad","U pad",0.505,0.505,0.990,0.990);
00076   fVZMCPad   = new TPad("vMCpad","V pad",0.505,0.010,0.990,0.495);
00077 
00078   fUZPad->SetFillColor(10);
00079   fVZPad->SetFillColor(10);
00080   fUZMCPad->SetFillColor(10);
00081   fVZMCPad->SetFillColor(10);
00082 
00083   fUZPad->SetLeftMargin(0.05);
00084   fUZPad->SetRightMargin(0.001);
00085   fUZPad->SetTopMargin(0.0001);
00086   fUZPad->SetBottomMargin(0.055);
00087   fVZPad->SetLeftMargin(0.05);
00088   fVZPad->SetRightMargin(0.001);
00089   fVZPad->SetTopMargin(0.0001);
00090   fVZPad->SetBottomMargin(0.055);
00091 
00092   fUZMCPad->SetLeftMargin(0.05);
00093   fUZMCPad->SetRightMargin(0.001);
00094   fUZMCPad->SetTopMargin(0.0001);
00095   fUZMCPad->SetBottomMargin(0.055);
00096   fVZMCPad->SetLeftMargin(0.05);
00097   fVZMCPad->SetRightMargin(0.001);
00098   fVZMCPad->SetTopMargin(0.0001);
00099   fVZMCPad->SetBottomMargin(0.055);
00100 
00101   fUZPad->Draw();
00102   fVZPad->Draw();
00103   fUZMCPad->Draw();
00104   fVZMCPad->Draw();
00105 
00106   fUZAxis=0;
00107   fVZAxis=0;
00108   fUZMCAxis=0;
00109   fVZMCAxis=0;
00110 
00111 
00112   // For writing results to file
00113   TDirectory* tmpd = 0;
00114   tmpd = gDirectory;  
00115 
00116   FTCFile = new TFile("FTCResults.root","recreate");
00117   FTCTree = new TTree("FTCTree","FTCTree");
00118 
00119   // Header info
00120   FTCTree->Branch("Run",&Run,"Run/I");
00121   FTCTree->Branch("Snarl",&Snarl,"Snarl/I");
00122   FTCTree->Branch("NumFittedTracks",&NumFittedTracks,"NumFittedTracks/I");
00123   FTCTree->Branch("Pass",&Pass,"Pass/I");
00124 
00125   // Momentum-related quantities
00126   FTCTree->Branch("RecoQP",&RecoQP,"RecoQP/D");
00127   FTCTree->Branch("TrueQP",&TrueQP,"TrueQP/D");
00128   FTCTree->Branch("QPVtxError",&QPVtxError,"QPVtxError/D");
00129   FTCTree->Branch("RecoMomCurve",&RecoMomCurve,"RecoMomCurve/D");
00130   FTCTree->Branch("RecoMomRange",&RecoMomRange,"RecoMomRange/D");
00131   FTCTree->Branch("TrueMom",&TrueMom,"TrueMom/D");
00132   FTCTree->Branch("RecoTime",&RecoTime,"RecoTime/D");
00133 
00134   // For checking tracking efficency
00135   FTCTree->Branch("FitTrackStrips",&FitTrackStrips,"FitTrackStrips/I");
00136   FTCTree->Branch("TrueMuonStrips",&TrueMuonStrips,"TrueMuonStrips/I");
00137   FTCTree->Branch("FitAndTruthAgree",&FitAndTruthAgree,"FitAndTruthAgree/I");
00138   FTCTree->Branch("FitTrackLength",&FitTrackLength,"FitTrackLength/I");
00139   FTCTree->Branch("TrueTrackLength",&TrueTrackLength,"TrueTrackLength/I");
00140   FTCTree->Branch("TotalStripsInSnarl",&TotalStripsInSnarl,"TotalStripsInSnarl/I");  
00141   FTCTree->Branch("FDFullyContained",&FDFullyContained,"FDFullyContained/I");
00142   FTCTree->Branch("NTrackStrip",&NTrackStrip,"NTrackStrip/I");
00143   FTCTree->Branch("NTrackDigit",&NTrackDigit,"NTrackDigit/I");
00144 
00145   // Track fit quality
00146   FTCTree->Branch("Chi2",&Chi2,"Chi2/D");
00147   FTCTree->Branch("NDOF",&NDOF,"NDOF/I");
00148   FTCTree->Branch("NIterate",&NIterate,"NIterate/I");
00149   FTCTree->Branch("NSwimFail",&NSwimFail,"NSwimFail/I");
00150 
00151   // Timing info
00152   FTCTree->Branch("TimeSlope",&TimeSlope,"TimeSlope/D");
00153   FTCTree->Branch("TimeOffset",&TimeOffset,"TimeOffset/D");
00154   FTCTree->Branch("VtxT",&VtxT,"VtxT/D");
00155   FTCTree->Branch("EndT",&EndT,"EndT/D");
00156   FTCTree->Branch("TimeFitChi2",&TimeFitChi2,"TimeFitChi2/D");
00157   FTCTree->Branch("NTimeFitDigit",&NTimeFitDigit,"NTimeFitDigit/D");
00158   FTCTree->Branch("TimeForwardFitRMS",&TimeForwardFitRMS,"TimeForwardFitRMS/D");
00159   FTCTree->Branch("TimeForwardFitNDOF",&TimeForwardFitNDOF,"TimeForwardFitNDOF/I");
00160   FTCTree->Branch("TimeBackwardFitRMS",&TimeBackwardFitRMS,"TimeBackwardFitRMS/D");
00161   FTCTree->Branch("TimeBackwardFitNDOF",&TimeBackwardFitNDOF,"TimeBackwardFitNDOF/I");
00162   
00163   // Vtx properties
00164   FTCTree->Branch("VtxU",&VtxU,"VtxU/D");
00165   FTCTree->Branch("VtxV",&VtxV,"VtxV/D");
00166   FTCTree->Branch("VtxZ",&VtxZ,"VtxZ/D");
00167   FTCTree->Branch("VtxPlane",&VtxPlane,"VtxPlane/I");
00168 
00169   FTCTree->Branch("VtxDirCosU",&VtxDirCosU,"VtxDirCosU/D");
00170   FTCTree->Branch("VtxDirCosV",&VtxDirCosV,"VtxDirCosV/D");
00171   FTCTree->Branch("VtxDirCosZ",&VtxDirCosZ,"VtxDirCosZ/D");
00172 
00173   FTCTree->Branch("VtxUError",&VtxUError,"VtxUError/D");
00174   FTCTree->Branch("VtxVError",&VtxVError,"VtxVError/D");
00175   FTCTree->Branch("VtxdUError",&VtxdUError,"VtxdUError/D");
00176   FTCTree->Branch("VtxdVError",&VtxdVError,"VtxdVError/D");
00177 
00178 
00179   // End properties
00180   FTCTree->Branch("EndU",&EndU,"EndU/D");
00181   FTCTree->Branch("EndV",&EndV,"EndV/D");
00182   FTCTree->Branch("EndZ",&EndZ,"EndZ/D");
00183   FTCTree->Branch("EndPlane",&EndPlane,"EndPlane/I");
00184   FTCTree->Branch("EndQP",&EndQP,"EndQP/D");
00185 
00186   FTCTree->Branch("EndDirCosU",&EndDirCosU,"EndDirCosU/D");
00187   FTCTree->Branch("EndDirCosV",&EndDirCosV,"EndDirCosV/D");
00188   FTCTree->Branch("EndDirCosZ",&EndDirCosZ,"EndDirCosZ/D");
00189 
00190   FTCTree->Branch("EndUError",&EndUError,"EndUError/D");
00191   FTCTree->Branch("EndVError",&EndVError,"EndVError/D");
00192   FTCTree->Branch("EnddUError",&EnddUError,"EnddUError/D");
00193   FTCTree->Branch("EnddVError",&EnddVError,"EnddVError/D");
00194   FTCTree->Branch("EndQOError",&EndQPError,"EndQPError/D");
00195 
00196   // Range and dS
00197   FTCTree->Branch("Range",&Range,"Range/D");
00198   FTCTree->Branch("dS",&dS,"dS/D");
00199 
00200 
00201   // Traces
00202   FTCTree->Branch("VtxTrace",&VtxTrace,"VtxTrace/D");
00203   FTCTree->Branch("VtxTraceZ",&VtxTraceZ,"VtxTraceZ/D");
00204   FTCTree->Branch("EndTrace",&EndTrace,"EndTrace/D");
00205   FTCTree->Branch("EndTraceZ",&EndTraceZ,"EndTraceZ/D");
00206 
00207   gDirectory = tmpd;
00208 }
00210 
00211 
00213 FitTrackCamAnalysisModule::~FitTrackCamAnalysisModule()
00214 {
00215   if(fTrackCanvas) {delete fTrackCanvas;}
00216 
00217   if(fUZAxis) {delete fUZAxis;}
00218   if(fVZAxis) {delete fVZAxis;}
00219   if(fUZMCAxis) {delete fUZMCAxis;} 
00220   if(fVZMCAxis) {delete fVZMCAxis;} 
00221 }
00223 
00224 
00226 void FitTrackCamAnalysisModule::BeginJob()
00227 {
00228 }
00230 
00231 
00233 void FitTrackCamAnalysisModule::EndJob()
00234 {
00235   TDirectory* tmpd = 0;
00236   tmpd = gDirectory;  
00237   FTCFile->cd();
00238   FTCTree->Write();
00239   FTCFile->Close();
00240   gDirectory = tmpd;
00241 }
00243 
00244 
00246 JobCResult FitTrackCamAnalysisModule::Ana(const MomNavigator* mom)
00247 {
00248   MSG("FitTrack", Msg::kDebug) << " FitTrackCamAnalysisModule::Ana(const MomNavigator* mom) " << endl;
00249 
00250   // Do we care about XTalk?
00251   CareAboutXTalk=true;
00252   debug=false;
00253 
00255   // Make sure we have a 'clean' start
00256   if ( fUZAxis ) { delete fUZAxis; fUZAxis=0; }
00257   if ( fVZAxis ) { delete fVZAxis; fVZAxis=0; }
00258   if ( fUZMCAxis ) { delete fUZMCAxis; fUZMCAxis=0; }
00259   if ( fVZMCAxis ) { delete fVZMCAxis; fVZMCAxis=0; }
00260   
00261   fMaxZ = -1;
00262   fMinZ = 50;
00263   fMaxUorV = -20;
00264   fMinUorV = 20;
00265 
00266   fFitEndPlane = -1;
00267   fFitVtxPlane = 500;
00268   fTrueMaxPlane = -1;
00269   fTrueMinPlane = 500;
00270 
00271   Run=-999;
00272   Snarl=-999;
00273   NumFittedTracks=-999;
00274   Pass=-999;
00275 
00276   RecoQP=-999;
00277   TrueQP=-999;
00278   QPVtxError=-999;
00279   RecoMomCurve=-999;
00280   RecoMomRange=-999;
00281   TrueMom=-999;
00282   RecoTime=-999;
00283 
00284   FitTrackStrips=-999;
00285   TrueMuonStrips=-999;
00286   FitAndTruthAgree=-999;
00287   FitTrackLength=-999;
00288   TrueTrackLength=-999;
00289   TotalStripsInSnarl=-999;
00290   FDFullyContained=-999;
00291   NTrackStrip=-999;
00292   NTrackDigit=-999;
00293 
00294   Chi2=-999;
00295   NDOF=-999;
00296   NIterate=-999;
00297   NSwimFail=-999;
00298 
00299   TimeSlope=-999;
00300   TimeOffset=-999;
00301   VtxT=-999;
00302   EndT=-999;
00303   TimeFitChi2=-999;
00304   NTimeFitDigit=-999;
00305   TimeForwardFitRMS=-999;
00306   TimeForwardFitNDOF=-999;
00307   TimeBackwardFitRMS=-999;
00308   TimeBackwardFitNDOF=-999;
00309 
00310   VtxU=-999;
00311   VtxV=-999;       
00312   VtxZ=-999;       
00313   VtxPlane=-999; 
00314                    
00315   VtxDirCosU=-999;
00316   VtxDirCosV=-999;
00317   VtxDirCosZ=-999;
00318   
00319   VtxUError=-999;
00320   VtxVError=-999;
00321   VtxdUError=-999;
00322   VtxdVError=-999;
00323                    
00324   EndU=-999;       
00325   EndV=-999;       
00326   EndZ=-999;       
00327   EndPlane=-999; 
00328   EndQP=-999;
00329 
00330   EndDirCosU=-999;
00331   EndDirCosV=-999;
00332   EndDirCosZ=-999;
00333                    
00334   EndUError=-999;
00335   EndVError=-999;
00336   EnddUError=-999;
00337   EnddVError=-999;
00338   EndQPError=-999;
00339 
00340   Range=-999;      
00341   dS=-999;         
00342   
00343   VtxTrace=-999; 
00344   VtxTraceZ=-999;
00345   EndTrace=-999; 
00346   EndTraceZ=-999;
00348 
00349 
00350   // Needed by methods
00352   candrec = dynamic_cast<CandRecord *> (mom->GetFragment("CandRecord", "PrimaryCandidateRecord"));
00353   
00354   if(!candrec)
00355     {
00356       MSG("FitTrack", Msg::kWarning) << " Failed to Find CandRecord " << endl;
00357       return JobCResult::kFailed;
00358     }
00359 
00360   // Header info
00361   CandHeader* candhead = (CandHeader*)(candrec->GetCandHeader());
00362   Run=candhead->GetRun();
00363   Snarl=candhead->GetSnarl();
00364 
00365   cout << "Snarl: " << Snarl << endl;
00366 
00367   VldContext *vldc = (VldContext*)(candrec->GetVldContext());  
00369 
00370 
00371   // Run methods 
00373   ConfigureAxes(vldc);
00374   SliceSection();
00375   ShowerSection();
00376   TrackSection();
00377   FittedTrackSection();
00378 
00379 
00380   // Truth section
00381   if(vldc->GetSimFlag()==SimFlag::kMC) {
00382     isMC=1;
00383 
00384     Truthifier* mytruth = new Truthifier(mom);
00385 
00386     //Get SimSnarlRecord
00387     SimSnarlRecord* simrec = dynamic_cast<SimSnarlRecord *>(mom->GetFragment("SimSnarlRecord"));
00388     if(simrec) {TruthSection(simrec);}
00389     
00390     TruthSliceSection(mytruth);
00391     EfficiencySection(mytruth);
00392 
00393     delete mytruth;
00394   }
00395 
00396   // Write ntuple
00397   TDirectory* tmpd = 0;
00398   tmpd = gDirectory;  
00399   FTCFile->cd();
00400   FTCTree->Fill();
00401   gDirectory = tmpd;
00402 
00403   Draw();
00404   //  Pause();
00405   CleanUp();
00407 
00408 
00409   return JobCResult::kPassed; // kNoDecision, kFailed, etc.
00410 }
00413 
00414 
00415 
00417 void FitTrackCamAnalysisModule::ConfigureAxes(VldContext *vldc)  
00418 {
00419   // Axes -  Determine for detector
00420 
00421   if (vldc->GetDetector()==Detector::kNear)
00422     {
00423       fUZAxis = new TH2F("UZAxis", "U view Near, Reco", 200, 0., 20., 80, -4., 4.);
00424       fVZAxis = new TH2F("VZAxis", "V view Near, Reco", 200, 0., 20., 80, -4., 4.);
00425 
00426       fUZMCAxis = new TH2F("UZMCAxis", "U view Near, Truth", 200, 0., 20., 80, -4., 4.);
00427       fVZMCAxis = new TH2F("VZMCAxis", "V view Near, Truth", 200, 0., 20., 80, -4., 4.);
00428     }
00429   else if (vldc->GetDetector()==Detector::kFar)
00430     {
00431       fUZAxis = new TH2F("UZAxis", "U view Far, Reco", 300, 0., 30., 100, -5., 5.);
00432       fVZAxis = new TH2F("VZAxis", "V view Far, Reco", 300, 0., 30., 100, -5., 5.);
00433 
00434       fUZMCAxis = new TH2F("UZMCAxis", "U view Far, Truth", 300, 0., 30., 100, -5., 5.);
00435       fVZMCAxis = new TH2F("VZMCAxis", "V view Far, Truth", 300, 0., 30., 100, -5., 5.);
00436     }
00437   else {cout << "Require detector to be near or far!!!" << endl;}
00438 
00439   // don't draw the Stats box
00440   fUZAxis->SetStats(kFALSE);
00441   fVZAxis->SetStats(kFALSE);
00442   fUZMCAxis->SetStats(kFALSE);
00443   fVZMCAxis->SetStats(kFALSE);
00444 
00445   // take away any association with a "directory" for these histograms
00446   fUZAxis->SetDirectory(0);
00447   fVZAxis->SetDirectory(0);
00448   fUZMCAxis->SetDirectory(0);
00449   fVZMCAxis->SetDirectory(0);
00450 
00451   // Draw empty canvas
00452   fUZPad->cd();
00453   fUZAxis->Draw();
00454 
00455   fVZPad->cd();
00456   fVZAxis->Draw();
00457 
00458   fUZMCPad->cd();
00459   fUZMCAxis->Draw();
00460 
00461   fVZMCPad->cd();
00462   fVZMCAxis->Draw();
00463 
00464   fTrackCanvas->cd();
00465 }
00467 
00468 
00469 
00471 void FitTrackCamAnalysisModule::SliceSection()
00472 {
00473   vector<TMarker> fThisSliceUZ;
00474   vector<TMarker> fThisSliceVZ;
00475   CandSliceListHandle* slice_list = 0;
00476 
00477   // Get CandSliceListHandle
00478   slice_list = dynamic_cast<CandSliceListHandle*>
00479     (candrec->FindCandHandle("CandSliceListHandle",fListInSlc.Data()));
00480 
00481   if(!slice_list) {MSG("FitTrack", Msg::kWarning) << " Failed to Find " << fListInSlc.Data() << endl; }
00482 
00483   else {
00484     assert(slice_list);
00485     if(slice_list->GetNDaughters()<1) {MSG("FitTrack", Msg::kWarning) << "SliceList was empty... " << endl; }
00486 
00487     // loop over the slices
00488     TIter SlcItr = slice_list->GetDaughterIterator();
00489     while(CandSliceHandle* Slc = dynamic_cast<CandSliceHandle*>(SlcItr()))
00490       {
00491         
00492         TIter SlcStripItr = Slc->GetDaughterIterator();
00493         while(CandStripHandle* SlcStrip = dynamic_cast<CandStripHandle*>(SlcStripItr()))
00494           {
00495 
00496             TIter digitrSlcXTalk = SlcStrip->GetDaughterIterator();
00497             while(CandDeMuxDigitHandle* SlcDigit = dynamic_cast<CandDeMuxDigitHandle*>(digitrSlcXTalk())) 
00498               {
00499                 // For U type planes
00500                 if(int(SlcStrip->GetPlaneView())==2 && (SlcDigit->GetDeMuxDigitFlagWord()!=1 || CareAboutXTalk)) {
00501                   TMarker tmpmUSlc(SlcStrip->GetZPos(),  SlcStrip->GetTPos(), 20);      
00502                   tmpmUSlc.SetMarkerColor(3);
00503                   tmpmUSlc.SetMarkerSize(0.8);
00504                   fThisSliceUZ.push_back(tmpmUSlc);
00505                 }
00506                 
00507                 // For V type planes
00508                 else if(int(SlcStrip->GetPlaneView())==3 && (SlcDigit->GetDeMuxDigitFlagWord()!=1 || CareAboutXTalk)) {
00509                   TMarker tmpmVSlc(SlcStrip->GetZPos(),  SlcStrip->GetTPos(), 20);      
00510                   tmpmVSlc.SetMarkerColor(3);
00511                   tmpmVSlc.SetMarkerSize(0.8);
00512                   fThisSliceVZ.push_back(tmpmVSlc);
00513                 }
00514                 
00515                 if(SlcStrip->GetZPos() > fMaxZ) fMaxZ=SlcStrip->GetZPos();
00516                 if(SlcStrip->GetZPos() < fMinZ) fMinZ=SlcStrip->GetZPos();
00517                 
00518                 if(SlcStrip->GetTPos() > fMaxUorV) fMaxUorV=SlcStrip->GetTPos();
00519                 if(SlcStrip->GetTPos() < fMinUorV) fMinUorV=SlcStrip->GetTPos();
00520               }
00521             digitrSlcXTalk.Reset();
00522           }
00523         SlcStripItr.Reset();
00524         
00525         fUZSliceMarker.push_back(fThisSliceUZ);
00526         fVZSliceMarker.push_back(fThisSliceVZ);
00527       }
00528     SlcItr.Reset();
00529   }
00530 }
00532 
00533 
00534 
00536 void FitTrackCamAnalysisModule::ShowerSection()
00537 {
00538   vector<TMarker> fThisShowerUZ;
00539   vector<TMarker> fThisShowerVZ;
00540   CandShowerListHandle* shower_list = 0;
00541 
00542   // Get CandShowerListHandle
00543   shower_list = dynamic_cast<CandShowerListHandle*>
00544     (candrec->FindCandHandle("CandShowerListHandle",fListInShw.Data()));
00545 
00546   if(!shower_list) {MSG("FitTrack", Msg::kWarning) << " Failed to Find " << fListInShw.Data() << endl; }
00547 
00548   else {
00549     assert(shower_list);
00550     if(shower_list->GetNDaughters()<1) {MSG("FitTrack", Msg::kWarning) << "ShowerList was empty... " << endl; }
00551     
00552     // loop over the showers
00553     TIter ShwItr = shower_list->GetDaughterIterator();
00554     while(CandShowerHandle* Shw = dynamic_cast<CandShowerHandle*>(ShwItr()))
00555       {
00556         
00557         TIter ShwStripItr = Shw->GetDaughterIterator();
00558         while(CandStripHandle* ShwStrip = dynamic_cast<CandStripHandle*>(ShwStripItr()))
00559           {
00560             
00561             TIter digitrShwXTalk = ShwStrip->GetDaughterIterator();
00562             while(CandDeMuxDigitHandle* ShwDigit = dynamic_cast<CandDeMuxDigitHandle*>(digitrShwXTalk())) 
00563               {
00564                 // For U type planes
00565                 if(int(ShwStrip->GetPlaneView())==2 && (ShwDigit->GetDeMuxDigitFlagWord()!=1 || CareAboutXTalk)) {
00566                   TMarker tmpmUShw(ShwStrip->GetZPos(),  ShwStrip->GetTPos(), 24);      
00567                   tmpmUShw.SetMarkerColor(5);
00568                   fThisShowerUZ.push_back(tmpmUShw);
00569                 }
00570                 
00571                 // For V type planes
00572                 else if(int(ShwStrip->GetPlaneView())==3 && (ShwDigit->GetDeMuxDigitFlagWord()!=1 || CareAboutXTalk)) {
00573                   TMarker tmpmVShw(ShwStrip->GetZPos(),  ShwStrip->GetTPos(), 24);      
00574                   tmpmVShw.SetMarkerColor(5);
00575                   fThisShowerVZ.push_back(tmpmVShw);
00576                 }
00577                 
00578                 if(ShwStrip->GetZPos() > fMaxZ) fMaxZ=ShwStrip->GetZPos();
00579                 if(ShwStrip->GetZPos() < fMinZ) fMinZ=ShwStrip->GetZPos();
00580                 
00581                 if(ShwStrip->GetTPos() > fMaxUorV) fMaxUorV=ShwStrip->GetTPos();
00582                 if(ShwStrip->GetTPos() < fMinUorV) fMinUorV=ShwStrip->GetTPos();
00583                 
00584               }
00585             digitrShwXTalk.Reset();
00586             
00587           }
00588         ShwStripItr.Reset();
00589         
00590         fUZShowerMarker.push_back(fThisShowerUZ);
00591         fVZShowerMarker.push_back(fThisShowerVZ);
00592       }
00593     ShwItr.Reset();
00594   }
00595 }
00597 
00598 
00599 
00601 void FitTrackCamAnalysisModule::TrackSection()
00602 {
00603   vector<TMarker> fThisTrackUZ;
00604   vector<TMarker> fThisTrackVZ;
00605   int numTrk=0;
00606   CandTrackListHandle* track_list = 0;
00607 
00608   // Get CandTrackListHandle
00609   track_list = dynamic_cast<CandTrackListHandle*>
00610     (candrec->FindCandHandle("CandTrackListHandle",fListInTrk.Data()));
00611 
00612   if(!track_list)    {MSG("Track", Msg::kWarning) << " Failed to Find " << fListInTrk.Data() << endl; }
00613 
00614   else {
00615     assert(track_list);
00616     if(track_list->GetNDaughters()<1) {MSG("Track", Msg::kWarning) << "Tracklist was empty... " << endl; }
00617 
00618     // loop over the simple tracks
00619     TIter TrkItr = track_list->GetDaughterIterator();
00620     while(CandTrackHandle* Trk = dynamic_cast<CandTrackHandle*>(TrkItr()))
00621       {
00622         numTrk++;
00623 
00624 
00625         TIter TrkStripItr = Trk->GetDaughterIterator();
00626         while(CandStripHandle* TrkStrip = dynamic_cast<CandStripHandle*>(TrkStripItr()))
00627           {
00628 
00629             TIter digitrTrkXTalk = TrkStrip->GetDaughterIterator();
00630             while(CandDeMuxDigitHandle* TrkDigit = dynamic_cast<CandDeMuxDigitHandle*>(digitrTrkXTalk())) 
00631               {
00632                 // For U type planes
00633                 if(int(TrkStrip->GetPlaneView())==2 && (TrkDigit->GetDeMuxDigitFlagWord()!=1 || CareAboutXTalk)) {
00634                   TMarker tmpmUTrk(TrkStrip->GetZPos(),  TrkStrip->GetTPos(), 24);      
00635                   tmpmUTrk.SetMarkerColor(4);
00636                   fThisTrackUZ.push_back(tmpmUTrk);
00637                 }
00638 
00639                 // For V type planes
00640                 else if(int(TrkStrip->GetPlaneView())==3 && (TrkDigit->GetDeMuxDigitFlagWord()!=1 || CareAboutXTalk)) {
00641                   TMarker tmpmVTrk(TrkStrip->GetZPos(), TrkStrip->GetTPos(), 24);       
00642                   tmpmVTrk.SetMarkerColor(4);
00643                   fThisTrackVZ.push_back(tmpmVTrk);
00644                 }
00645         
00646                 if(TrkStrip->GetZPos() > fMaxZ) fMaxZ=TrkStrip->GetZPos();
00647                 if(TrkStrip->GetZPos() < fMinZ) fMinZ=TrkStrip->GetZPos();
00648           
00649                 if(TrkStrip->GetTPos() > fMaxUorV) fMaxUorV=TrkStrip->GetTPos();
00650                 if(TrkStrip->GetTPos() < fMinUorV) fMinUorV=TrkStrip->GetTPos();
00651 
00652               }
00653             digitrTrkXTalk.Reset();
00654             
00655           }
00656         TrkStripItr.Reset();
00657 
00658         fUZTrackMarker.push_back(fThisTrackUZ);
00659         fVZTrackMarker.push_back(fThisTrackVZ);
00660       }
00661     TrkItr.Reset();
00662 
00663     if(debug) {cout << "Number of simple tracks: " << numTrk << endl;}
00664   }
00665 }
00667 
00668 
00669 
00670 
00672 void FitTrackCamAnalysisModule::FittedTrackSection()
00673 {
00674   vector<TMarker> fThisFitTrackUZ;
00675   vector<TMarker> fThisFitTrackVZ;
00676   int numFitTrk=0;
00677   CandFitTrackListHandle* fit_track_list = 0;
00678 
00679   // Get CandFitTrackListHandle
00680   fit_track_list = dynamic_cast<CandFitTrackListHandle*>
00681     (candrec->FindCandHandle("CandFitTrackListHandle",fListInFitTrk.Data()));
00682 
00683   if(!fit_track_list) {
00684     MSG("FitTrack", Msg::kWarning) << " Failed to Find " << fListInFitTrk.Data() << endl;
00685     NumFittedTracks=0;
00686     FitTrackLength=0;
00687   }
00688 
00689   else {
00690     assert(fit_track_list);
00691     if(fit_track_list->GetNDaughters()<1) {MSG("FitTrack", Msg::kWarning) << "FitTracklist was empty... " << endl; }
00692 
00693     // loop over the fittedtracks
00694     TIter FitTrkItr = fit_track_list->GetDaughterIterator();
00695     while(CandFitTrackCamHandle* FitTrk = dynamic_cast<CandFitTrackCamHandle*>(FitTrkItr()))
00696       {
00697         numFitTrk++;
00698 
00700         // Fully contained?
00701         bool EndContained=false; bool VtxContained=false;
00702 
00703         if( fabs(FitTrk->GetEndU())<3.5 && fabs(FitTrk->GetEndV())<3.5 
00704             && fabs( pow(0.5,0.5)*(FitTrk->GetEndU()-FitTrk->GetEndV()) )<3.5 
00705             && fabs( pow(0.5,0.5)*(FitTrk->GetEndU()+FitTrk->GetEndV()) )<3.5
00706             
00707             && fabs( pow( pow(FitTrk->GetEndU(),2) + pow(FitTrk->GetEndV(),2),0.5) )>.4
00708             
00709             && (FitTrk->GetTermPlane())<480 && (FitTrk->GetTermPlane())>5
00710 
00711             && ( (FitTrk->GetTermPlane())>254 || (FitTrk->GetTermPlane())<243 ) )
00712           
00713           {EndContained=true;}
00714         
00715         if( fabs(FitTrk->GetVtxU())<3.5 && fabs(FitTrk->GetVtxV())<3.5 
00716             && fabs( pow(0.5,0.5)*(FitTrk->GetVtxU()-FitTrk->GetVtxV()) )<3.5 
00717             && fabs( pow(0.5,0.5)*(FitTrk->GetVtxU()+FitTrk->GetVtxV()) )<3.5
00718             
00719             && fabs( pow( pow(FitTrk->GetVtxU(),2) + pow(FitTrk->GetVtxV(),2),0.5) )>.4
00720             
00721             && (FitTrk->GetVtxPlane())<480 && (FitTrk->GetVtxPlane())>5
00722 
00723             && ( (FitTrk->GetVtxPlane())>254 || (FitTrk->GetVtxPlane())<243 ) )
00724           
00725           {VtxContained=true;}
00726         
00727         if(EndContained==true && VtxContained==true) {FDFullyContained=1;}
00728         else {FDFullyContained=0;}
00730 
00731 
00732         TIter FitTrkStripItr = FitTrk->GetDaughterIterator();
00733         while(CandStripHandle* FitTrkStrip = dynamic_cast<CandStripHandle*>(FitTrkStripItr()))
00734           {
00735 
00736             TIter digitrFitTrkXTalk = FitTrkStrip->GetDaughterIterator();
00737             while(CandDeMuxDigitHandle* FitTrkDigit = dynamic_cast<CandDeMuxDigitHandle*>(digitrFitTrkXTalk())) 
00738               {
00739                 // For U type planes
00740                 if(int(FitTrkStrip->GetPlaneView())==2 && (FitTrkDigit->GetDeMuxDigitFlagWord()!=1 || CareAboutXTalk)) {
00741                   TMarker tmpmUFitTrk(FitTrkStrip->GetZPos(),  FitTrkStrip->GetTPos(), 23+numFitTrk);   
00742                   tmpmUFitTrk.SetMarkerColor(2);
00743                   fThisFitTrackUZ.push_back(tmpmUFitTrk);
00744                 }
00745 
00746                 // For V type planes
00747                 else if(int(FitTrkStrip->GetPlaneView())==3 && (FitTrkDigit->GetDeMuxDigitFlagWord()!=1 || CareAboutXTalk)) {
00748                   TMarker tmpmVFitTrk(FitTrkStrip->GetZPos(), FitTrkStrip->GetTPos(), 23+numFitTrk);    
00749                   tmpmVFitTrk.SetMarkerColor(2);
00750                   fThisFitTrackVZ.push_back(tmpmVFitTrk);
00751                 }
00752         
00753                 if(FitTrkStrip->GetZPos() > fMaxZ) fMaxZ=FitTrkStrip->GetZPos();
00754                 if(FitTrkStrip->GetZPos() < fMinZ) fMinZ=FitTrkStrip->GetZPos();
00755           
00756                 if(FitTrkStrip->GetTPos() > fMaxUorV) fMaxUorV=FitTrkStrip->GetTPos();
00757                 if(FitTrkStrip->GetTPos() < fMinUorV) fMinUorV=FitTrkStrip->GetTPos();
00758 
00759                 if(FitTrkStrip->GetPlane() > fFitEndPlane) fFitEndPlane=FitTrkStrip->GetPlane();
00760                 if(FitTrkStrip->GetPlane() < fFitVtxPlane) fFitVtxPlane=FitTrkStrip->GetPlane();
00761               }
00762             digitrFitTrkXTalk.Reset();
00763 
00764           }
00765         FitTrkStripItr.Reset();
00766 
00767 
00768         // Fill tree
00770         if(fit_track_list->GetNDaughters()==1) {
00771           Pass=FitTrk->GetPass();
00772 
00773           RecoMomCurve=FitTrk->GetMomentumCurve();
00774           if(FitTrk->GetMomentumCurve()!=0) {RecoQP=FitTrk->GetEMCharge()/FitTrk->GetMomentumCurve();}
00775           QPVtxError=FitTrk->GetVtxQPError();
00776           RecoTime=FitTrk->GetCPUTime();
00777 
00778           RecoMomRange=FitTrk->GetMomentumRange();
00779 
00780           NTrackStrip=FitTrk->GetNTrackStrip();
00781           NTrackDigit=FitTrk->GetNTrackDigit();
00782 
00783           Chi2=FitTrk->GetChi2();
00784           NDOF=FitTrk->GetNDOF();
00785           NIterate=FitTrk->GetNIterate();
00786           NSwimFail=FitTrk->GetNSwimFail();
00787 
00788           TimeSlope=FitTrk->GetTimeSlope();
00789           TimeOffset=FitTrk->GetTimeOffset();
00790           VtxT=FitTrk->GetVtxT();
00791           EndT=FitTrk->GetEndT();
00792           TimeFitChi2=FitTrk->GetTimeFitChi2();
00793           NTimeFitDigit=FitTrk->GetNTimeFitDigit();
00794           TimeForwardFitRMS=FitTrk->GetTimeForwardFitRMS();
00795           TimeForwardFitNDOF=FitTrk->GetTimeForwardFitNDOF();
00796           TimeBackwardFitRMS=FitTrk->GetTimeBackwardFitRMS();
00797           TimeBackwardFitNDOF=FitTrk->GetTimeBackwardFitNDOF();
00798 
00799           VtxU=FitTrk->GetVtxU();
00800           VtxV=FitTrk->GetVtxV();
00801           VtxZ=FitTrk->GetVtxZ();
00802           VtxPlane=FitTrk->GetVtxPlane();
00803 
00804           VtxDirCosU=FitTrk->GetVtxDirCosU();
00805           VtxDirCosV=FitTrk->GetVtxDirCosV();
00806           VtxDirCosZ=FitTrk->GetVtxDirCosZ();
00807 
00808           VtxUError=FitTrk->GetVtxUError();
00809           VtxVError=FitTrk->GetVtxVError();
00810           VtxdUError=FitTrk->GetVtxdUError();
00811           VtxdVError=FitTrk->GetVtxdVError();
00812 
00813           EndU=FitTrk->GetEndU();
00814           EndV=FitTrk->GetEndV();
00815           EndZ=FitTrk->GetEndZ();
00816           EndPlane=FitTrk->GetTermPlane();
00817           EndQP=FitTrk->GetEndQP();
00818 
00819           EndDirCosU=FitTrk->GetEndDirCosU();
00820           EndDirCosV=FitTrk->GetEndDirCosV();
00821           EndDirCosZ=FitTrk->GetEndDirCosZ();
00822 
00823           EndUError=FitTrk->GetEndUError();
00824           EndVError=FitTrk->GetEndVError();
00825           EnddUError=FitTrk->GetEnddUError();
00826           EnddVError=FitTrk->GetEnddVError();
00827           EndQPError=FitTrk->GetEndQPError();
00828 
00829           Range=FitTrk->GetRange();
00830           dS=FitTrk->GetdS();
00831 
00832           VtxTrace=FitTrk->GetVtxTrace();
00833           VtxTraceZ=FitTrk->GetVtxTraceZ();
00834           EndTrace=FitTrk->GetEndTrace();
00835           EndTraceZ=FitTrk->GetEndTraceZ();
00836           
00837           FitTrackLength=fFitEndPlane-fFitVtxPlane;
00838   
00839           cout << "Cam Fitter charge * momentum result: " << FitTrk->GetEMCharge()*FitTrk->GetMomentumCurve() << endl;
00840           cout << "Cam Fitter q/p vertex error: " << FitTrk->GetVtxQPError() << endl;
00841           cout << "Cam Fitter CPU time: " << FitTrk->GetCPUTime() << endl;
00842         }
00843         else {
00844           cout << "Multiple tracks!" << endl;
00845           cout << "Cam Fitter charge * momentum result: " << FitTrk->GetEMCharge()*FitTrk->GetMomentumCurve() << endl;
00846           cout << "Cam Fitter q/p vertex error: " << FitTrk->GetVtxQPError() << endl;
00847           cout << "Cam Fitter CPU time: " << FitTrk->GetCPUTime() << endl;
00848         }
00850 
00851         fUZFitTrackMarker.push_back(fThisFitTrackUZ);
00852         fVZFitTrackMarker.push_back(fThisFitTrackVZ);
00853       }
00854     FitTrkItr.Reset();
00855 
00856     if(debug) {
00857       cout << "Number of fitted tracks: " << numFitTrk << endl;
00858       cout << "Fit track length: " << FitTrackLength << endl;}
00859     
00860     NumFittedTracks=numFitTrk;
00861   }
00862 } 
00864 
00865 
00866 
00868 void FitTrackCamAnalysisModule::TruthSection(SimSnarlRecord* simrec)
00869 {   
00870   double fEmu=0;
00871 
00872   TObjArray arr(simrec->GetComponents());
00873   TIter iter(arr.MakeIterator());
00874   while(TObject* tob = (TObject*)(iter()))
00875     {
00876       if(tob->GetName()==TString("REROOT_NeuKin"))
00877         {
00878           REROOT_NeuKin* nukin = dynamic_cast<REROOT_NeuKin*>(tob);
00879           fEmu = nukin->P4Mu1()[3]; // Multiple muons?
00880         }   
00881     }
00882     
00883   cout << "--- True muon momentum * charge: " << fEmu << endl;
00884 
00885 
00886   // Get CandFitTrackListHandle
00887   CandFitTrackListHandle* fit_track_list = dynamic_cast<CandFitTrackListHandle*>
00888     (candrec->FindCandHandle("CandFitTrackListHandle",fListInFitTrk.Data()));
00889 
00890     
00891   // Fill tree
00893   if(fit_track_list) {
00894     if(fit_track_list->GetNDaughters()==1) {
00895       if(fEmu!=0.) {TrueQP=1./fEmu;}
00896       else{TrueQP=-999;}
00897       TrueMom=fabs(fEmu);
00898     }
00899     else {TrueQP=-999; TrueMom=-999;}
00900   }
00901   else {TrueQP=-999; TrueMom=-999;}
00903   
00904 
00905   // Display
00907   if(fit_track_list) {
00908     if(fEmu!=0. && fit_track_list->GetNDaughters()==1) {
00909       cout << "--- (Reco - Truth) / Truth: " << (RecoMomCurve-TrueMom)/ TrueMom << endl;
00910     }
00911   } 
00913 
00914 }
00916 
00917 
00918 
00920 void FitTrackCamAnalysisModule::TruthSliceSection(Truthifier* mytruth)
00921 {
00922   int numTrueMuonDigits=0;
00923   int numTrueMuonStrips=0;
00924 
00925   int numSliceStrips=0;
00926 
00927   vector<TMarker> fThisSliceUZTruth;
00928   vector<TMarker> fThisSliceVZTruth;
00929 
00930   vector<TMarker> fThisTrackUZTruth;
00931   vector<TMarker> fThisTrackVZTruth;
00932 
00933   // Get CandSliceListHandle
00934   CandSliceListHandle* slice_list = dynamic_cast<CandSliceListHandle*>
00935     (candrec->FindCandHandle("CandSliceListHandle",fListInSlc.Data()));
00936 
00937   if(!slice_list)    {MSG("FitTrack", Msg::kWarning) << " Failed to Find " << fListInSlc.Data() << endl;}
00938 
00939   else {
00940     assert(slice_list);
00941     if(slice_list->GetNDaughters()<1) {MSG("FitTrack", Msg::kWarning) << "SliceList was empty... " << endl; }     
00942       
00943     TIter SlcItrTruth = slice_list->GetDaughterIterator();
00944     while(CandSliceHandle* SlcTruth = dynamic_cast<CandSliceHandle*>(SlcItrTruth()))
00945       {
00946         
00947         TIter SlcStripItrTruth = SlcTruth->GetDaughterIterator();
00948         while(CandStripHandle* SlcStripTruth = dynamic_cast<CandStripHandle*>(SlcStripItrTruth()))
00949           {
00950             numSliceStrips++;
00951 
00952             TIter digitrTruth = SlcStripTruth->GetDaughterIterator();
00953             while(CandDeMuxDigitHandle* SlcDigitTruth = dynamic_cast<CandDeMuxDigitHandle*>(digitrTruth())) 
00954               { 
00955                 // For U type planes
00956                 if(int(SlcStripTruth->GetPlaneView())==2 && (SlcDigitTruth->GetDeMuxDigitFlagWord()!=1 || CareAboutXTalk)) {
00957                   TMarker tmpmUSlcTruth(SlcStripTruth->GetZPos(),  SlcStripTruth->GetTPos(), 20);       
00958                   tmpmUSlcTruth.SetMarkerColor(3);
00959                   tmpmUSlcTruth.SetMarkerSize(0.8);
00960                   fThisSliceUZTruth.push_back(tmpmUSlcTruth);
00961                 }
00962                   
00963                 // For V type planes
00964                 else if(int(SlcStripTruth->GetPlaneView())==3 && (SlcDigitTruth->GetDeMuxDigitFlagWord()!=1 || CareAboutXTalk)) {
00965                   TMarker tmpmVSlcTruth(SlcStripTruth->GetZPos(),  SlcStripTruth->GetTPos(), 20);       
00966                   tmpmVSlcTruth.SetMarkerColor(3);
00967                   tmpmVSlcTruth.SetMarkerSize(0.8);
00968                   fThisSliceVZTruth.push_back(tmpmVSlcTruth);
00969                 }
00970                   
00971                   
00972                 // Highlight true track and true showers, etc.
00973                 if ( (mytruth->IsDigitFromParticle(13,*SlcDigitTruth)
00974                       || mytruth->IsDigitFromParticle(-13,*SlcDigitTruth))
00975                      
00976                      && mytruth->DigitIsOnlyCrosstalk(SlcDigitTruth)==0 )
00977                   {
00978                     // count number of true muon hit strips
00979                     numTrueMuonDigits++;
00980                     
00981                     // For U type planes
00982                     if(int(SlcStripTruth->GetPlaneView())==2) {
00983                       TMarker tmpmUTrkTruth(SlcStripTruth->GetZPos(),  SlcStripTruth->GetTPos(), 30);   
00984                       tmpmUTrkTruth.SetMarkerColor(2);
00985                       fThisTrackUZTruth.push_back(tmpmUTrkTruth);
00986                     }
00987                     
00988                     // For V type planes
00989                     else if(int(SlcStripTruth->GetPlaneView())==3) {
00990                       TMarker tmpmVTrkTruth(SlcStripTruth->GetZPos(),  SlcStripTruth->GetTPos(), 30);   
00991                       tmpmVTrkTruth.SetMarkerColor(2);
00992                       fThisTrackVZTruth.push_back(tmpmVTrkTruth);
00993                     }     
00994                     
00995                     if(SlcStripTruth->GetPlane() > fTrueMaxPlane) {fTrueMaxPlane=SlcStripTruth->GetPlane();}
00996                     if(SlcStripTruth->GetPlane() < fTrueMinPlane) {fTrueMinPlane=SlcStripTruth->GetPlane();}
00997                   }
00998               }
00999             digitrTruth.Reset();
01000 
01001             if(numTrueMuonDigits>0) {numTrueMuonStrips++;}
01002             numTrueMuonDigits=0; // Reset counter
01003             
01004           }
01005         SlcStripItrTruth.Reset();
01006         
01007         if(debug) {
01008           cout << "Total no. of hit strips: " << numSliceStrips << endl;
01009           cout << "No. of true muon hit strips: " << numTrueMuonStrips << endl;}
01010         
01011 
01012         // Fill Tree - even if multiple tracks
01014         TotalStripsInSnarl=numSliceStrips;
01015         TrueMuonStrips=numTrueMuonStrips;
01016         if(TrueMuonStrips!=0) {TrueTrackLength=fTrueMaxPlane-fTrueMinPlane;}
01017         else {TrueTrackLength=0;}
01019 
01020         if(debug) {cout << "True track length: " << TrueTrackLength << endl;}
01021 
01022 
01023         fUZSliceMarkerTruth.push_back(fThisSliceUZTruth);
01024         fVZSliceMarkerTruth.push_back(fThisSliceVZTruth);
01025 
01026         fUZTrackMarkerTruth.push_back(fThisTrackUZTruth);
01027         fVZTrackMarkerTruth.push_back(fThisTrackVZTruth);
01028       }
01029   }
01030 }
01032 
01033 
01034  
01036 void FitTrackCamAnalysisModule::EfficiencySection(Truthifier* mytruth)
01037 {
01038   int numFitTrkStrips=0;
01039   int numTrueMuonDigits=0;
01040   int numFitTrkTruthAgree=0;
01041     
01042   // Get CandFitTrackListHandle
01043   CandFitTrackListHandle* fit_track_list = dynamic_cast<CandFitTrackListHandle*>(candrec->FindCandHandle("CandFitTrackListHandle",
01044                                                                                                          fListInFitTrk.Data()));
01045   if(!fit_track_list) {
01046     MSG("FitTrack", Msg::kWarning) << " Failed to Find " << fListInFitTrk.Data() << endl;
01047     FitTrackStrips=0;
01048     FitAndTruthAgree=0;
01049   }
01050   
01051   else {
01052     assert(fit_track_list);
01053     if(fit_track_list->GetNDaughters()<1) {MSG("FitTrack", Msg::kWarning) << "FitTracklist was empty... " << endl; }
01054       
01055     // loop over the fittedtracks
01056     TIter FitTrkItr = fit_track_list->GetDaughterIterator();
01057     while(CandFitTrackHandle* FitTrk = dynamic_cast<CandFitTrackHandle*>(FitTrkItr()))
01058       {
01059 
01060         TIter FitTrkStripItr = FitTrk->GetDaughterIterator();
01061         while(CandStripHandle* FitTrkStrip = dynamic_cast<CandStripHandle*>(FitTrkStripItr()))
01062           {
01063             numFitTrkStrips++;
01064               
01065             TIter digitrFitTrkXTalk = FitTrkStrip->GetDaughterIterator();
01066             while(CandDeMuxDigitHandle* FitTrkDigit = dynamic_cast<CandDeMuxDigitHandle*>(digitrFitTrkXTalk())) 
01067               {
01068                 if ( ( mytruth->IsDigitFromParticle(13,*FitTrkDigit)
01069                        || mytruth->IsDigitFromParticle(-13,*FitTrkDigit) )
01070                        
01071                      && mytruth->DigitIsOnlyCrosstalk(FitTrkDigit)==0 )
01072                   {
01073                     // count number of true muon hit strips
01074                     numTrueMuonDigits++;
01075                   }
01076               }
01077             digitrFitTrkXTalk.Reset();
01078               
01079             if(numTrueMuonDigits>0) {numFitTrkTruthAgree++;}
01080             numTrueMuonDigits=0;
01081               
01082           }
01083         FitTrkStripItr.Reset();
01084           
01085         if(debug) {
01086           cout << "No. of fit track hit strips: " << numFitTrkStrips << endl;
01087           cout << "No. of fit track hits that agree with true muon hits: " << numFitTrkTruthAgree << endl;}
01088 
01089 
01090         //Fill tree
01092         if(fit_track_list->GetNDaughters()==1) {
01093           FitTrackStrips=numFitTrkStrips;
01094           FitAndTruthAgree=numFitTrkTruthAgree;
01095         }
01096         else {
01097           FitTrackStrips=-999;
01098           FitAndTruthAgree=-999;
01099         }
01101 
01102       }
01103     FitTrkItr.Reset();
01104   }
01105 }
01107 
01108 
01109 
01111 void FitTrackCamAnalysisModule::Draw()
01112 {
01113   // Plot slices
01115   if(fUZSliceMarker.size() > 0) {
01116     fUZPad->cd();
01117     fUZAxis->GetXaxis()->SetRangeUser(fMinZ-0.1, fMaxZ+0.1);
01118     fUZAxis->GetYaxis()->SetRangeUser(fMinUorV-0.4, fMaxUorV+0.4);
01119     for(unsigned int j=0; j<fUZSliceMarker.size(); ++j) {
01120       if (fUZSliceMarker[j].size() > 0) {
01121         for(unsigned int i=0; i<fUZSliceMarker[j].size(); ++i) {  
01122           fUZSliceMarker[j][i].Draw();
01123         }
01124       }
01125     }  
01126   }
01127 
01128   if(fVZSliceMarker.size() > 0) {
01129     fVZPad->cd();
01130     fVZAxis->GetXaxis()->SetRangeUser(fMinZ-0.1, fMaxZ+0.1);
01131     fVZAxis->GetYaxis()->SetRangeUser(fMinUorV-0.4, fMaxUorV+0.4);
01132     for(unsigned int j=0; j<fVZSliceMarker.size(); ++j) {
01133       if (fVZSliceMarker[j].size() > 0) {
01134         for(unsigned int i=0; i<fVZSliceMarker[j].size(); ++i) {
01135           fVZSliceMarker[j][i].Draw();
01136         }
01137       }
01138     }
01139   }
01141 
01142 
01143   // Plot showers
01145   if (fUZShowerMarker.size() > 0) {  // Check to see if there are showers
01146     fUZPad->cd();
01147     fUZAxis->GetXaxis()->SetRangeUser(fMinZ-0.1, fMaxZ+0.1);
01148     fUZAxis->GetYaxis()->SetRangeUser(fMinUorV-0.4, fMaxUorV+0.4);
01149     for(unsigned int j=0; j<fUZShowerMarker.size(); ++j) {
01150       if (fUZShowerMarker[j].size() > 0) {
01151         for(unsigned int i=0; i<fUZShowerMarker[j].size(); ++i) {  
01152           fUZShowerMarker[j][i].Draw();
01153         }
01154       }
01155     }  
01156   }
01157 
01158   if (fVZShowerMarker.size() > 0) { 
01159     fVZPad->cd();
01160     fVZAxis->GetXaxis()->SetRangeUser(fMinZ-0.1, fMaxZ+0.1);
01161     fVZAxis->GetYaxis()->SetRangeUser(fMinUorV-0.4, fMaxUorV+0.4);
01162     for(unsigned int j=0; j<fVZShowerMarker.size(); ++j) {
01163       if (fVZShowerMarker[j].size() > 0) {
01164         for(unsigned int i=0; i<fVZShowerMarker[j].size(); ++i) {
01165           fVZShowerMarker[j][i].Draw();
01166         }
01167       }
01168     }
01169   }
01171 
01172 
01173   // Plot simple tracks
01175   if (fUZTrackMarker.size() > 0) {  // Check to see if there are tracks
01176     fUZPad->cd();
01177     fUZAxis->GetXaxis()->SetRangeUser(fMinZ-0.1, fMaxZ+0.1);
01178     fUZAxis->GetYaxis()->SetRangeUser(fMinUorV-0.4, fMaxUorV+0.4);
01179     for(unsigned int j=0; j<fUZTrackMarker.size(); ++j) {
01180       if (fUZTrackMarker[j].size() > 0) {
01181         for(unsigned int i=0; i<fUZTrackMarker[j].size(); ++i) {  
01182           fUZTrackMarker[j][i].Draw();
01183         }
01184       }
01185     }
01186   }
01187  
01188   if (fVZTrackMarker.size() > 0) {  
01189     fVZPad->cd();
01190     fVZAxis->GetXaxis()->SetRangeUser(fMinZ-0.1, fMaxZ+0.1);
01191     fVZAxis->GetYaxis()->SetRangeUser(fMinUorV-0.4, fMaxUorV+0.4);
01192     for(unsigned int j=0; j<fVZTrackMarker.size(); ++j) {
01193       if (fVZTrackMarker[j].size() > 0) {
01194         for(unsigned int i=0; i<fVZTrackMarker[j].size(); ++i) {  
01195           fVZTrackMarker[j][i].Draw();
01196         }
01197       }
01198     }
01199   }
01201 
01202 
01203 
01204   // Plot fitted tracks
01206   if (fUZFitTrackMarker.size() > 0) {  // Check to see if there are fitted tracks
01207     fUZPad->cd();
01208     fUZAxis->GetXaxis()->SetRangeUser(fMinZ-0.1, fMaxZ+0.1);
01209     fUZAxis->GetYaxis()->SetRangeUser(fMinUorV-0.4, fMaxUorV+0.4);
01210     for(unsigned int j=0; j<fUZFitTrackMarker.size(); ++j) {
01211       if (fUZFitTrackMarker[j].size() > 0) {
01212         for(unsigned int i=0; i<fUZFitTrackMarker[j].size(); ++i) {  
01213           fUZFitTrackMarker[j][i].Draw();
01214         }
01215       }
01216     }
01217   }
01218 
01219   if (fVZFitTrackMarker.size() > 0) {
01220     fVZPad->cd();
01221     fVZAxis->GetXaxis()->SetRangeUser(fMinZ-0.1, fMaxZ+0.1);
01222     fVZAxis->GetYaxis()->SetRangeUser(fMinUorV-0.4, fMaxUorV+0.4);
01223     for(unsigned int j=0; j<fVZFitTrackMarker.size(); ++j) {
01224       if (fVZFitTrackMarker[j].size() > 0) {
01225         for(unsigned int i=0; i<fVZFitTrackMarker[j].size(); ++i) {  
01226           fVZFitTrackMarker[j][i].Draw();
01227         }
01228       }
01229     }
01230   }
01232 
01233 
01234   // Truth section plot
01236   if (isMC==1) {
01237     
01238     // All slice
01239     if(fUZSliceMarkerTruth.size() > 0) {
01240       fUZMCPad->cd();
01241       fUZMCAxis->GetXaxis()->SetRangeUser(fMinZ-0.1, fMaxZ+0.1);
01242       fUZMCAxis->GetYaxis()->SetRangeUser(fMinUorV-0.4, fMaxUorV+0.4);
01243       for(unsigned int j=0; j<fUZSliceMarkerTruth.size(); ++j) {
01244         if (fUZSliceMarkerTruth[j].size() > 0) {
01245           for(unsigned int i=0; i<fUZSliceMarkerTruth[j].size(); ++i) {  
01246             fUZSliceMarkerTruth[j][i].Draw();
01247           }
01248         }
01249       }  
01250     }
01251     
01252     if(fVZSliceMarkerTruth.size() > 0) {
01253       fVZMCPad->cd();
01254       fVZMCAxis->GetXaxis()->SetRangeUser(fMinZ-0.1, fMaxZ+0.1);
01255       fVZMCAxis->GetYaxis()->SetRangeUser(fMinUorV-0.4, fMaxUorV+0.4);
01256       for(unsigned int j=0; j<fVZSliceMarkerTruth.size(); ++j) {
01257         if (fVZSliceMarkerTruth[j].size() > 0) {
01258           for(unsigned int i=0; i<fVZSliceMarkerTruth[j].size(); ++i) {
01259             fVZSliceMarkerTruth[j][i].Draw();
01260           }
01261         }
01262       }
01263     }
01264 
01265     // True tracks... muon hits, etc
01266     if(fUZTrackMarkerTruth.size() > 0) {
01267       fUZMCPad->cd();
01268       fUZMCAxis->GetXaxis()->SetRangeUser(fMinZ-0.1, fMaxZ+0.1);
01269       fUZMCAxis->GetYaxis()->SetRangeUser(fMinUorV-0.4, fMaxUorV+0.4);
01270       for(unsigned int j=0; j<fUZTrackMarkerTruth.size(); ++j) {
01271         if (fUZTrackMarkerTruth[j].size() > 0) {
01272           for(unsigned int i=0; i<fUZTrackMarkerTruth[j].size(); ++i) {  
01273             fUZTrackMarkerTruth[j][i].Draw();
01274           }
01275         }
01276       }  
01277     }
01278     
01279     if(fVZTrackMarkerTruth.size() > 0) {
01280       fVZMCPad->cd();
01281       fVZMCAxis->GetXaxis()->SetRangeUser(fMinZ-0.1, fMaxZ+0.1);
01282       fVZMCAxis->GetYaxis()->SetRangeUser(fMinUorV-0.4, fMaxUorV+0.4);
01283       for(unsigned int j=0; j<fVZTrackMarkerTruth.size(); ++j) {
01284         if (fVZTrackMarkerTruth[j].size() > 0) {
01285           for(unsigned int i=0; i<fVZTrackMarkerTruth[j].size(); ++i) {
01286             fVZTrackMarkerTruth[j][i].Draw();
01287           }
01288         }
01289       }
01290     }
01291     
01292   }
01294 
01295   fTrackCanvas->cd();
01296   fTrackCanvas->Update();
01297 }
01299 
01300 
01302 void FitTrackCamAnalysisModule::Pause()
01303 {
01304   cout << "Press return to continue" << endl;
01305 
01306   int key = 0;
01307   while(1){
01308     gSystem->ProcessEvents();
01309     fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK);
01310     key = getchar();
01311     if(key=='\n') break;
01312     usleep(1000);
01313   }
01314 }
01316 
01317 
01318 
01320 void FitTrackCamAnalysisModule::CleanUp()
01321 {
01322   fUZSliceMarker.clear();
01323   fVZSliceMarker.clear();
01324 
01325   fUZShowerMarker.clear();
01326   fVZShowerMarker.clear();
01327 
01328   fUZTrackMarker.clear();
01329   fVZTrackMarker.clear();
01330 
01331   fUZFitTrackMarker.clear();
01332   fVZFitTrackMarker.clear();
01333 
01334   fUZSliceMarkerTruth.clear();
01335   fVZSliceMarkerTruth.clear();
01336 
01337   fUZTrackMarkerTruth.clear();
01338   fVZTrackMarkerTruth.clear();
01339 }
01341 
01342 
01343 
01345 const Registry& FitTrackCamAnalysisModule::DefaultConfig() const
01346 {
01347   //======================================================================
01348   // Supply the default configuration for the module
01349   //======================================================================
01350   static Registry r; // Default configuration for module
01351 
01352   // Set name of config
01353   std::string name = this->GetName();
01354   name += ".config.default";
01355   r.SetName(name.c_str());
01356 
01357   // Set values in configuration
01358   r.UnLockValues();
01359   r.Set("NameSlcListIn","CandSliceList");
01360   r.Set("NameShwListIn","CandShowerList");
01361   r.Set("NameTrkListIn","CandTrackSRList");
01362   r.Set("NameFitTrkListIn","CandFitTrackCamList");
01363   r.Set("NameFileOut","FitTrackCamAna.root");
01364   r.LockValues();
01365 
01366   return r;
01367 }
01369 
01370 
01371 
01373 void FitTrackCamAnalysisModule::Config(const Registry& r)
01374 {
01375   //======================================================================
01376   // Configure the module given the Registry r
01377   //======================================================================
01378   const char* tmps;
01379   if (r.Get("NameSlcListIn",tmps)) { fListInSlc = tmps; }
01380   if (r.Get("NameShwListIn",tmps)) { fListInShw = tmps; }
01381   if (r.Get("NameTrkListIn",tmps)) { fListInTrk = tmps; }
01382   if (r.Get("NameFitTrkListIn",tmps)) { fListInFitTrk = tmps; }
01383   if (r.Get("NameFileOut",tmps)) { fFileName = tmps; }
01384 }

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