// -*- C++ -*- // // Package: HadronicDNtupleProc // Module: HadronicDNtupleProc_missingMass // // Description: // // Implementation: // // // Author: Peter Onyisi // Created: Sometime in April 2005 // $Id: HadronicDNtupleProc_missingMass.cc,v 1.2 2006/02/01 17:56:58 srs63 Exp $ // // Revision history // // $Log: HadronicDNtupleProc_missingMass.cc,v $ // Revision 1.2 2006/02/01 17:56:58 srs63 // Added missing mass modes: 7 - pi0 from D0->Kspi0pi0, 14 - mode 4 with loose pi0s, 17 - mode 7 with loose pi0s // // Revision 1.1 2005/08/30 19:20:54 ponyisi // Update to current state. New features: // // New eta block parallels pi0s; // New lepton ID variables (dpthmu, Rochester EID f_with_rich); // Trkman info; // Missing mass information filled in separate functions; // dataselection.tcl has new input data types, allowing information to be // specified by another tcl; // Will use setup_analysis if requested // #include "Experiment/Experiment.h" #include "Experiment/units.h" #include "Experiment/report.h" #include "HadronicDNtupleProc/HadronicDNtupleProc.h" #include "LabNet4Momentum/LabNet4Momentum.h" #include "PhotonDecays/PhdPi0.h" #include "Navigation/NavTrack.h" #include "DChain/List/Template/DCDecayList.cc" #include "DTag/DTagList.h" #include "DTag/DTagDecayModes.h" #include "DTag/DTagUtilities.h" #include "DDoubleTag/DDoubleTag.h" #include "DDoubleTag/DDoubleTagList.h" #include "CleoDChain/CDPi0.h" #include "CleoDChain/CDKs.h" #include "CleoDChain/CDEta.h" static const char* const kFacilityString = "Processor.HadronicDNtupleProc" ; static DABoolean goodTrack(const NavTrack& track, const DBCandidate::Hypo hypo){ //FAItem< TRSeedTrackQuality > SeedQual = track.seedQuality(); //if( (*SeedQual).originUsed() ) return false; //if( (*SeedQual).numberHitsExpected() == 0 ) return false; FAItem< TRTrackFitQuality > FitQual = track.quality(hypo); //if( (*FitQual).fitAbort() ) return false; if( (*FitQual).chiSquare() > 100000.0 ) return false; //if( (*FitQual).chiSquare() <= 0.0 ) return false; //if( (*FitQual).ratioNumberHitsToExpected() < 0.5 ) return false; int hits=(*FitQual).numberHits(); int ehits=(*FitQual).numberHitsExpected(); float fhits=(float) hits; float efhits=(float) ehits; float frac=0; if(efhits>0){frac=fhits/efhits;} if (frac<0.5) return false; //FAItem< TDKinematicFit > Fit=track.kinematicFit(hypo); //if ( (*Fit).pmag() < 50.0*k_MeV ) return false; //if ( (*Fit).pmag() > 2.0*k_GeV ) return false; //if ( fabs((*Fit).momentum().cosTheta()) > 0.93 ) return false; FAItem< TRHelixFit > Helix=track.helixFit(hypo); if ( fabs((*Helix).d0() ) > 5*k_mm ) return false; if ( fabs((*Helix).z0() ) > 5*k_cm ) return false; return true; } DChainBoolean pionSelector( CDChargedPion& iPion ) { if (! goodTrack (iPion.track(), iPion.hypo() )) return false; return true; } DChainBoolean kaonSelector( CDChargedKaon& iKaon ) { if (! goodTrack (iKaon.track(), iKaon.hypo() )) return false; return true; } //DChainBoolean loosePi0Selector( CDPi0& iPi0 ) //{ // double pi0Mass = iPi0.pi0().unconMass(); // if ( pi0Mass > m_loosePi0MinMass.value() && pi0Mass < m_loosePi0MaxMass.value() ) return true; // else return false; //} /*FATable< NavPi0ToGG > TurnPhdPi0sIntoNavPi0ToGGs(FATable< PhdPi0 > loosePi0table) { FAPtrTable< NavPi0ToGG > * pointerTable = new FAPtrTable(); FATable::const_iterator PhdPi0Itr = loosePi0table.begin(); for ( ; PhdPi0Itr != loosePi0table.end(); PhdPi0Itr++) { PhDPi0 thisPhdPi0 = *PhdPi0Itr; NavShower* hiEnShower = FindShowerWithIdentifier(thisPhDPi0.hiEnId()); NavShower* loEnShower = FindShowerWithIdentifier(thisPhDPi0.loEnId()); pointerTable.insert(new NavPi0ToGG(&thisPhdPi0, hiEnShower, loEnShower); } return FATable< NavPi0ToGG >(pointerTable); }*/ class RecoilCandSelector: public DCSelectionFunction< CDDecay >{ public: RecoilCandSelector(int modemin,int modemax,double m2missmin,double m2missmax,int modenumber,const LabNet4Momentum* labmomentum) { m_modemin=modemin; m_modemax=modemax; m_m2missmin=m2missmin; m_m2missmax=m2missmax; m_modenumber=modenumber; m_labmomentum=labmomentum; } SelectionResult operator()( CDDecay& aRecoilCand ) { //cout << "In selector"<(aRecoilCand.child((DCChildren::Position)nrecoilpart).decay()); //cout << "decayMode():"<m_modemax) return false; if (tagDecay.decayMode()m_m2missmin)&&(mmissq(); } if (missingMassObjects.recoils == NULL) { missingMassObjects.recoils = new vector* >(); } vector* >& recoils = *missingMassObjects.recoils; vector& fullyreco = *missingMassObjects.fullyreco; for (int irecoil=0;irecoilplus()*DTags; recoils.push_back(new pair(recoillist,0)); fullyrecolist=new CDDecayList; if (usePID){ (*fullyrecolist)=(*recoillist)*missingMassObjects.pionList->minus(); } else { (*fullyrecolist)=(*recoillist)*missingMassObjects.pionListTrkEff->minus(); } fullyreco.push_back(fullyrecolist); //cout << "Will make mode 1"<minus()*DTags; recoils.push_back(new pair(recoillist,1)); fullyrecolist=new CDDecayList; if (usePID) { (*fullyrecolist)=(*recoillist)*missingMassObjects.kaonList->plus(); } else { (*fullyrecolist)=(*recoillist)*missingMassObjects.kaonListTrkEff->plus(); } fullyreco.push_back(fullyrecolist); //cout << "Will make mode 2"<plus()*(*missingMassObjects.pi0List)*DTags; recoils.push_back(new pair(recoillist,2)); fullyrecolist=new CDDecayList; if (usePID){ (*fullyrecolist)=(*recoillist)*missingMassObjects.pionList->minus(); } else { (*fullyrecolist)=(*recoillist)*missingMassObjects.pionListTrkEff->minus(); } fullyreco.push_back(fullyrecolist); //cout << "Will make mode 3"<minus()*(*missingMassObjects.pi0List)*DTags; recoils.push_back(new pair(recoillist,3)); fullyrecolist=new CDDecayList; if (usePID) { (*fullyrecolist)=(*recoillist)*missingMassObjects.kaonList->plus(); } else { (*fullyrecolist)=(*recoillist)*missingMassObjects.kaonListTrkEff->plus(); } fullyreco.push_back(fullyrecolist); //cout << "Will make mode 4"<(recoillist,4)); fullyrecolist=new CDDecayList; (*fullyrecolist)=(*recoillist)*(*missingMassObjects.pi0List); fullyreco.push_back(fullyrecolist); //mode 14 ks combined with loose pi0 RecoilCandSelector Mode14(0,99,-0.5,0.5,14,&labMomentum); recoillist=new CDDecayList(Mode14); (*recoillist)=(*missingMassObjects.ksList)*DTags; recoils.push_back(new pair(recoillist,14)); fullyrecolist=new CDDecayList; (*fullyrecolist)=(*recoillist)*(*missingMassObjects.loosePi0List); fullyreco.push_back(fullyrecolist); //mode 7 ks pi0 RecoilCandSelector Mode7(0,99,-0.5,0.5,7,&labMomentum); recoillist=new CDDecayList(Mode7); (*recoillist)=(*missingMassObjects.ksList)*(*missingMassObjects.pi0List)*DTags; recoils.push_back(new pair(recoillist,7)); fullyrecolist=new CDDecayList; (*fullyrecolist)=(*recoillist)*(*missingMassObjects.pi0List); fullyreco.push_back(fullyrecolist); //mode 17 ks pi0 combined with loose pi0 RecoilCandSelector Mode17(0,99,-0.5,0.5,17,&labMomentum); recoillist=new CDDecayList(Mode17); (*recoillist)=(*missingMassObjects.ksList)*(*missingMassObjects.pi0List)*DTags; recoils.push_back(new pair(recoillist,17)); fullyrecolist=new CDDecayList; (*fullyrecolist)=(*recoillist)*(*missingMassObjects.loosePi0List); fullyreco.push_back(fullyrecolist); //cout << "Will make mode 5"<(recoillist,5)); fullyrecolist=new CDDecayList; (*fullyrecolist)=(*recoillist)*(*missingMassObjects.ksList); fullyreco.push_back(fullyrecolist); //cout << "Will make mode 6"<plus()*missingMassObjects.pionList->minus()*DTags; recoils.push_back(new pair(recoillist,6)); fullyrecolist=new CDDecayList; (*fullyrecolist)=(*recoillist)*(*missingMassObjects.ksList); fullyreco.push_back(fullyrecolist); //cout << "Will make mode 100"<minus()*DTags; recoils.push_back(new pair(recoillist,100)); fullyrecolist=new CDDecayList; (*fullyrecolist)=(*recoillist)*(*missingMassObjects.ksList); fullyreco.push_back(fullyrecolist); //cout << "Will make mode 101"<(recoillist,101)); fullyrecolist=new CDDecayList; if (usePID){ (*fullyrecolist)=(*recoillist)*missingMassObjects.pionList->plus(); } else{ (*fullyrecolist)=(*recoillist)*missingMassObjects.pionListTrkEff->plus(); } fullyreco.push_back(fullyrecolist); //cout << "Will make mode 102"<minus()*missingMassObjects.pionList->minus()*DTags; recoils.push_back(new pair(recoillist,102)); fullyrecolist=new CDDecayList; if (usePID) { (*fullyrecolist)=(*recoillist)*missingMassObjects.kaonList->plus(); } else { (*fullyrecolist)=(*recoillist)*missingMassObjects.kaonListTrkEff->plus(); } fullyreco.push_back(fullyrecolist); //cout << "Will make mode 103"<plus()*missingMassObjects.pionList->minus()*DTags; recoils.push_back(new pair(recoillist,103)); fullyrecolist=new CDDecayList; if (usePID) { (*fullyrecolist)=(*recoillist)*missingMassObjects.pionList->minus(); } else { (*fullyrecolist)=(*recoillist)*missingMassObjects.pionListTrkEff->minus(); } fullyreco.push_back(fullyrecolist); } void HadronicDNtupleProc::makeMissingMassStage2(const DTag& tagd, const LabNet4Momentum& labMomentum) { if (missingMassObjects.fullyreco == NULL) { missingMassObjects.fullyreco = new vector(); report(EMERGENCY, kFacilityString) << "fullyreco should already exist at this point" << endl; } if (missingMassObjects.recoils == NULL) { missingMassObjects.recoils = new vector* >(); report(EMERGENCY, kFacilityString) << "recoils should already exist at this point" << endl; } vector* >& recoils = *missingMassObjects.recoils; vector& fullyreco = *missingMassObjects.fullyreco; int irecoil=0; for (irecoil=0;irecoil(recoilCand.child((DCChildren::Position)nrecoilpart).decay()); if ((&tagDecay)!=(&(tagd))) continue; HepLorentzVector p4recoil; int index1=-1; int index2=-1; switch (mode) { case 0: { const NavTrack& kaon = recoilCand.child(DCChildren::First).track(); p4recoil=kaon.kaonFit()->lorentzMomentum(); index1=indexInTrackBlock(kaon); } break; case 1: { const NavTrack& pion = recoilCand.child(DCChildren::First).track(); p4recoil=pion.pionFit()->lorentzMomentum(); index1=indexInTrackBlock(pion); } break; case 2: { const NavTrack& kaon = recoilCand.child(DCChildren::First).track(); const NavPi0ToGG& pi0 = recoilCand.child(DCChildren::Second).navPi0(); p4recoil=kaon.kaonFit()->lorentzMomentum()+ pi0.pi0().lorentzMomentum(); index1=indexInTrackBlock(kaon); index2=indexInPi0Block(pi0); } break; case 3: { const NavTrack& pion = recoilCand.child(DCChildren::First).track(); const NavPi0ToGG& pi0 = recoilCand.child(DCChildren::Second).navPi0(); p4recoil=pion.pionFit()->lorentzMomentum()+ pi0.pi0().lorentzMomentum(); index1=indexInTrackBlock(pion); index2=indexInPi0Block(pi0); } break; case 4: case 14: { const NavKs& ks = recoilCand.child(DCChildren::First).navKshort(); p4recoil=ks.kShort().lorentzMomentum(); index1=indexInKsBlock(ks); } break; case 7: case 17: { const NavKs& ks = recoilCand.child(DCChildren::First).navKshort(); const NavPi0ToGG& pi0 = recoilCand.child(DCChildren::Second).navPi0(); p4recoil=ks.kShort().lorentzMomentum() + pi0.pi0().lorentzMomentum(); index1=indexInKsBlock(ks); index2=indexInPi0Block(pi0); } break; case 5: { const NavPi0ToGG& pi0 = recoilCand.child(DCChildren::First).navPi0(); p4recoil=pi0.pi0().lorentzMomentum(); index1=indexInPi0Block(pi0); } break; case 6: { const NavTrack& pion1 = recoilCand.child(DCChildren::First).track(); const NavTrack& pion2 = recoilCand.child(DCChildren::Second).track(); p4recoil=pion1.pionFit()->lorentzMomentum()+ pion2.pionFit()->lorentzMomentum(); index1=indexInTrackBlock(pion1); index2=indexInTrackBlock(pion2); } break; case 100: { const NavTrack& pion = recoilCand.child(DCChildren::First).track(); p4recoil=pion.pionFit()->lorentzMomentum(); index1=indexInTrackBlock(pion); } break; case 101: { const NavKs& ks = recoilCand.child(DCChildren::First).navKshort(); p4recoil=ks.kShort().lorentzMomentum(); index1=indexInKsBlock(ks); } break; case 102: { const NavTrack& pion1 = recoilCand.child(DCChildren::First).track(); const NavTrack& pion2 = recoilCand.child(DCChildren::Second).track(); p4recoil=pion1.pionFit()->lorentzMomentum()+ pion2.pionFit()->lorentzMomentum(); index1=indexInTrackBlock(pion1); index2=indexInTrackBlock(pion2); } break; case 103: { const NavTrack& kaon = recoilCand.child(DCChildren::First).track(); const NavTrack& pion = recoilCand.child(DCChildren::Second).track(); p4recoil=kaon.kaonFit()->lorentzMomentum()+ pion.pionFit()->lorentzMomentum(); index1=indexInTrackBlock(kaon); index2=indexInTrackBlock(pion); } break; default: cout << "mode:"<particle_end(); CDDecayList::iterator fullreco = fullyreco[irecoil]->particle_begin(); for( ; fullreco != fullrecoEnd; ++fullreco ){ const CDDecay& fullrecoCand = (*fullreco).particle(); if (&recoilCand!=&(fullrecoCand.child(DCChildren::First).decay().decay())) continue; HepLorentzVector p4particle; switch (mode) { case 0: case 2: case 101: case 103: { const NavTrack& pion = fullrecoCand.child(DCChildren::Second).track(); p4particle=pion.pionFit()->lorentzMomentum(); } break; case 1: case 3: case 102: { const NavTrack& kaon = fullrecoCand.child(DCChildren::Second).track(); p4particle=kaon.kaonFit()->lorentzMomentum(); } break; case 4: case 14: case 7: case 17: { const NavPi0ToGG& pi0 = fullrecoCand.child(DCChildren::Second).navPi0(); p4particle=pi0.pi0().lorentzMomentum(); } break; case 5: case 6: case 100: { const NavKs& ks = fullrecoCand.child(DCChildren::Second).navKshort(); p4particle=ks.kShort().lorentzMomentum(); } break; default: cout << "Unknown mode:"<0.05) continue; double mbc=sqrt(0.25*labMomentum.t()*labMomentum.t()-p4D.rho()*p4D.rho()); if (fabs(mbc-tagDecay.nominalMass())< fabs(bestmbc-tagDecay.nominalMass())){ bestmbc=mbc; } } tuple.mdcand[tuple.nmiss]=tuple.ndcand; tuple.mmode[tuple.nmiss]=mode; tuple.mtrack1[tuple.nmiss]=index1; tuple.mtrack2[tuple.nmiss]=index2; tuple.mmsq[tuple.nmiss]=mmissq; tuple.mpx[tuple.nmiss]=labMomentum.x()-p4recoil.x()-tagd.kinematicData().lorentzMomentum().x(); tuple.mpy[tuple.nmiss]=labMomentum.y()-p4recoil.y()-tagd.kinematicData().lorentzMomentum().y(); tuple.mpz[tuple.nmiss]=labMomentum.z()-p4recoil.z()-tagd.kinematicData().lorentzMomentum().z(); tuple.me[tuple.nmiss]=labMomentum.t()-p4recoil.t()-tagd.kinematicData().lorentzMomentum().t(); tuple.mbestmbc[tuple.nmiss]=bestmbc; tuple.nmiss++; if (tuple.nmiss>=10000) { report( NOTICE, kFacilityString ) <<"To many missing masses"<