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

CosmicAna.cxx

Go to the documentation of this file.
00001 
00002 
00003 
00004 
00005 
00006 #include "MCCheckOut/CosmicAna.h"
00007 #include <vector>
00008 #include <cmath>
00009 #include "TH1F.h"
00010 #include "TH2F.h"
00011 #include "Config/Config.h"
00012 #include "EventDataModel/edm.h"
00013 #include "Geometry/geo.h"
00014 #include "JobControl/jobc.h"
00015 #include "Simulation/PartToHitTable.h"
00016 #include "Simulation/ParticleList.h"
00017 #include "Simulation/FLSHitList.h"
00018 using namespace mcchk;
00019 MODULE_DECL(mcchk::CosmicAna);
00020 
00021 //......................................................................
00022 
00023 CosmicAna::CosmicAna(const char* version) : 
00024   jobc::Module("mcchk::CosmicAna")
00025 {
00026   this->SetCfgVersion(version);
00027 
00028   fNhitHisto = new TH1F("fNhitHisto",
00029                         ";hits/20 usec;spills",200,0.0,20000.0);
00030 
00031   fDminHisto0 = new TH1F("fDminHisto0",";d (cm);",100,0.0,500.E2);
00032   fDminHisto1 = new TH1F("fDminHisto1",";d (cm);",100,0.0,500.E2);
00033 
00034   fPhotonAngles = new TH2F("fPhotonAngles",";x;y",
00035                          36,-180.0,180.0,50,-1.0,1.0);
00036   fPhotonAnglesLo = new TH2F("fPhotonAnglesLo",";x;y",
00037                            36,-180.0,180.0,50,-1.0,1.0);
00038   fPhotonAnglesMi = new TH2F("fPhotonAnglesMi",";x;y",
00039                            36,-180.0,180.0,50,-1.0,1.0);
00040   fPhotonAnglesHi = new TH2F("fPhotonAnglesHi",";x;y",
00041                              36,-180.0,180.0,50,-1.0,1.0);
00042   fPhotonCosQ   = new TH1F("fPhotonCosQ",";cosQ;tracks",50,-1.0,1.0);
00043   fPhotonEnergy = new TH1F("fPhotonEnergy",";E (GeV)",5000,0.0,1000.0);
00044 
00045   fElectronAngles = new TH2F("fElectronAngles",";x;y",
00046                              36,-180.0,180.0,50,-1.0,1.0);
00047   fElectronAnglesLo = new TH2F("fElectronAnglesLo",";x;y",
00048                                36,-180.0,180.0,50,-1.0,1.0);
00049   fElectronAnglesMi = new TH2F("fElectronAnglesMi",";x;y",
00050                                36,-180.0,180.0,50,-1.0,1.0);
00051   fElectronAnglesHi = new TH2F("fElectronAnglesHi",";x;y",
00052                                36,-180.0,180.0,50,-1.0,1.0);
00053   fElectronCosQ   = new TH1F("fElectronCosQ",";cosQ;tracks",50,-1.0,1.0);
00054   fElectronEnergy = new TH1F("fElectronEnergy",";E (GeV)",5000,0.0,1000.0);
00055   
00056   fMuonAngles = new TH2F("fMuonAngles",";x;y",
00057                          36,-180.0,180.0,50,-1.0,1.0);
00058   fMuonAnglesLo = new TH2F("fMuonAnglesLo",";x;y",
00059                            36,-180.0,180.0,50,-1.0,1.0);
00060   fMuonAnglesMi = new TH2F("fMuonAnglesMi",";x;y",
00061                            36,-180.0,180.0,50,-1.0,1.0);
00062   fMuonAnglesHi = new TH2F("fMuonAnglesHi",";x;y",
00063                            36,-180.0,180.0,50,-1.0,1.0);
00064   fMuonCosQ   = new TH1F("fMuonCosQ",";cosQ;tracks",50,-1.0,1.0);
00065   fMuonEnergy = new TH1F("fMuonEnergy",";E (GeV)",5000,0.0,1000.0);
00066 }
00067 
00068 //......................................................................
00069 
00070 CosmicAna::~CosmicAna() { }
00071 
00072 //......................................................................
00073 
00074 void CosmicAna::Update(const cfg::Config& /*c*/) { }
00075 
00076 //......................................................................
00077 
00078 jobc::Result CosmicAna::Ana(const edm::EventHandle& evt) 
00079 { 
00080   std::vector<const sim::ParticleList*> partlist;
00081   try         { evt.DetSim().Get(".",partlist); }
00082   catch (...) { std::cerr << "No particle list!" << std::endl; }
00083 
00084   std::vector<const sim::FLSHitList*> hitlist;
00085   try         { evt.DetSim().Get(".",hitlist); }
00086   catch (...) { std::cerr << "No FLS hit list!" << std::endl; }
00087 
00088   geo::Geometry& geom = geo::Geometry::Instance(evt.Header().Run(),1);
00089   
00090   const std::vector<sim::Particle>& particle = partlist[0]->fParticles;
00091   const std::vector<sim::FLSHit>&   hits     = hitlist[0]->fHits;
00092   fNhitHisto->Fill((float)hits.size());
00093 
00094   // Build look up table from a particle to the hits it created
00095   sim::PartToHitTable p2h(*partlist[0], *hitlist[0]);
00096   
00097   double electronE = -1.0;
00098   double photonE   = -1.0;
00099   for (unsigned int i=0; i<particle.size(); ++i) {
00100     const TLorentzVector& v4 = particle[i].fVtx;
00101     const TLorentzVector& p4 = particle[i].fP;
00102     double x0[3] = {v4.X(),  v4.Y(),  v4.Z()};
00103     double dx[3] = {p4.Px(), p4.Py(), p4.Pz()};
00104     double x1[3] = {0.0,     0.0,     0.5*geom.DetLength()};
00105     double x2[3];
00106     double d = geo::ClosestApproach(x1, x0, dx, x2);
00107     if (p2h[i].size()==0) {fDminHisto0->Fill(d); }
00108     else                  {fDminHisto1->Fill(d); }
00109     if (p2h[i].size()>0 && d>100.E2) {
00110       std::cout <<
00111         "dmin.gt.100 " << 
00112         evt.Header().Run() << " " << evt.Header().Event() << " " <<
00113         particle[i].fPdgCode << " " <<
00114         v4.X()  << " " << v4.Y()  << " " << v4.Z()  << " " <<
00115         p4.Px() << " " << p4.Py() << " " << p4.Pz() << " " <<
00116         d << " " << p2h[i].size() << std::endl;
00117     }
00118 
00119     TH1F* hCosQ     = 0;
00120     TH2F* hAngles   = 0;
00121     TH2F* hAnglesLo = 0;
00122     TH2F* hAnglesMi = 0;
00123     TH2F* hAnglesHi = 0;
00124     TH1F* hEnergy   = 0;
00125     if (abs(particle[i].fPdgCode)==13) {
00126       hCosQ     = fMuonCosQ;
00127       hAngles   = fMuonAngles;
00128       hAnglesLo = fMuonAnglesLo;
00129       hAnglesMi = fMuonAnglesMi;
00130       hAnglesHi = fMuonAnglesHi;
00131       hEnergy   = fMuonEnergy;
00132     }
00133     else if (abs(particle[i].fPdgCode)==22) {
00134       hCosQ     = fPhotonCosQ;
00135       hAngles   = fPhotonAngles;
00136       hAnglesLo = fPhotonAnglesLo;
00137       hAnglesMi = fPhotonAnglesMi;
00138       hAnglesHi = fPhotonAnglesHi;
00139       hEnergy   = fPhotonEnergy;
00140     }
00141     else if (abs(particle[i].fPdgCode)==11) {
00142       hCosQ     = fElectronCosQ;
00143       hAngles   = fElectronAngles;
00144       hAnglesLo = fElectronAnglesLo;
00145       hAnglesMi = fElectronAnglesMi;
00146       hAnglesHi = fElectronAnglesHi;
00147       hEnergy   = fElectronEnergy;
00148     }
00149     if (hCosQ!=0) {
00150       if (p2h[i].size()>0) {
00151         double cosq = -p4.Py()/p4.P();
00152         double phi  = atan2(p4.Pz(),p4.Px());
00153         phi *= 180/M_PI;
00154         hCosQ->Fill(cosq);
00155         hAngles->Fill(phi,cosq);
00156         if      (p4.E()<1.0)  hAnglesLo->Fill(phi,cosq);
00157         else if (p4.E()<10.0) hAnglesMi->Fill(phi,cosq);
00158         else                  hAnglesHi->Fill(phi,cosq);
00159         hEnergy->Fill(p4.E());
00160         
00161         // Check for interesting particles
00162         if (p4.E()>0.500 && p4.E()<5.0) {
00163           if (abs(particle[i].fPdgCode)==11) electronE = p4.E();
00164           if (abs(particle[i].fPdgCode)==22) photonE   = p4.E();
00165         }
00166       }
00167     } // loop on particles
00168   }
00169   if (electronE>0.0 || photonE>0.0) {
00170     std::cout << "Run/Event " << evt.Header().Run() << " "
00171               << evt.Header().Event() << " " 
00172               << electronE << " " << photonE << std::endl;
00173   }
00174   return jobc::kPassed;
00175 }
00176 

Generated on Mon Dec 1 02:35:17 2008 for NOvA Offline by  doxygen 1.3.9.1