2 #include "marlin/Global.h"
3 #include "EVENT/LCCollection.h"
4 #include "EVENT/Track.h"
5 #include "IMPL/LCCollectionVec.h"
6 #include "IMPL/ReconstructedParticleImpl.h"
7 #include "IMPL/VertexImpl.h"
8 #include "UTIL/Operators.h"
11 #include <DD4hep/Detector.h>
12 #include <DD4hep/DD4hepUnits.h>
13 #include <DDRec/Vector3D.h>
16 #include "HelixClass.h"
18 using namespace lcio ;
19 using namespace marlin ;
27 _description =
"V0 Finder Processor " ;
29 registerInputCollection(LCIO::TRACK,
31 "Name of input collection of reconstructed particles",
33 std::string(
"LDCTracks"));
35 registerOutputCollection(LCIO::RECONSTRUCTEDPARTICLE,
36 "RecoParticleCollection",
37 "Name of output collection of reconstructed particles",
39 std::string(
"V0RecoParticles"));
41 registerOutputCollection(LCIO::VERTEX,
43 "Name of output collection of neutral vertices",
45 std::string(
"V0Vertices"));
53 registerProcessorParameter(
"CutOnRadius",
64 registerProcessorParameter(
"CutOnTrkDistance",
65 "Cut on two track distance",
69 registerProcessorParameter(
"MinimumTrackHitRatio",
70 "Minimum ratio of inner track hit radius to reconstructed vertex radius",
74 registerProcessorParameter(
"MassRangeGamma",
75 "Maximal deviation in mass for photon candidate",
79 registerProcessorParameter(
"MassRangeK0S",
80 "Maximal deviation in mass for K0S candidate",
84 registerProcessorParameter(
"MassRangeL0",
85 "Maximal deviation in mass for Lamda0 candidate",
89 registerProcessorParameter(
"RxyCutGamma",
90 "Minimum radius in xy plane for photon candidate",
94 registerProcessorParameter(
"RxyCutK0S",
95 "Minimum radius in xy plane for K0S candidate",
99 registerProcessorParameter(
"RxyCutLambda",
100 "Minimum radius in xy plane for Lambda0 candidate",
116 dd4hep::Detector& theDet = dd4hep::Detector::getInstance();
118 theDet.field().magneticField( { 0., 0., 0. } , bfieldV ) ;
119 _bField = bfieldV[2]/dd4hep::tesla ;
139 LCCollection * col = evt->getCollection(
_trackColName.c_str() );
141 int nelem = col->getNumberOfElements();
143 TrackPairVec trkPairs;
146 std::map<Track*,int> trackUsed;
148 for (
int i=0;i<nelem;++i) {
149 Track * trk =
dynamic_cast<Track*
>(col->getElementAt(i));
153 for (
int i=0;i<nelem-1;++i) {
154 Track * firstTrack =
dynamic_cast<Track*
>(col->getElementAt(i));
155 float d01 = firstTrack->getD0();
156 float z01 = firstTrack->getZ0();
157 float phi1 = firstTrack->getPhi();
158 float tanLambda1 = firstTrack->getTanLambda();
159 float omega1 = firstTrack->getOmega();
160 HelixClass firstHelix;
161 firstHelix.Initialize_Canonical(phi1,d01,z01,omega1,tanLambda1,
_bField);
162 float charge1 = firstHelix.getCharge();
164 float r1 = firstTrack->getRadiusOfInnermostHit();
166 for (
int j=i+1;j<nelem;++j) {
167 Track * secondTrack =
dynamic_cast<Track*
>(col->getElementAt(j));
168 float r2 = secondTrack->getRadiusOfInnermostHit();
170 float d02 = secondTrack->getD0();
171 float z02 = secondTrack->getZ0();
172 float phi2 = secondTrack->getPhi();
173 float tanLambda2 = secondTrack->getTanLambda();
174 float omega2 = secondTrack->getOmega();
175 HelixClass secondHelix;
176 secondHelix.Initialize_Canonical(phi2,d02,z02,omega2,tanLambda2,
_bField);
177 float charge2 = secondHelix.getCharge();
178 float prodCharge = charge1*charge2;
181 float px1 = firstHelix.getMomentum()[0];
182 float py1 = firstHelix.getMomentum()[1];
183 float pz1 = firstHelix.getMomentum()[2];
184 float pp1 = sqrt(px1*px1+py1*py1+pz1*pz1);
186 float px2 = secondHelix.getMomentum()[0];
187 float py2 = secondHelix.getMomentum()[1];
188 float pz2 = secondHelix.getMomentum()[2];
189 float pp2 = sqrt(px2*px2+py2*py2+pz2*pz2);
196 distV0 = firstHelix.getDistanceToHelix(&secondHelix, vertex, momentum);
199 distV0 = secondHelix.getDistanceToHelix(&firstHelix, vertex, momentum);
202 float radV0 = sqrt(vertex[0]*vertex[0]+vertex[1]*vertex[1]);
214 streamlog_out( DEBUG4 ) <<
" ***************** found vertex for tracks : " <<
dd4hep::rec::Vector3D( (
const float*) vertex )
215 <<
" t1 " << lcshort( firstTrack ) <<
"\n"
216 <<
" t2 " << lcshort( secondTrack )
217 <<
" distV0 " << distV0
223 streamlog_out( DEBUG ) <<
" ***** testing various hypotheses " << std::endl ;
227 float energy2 = sqrt(pp2*pp2+MASSPion*MASSPion);
228 float energyV0 = energy1 + energy2;
229 float massK0 = sqrt(energyV0*energyV0-momentum[0]*momentum[0]-momentum[1]*momentum[1]-momentum[2]*momentum[2]);
233 energy1 = sqrt(pp1*pp1+MASSPion*MASSPion);
238 energy2 = sqrt(pp2*pp2+MASSPion*MASSPion);
240 energyV0 = energy1 + energy2;
241 float massL0 = sqrt(energyV0*energyV0-momentum[0]*momentum[0]-momentum[1]*momentum[1]-momentum[2]*momentum[2]);
245 energy1 = sqrt(pp1*pp1+MASSPion*MASSPion);
250 energy2 = sqrt(pp2*pp2+MASSPion*MASSPion);
252 energyV0 = energy1 + energy2;
253 float massL0bar = sqrt(energyV0*energyV0-momentum[0]*momentum[0]-momentum[1]*momentum[1]-momentum[2]*momentum[2]);
258 energyV0 = pp1 + pp2;
259 float massGamma = sqrt(energyV0*energyV0-momentum[0]*momentum[0]-momentum[1]*momentum[1]-momentum[2]*momentum[2]);
261 float deltaK0 = fabs(massK0 -
MASSK0S);
263 float deltaGm = fabs(massGamma -
MASSGamma);
271 bool massCondition =
false;
273 if (deltaGm<deltaL0&&deltaGm<deltaK0&&deltaGm<deltaL0bar) {
277 else if (deltaK0<deltaL0 && deltaK0<deltaL0bar) {
282 if (deltaL0<deltaL0bar ) {
291 streamlog_out( DEBUG ) <<
" ***** mass condition : " << massCondition
292 <<
" code : " << code << std::endl ;
297 r1 = this->
Rmin(firstTrack);
298 r2 = this->
Rmin(secondTrack);
303 TrackPair * trkPair =
new TrackPair();
304 trkPair->setFirstTrack( firstTrack );
305 trkPair->setSecondTrack( secondTrack );
306 trkPair->setDistance( distV0 );
307 trkPair->setVertex( vertex );
308 trkPair->setMomentum( momentum );
309 trkPair->setCode( code );
310 trkPairs.push_back( trkPair );
336 int nTrkPairs = int(trkPairs.size());
348 for (
int iTrkP=0;iTrkP<nTrkPairs;++iTrkP) {
349 TrackPair * pair = trkPairs[iTrkP];
350 Track * firstTrack = pair->getFirstTrack();
351 Track * secondTrack = pair->getSecondTrack();
352 if (trackUsed[firstTrack]==0&&trackUsed[secondTrack]==0) {
354 ReconstructedParticleImpl * part =
new ReconstructedParticleImpl();
355 VertexImpl * vtx =
new VertexImpl();
359 int code = pair->getCode();
360 for (
int iC=0;iC<3;++iC) {
361 vertex[iC] = pair->getVertex()[iC];
362 momentum[iC] = pair->getMomentum()[iC];
365 float distance = pair->getDistance();
366 vtx->setPosition( vertex );
367 vtx->addParameter( distance );
369 part->setMomentum( momentum );
370 part->setType( code );
388 else if ( code == 310 )
393 part->setMass( mass );
394 vtx->setAssociatedParticle( part );
395 part->setStartVertex( vtx );
396 part->addTrack( firstTrack );
397 part->addTrack( secondTrack );
399 colRecoPart->addElement( part );
400 colVertex->addElement( vtx );
402 trackUsed[firstTrack] = 1;
403 trackUsed[secondTrack] = 1;
413 for (
int iTrkP=0;iTrkP<nTrkPairs;++iTrkP) {
414 TrackPair * trkPair = trkPairs[iTrkP];
422 catch(DataNotAvailableException &
e) {}
437 int sizeOfVector = int(trkPairVec.size());
438 TrackPair *one,*two,*Temp;
440 for (
int i = 0 ; i < sizeOfVector-1; i++)
441 for (
int j = 0; j < sizeOfVector-i-1; j++)
444 two = trkPairVec[j+1];
445 if( one->getDistance() > two->getDistance() )
447 Temp = trkPairVec[j];
448 trkPairVec[j] = trkPairVec[j+1];
449 trkPairVec[j+1] = Temp;
459 float rmin = 1000000.;
460 TrackerHitVec hitvec = track->getTrackerHits();
461 int nhits = (int)hitvec.size();
464 for(
int ih =0;ih<nhits;++ih){
465 float z = (float)hitvec[ih]->getPosition()[2];
469 float tanLambda = track->getTanLambda();
472 if(tanLambda<0)zzz=zmax;
475 if(fabs(zmin)<fabs(zmax))zstart = zmin;
476 if(fabs(zmax)<fabs(zmin))zstart = zmax;
478 for(
int ih =0;ih<nhits;++ih){
479 float z = (float)hitvec[ih]->getPosition()[2];
480 if(fabs(z-zstart)<250){
481 float x = (float)hitvec[ih]->getPosition()[0];
482 float y = (float)hitvec[ih]->getPosition()[1];
virtual void processEvent(LCEvent *evt)
void Sorting(TrackPairVec &trkPairVec)
CLHEP::Hep3Vector Vector3D
std::string _recoPartColName
virtual void processRunHeader(LCRunHeader *run)
std::string _trackColName
virtual void check(LCEvent *evt)
std::string _vertexColName
std::vector< LCCollection * > LCCollectionVec