#include #include #include "IGRooTrackerVtxModule.hxx" #include "IJNuBeamFlux.hxx" #include "IG4PrimaryParticle.hxx" #include "IG4PrimaryVertex.hxx" #include "IGeomInfo.hxx" #include "IP0DGeom.hxx" #include "IOADatabase.hxx" #include "ICOMETLog.hxx" ClassImp(COMET::IGRooTrackerVtxModule); // //------------------------------------------------------------------------------ COMET::IGRooTrackerVtxModule::IGRooTrackerVtxModule(const char *name, const char *title){ fVtx = new TClonesArray("COMET::IGRooTrackerVtx", 100); SetNameTitle(name, title); ///< Enable this module by default: fIsEnabled = kTRUE; fDescription = "Genie specific module which fills mc-truth vertex info"; fCurrGenieVtx = new IGRooTrackerVtx(); //COMET::ICOMETLog::Configure(); } // //------------------------------------------------------------------------------ COMET::IGRooTrackerVtxModule::~IGRooTrackerVtxModule() { } // //------------------------------------------------------------------------------ Bool_t COMET::IGRooTrackerVtxModule::IsKnownGenerator(const char * name){ std::string name2compare(name); bool is_genie1 = (name2compare.find("genie") != name2compare.npos); bool is_genie2 = (name2compare.find("gRooTracker") != name2compare.npos); bool is_genie = (is_genie1 || is_genie2); COMETDebug("Returning is generator = "<< is_genie << " for generator name = "<< name); return is_genie; } // //------------------------------------------------------------------------------ Bool_t COMET::IGRooTrackerVtxModule::CheckMismatch(COMET::IG4PrimaryVertex vtx){ if(fCurrGenieVtx == NULL){ COMETDebug("Could not compare pass-through to G4 primary vertex as" << " there is no passed through vertex to compare to!"); return false; } ///< Compare the event codes. bool evtcode = (fCurrGenieVtx->EvtCode->GetString().CompareTo(vtx.GetReaction()) == 0); COMETDebug("Comparing "<< fCurrGenieVtx->EvtCode->GetString().Data() << " and " << vtx.GetReaction()); ///< And the vertex position. double smallnum = 0.000001; bool position = (std::abs(fCurrGenieVtx->EvtVtx[0] - vtx.GetPosition().X()) < smallnum) && (std::abs(fCurrGenieVtx->EvtVtx[1] - vtx.GetPosition().Y()) < smallnum) && (std::abs(fCurrGenieVtx->EvtVtx[2] - vtx.GetPosition().Z()) < smallnum); COMETDebug("Pass through vertex position check bool passed = "<< position ); ///< In future can add more but for now this should suffice along ///< with the validation scripts. if(position && evtcode){ COMETDebug("Passed through vertex passed mismatch test!"); return true; } COMETError("SEVERE ERROR! Mismatch between G4Vertex and pass-through info!"); return false; } // //------------------------------------------------------------------------------ void COMET::IGRooTrackerVtxModule::FillVtx(int entry){ COMETVerbose("Filling fCurrGenieVtx with OrigEvtNum = " << fOrigTreeEntryNumber); fCurrGenieVtx->Reset(); fRooTrackerTree->GetEntry(entry); ///< first fill up all the book-keeping info fCurrGenieVtx->OrigFileName->SetString(fOrigInputFileName.c_str()); fCurrGenieVtx->OrigTreeName->SetString(fInputTreeName.c_str()); fCurrGenieVtx->OrigEvtNum = fOrigTreeEntryNumber; fCurrGenieVtx->OrigTreePOT = fOrigInputTreePOT; fCurrGenieVtx->OrigTreeEntries = fOrigInputTreeEntries; fCurrGenieVtx->TimeInSpill = fTimeInSpill; fCurrGenieVtx->TruthVertexID = fTruthVertexID; ///< Need to convert to the comet length units fCurrGenieVtx->EvtVtx[0] *= 1000.0; fCurrGenieVtx->EvtVtx[1] *= 1000.0; fCurrGenieVtx->EvtVtx[2] *= 1000.0; ///< Fill in the geometry path for the current vertex. gGeoManager->FindNode(fCurrGenieVtx->EvtVtx[0], fCurrGenieVtx->EvtVtx[1], fCurrGenieVtx->EvtVtx[2]); ///< Get the name of the generator that generated this event. fCurrGenieVtx->GeneratorName->SetString(fGeneratorName.c_str()); ///< Get the geometry path for this event. fCurrGenieVtx->GeomPath->SetString(gGeoManager->GetPath()); ///< Now create another fRooTracker vtx to add to the vertex ///< container. IGRooTrackerVtx * fGRooTrackerVtx; fGRooTrackerVtx = new((*fVtx)[fNVtx++]) IGRooTrackerVtx(); ///< Copy the current genie event. Make sure this is done last so we copy a ///< complete event. fGRooTrackerVtx->Copy(fCurrGenieVtx); } // //------------------------------------------------------------------------------ void COMET::IGRooTrackerVtxModule::SetGeneratorTreeAddresses(){ // Set the flux branch addresses common to both generators COMET::IJNuBeamFlux * flux = (COMET::IJNuBeamFlux *) fCurrGenieVtx; COMET::IRooTrackerVtxModuleBase::SetFluxTreeAddresses(flux); // Now set the generator specific branch addresses fRooTrackerTree->SetBranchAddress("G2NeutEvtCode", &(fCurrGenieVtx->G2NeutEvtCode) ); fRooTrackerTree->SetBranchAddress("EvtCode", &(fCurrGenieVtx->EvtCode) ); fRooTrackerTree->SetBranchAddress("EvtNum", &(fCurrGenieVtx->EvtNum) ); fRooTrackerTree->SetBranchAddress("EvtXSec", &(fCurrGenieVtx->EvtXSec) ); fRooTrackerTree->SetBranchAddress("EvtDXSec", &(fCurrGenieVtx->EvtDXSec) ); fRooTrackerTree->SetBranchAddress("EvtWght", &(fCurrGenieVtx->EvtWght) ); fRooTrackerTree->SetBranchAddress("EvtProb", &(fCurrGenieVtx->EvtProb) ); fRooTrackerTree->SetBranchAddress("EvtVtx", (fCurrGenieVtx->EvtVtx) ); fRooTrackerTree->SetBranchAddress("StdHepN", &(fCurrGenieVtx->StdHepN) ); fRooTrackerTree->SetBranchAddress("StdHepPdg", &(fCurrGenieVtx->StdHepPdg) ); fRooTrackerTree->SetBranchAddress("StdHepRescat", &(fCurrGenieVtx->StdHepRescat) ); fRooTrackerTree->SetBranchAddress("StdHepStatus", &(fCurrGenieVtx->StdHepStatus) ); fRooTrackerTree->SetBranchAddress("StdHepX4", (fCurrGenieVtx->StdHepX4) ); fRooTrackerTree->SetBranchAddress("StdHepP4", (fCurrGenieVtx->StdHepP4) ); fRooTrackerTree->SetBranchAddress("StdHepPolz", (fCurrGenieVtx->StdHepPolz) ); fRooTrackerTree->SetBranchAddress("StdHepFd", (fCurrGenieVtx->StdHepFd) ); fRooTrackerTree->SetBranchAddress("StdHepLd", (fCurrGenieVtx->StdHepLd) ); fRooTrackerTree->SetBranchAddress("StdHepFm", (fCurrGenieVtx->StdHepFm) ); fRooTrackerTree->SetBranchAddress("StdHepLm", (fCurrGenieVtx->StdHepLm) ); } // //------------------------------------------------------------------------------