22 #ifdef DO_TPCCATRACKER_EFF_PERFORMANCE
34 #ifndef HLTCA_STANDALONE
47 #include "Riostream.h"
54 PndFTSCAPerformance::PndFTSCAPerformance()
56 static bool first_call =
true;
59 typedef TSubPerformance TSP;
63 #if !defined(KFPARTICLE)
64 const int NSPerfo = 1;
66 #ifndef STAR_STANDALONE
67 const int NSPerfo = 1;
68 #else // HLTCA_STANDALONE
69 const int NSPerfo = 1;
70 #endif // HLTCA_STANDALONE
72 const TSP perfos[NSPerfo] = {
79 subPerformances.resize(NSPerfo);
80 for (
int iP = 0; iP < NSPerfo; iP++){
81 subPerformances[iP] = perfos[iP];
88 PndFTSCAPerformance::~PndFTSCAPerformance()
91 fHitLabels.Resize( 0 );
92 fMCTracks.Resize( 0 );
93 for (
unsigned int iPerf = 0; iPerf < subPerformances.size(); iPerf++){
94 if (subPerformances[iPerf].perf)
delete subPerformances[iPerf].perf;
98 PndFTSCAPerformance &PndFTSCAPerformance::Instance()
101 static PndFTSCAPerformance gPndFTSCAPerformance;
102 return gPndFTSCAPerformance;
105 bool PndFTSCAPerformance::SetNewEvent(
PndFTSCAGBTracker*
const tracker,
string mcTracksFile,
string mcPointsFile)
109 FILE *
file = std::fopen( mcTracksFile.data(),
"rb" );
116 file = std::fopen( mcPointsFile.data(),
"rb" );
120 ReadLocalMCPoints( file );
126 void PndFTSCAPerformance::InitSubPerformances()
130 for (
unsigned int iPerf = 0; iPerf < subPerformances.size(); iPerf++){
131 subPerformances[iPerf]->SetNewEvent(fTracker, &fHitLabels, &fMCTracks, &fLocalMCPoints);
143 void PndFTSCAPerformance::CreateHistos()
145 for (
unsigned int iPerf = 0; iPerf < subPerformances.size(); iPerf++){
146 if(!(subPerformances[iPerf]->IsHistoCreated()))
147 subPerformances[iPerf]->CreateHistos(subPerformances[iPerf].
name, fOutputFile);
151 bool PndFTSCAPerformance::CreateHistos(
string name)
154 for( ; i < (subPerformances.size()) && (subPerformances[i].name != name); i++);
155 if(!(subPerformances[i]->IsHistoCreated()) && i != subPerformances.size())
156 subPerformances[i]->CreateHistos(subPerformances[i].name, fOutputFile);
157 if ( i == subPerformances.size() )
return 0;
162 void PndFTSCAPerformance::WriteDir2Current( TObject *
obj )
165 if ( !obj->IsFolder() ) obj->Write();
167 TDirectory *cur = gDirectory;
168 ((TDirectory*)obj)->cd();
169 TList *listSub = ( ( TDirectory* )obj )->GetList();
171 while ( TObject *obj1 = it() ) WriteDir2Current( obj1 );
177 void PndFTSCAPerformance::WriteHistos()
179 if(fOutputFile) WriteDir2Current(fOutputFile);
182 void PndFTSCAPerformance::ExecPerformance()
186 for (
unsigned int iPerf = 0; iPerf < subPerformances.size(); iPerf++){
188 for (
unsigned int iPerf = 0; iPerf < subPerformances.size(); iPerf++){
190 if(subPerformances[iPerf].IsGlobalPerf) subPerformances[iPerf]->Exec(0);
192 #if 1 // current event efficiencies
193 for (
unsigned int iPerf = 0; iPerf < subPerformances.size(); iPerf++){
195 <<
" ---- " << subPerformances[iPerf].name <<
" event " << fStatNEvents <<
" ---- "<< endl;
196 subPerformances[iPerf]->PrintEfficiency();
198 cout << endl <<
" ============================== " << endl;
200 for (
unsigned int iPerf = 0; iPerf < subPerformances.size(); iPerf++){
202 <<
" ---- " << subPerformances[iPerf].name <<
" " << fStatNEvents <<
" events Statistic ---- " << endl;
203 if(subPerformances[iPerf].IsGlobalPerf) subPerformances[iPerf]->PrintEfficiencyStatistic();
208 PndFTSPerformanceBase* PndFTSCAPerformance::GetSubPerformance(
string name)
211 for( ; (i < subPerformances.size()) && (subPerformances[i].name != name); i++);
213 if ( i == subPerformances.size() )
return 0;
214 return subPerformances[
i].perf;
219 void PndFTSCAPerformance::WriteMCEvent( FILE *file )
const
222 int n = fMCTracks.Size();
223 std::fwrite( &n,
sizeof(
int ), 1, file );
224 n = fHitLabels.Size();
225 std::fwrite( &n,
sizeof(
int ), 1, file );
227 std::fwrite( fHitLabels.Data(),
sizeof( PndFTSCAHitLabel ), fHitLabels.Size(),
file );
230 void PndFTSCAPerformance::ReadMCEvent( FILE *file )
236 read = std::fread( &n,
sizeof(
int ), 1, file );
238 fMCTracks.Resize( n );
239 read = std::fread( &n,
sizeof(
int ), 1, file );
241 fHitLabels.Resize( n );
244 assert( read == fMCTracks.Size() );
246 read = std::fread( fHitLabels.Data(),
sizeof( PndFTSCAHitLabel ), fHitLabels.Size(),
file );
247 assert( read == fHitLabels.Size() );
269 void PndFTSCAPerformance::ReadLocalMCPoints( FILE *file )
275 read = std::fread( &n,
sizeof(
int ), 1, file );
277 fLocalMCPoints.Resize( n );
280 assert( read == fLocalMCPoints.Size() );
285 void PndFTSCAPerformance::SetMCTracks(vector<PndFTSCAMCTrack>& mcTracks)
287 const int N = mcTracks.size();
289 for(
int i = 0; i < N; i++){
290 fMCTracks[
i] = mcTracks[
i];
294 void PndFTSCAPerformance::SetMCPoints(vector<PndFTSCALocalMCPoint>& mcPoints)
296 const int N = mcPoints.size();
297 fLocalMCPoints.Resize(N);
298 for(
int i = 0; i < N; i++){
299 fLocalMCPoints[
i] = mcPoints[
i];
303 void PndFTSCAPerformance::SetHitLabels(vector<PndFTSCAHitLabel>& hitLabels)
305 const int N = hitLabels.size();
306 fHitLabels.Resize(N);
307 for(
int i = 0; i < N; i++){
308 fHitLabels[
i] = hitLabels[
i];
312 void PndFTSCAPerformance::SaveDataInFiles(
string ) const
349 bool PndFTSCAPerformance::ReadData(vector <int>&
labels, vector <PndFTSCALocalMCPoint>& mcpoints, vector<PndFTSCAMCTrack>& mctracks)
353 fHitLabels.Resize(labels.size());
354 for (
unsigned int i = 0; i < labels.size(); i++){
356 l.fLab[0] = labels[
i];
377 fMCTracks.Resize(mctracks.size());
378 for (
unsigned int i = 0; i < mctracks.size(); i++){
379 fMCTracks[
i] = mctracks[
i];
398 fLocalMCPoints.Resize(mcpoints.size());
400 for (
unsigned int i = 0; i < mcpoints.size(); i++){
401 fLocalMCPoints[
i] = mcpoints[
i];
419 const int NMCTracks = fMCTracks.Size();
421 for (
int i = 0; i < NMCTracks; ++
i ){
425 rows.resize( PndFTSCAParameters::MaxNStations, 0 );
428 rows[fLocalMCPoints[iP].IRow()]++;
434 int istaold = -2, ncont=0;
435 for (
unsigned int j = 0 ; j < rows.size(); j++) {
439 if( istaold == static_cast<int>(j)-1 ) {
443 nMCContRows = (nMCContRows > ncont) ? nMCContRows : ncont;
449 nMCContRows = (nMCContRows > ncont) ? nMCContRows : ncont;
457 vector<int> zero(PndFTSCAParameters::MaxNStations, 0);
458 vector< vector<int> > nmchits(NMCTracks,zero);
460 for (
int i = 0; i < hits.
Size(); i++) {
461 int id = hits[
i].ID();
462 for (
int il = 0; il < 3; il++ ) {
463 int trackId = HitLabel(
id).fLab[il];
464 if(trackId < 0)
continue;
465 ASSERT(trackId < NMCTracks,
"Incorrect MCPoints of MCTracks file. " << trackId <<
" < " << NMCTracks );
466 assert( hits[i].IRow() < PndFTSCAParameters::MaxNStations );
467 nmchits[trackId][hits[
i].IRow()]++;
471 for (
int i = 0; i < NMCTracks; ++
i ){
475 int nHitContRows = 0;
476 int istaold = -1, ncont=0;
477 for (
int j = 0; j < PndFTSCAParameters::MaxNStations; ++j ) {
478 if ( nmchits[i][j] ) {
481 if( istaold == j-1 ) {
485 nHitContRows = (nHitContRows > ncont) ? nHitContRows : ncont;
491 nHitContRows = (nHitContRows > ncont) ? nHitContRows : ncont;
498 for (
int ih = 0; ih < hits.
Size(); ih++ ) {
500 const PndFTSCAHitLabel &l = (fHitLabels)[hit.
ID()];
502 const int iMC = l.fLab[0];
503 if( iMC<0 )
continue;
512 for(
int iMCPoint=0; iMCPoint<nMCPoints; iMCPoint++)
514 if(points[iMCPoint].IRow() == hit.
IRow())
516 if(
fabs(hit.
Y() - points[iMCPoint].
Y())<2 &&
fabs(hit.
Z() - points[iMCPoint].
Z())<2)
531 fPV[0] = fPV[1] = fPV[2] = 0;
532 for (
int i = 0; i < NMCTracks; ++
i ){
543 for (
int i = 0; i < NMCTracks; ++
i ){
547 if ( ( abs(fPV[0] - t.
X()) <= 1e-7 ) && ( abs(fPV[1] - t.
Y()) <= 1e-7 ) && ( abs(fPV[2] - t.
Z()) <= 1e-7 ) )
556 int PndFTSCAPerformance::GetMCPoint(
const PndFTSCAGBHit& hit )
const
558 const PndFTSCAHitLabel &l = fHitLabels[hit.
ID()];
562 for(
int k = 0; k < 3 && iMCP == -1; k++ ) {
563 const int iMC = l.fLab[k];
564 if (iMC < 0)
continue;
573 for(
int iMCPoint=0; iMCPoint<nMCPoints; iMCPoint++)
577 if(
fabs(p.
Z() - hit.
Z()) > 0.3)
continue;
581 float sinA = fTracker->GetParameters().Station(hit.
IRow()).
f.sin;
582 float cosA = fTracker->GetParameters().Station(hit.
IRow()).
f.cos;
583 float correction = cosA*(p.
Px()/p.
Pz()) + sinA*(p.
Py()/p.
Pz());
584 float dx = cosA*hit.
X() + sinA*hit.
Y() + hit.R()*
sqrt(1.+correction*correction) - cosA*p.
X()- sinA*p.
Y();
586 dx = cosA*hit.
X() + sinA*hit.
Y() - hit.R()*
sqrt(1.+correction*correction) - cosA*p.
X()- sinA*p.
Y();
590 if(
fabs(dx) < 10*
sqrt(hit.Err2R())*
sqrt(1.+correction*correction) )
592 iMCP = iMCPoint + nFirstMC;
605 void PndFTSCAPerformance::ShiftHitsToMC(
float errorX1,
float errorX2 ){
610 static TRandom3
rand;
612 int nHits = fTracker->NHits();
614 for (
int ih = 0; ih <
nHits; ih++ ) {
617 const int iMCP = GetMCPoint(hit);
618 if (iMCP == -1)
continue;
644 if ( errorX2 <= 0 ) errorX2 = errorX1;
646 const float err2X1 = errorX1*errorX1;
647 const float err2X2 = errorX2*errorX2;
649 if ( errorX1 <= 0 ) ;
651 if ( errorX2 <= 0 ) ;
653 if ( errorX1 <= 0 || errorX2 <= 0 ) ;
656 const float_v Err2Y = hit.
Err2Y(), Err2Z = hit.
Err2Z();
658 double mcX = point.
X();
659 double mcY = point.
Y();
660 double mcZ = point.
Z();
665 yl +=
sqrt(Err2Y[0])*rand.Gaus();
666 zl +=
sqrt(Err2Z[0])*rand.Gaus();
677 void PndFTSCAPerformance::ResimulateHits(
float errorX1,
float errorX2 ){
680 const int NHits = fLocalMCPoints.Size();
684 fHitLabels.Resize(NHits);
692 static TRandom3
rand;
693 for (
int ih = 0; ih < NHits; ih++ ) {
698 PndFTSCAHitLabel &l = fHitLabels[ih];
704 if ( errorX2 <= 0 ) errorX2 = errorX1;
706 const float err2X1 = errorX1*errorX1;
707 const float err2X2 = errorX2*errorX2;
716 float_v Err2Y = hit.
Err2Y(), Err2Z = hit.
Err2Z();
718 double mcX = mcP.
X();
719 double mcY = mcP.
Y();
720 double mcZ = mcP.
Z();
727 mcYTmp -=
sqrt(Err2Y[0])*rand.Gaus();
728 mcZ -=
sqrt(Err2Z[0])*rand.Gaus();
742 void PndFTSCAPerformance::RematchHits(){
745 const int NHits = fTracker->
NHits();
747 for (
int ih = 0; ih < NHits; ih++ ) {
749 PndFTSCAHitLabel &l = fHitLabels[ih];
753 for(
int iMCPoint=0; iMCPoint < fLocalMCPoints.Size(); iMCPoint++)
755 if(fLocalMCPoints[iMCPoint].IRow() != hit.
IRow())
continue;
757 const float dY = hit.
Y() - fLocalMCPoints[iMCPoint].Y();
758 const float dZ = hit.
Z() - fLocalMCPoints[iMCPoint].Z();
759 const float r2 = dY*dY + dZ*dZ;
775 l.fLab[0] = fLocalMCPoints[MCindex].TrackI();
783 Vector3(
const float&
x,
const float&
y,
const float&
z):fx(x),fy(y),fz(z){};
784 float X()
const {
return fx; }
785 float Y()
const {
return fy; }
786 float Z()
const {
return fz; }
791 bool operator<(
const Vector3&
a,
const Vector3&
b) {
793 return a.X() < b.X();
796 return a.Y() < b.Y();
798 return a.Z() < b.Z();
802 void PndFTSCAPerformance::CombineHits(){
804 const int NHits = hits.
Size();
805 map<Vector3,float> minR[PndFTSCAParameters::MaxNStations];
806 map<Vector3,bool> isPileuped[PndFTSCAParameters::MaxNStations];
807 for (
int i = 0; i < NHits; i++){
809 const int iS = l.
IRow();
811 Vector3
v(l.
X(), l.
Y(), l.
Z());
812 if ( minR[iS].
count(
v) > 0 ) {
813 minR[iS][
v] =
min(l.R(), minR[iS][
v]);
814 isPileuped[iS][
v] =
true;
819 isPileuped[iS][
v] =
false;
825 for(
int iS = 0; iS < PndFTSCAParameters::MaxNStations; iS++ ) {
826 nHits2 += minR[iS].size();
829 for (
int i = 0, j = 0; i < NHits; i++){
831 Vector3
v(l.
X(), l.
Y(), l.
Z());
832 const int iS = l.
IRow();
834 if ( minR[iS][
v] == l.R() ) {
835 l.SetIsPileuped(isPileuped[iS][
v]);
841 #ifndef HLTCA_STANDALONE
843 for (
int j = 0; j <
nHits2; j++){
845 const int id2 = l2.
ID();
846 Vector3
v2(l2.
X(), l2.
Y(), l2.
Z());
847 for (
int i = 0; i < NHits; i++){
849 const int id = l.
ID();
850 if ( id2 ==
id )
continue;
851 Vector3
v(l.
X(), l.
Y(), l.
Z());
852 if ( l.
X() != l2.
X() || l.
Y() != l2.
Y() || l.
Z() != l2.
Z() )
continue;
856 for( ; k < 3 && fHitLabels[id2].fLab[k] != -1; k++ )
857 if ( fHitLabels[id2].fLab[k] == fHitLabels[
id].fLab[0] ) flag =
true;
859 if (k >= 3)
continue;
860 fHitLabels[id2].fLab[k] = fHitLabels[id].fLab[0];
866 for (
int i = 0; i <
nHits2; i++){
874 void PndFTSCAPerformance::DivideHitsOnLR(){
876 const int NHits = hits.
Size();
887 const int NHits2 = nMvdHits + 2*(NHits-nMvdHits);
890 for(
int i=0; i<nMvdHits; i++)
895 for (
int i = nMvdHits; i < NHits; i++){
909 const float errT = 0.02/k;
911 const float errN =
sqrt(hIn.Err2R());
918 const double beta = hIn.Beta();
920 const double C11 = errN*errN;
921 const double C22 = hIn.
Err2X2();
922 const double s =
sin(beta);
923 const double c =
cos(beta);
924 hOut1.SetErr2X0( errT*errT );
925 hOut1.SetErrX12( -s*c*(C11-C22) );
926 hOut1.SetErr2X1( c*c*C11+s*s*C22 );
927 hOut1.SetErr2X2( s*s*C11+c*c*C22 );
931 const float x = hIn.
X();
932 const float y = hIn.
Y();
933 const float a = hIn.
Angle();
935 hOut1.SetX( x +
r*
cos(a) );
936 hOut1.SetY( y -
r*
sin(a) );
938 const float x = hIn.
X();
942 hOut1.SetIsLeft(
false );
951 hOut2.SetIsLeft(
true );
953 hOut1.
SetID(hIn.
ID()*2-nMvdHits);
954 hOut2.
SetID(hIn.
ID()*2-nMvdHits+1);
958 for (
int i = 0; i < NHits2; i++){
964 const int NLabs = fHitLabels.
Size();
965 labs2.
Resize(nMvdHits + 2*(NLabs-nMvdHits));
966 for (
int i = 0; i < nMvdHits; i++){
967 labs2[
i] = fHitLabels[
i];
969 for (
int i = nMvdHits; i < NLabs; i++){
970 labs2[2*i-nMvdHits] = fHitLabels[
i];
971 labs2[2*i-nMvdHits+1] = fHitLabels[
i];
973 fHitLabels.
Resize(nMvdHits + 2*(NLabs-nMvdHits));
974 for (
int i = 0; i < nMvdHits + 2*(NLabs-nMvdHits); i++){
975 fHitLabels[
i] = labs2[
i];
979 for (
int iHit = nMvdHits; iHit < hits.
Size(); iHit+=2)
986 for(
int k = 0; k < 3 && iMCP == -1; k++ )
988 const int iMCTrack = fHitLabels[iHit].fLab[k];
989 if (iMCTrack < 0)
continue;
998 for(
int iMCPoint=0; iMCPoint<nMCPoints; iMCPoint++)
1002 if(
fabs(p.
Z() - hitR.
Z()) > 0.5)
continue;
1004 float sinA = fTracker->GetParameters().Station(hitR.
IRow()).
f.sin;
1005 float cosA = fTracker->GetParameters().Station(hitR.
IRow()).
f.cos;
1006 float correction = cosA*(p.
Px()/p.
Pz()) + sinA*(p.
Py()/p.
Pz());
1007 float dxR = cosA*hitR.
X() + sinA*hitR.
Y() + hitR.R()*
sqrt(1.+correction*correction) - cosA*p.
X()- sinA*p.
Y();
1008 float dxL = cosA*hitL.
X() + sinA*hitL.
Y() - hitL.R()*
sqrt(1.+correction*correction) - cosA*p.
X()- sinA*p.
Y();
1018 iMCP = iMCPoint + nFirstMC;
1027 for(
int iLabel=0; iLabel<3; iLabel++)
1029 fHitLabels[iHit].fLab[iLabel] = -1;
1030 fHitLabels[iHit+1].fLab[iLabel] = -1;
1037 float sinA = fTracker->GetParameters().Station(hitR.
IRow()).
f.sin;
1038 float cosA = fTracker->GetParameters().Station(hitR.
IRow()).
f.cos;
1039 float correction = cosA*(p.
Px()/p.
Pz()) + sinA*(p.
Py()/p.
Pz());
1040 float dxR = cosA*hitR.
X() + sinA*hitR.
Y() + hitR.R()*
sqrt(1.+correction*correction) - cosA*p.
X()- sinA*p.
Y();
1041 float dxL = cosA*hitL.
X() + sinA*hitL.
Y() - hitL.R()*
sqrt(1.+correction*correction) - cosA*p.
X()- sinA*p.
Y();
1044 for(
int iLabel=0; iLabel<3; iLabel++)
1045 fHitLabels[iHit+1].fLab[iLabel] = -1;
1047 for(
int iLabel=0; iLabel<3; iLabel++)
1048 fHitLabels[iHit].fLab[iLabel] = -1;
1052 const int NMCPoints = GetMCPoints()->Size();
1053 vector<vector<int> > hitsOnPoint(NMCPoints);
1054 for(
int iH = nMvdHits; iH < hits.
Size(); iH++) {
1056 int id = GetMCPoint(h);
1059 for(
int k = 0; k < 3; k++ ) {
1060 fHitLabels[h.
ID()].fLab[k] = -1;
1064 hitsOnPoint[id].push_back(iH);
1067 std::cout <<
"fHitLabels " << fHitLabels.Size() << std::endl;
1069 for(
int iHL=0; iHL<fHitLabels.Size(); iHL++)
1071 std::cout <<
"iHL " << iHL <<
" " << fHitLabels[iHL].fLab[0] <<
" " <<fHitLabels[iHL].fLab[1] <<
" " << fHitLabels[iHL].fLab[2] <<
" " << std::endl;
1072 if(fHitLabels[iHL].fLab[0] < 0 && fHitLabels[iHL].fLab[1] < 0 && fHitLabels[iHL].fLab[2] < 0)
1075 std::cout <<
"nNegative " << nNegative << std::endl;
1079 for(
int iT=0; iT<NMCPoints; iT++) {
1080 const vector<int> &hop = hitsOnPoint[iT];
1081 if (hop.size() == 0)
continue;
1084 for(
unsigned int iH = 0; iH < hop.size(); iH++ ) {
1086 const int iMCP = GetMCPoint(h);
1087 if (iMCP < 0)
continue;
1090 float sinA = fTracker->GetParameters().Station(h.
IRow()).
f.sin;
1091 float cosA = fTracker->GetParameters().Station(h.
IRow()).
f.cos;
1092 float correction = cosA*(p.
Px()/p.
Pz()) + sinA*(p.
Py()/p.
Pz());
1093 float dx = cosA*h.
X() + sinA*h.
Y() + h.R()*
sqrt(1.+correction*correction) - cosA*p.
X()- sinA*p.
Y();
1095 dx = cosA*h.
X() + sinA*h.
Y() - h.R()*
sqrt(1.+correction*correction) - cosA*p.
X()- sinA*p.
Y();
1097 if (
fabs(dx) < r2Min) {
1104 std::cout <<
"Ololo!! " << hop.size() << std::endl;
1105 for(
unsigned int iH = 0; iH < hop.size(); iH++ ) {
1106 if (static_cast<int>(iH) == iBestH)
continue;
1110 const int id = GetMCPoint(h);
1111 if(
id < 0)
continue;
1112 const int iMCT = fLocalMCPoints[id].TrackI();
1114 for(
int k = 0; k < 3; k++ ) {
1115 if ( fHitLabels[h.
ID()].fLab[k] == iMCT ) {
1116 fHitLabels[h.
ID()].fLab[k] = -1;
1124 std::cout <<
"fHitLabels " << fHitLabels.Size() << std::endl;
1126 for(
int iHL=0; iHL<fHitLabels.Size(); iHL++)
1128 std::cout <<
"iHL " << iHL <<
" " << fHitLabels[iHL].fLab[0] <<
" " <<fHitLabels[iHL].fLab[1] <<
" " << fHitLabels[iHL].fLab[2] <<
" " << std::endl;
1129 if(fHitLabels[iHL].fLab[0] < 0 && fHitLabels[iHL].fLab[1] < 0 && fHitLabels[iHL].fLab[2] < 0)
1132 std::cout <<
"nNegative " << nNegative2 << std::endl;
1139 #endif //DO_TPCCATRACKER_EFF_PERFORMANCE
friend F32vec4 cos(const F32vec4 &a)
static bool Compare(const PndFTSCAGBHit &a, const PndFTSCAGBHit &b)
Hits reordering in accordance with the geometry and the track-finder needs: Hits are sorted by sector...
friend F32vec4 sqrt(const F32vec4 &a)
friend F32vec4 sin(const F32vec4 &a)
void SetNHitContRows(int v)
void SetFStripP(FTSCAStrip *s)
std::vector< std::string > labels
void SetNMCContRows(int v)
static void GlobalToCALocal(T x, T y, T angle, T &x0, T &x1)
friend F32vec4 min(const F32vec4 &a, const F32vec4 &b)
friend F32vec4 fabs(const F32vec4 &a)
void SetBStripP(FTSCAStrip *s)
int hit(Int_t nEvents=0, TString inFile="sim.root", TString parFile="par.root", TString inDigi="digi.root", TString outFile="hit.root", Int_t timeBased=0)
static void CALocalToGlobal(T x0, T x1, T angle, T &x, T &y)
friend F32vec4 operator<(const F32vec4 &a, const F32vec4 &b)
int FirstMCPointID() const