20#include "CbmStsPoint.h"
21#include "CbmStsDigi.h"
22#include "CbmStsCluster.h"
24#include "CbmMvdPoint.h"
26#include "CbmMvdHitMatch.h"
27#include "CbmMCTrack.h"
29#include "TDatabasePDG.h"
47 return ( a.
ID < b.
ID ) || ( ( a.
ID == b.
ID ) && (a.
z < b.
z) );
81void CbmL1::ReadEvent()
83 if (fVerbose >= 10) cout <<
"ReadEvent: start." << endl;
100 if (fVerbose >= 10) cout <<
"ReadEvent: clear is done." << endl;
102 vector<TmpHit> tmpHits;
103 vector<TmpStrip> tmpStrips;
104 vector<TmpStrip> tmpStripsB;
108 for(
int i = 0;
i < NStation;
i++){
114 vector<bool> isUsedMvdPoint;
115 vector<bool> isUsedStsPoint;
120 Int_t nEnt = listMvdHits->GetEntries();
121 Int_t nMC = (listMvdPts) ? listMvdPts->GetEntries() : 0;
125 isUsedMvdPoint.resize(nMC);
126 for(
int iMc=0; iMc<nMC; iMc++) isUsedMvdPoint[iMc]=0;
129 for (
int j=0; j <nEnt; j++ ){
132 CbmMvdHit *mh = L1_DYNAMIC_CAST<CbmMvdHit*>( listMvdHits->At(j) );
145 mh->PositionError(err);
164 if( listMvdHitMatches ){
167 iMC =
match->GetPointId();
170 if( listMvdPts && iMC>=0 ){
172 if( ! ReadMCPoint( &MC, iMC, 1 ) ){
174 isUsedMvdPoint[iMC] = 1;
179 vMCPoints.push_back( MC );
180 th.
iMC = vMCPoints.size()-1;
185 tmpHits.push_back(th);
190 if (fVerbose >= 10) cout <<
"ReadEvent: mvd hits are gotten." << endl;
195 Int_t nEnt = listStsHits->GetEntries();
196 Int_t nMC = (listStsPts) ? listStsPts->GetEntries() : 0;
200 isUsedStsPoint.resize(nMC);
201 for(
int iMc=0; iMc<nMC; iMc++) isUsedStsPoint[iMc]=0;
205 for (
int j=0; j < nEnt; j++ ){
206 CbmStsHit *sh = L1_DYNAMIC_CAST<CbmStsHit*>( listStsHits->At(j) );
207 if (sh->GetUniqueID())
continue;
210 CbmStsHit *mh = L1_DYNAMIC_CAST<CbmStsHit*>( listStsHits->At(j) );
217 if( th.
iStripF<0 ){ negF++;
continue;}
226 mh->PositionError(err);
250 int iMC = sh->GetRefIndex();
251 if( listStsPts && iMC>=0 && iMC<nMC){
253 if( ! ReadMCPoint( &MC, iMC, 0 ) ){
255 vMCPoints.push_back( MC );
256 isUsedStsPoint[iMC] = 1;
257 th.
iMC = vMCPoints.size()-1;
264 tmpHits.push_back(th);
269 if (fVerbose >= 10) cout <<
"ReadEvent: sts hits are gotten." << endl;
272 if(listMvdHits && listMvdPts)
274 int nMC = listMvdPts->GetEntriesFast();
275 for(
int iMC=0; iMC<nMC; iMC++){
276 if(!(isUsedMvdPoint[iMC])) {
278 if( ! ReadMCPoint( &MC, iMC, 1 ) ){
279 MC.
iStation = (L1_DYNAMIC_CAST<CbmMvdPoint*>(listMvdPts->At(iMC)))->GetStationNr() - 1;
280 isUsedMvdPoint[iMC] = 1;
281 vMCPoints.push_back( MC );
286 if(listStsHits && listStsPts)
288 int nMC = listStsPts->GetEntriesFast();
289 for(
int iMC=0; iMC<nMC; iMC++){
290 if(!(isUsedStsPoint[iMC])) {
292 if( ! ReadMCPoint( &MC, iMC, 0 ) ){
295 for(
int iSt=0; iSt < NStsStations; iSt++)
296 MC.
iStation = ( MC.
z > sta[iSt].z[0] - 2.5 ) ? (NMvdStations+iSt) : MC.iStation;
297 isUsedStsPoint[iMC] = 1;
298 vMCPoints.push_back( MC );
304 int nHits = nMvdHits + nStsHits;
308 int NStrips = 0, NStripsB = 0;
309 for (
int ih = 0; ih<nHits; ih++ ){
315 for(
int is = 0; is<NStrips; is++ ){
318 if(
s.iStrip!=th.
iStripF )
continue;
320 if (fabs (
s.strip - th.
strip1) > 1.e-4)
continue;
326 for(
int is = 0; is<NStripsB; is++ ){
329 if(
s.iStrip!=th.
iStripB )
continue;
331 if (fabs (
s.strip - th.
strip2) > 1.e-4)
continue;
347 tmpStrips.push_back(tmp);
359 tmpStripsB.push_back(tmp);
394 Int_t NEffStrips = 0, NEffStripsB = 0;
395 for(
int i=0;
i<NStrips;
i++ ){
405 for(
int i=0;
i<NStripsB;
i++ ){
416 if (fVerbose >= 10) cout <<
"ReadEvent: strips are read." << endl;
422 vector<float> vStsZPos_temp;
423 for(
int i=0;
i<nHits;
i++ ){
450 if (ist < NMvdStations){
455 CbmStsHit *mh_m = L1_DYNAMIC_CAST<CbmStsHit*>( listStsHits->At(
s.ExtIndex));
456 z_tmp = mh_m->GetZ();
461 for (k = 0; k < vStsZPos_temp.size(); k++){
462 if (vStsZPos_temp[k] == z_tmp){
467 if (k == vStsZPos_temp.size()){
468 h.
iz = vStsZPos_temp.size();
469 vStsZPos_temp.push_back(z_tmp);
489 vHitMCRef.push_back(th.
iMC);
491 for(
int i = 0;
i < NStation;
i++){
502 if (fVerbose >= 10) cout <<
"ReadEvent: mvd and sts are saved." << endl;
505 if (vStsZPos_temp.size() != 0){
506 vector<float> vStsZPos_temp2;
507 vStsZPos_temp2.clear();
508 vStsZPos_temp2.push_back(vStsZPos_temp[0]);
509 vector<int> newToOldIndex;
510 newToOldIndex.clear();
511 newToOldIndex.push_back(0);
513 for (
unsigned int k = 1; k < vStsZPos_temp.size(); k++){
514 vector<float>::iterator itpos = vStsZPos_temp2.begin()+1;
515 vector<int>::iterator iti = newToOldIndex.begin()+1;
516 for (; itpos < vStsZPos_temp2.end(); itpos++, iti++){
517 if (vStsZPos_temp[k] < *itpos){
518 vStsZPos_temp2.insert(itpos,vStsZPos_temp[k]);
519 newToOldIndex.insert(iti,k);
523 if (itpos == vStsZPos_temp2.end()){
524 vStsZPos_temp2.push_back(vStsZPos_temp[k]);
525 newToOldIndex.push_back(k);
530 if (fVerbose >= 10) cout <<
"ReadEvent: z-pos are sorted." << endl;
533 for (
unsigned int k = 0; k < vStsZPos_temp2.size(); k++)
536 int size_nto_tmp = newToOldIndex.size();
537 vector<int> oldToNewIndex;
538 oldToNewIndex.clear();
539 oldToNewIndex.resize(size_nto_tmp);
540 for (
int k = 0; k < size_nto_tmp; k++)
541 oldToNewIndex[newToOldIndex[k]] = k;
544 for (
int k = 0; k < size_hs_tmp; k++)
559 if (fVerbose >= 10) cout <<
"ReadEvent: z-pos are saved." << endl;
563 if (fVerbose >= 10) cout <<
"HitMatch is done." << endl;
566 vector<TmpMCPoint> vtmpMCPoints;
567 for (
unsigned int iMCPoint = 0; iMCPoint < vMCPoints.size(); iMCPoint++) {
575 vtmpMCPoints.push_back(tmp);
592 if (fVerbose >= 10) cout <<
"MCPoints are sorted." << endl;
601 for ( vector<TmpMCPoint>::iterator
i= vtmpMCPoints.begin();
i!=vtmpMCPoints.end(); ++
i){
602 if( vMCTracks.empty() ||
i->ID!= ID ){
608 CbmMCTrack *MCTrack = L1_DYNAMIC_CAST<CbmMCTrack*>( listMCTracks->At( T.
ID ) );
615 T =
CbmL1MCTrack(vMCPoints[
i->MCPoint].mass, vMCPoints[
i->MCPoint].q, vr, vp,
i->ID, mother_ID, vMCPoints[
i->MCPoint].pdg);
617 vMCTracks.push_back( T );
622 if( nvtrackscurr > nvtracks ){
624 nvtracks = nvtrackscurr;
636 vMCTracks.back().Points.push_back(
i->MCPoint);
639 if( nvtrackscurr > nvtracks ) PrimVtx = Vtxcurr;
641 if (fVerbose >= 10) cout <<
"MCPoints and MCTracks are saved." << endl;
645 for( vector<CbmL1MCTrack>::iterator it = vMCTracks.begin(); it != vMCTracks.end(); ++it){
649 if ( fVerbose && PrimVtx.
MC_ID == 999 ) cout<<
"No primary vertex !!!"<<endl;
653 if (fVerbose >= 10) cout <<
"ReadEvent is done." << endl;
657bool CbmL1::ReadMCPoint(
CbmL1MCPoint *MC,
int iPoint,
bool MVD )
659 TVector3 xyzI,PI, xyzO,PO;
661 if( MVD && listMvdPts ){
662 CbmMvdPoint *pt = L1_DYNAMIC_CAST<CbmMvdPoint*>( listMvdPts->At(iPoint) );
668 mcID = pt->GetTrackID();
669 }
else if( listStsPts ){
670 CbmStsPoint *pt = L1_DYNAMIC_CAST<CbmStsPoint*>( listStsPts->At(iPoint) );
676 mcID = pt->GetTrackID();
678 TVector3 xyz = .5*(xyzI + xyzO );
679 TVector3 P = .5*(PI + PO );
702 CbmMCTrack *MCTrack = L1_DYNAMIC_CAST<CbmMCTrack*>( listMCTracks->At( MC->
ID ) );
703 if ( !MCTrack )
return 1;
706 if ( abs(MC->
pdg) >= 10000 )
return 1;
707 MC->
q = TDatabasePDG::Instance()->GetParticle(MC->
pdg)->Charge()/3.0;
708 MC->
mass = TDatabasePDG::Instance()->GetParticle(MC->
pdg)->Mass();
717void CbmL1::HitMatch()
719 const bool useLinks = 0;
722 const int NHits = vStsHits.size();
723 for (
int iH = 0; iH < NHits; iH++){
726 const bool isMvd = (hit.
extIndex < 0);
727 if (useLinks && !isMvd){
728 if (listStsClusters){
729 CbmStsHit *stsHit = L1_DYNAMIC_CAST<CbmStsHit*>( listStsHits->At(hit.
extIndex) );
730 const int NLinks = stsHit->GetNLinks();
731 if ( NLinks != 2 ) cout <<
"HitMatch: Error. Hit wasn't matched with 2 clusters." << endl;
733 vector<int> stsPointIds;
735 FairLink link = stsHit->GetLink(iL);
736 CbmStsCluster *stsCluster = L1_DYNAMIC_CAST<CbmStsCluster*>( listStsClusters->At( link.GetIndex() ) );
737 int NLinks2 = stsCluster->GetNLinks();
738 for (
int iL2 = 0; iL2 < NLinks2; iL2++){
739 FairLink link2 = stsCluster->GetLink(iL2);
740 CbmStsDigi *stsDigi = L1_DYNAMIC_CAST<CbmStsDigi*>( listStsDigi->At( link2.GetIndex() ) );
741 const int NLinks3 = stsDigi->GetNLinks();
742 for (
int iL3 = 0; iL3 < NLinks3; iL3++){
743 FairLink link3 = stsDigi->GetLink(iL3);
744 int stsPointId = link3.GetIndex();
745 stsPointIds.push_back( stsPointId );
750 link = stsHit->GetLink(iL);
751 stsCluster = L1_DYNAMIC_CAST<CbmStsCluster*>( listStsClusters->At( link.GetIndex() ) );
752 NLinks2 = stsCluster->GetNLinks();
753 for (
int iL2 = 0; iL2 < NLinks2; iL2++){
754 FairLink link2 = stsCluster->GetLink(iL2);
755 CbmStsDigi *stsDigi = L1_DYNAMIC_CAST<CbmStsDigi*>( listStsDigi->At( link2.GetIndex() ) );
756 const int NLinks3 = stsDigi->GetNLinks();
757 for (
int iL3 = 0; iL3 < NLinks3; iL3++){
758 FairLink link3 = stsDigi->GetLink(iL3);
759 int stsPointId = link3.GetIndex();
761 if ( !find(&(stsPointIds[0]), &(stsPointIds[stsPointIds.size()]), stsPointId) )
continue;
763 CbmStsPoint *stsPoint = L1_DYNAMIC_CAST<CbmStsPoint*>( listStsPts->At( stsPointId ) );
766 int mcTrackId = stsPoint->GetTrackID();
767 TVector3 xyzIn,xyzOut;
770 TVector3 xyz = .5*(xyzIn + xyzOut );
773 const int NPoints = vMCPoints.size();
775 for (iP = 0; iP < NPoints; iP++){
776 if ( (vMCPoints[iP].ID == mcTrackId) && (vMCPoints[iP].z == z) )
break;
781 if ( !ReadMCPoint( &MC, stsPointId, 0 ) ) {
784 vMCPoints.push_back(MC);
794 vMCPoints[iP].hitIds.push_back(iH);
804 int iP = vHitMCRef[iH];
807 vMCPoints[iP].hitIds.push_back(iH);
825 int iP = vHitMCRef[iH];
828 vMCPoints[iP].hitIds.push_back(iH);
832 cout <<
"Hit number " << iH <<
" has been matched with " << hit.
mcPointIds.size() <<
" mcPoints." << endl;
833 cout <<
"Hit number " << iH <<
" " << hit.
mcPointIds[0] <<
" " << vHitMCRef[iH] << endl;
friend F32vec4 sqrt(const F32vec4 &a)
friend F32vec4 fabs(const F32vec4 &a)
static CbmKF * Instance()
std::vector< CbmKFTube > vMvdMaterial
vector< CbmL1HitStore > vHitStore
vector< CbmL1Track > vRTracks
friend class CbmL1MCTrack
Int_t GetMotherId() const
void Get4Momentum(TLorentzVector &momentum) const
void GetStartVertex(TVector3 &vertex) const
virtual Int_t GetStationNr() const
void MomentumOut(TVector3 &mom)
void PositionOut(TVector3 &pos)
virtual Int_t GetStationNr() const
Double_t GetStrip(int side) const
Int_t GetSectorNr() const
Int_t GetDigi(Int_t iSide) const
void PositionOut(TVector3 &pos)
void MomentumOut(TVector3 &mom)
void PositionIn(TVector3 &pos)
vector< unsigned char > vSFlag
THitI StsHitsStopIndex[MaxNStations+1]
vector< L1Strip > vStsStrips
vector< L1HitPoint > vAllHitPoints
vector< unsigned char > vSFlagB
THitI StsHitsStartIndex[MaxNStations+1]
vector< L1StsHit > vStsHits
vector< L1Strip > vStsStripsB
L1UMeasurementInfo backInfo
L1UMeasurementInfo frontInfo
contain strips positions and coordinates of hit
static bool Compare(const TmpHit &a, const TmpHit &b)
static bool compareIDz(const TmpMCPoint &a, const TmpMCPoint &b)