9 #include <analysis/modules/BtubeCreator/BtubeCreatorModule.h>
12 #include <framework/gearbox/Unit.h>
13 #include <framework/gearbox/Const.h>
14 #include <framework/logging/Logger.h>
17 #include <analysis/dataobjects/Particle.h>
18 #include <analysis/DecayDescriptor/ParticleListName.h>
21 #include <analysis/utility/PCmsLabTransform.h>
22 #include <analysis/utility/ParticleCopy.h>
25 #include <framework/geometry/BFieldManager.h>
46 setDescription(
"BtubeCreator : This module creates Btube object, an object geometrically similar to a very long ellipsoid along a particular direction and can be used as a constraint in vertexing B particles. Upsilon4S decays to two Bs. the user selects one B with a ^ in decaystring. The order of daughters in reconstructdecay of Upsilon4S and this decaystring should be same. Using selected B as reference, the module calculates the direction in which the other B should fly and constructs a Btube object along that direction. In semi-leptonic analyses, the selected B is usually the fully reconstructed one, while for time dependent studies, the selected B is usually signal B which can be partially reconstructed");
49 addParam(
"listName", m_listName,
"name of mother particle list",
string(
""));
50 addParam(
"confidenceLevel", m_confidenceLevel,
"Confidence level to accept the fit.", 0.001);
51 addParam(
"decayString", m_decayString,
52 "decay string of the mother particle, the selected daughter specifies which daughter will be used as reference to create Btube",
54 addParam(
"associateBtubeToBselected", m_associateBtubeToBselected,
55 "whether to associate the Btube with the selected B",
57 addParam(
"verbosity", m_verbose,
"print statements",
true);
60 void BtubeCreatorModule::initialize()
63 m_plist.isRequired(m_listName);
66 m_Bfield = BFieldManager::getField(TVector3(0, 0, 0)).Z() / Unit::T;
68 m_BeamSpotCenter = m_beamSpotDB->getIPPosition();
69 m_beamSpotCov.ResizeTo(3, 3);
70 m_beamSpotCov = m_beamSpotDB->getCovVertex();
71 B2INFO(
"BtubeCreator : magnetic field = " << m_Bfield);
73 m_tubeArray.registerInDataStore();
76 bool valid = m_decaydescriptor.init(m_decayString);
78 B2ERROR(
"BtubeCreatorModule: invalid decay string" << m_decayString);
79 int nProducts = m_decaydescriptor.getNDaughters();
81 B2ERROR(
"BtubeCreatorModule: decay string should contain only two daughters");
84 void BtubeCreatorModule::event()
86 analysis::RaveSetup::initialize(1, m_Bfield);
88 std::vector<unsigned int> toRemove;
89 unsigned int n = m_plist->getListSize();
91 for (
unsigned i = 0; i < n; i++) {
92 Particle* particle = m_plist->getParticle(i);
94 std::vector<Particle*> daughtervec = particle->getDaughters();
95 std::vector<const Particle*> selParticles = m_decaydescriptor.getSelectionParticles(particle);
96 if (selParticles.size() > 1) {
97 B2FATAL(
"Please select only one daughter which will be used as reference to create Btube");
101 if ((daughtervec.at(0))->getArrayIndex() == (selParticles.at(0))->getArrayIndex()) selectindex = 0 ;
103 Particle* tubecreatorB =
const_cast<Particle*
>(particle->getDaughter(selectindex));
104 Particle* otherB =
const_cast<Particle*
>(particle->getDaughter(1 - selectindex));
107 B2FATAL(
"Please perform a vertex fit of the selected B before calling this module");
112 Particle* tubecreatorBCopy = ParticleCopy::copyParticle(tubecreatorB);
115 B2DEBUG(10,
"tubecreator B decay vertex: ");
116 B2DEBUG(10,
"{" << std::fixed << std::setprecision(20) << tubecreatorBCopy->
getVertex()[0] <<
"," << std::fixed <<
118 20) << tubecreatorBCopy->
getVertex()[1] <<
"," << std::fixed << std::setprecision(20) << tubecreatorBCopy->
getVertex()[2] <<
"}");
121 bool ok0 = doVertexFit(tubecreatorBCopy);
124 if (tubecreatorBCopy->
getPValue() < m_confidenceLevel) {
125 toRemove.push_back(particle->getArrayIndex());
127 particle->setVertex(tubecreatorBCopy->
getVertex());
148 Eigen::Matrix<double, 3, 1> tubecreatorBOriginpos(tubecreatorBCopy->
getVertex()[0], tubecreatorBCopy->
getVertex()[1],
150 TLorentzVector v4Final = tubecreatorBCopy->
get4Vector();
153 TLorentzVector vecNew(-1 * vec.Px(), -1 * vec.Py(), -1 * vec.Pz(), vec.E());
157 B2DEBUG(10,
"beamspot center :");
158 B2DEBUG(10,
"{" << std::fixed << std::setprecision(20) << m_BeamSpotCenter.X() <<
"," << std::fixed << std::setprecision(
159 20) << m_BeamSpotCenter.Y() <<
"," << std::fixed << std::setprecision(20) << m_BeamSpotCenter.Z() <<
"}");
160 B2DEBUG(10,
"beamspot cov :");
162 B2DEBUG(10,
"{" << std::fixed << std::setprecision(20) << m_beamSpotCov(0,
163 0) <<
"," << std::fixed << std::setprecision(20) << m_beamSpotCov(0,
164 1) <<
"," << std::fixed << std::setprecision(20) << m_beamSpotCov(0, 2) <<
"},");
165 B2DEBUG(10,
"{" << std::fixed << std::setprecision(20) << m_beamSpotCov(1,
166 0) <<
"," << std::fixed << std::setprecision(20) << m_beamSpotCov(1,
167 1) <<
"," << std::fixed << std::setprecision(20) << m_beamSpotCov(1, 2) <<
"},");
168 B2DEBUG(10,
"{" << std::fixed << std::setprecision(20) << m_beamSpotCov(2,
169 0) <<
"," << std::fixed << std::setprecision(20) << m_beamSpotCov(2,
170 1) <<
"," << std::fixed << std::setprecision(20) << m_beamSpotCov(2, 2) <<
"}");
178 double theta = v4FinalNew.Theta();
179 double phi = v4FinalNew.Phi();
181 double st = TMath::Sin(theta);
182 double ct = TMath::Cos(theta);
183 double sp = TMath::Sin(phi);
184 double cp = TMath::Cos(phi);
186 TMatrix r2z(3, 3); r2z(2, 2) = 1;
187 r2z(0, 0) = cp; r2z(0, 1) = -1 * sp;
188 r2z(1, 0) = sp; r2z(1, 1) = cp;
190 TMatrix r2y(3, 3); r2y(1, 1) = 1;
191 r2y(0, 0) = ct; r2y(0, 2) = st;
192 r2y(2, 0) = -1 * st; r2y(2, 2) = ct;
194 TMatrix r2(3, 3); r2.Mult(r2z, r2y);
195 TMatrix r2t(3, 3); r2t.Transpose(r2);
197 TMatrix longerror(3, 3); longerror(2, 2) = 1000;
198 TMatrix longerror_temp(3, 3); longerror_temp.Mult(r2, longerror);
199 TMatrix longerrorRotated(3, 3); longerrorRotated.Mult(longerror_temp, r2t);
203 pvNew += longerrorRotated;
205 TMatrixFSym errNew(7);
206 errNew.SetSub(0, 0, pp);
207 errNew.SetSub(4, 4, pvNew);
210 TMatrixFSym tubeMat(3);
211 tubeMat.SetSub(0, 0, pvNew);
213 TMatrixFSym tubeMatCenterError(3);
214 tubeMatCenterError.SetSub(0, 0, pv);
217 B2DEBUG(10,
"B origin error matrix : ");
218 B2DEBUG(10,
"{" << std::fixed << std::setprecision(20) << pv(0, 0) <<
"," << std::fixed << std::setprecision(20) << pv(0,
219 1) <<
"," << std::fixed << std::setprecision(20) << pv(0, 2) <<
"},");
220 B2DEBUG(10,
"{" << std::fixed << std::setprecision(20) << pv(1, 0) <<
"," << std::fixed << std::setprecision(20) << pv(1,
221 1) <<
"," << std::fixed << std::setprecision(20) << pv(1, 2) <<
"},");
222 B2DEBUG(10,
"{" << std::fixed << std::setprecision(20) << pv(2, 0) <<
"," << std::fixed << std::setprecision(20) << pv(2,
223 1) <<
"," << std::fixed << std::setprecision(20) << pv(2, 2) <<
"}");
225 B2DEBUG(10,
"B tube error matrix : ");
226 B2DEBUG(10,
"{" << std::fixed << std::setprecision(20) << pvNew(0, 0) <<
"," << std::fixed << std::setprecision(20) << pvNew(0,
227 1) <<
"," << std::fixed << std::setprecision(20) << pvNew(0, 2) <<
"},");
228 B2DEBUG(10,
"{" << std::fixed << std::setprecision(20) << pvNew(1, 0) <<
"," << std::fixed << std::setprecision(20) << pvNew(1,
229 1) <<
"," << std::fixed << std::setprecision(20) << pvNew(1, 2) <<
"},");
230 B2DEBUG(10,
"{" << std::fixed << std::setprecision(20) << pvNew(2, 0) <<
"," << std::fixed << std::setprecision(20) << pvNew(2,
231 1) <<
"," << std::fixed << std::setprecision(20) << pvNew(2, 2) <<
"}");
233 B2DEBUG(10,
"B origin ");
234 B2DEBUG(10,
"{" << std::fixed << std::setprecision(20) << tubecreatorBCopy->
getVertex()[0] <<
"," << std::fixed <<
236 20) << tubecreatorBCopy->
getVertex()[1] <<
"," << std::fixed << std::setprecision(20) << tubecreatorBCopy->
getVertex()[2] <<
"}");
241 Btube* tubeconstraint = m_tubeArray.appendNew(
Btube());
242 if (m_associateBtubeToBselected) {
252 if (m_associateBtubeToBselected) {
253 addextrainfos(tubecreatorB, tubecreatorBCopy, pvNew, v4FinalNew);
255 addextrainfos(otherB, tubecreatorBCopy, pvNew, v4FinalNew);
259 if (!ok0) toRemove.push_back(particle->getArrayIndex());
261 m_plist->removeParticles(toRemove);
263 analysis::RaveSetup::getInstance()->reset();
266 bool BtubeCreatorModule::doVertexFit(
Particle* mother)
268 analysis::RaveSetup::getInstance()->setBeamSpot(m_BeamSpotCenter, m_beamSpotCov);
272 int nvert = rsg.
fit(
"avf");
277 mother->setPValue(pValue);
278 }
else {
return false;}
282 void BtubeCreatorModule::addextrainfos(
Particle* daughter,
Particle* copy, TMatrix mat, TLorentzVector TLV)
284 daughter->writeExtraInfo(
"TubePosX", copy->getVertex()[0]);
285 daughter->writeExtraInfo(
"TubePosY", copy->getVertex()[1]);
286 daughter->writeExtraInfo(
"TubePosZ", copy->getVertex()[2]);
288 daughter->writeExtraInfo(
"TubeCov00", mat(0, 0));
289 daughter->writeExtraInfo(
"TubeCov01", mat(0, 1));
290 daughter->writeExtraInfo(
"TubeCov02", mat(0, 2));
291 daughter->writeExtraInfo(
"TubeCov10", mat(1, 0));
292 daughter->writeExtraInfo(
"TubeCov11", mat(1, 1));
293 daughter->writeExtraInfo(
"TubeCov12", mat(1, 2));
294 daughter->writeExtraInfo(
"TubeCov20", mat(2, 0));
295 daughter->writeExtraInfo(
"TubeCov21", mat(2, 1));
296 daughter->writeExtraInfo(
"TubeCov22", mat(2, 2));
298 daughter->writeExtraInfo(
"TubeDirX", (TLV.Px() / TLV.Mag()));
299 daughter->writeExtraInfo(
"TubeDirY", (TLV.Py() / TLV.Mag()));
300 daughter->writeExtraInfo(
"TubeDirZ", (TLV.Pz() / TLV.Mag()));
301 daughter->writeExtraInfo(
"TubeB_p_estimated", TLV.Mag());
Create a B particle from a Bbar particle.
For each MCParticle with hits in the CDC, this class stores some summarising information on those hit...
void setTubeCenterErrorMatrix(const TMatrixFSym &tubecentererrormatrix)
Sets Btube Center Error Matrix.
void setTubeCenter(const Eigen::Matrix< double, 3, 1 > &tubecenter)
Sets Btube Center.
void setTubeMatrix(const TMatrixFSym &tubematrix)
Sets Btube Matrix.
Class to store reconstructed particles.
TMatrixFSym getVertexErrorMatrix() const
Returns the 3x3 position error sub-matrix.
void writeExtraInfo(const std::string &name, const float value)
Sets the user defined extraInfo.
TVector3 getVertex() const
Returns vertex position (POCA for charged, IP for neutral FS particles)
float getPValue() const
Returns chi^2 probability of fit if done or -1.
TMatrixFSym getMomentumErrorMatrix() const
Returns the 4x4 momentum error matrix.
TLorentzVector get4Vector() const
Returns Lorentz vector.
void setMomentumVertexErrorMatrix(const TMatrixFSym &errMatrix)
Sets 7x7 error matrix.
TMatrixFSym getMomentumVertexErrorMatrix() const
Returns 7x7 error matrix.
void addRelationTo(const RelationsInterface< BASE > *object, float weight=1.0, const std::string &namedRelation="") const
Add a relation from this object to another object (with caching).
Accessor to arrays stored in the data store.
bool registerRelationTo(const StoreArray< TO > &toArray, DataStore::EDurability durability=DataStore::c_Event, DataStore::EStoreFlags storeFlags=DataStore::c_WriteOut, const std::string &namedRelation="") const
Register a relation to the given StoreArray.
The RaveVertexFitter class is part of the RaveInterface together with RaveSetup.
int fit(std::string options="default")
do the vertex fit with all tracks previously added with the addTrack or addMother function.
void addTrack(const Particle *const aParticlePtr)
add a track (in the format of a Belle2::Particle) to set of tracks that should be fitted to a vertex
void updateDaughters()
update the Daughters particles
double getPValue(VecSize vertexId=0) const
get the p value of the fitted vertex.
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Abstract base class for different kinds of events.