12 if (base==0)
return 0;
14 if (base<0 && exp%2==1)ss=-1;
17 for(
int ii=0;ii<exp;ii++)
25 TF1*
fkC =
new TF1(
"user",
"1.0/((0.00394707/(-1.0417+exp(0.112602*x)))/x + 1.0/x)", 0.1, 100);
33 #endif //#ifdef _WITHGBATCH_
39 printf(
"In myTrTrackPlus::myTrTrackPlus\n");
48 printf(
"In myTrTrackPlus::~myTrTrackPlus\n");
56 printf(
"In myTrTrackPlus::Clear\n");
59 _fitresultmap.clear();
72 kDefSameWeight = -999999;
73 k89SameWeight = -999999;
74 k8SameWeight = -999999;
75 k9SameWeight = -999999;
76 kinnSameWeight = -999999;
85 for (
int ii=0; ii<9; ii++) {
86 GlobalCoordinateAL[ii].setp(-999999, -999999, -999999);
87 GlobalCoordinateNL[ii].setp(-999999, -999999, -999999);
89 for (
int ii=0; ii<5; ii++) NoiseMinDist[ii].setp(-999999, -999999, -999999);
91 fill_n(QStatusL, 9, 0);
98 TruncMeanInnX = -999999;
99 TruncMeanInnY = -999999;
103 InnerQ_RMS = -999999;
105 btempcor_status= -999999;
125 PointTrackCogEcal.setp(-999999, -999999, -999999);
126 DirTrackCogEcal.setd(-999999, -999999);
127 PointTrackEntryEcal.setp(-999999, -999999, -999999);
128 DirTrackEntryEcal.setd(-999999, -999999);
129 PointTrackExitEcal.setp(-999999, -999999, -999999);
130 DirTrackExitEcal.setd(-999999, -999999);
132 PointTrackTopTrd.setp(-999999, -999999, -999999);
133 DirTrackTopTrd.setd(-999999, -999999);
134 PointTrackCenterTrd.setp(-999999, -999999, -999999);
135 DirTrackCenterTrd.setd(-999999, -999999);
136 PointTrackBottomTrd.setp(-999999, -999999, -999999);
137 DirTrackBottomTrd.setd(-999999, -999999);
151 printf(
"In myTrTrackPlus::init\n");
161 static std::map<int, fitresult>::iterator it;
163 it = _fitresultmap.find(ittp);
164 if (it!=_fitresultmap.end())
return it->second.ErrRinv;
172 static std::map<int, fitresult>::iterator it;
174 it = _fitresultmap.find(ittp);
175 if (it!=_fitresultmap.end())
return it->second.Chisq;
183 static std::map<int, fitresult>::iterator it;
185 it = _fitresultmap.find(ittp);
186 if (it!=_fitresultmap.end())
return it->second.NormChisqX;
194 static std::map<int, fitresult>::iterator it;
196 it = _fitresultmap.find(ittp);
197 if (it!=_fitresultmap.end())
return it->second.NormChisqY;
205 static std::map<int, fitresult>::iterator it;
207 it = _fitresultmap.find(ittp);
208 if (it!=_fitresultmap.end())
return it->second.Rigidity;
216 static std::map<int, fitresult>::iterator it;
218 it = _fitresultmap.find(ittp);
219 if (it!=_fitresultmap.end()){
220 if(btempcor_status==0)
221 return (it->second.Rigidity)*factor;
232 int index = ComputeIndex(algo, pattern, refit);
234 if (_fitresultmap.find(index)!=_fitresultmap.end())
return index;
246 for (
int kk=0; kk<9; kk++){
250 else if (((pattern/
my_int_pow(10,kk))%10)==9){
251 _pattern|=(1<<(kk+9));
256 _pattern=(pattern<<18);
264 return (algo+(_refit<<5)+(_pattern<<10));
273 bool HasL1 = ((BitPatternJ)&(1<<0))>>0;
274 bool HasL2 = ((BitPatternJ)&(1<<1))>>1;
275 bool HasL9 = ((BitPatternJ)&(1<<8))>>8;
322 myTrTrackPlusFiller::myTrTrackPlusFiller(){
324 printf(
"In myTrTrackPlusFiller::myTrTrackPlusFiller\n");
331 myTrTrackPlusFiller::~myTrTrackPlusFiller(){
333 printf(
"In myTrTrackPlusFiller::~myTrTrackPlusFiller\n");
339 void myTrTrackPlusFiller::Clear(Option_t* option){
341 printf(
"In myTrTrackPlusFiller::Clear\n");
351 void myTrTrackPlusFiller::init(){
353 printf(
"In myTrTrackPlusFiller::init\n");
361 void myTrTrackPlusFiller::Fill(TrTrackR* _track,
short int ipart, EcalShowerR* shower, Double_t beta,
bool kMC,
bool heavy){
363 printf(
"In myTrTrackPlusFiller::Fill\n");
380 if (track && n_valid_hit>0) {
382 BitPatternJ=track->GetBitPatternJ();
386 bool HasL1 = ((BitPatternJ)&(1<<0))>>0;
387 bool HasL2 = ((BitPatternJ)&(1<<1))>>1;
388 bool HasL9 = ((BitPatternJ)&(1<<8))>>8;
395 for (
int ii=0; ii<track->GetNhits(); ii++) {
396 TrRecHitR* rh = track->pTrRecHit(ii);
398 int lay=rh->GetLayerJ()-1;
399 int mult=rh->GetResolvedMultiplicity();
402 AMSPoint AtrrechitposA = rh->GetGlobalCoordinateA(mult);
403 GlobalCoordinateAL[lay].CopyAMSPoint(AtrrechitposA);
404 AMSPoint AtrrechitposN = rh->GetGlobalCoordinateN(mult);
405 GlobalCoordinateNL[lay].CopyAMSPoint(AtrrechitposN);
407 #if !defined _B524_ && !defined _B530_ && !defined _B538_ && !defined _B550_ && !defined _B572_ && !defined _B580_ && !defined _B584_ && !defined _B594_ && !defined _B598_ && !defined _B610_ && !defined _B620_ && !defined _B630_
408 QStatusL[lay]=rh->GetQStatus();
412 GetMinDistanceNoiseHits(track, NoiseMinDist);
416 Fits(beta, kMC, heavy);
422 AMSPoint APointTrackEntryEcal;
423 AMSDir ADirTrackEntryEcal;
424 track->Interpolate(-142.792, APointTrackEntryEcal, ADirTrackEntryEcal, kDef);
425 PointTrackEntryEcal.CopyAMSPoint(APointTrackEntryEcal);
426 DirTrackEntryEcal.CopyAMSDir(ADirTrackEntryEcal);
428 AMSPoint APointTrackExitEcal;
429 AMSDir ADirTrackExitEcal;
430 track->Interpolate(-158.457, APointTrackExitEcal, ADirTrackExitEcal, kDef);
431 PointTrackExitEcal.CopyAMSPoint(APointTrackExitEcal);
432 DirTrackExitEcal.CopyAMSDir(ADirTrackExitEcal);
434 AMSPoint APointTrackCogEcal;
435 AMSDir ADirTrackCogEcal;
436 if (shower) track->Interpolate(shower->CofG[2], APointTrackCogEcal, ADirTrackCogEcal, kDef);
437 PointTrackCogEcal.CopyAMSPoint(APointTrackCogEcal);
438 DirTrackCogEcal.CopyAMSDir(ADirTrackCogEcal);
440 AMSPoint APointTrackTopTrd;
441 AMSDir ADirTrackTopTrd;
442 track->Interpolate(141.825, APointTrackTopTrd, ADirTrackTopTrd, kDef);
443 PointTrackTopTrd.CopyAMSPoint(APointTrackTopTrd);
444 DirTrackTopTrd.CopyAMSDir(ADirTrackTopTrd);
446 AMSPoint APointTrackCenterTrd;
447 AMSDir ADirTrackCenterTrd;
448 track->Interpolate(0.5*(141.825+86.725), APointTrackCenterTrd, ADirTrackCenterTrd, kDef);
449 PointTrackCenterTrd.CopyAMSPoint(APointTrackCenterTrd);
450 DirTrackCenterTrd.CopyAMSDir(ADirTrackCenterTrd);
452 AMSPoint APointTrackBottomTrd;
453 AMSDir ADirTrackBottomTrd;
454 track->Interpolate(86.725, APointTrackBottomTrd, ADirTrackBottomTrd, kDef);
455 PointTrackBottomTrd.CopyAMSPoint(APointTrackBottomTrd);
456 DirTrackBottomTrd.CopyAMSDir(ADirTrackBottomTrd);
466 MagField* magfield = MagField::GetPtr();
468 PathOnB(track, kDef, magfield, B, SenThetaX, SenThetaY, L, pMDR, pMDR_known, 0.1,
false);
479 void myTrTrackPlusFiller::Fits(Double_t beta,
bool kMC,
bool heavy){
486 #ifndef _B524_ //whatever but B524
487 #ifdef _B550_ //tag B550
488 TrExtAlignDB::ResetExtAlign();
489 TrExtAlignDB::ForceFromTDV = 1;
495 #if defined _B610_ || defined _B620_ || defined _vdev_
503 if (Rigidity>50.0) Refit=1;
509 if (fabs(__beta)>1) __beta=1;
520 bool HasL1 = ((BitPatternJ)&(1<<0))>>0;
521 bool HasL2 = ((BitPatternJ)&(1<<1))>>1;
522 bool HasL9 = ((BitPatternJ)&(1<<8))>>8;
530 k89 = AddResults( 1, 7, Refit, TrTrackR::DefaultMass, TrTrackR::DefaultCharge, __beta);
531 k89NoMS = AddResults(11, 7, Refit, TrTrackR::DefaultMass, TrTrackR::DefaultCharge, __beta);
532 k89SameWeight = AddResults(21, 7, Refit, TrTrackR::DefaultMass, TrTrackR::DefaultCharge, __beta);
537 #ifndef DOHOWEVERALLFITS
543 if (HasL9 && proceed) {
544 k9 = AddResults( 1, 6, Refit, TrTrackR::DefaultMass, TrTrackR::DefaultCharge, __beta);
545 k9NoMS = AddResults(11, 6, Refit, TrTrackR::DefaultMass, TrTrackR::DefaultCharge, __beta);
546 k9SameWeight = AddResults(21, 6, Refit, TrTrackR::DefaultMass, TrTrackR::DefaultCharge, __beta);
551 #ifndef DOHOWEVERALLFITS
557 if (HasL1 && proceed) {
558 k8 = AddResults( 1, 5, Refit, TrTrackR::DefaultMass, TrTrackR::DefaultCharge, __beta);
559 k8NoMS = AddResults(11, 5, Refit, TrTrackR::DefaultMass, TrTrackR::DefaultCharge, __beta);
560 k8SameWeight = AddResults(21, 5, Refit, TrTrackR::DefaultMass, TrTrackR::DefaultCharge, __beta);
565 #ifndef DOHOWEVERALLFITS
572 kinn = AddResults( 1, 3, Refit, TrTrackR::DefaultMass, TrTrackR::DefaultCharge, __beta);
573 kinnNoMS = AddResults(11, 3, Refit, TrTrackR::DefaultMass, TrTrackR::DefaultCharge, __beta);
574 kinnSameWeight = AddResults(21, 3, Refit, TrTrackR::DefaultMass, TrTrackR::DefaultCharge, __beta);
581 if (HasL1&HasL9 && k89>=0) {
584 kDefSameWeight = k89SameWeight;
586 else if (HasL1 && k8>=0) {
589 kDefSameWeight = k8SameWeight;
591 else if (HasL9 && k9>=0) {
594 kDefSameWeight = k9SameWeight;
599 kDefSameWeight = kinnSameWeight;
604 fr.
Rigidity = getRigidity(track, kDef,
false);
605 fr.
ErrRinv = track->GetErrRinv(kDef);
606 fr.
Chisq = getChisq(track, kDef);
609 AddResults(fr, 0, 0, 0);
613 fr.
Rigidity = getRigidity(track, kDefNoMS,
false);
614 fr.
ErrRinv = track->GetErrRinv(kDefNoMS);
615 fr.
Chisq = getChisq(track, kDefNoMS);
616 fr.
NormChisqX = getNormChisqX(track, kDefNoMS);
617 fr.
NormChisqY = getNormChisqY(track, kDefNoMS);
618 AddResults(fr, 10, 0, 0);
620 if (kDefSameWeight>=0) {
622 fr.
Rigidity = getRigidity(track, kDefSameWeight,
false);
623 fr.
ErrRinv = track->GetErrRinv(kDefSameWeight);
624 fr.
Chisq = getChisq(track, kDefSameWeight);
625 fr.
NormChisqX = getNormChisqX(track, kDefSameWeight);
626 fr.
NormChisqY = getNormChisqY(track, kDefSameWeight);
627 AddResults(fr, 20, 0, 0);
631 kUp = AddResults(1, 1, Refit, TrTrackR::DefaultMass, TrTrackR::DefaultCharge, __beta);
632 kLow = AddResults(1, 2, Refit, TrTrackR::DefaultMass, TrTrackR::DefaultCharge, __beta);
635 kExt = AddResults(1, 4, Refit, TrTrackR::DefaultMass, TrTrackR::DefaultCharge, __beta);
638 kAl = AddResults(2, 0, Refit, TrTrackR::DefaultMass, TrTrackR::DefaultCharge, __beta);
639 kCIE = AddResults(0, 0, 10+Refit, TrTrackR::DefaultMass, TrTrackR::DefaultCharge, __beta);
640 kPGCIE = AddResults(0, 0, 20+Refit, TrTrackR::DefaultMass, TrTrackR::DefaultCharge, __beta);
645 btempcor_status= (Int_t) MagnetVarp::btempcor( _factor);
646 factor = (Double32_t) _factor;
654 void myTrTrackPlusFiller::FillCharge(TrTrackR* _track, Double_t beta){
656 printf(
"In myEventFiller::Once_trackercharge\n");
665 #if defined _B524_ || defined _B550_
666 const static int flag=TrCharge::kTruncMean|TrCharge::kAll;
667 Double_t sqrtmeanx = sqrt(TrCharge::GetMean(flag, track, TrCharge::kX, beta).Mean);
668 TruncMeanX = -0.129643+0.202016*sqrtmeanx-0.00208005*sqrtmeanx*sqrtmeanx+2.60621e-05*sqrtmeanx*sqrtmeanx*sqrtmeanx;
669 Double_t sqrtmeany = sqrt(TrCharge::GetMean(flag, track, TrCharge::kY, beta).Mean);
670 TruncMeanY = -0.129643+0.202016*sqrtmeany-0.00208005*sqrtmeany*sqrtmeany+2.60621e-05*sqrtmeany*sqrtmeany*sqrtmeany;
671 const static int flaginn=TrCharge::kTruncMean|TrCharge::kInner;
672 sqrtmeanx = sqrt(TrCharge::GetMean(flaginn, track, TrCharge::kX, beta).Mean);
673 TruncMeanInnX = -0.129643+0.202016*sqrtmeanx-0.00208005*sqrtmeanx*sqrtmeanx+2.60621e-05*sqrtmeanx*sqrtmeanx*sqrtmeanx;
674 sqrtmeany = sqrt(TrCharge::GetMean(flaginn, track, TrCharge::kY, beta).Mean);
675 TruncMeanInnY = -0.129643+0.202016*sqrtmeany-0.00208005*sqrtmeany*sqrtmeany+2.60621e-05*sqrtmeany*sqrtmeany*sqrtmeany;
677 const static int flag=TrCharge::kTruncMean|TrCharge::kAll|TrCharge::kSqrt;
678 TruncMeanX = TrCharge::GetMean(flag, track, TrCharge::kX, beta, -1, TrClusterR::DefaultChargeCorrOpt).Mean;
679 TruncMeanY = TrCharge::GetMean(flag, track, TrCharge::kY, beta, -1, TrClusterR::DefaultChargeCorrOpt).Mean;
680 const static int flaginn=TrCharge::kTruncMean|TrCharge::kInner|TrCharge::kSqrt;
681 TruncMeanInnX = TrCharge::GetMean(flaginn, track, TrCharge::kX, beta, -1, TrClusterR::DefaultChargeCorrOpt).Mean;
682 TruncMeanInnY = TrCharge::GetMean(flaginn, track, TrCharge::kY, beta, -1, TrClusterR::DefaultChargeCorrOpt).Mean;
686 Q_NPoints = track->GetQ_NPoints(beta);
687 Q_RMS = track->GetQ_RMS(beta);
688 InnerQ_RMS = track->GetInnerQ_RMS(beta);
697 void myTrTrackPlusFiller::FillMoreHeavy(TrTrackR* _track){
699 printf(
"In myTrTrack::FillMoreHeavy\n");
705 AMSEventR* pev = AMSEventR::Head();
796 static Double_t minore;
799 for (
int ii=2; ii<8; ii++)
if (fabs(HitCloseTrack(ii, 0,
"HM", pev, track, kDef))<minore) minore=HitCloseTrack(ii, 0,
"HM", pev, track, kDef);
802 for (
int ii=2; ii<8; ii++)
if (fabs(HitCloseTrack(ii, 1,
"HM", pev, track, kDef))<minore) minore=HitCloseTrack(ii, 1,
"HM", pev, track, kDef);
804 distHMx_L1=HitCloseTrack(1, 0,
"HM", pev, track, kDef);
805 distHMy_L1=HitCloseTrack(1, 1,
"HM", pev, track, kDef);
806 distHMx_L9=HitCloseTrack(9, 0,
"HM", pev, track, kDef);
807 distHMy_L9=HitCloseTrack(9, 1,
"HM", pev, track, kDef);
808 distHMx_L8=HitCloseTrack(8, 0,
"HM", pev, track, kDef);
809 distHMy_L8=HitCloseTrack(8, 1,
"HM", pev, track, kDef);
812 for (
int ii=2; ii<8; ii++)
if (fabs(HitCloseTrack(ii, 0,
"NH", pev, track, kDef))<minore) minore=HitCloseTrack(ii, 0,
"NH", pev, track, kDef);
815 for (
int ii=2; ii<8; ii++)
if (fabs(HitCloseTrack(ii, 1,
"NH", pev, track, kDef))<minore) minore=HitCloseTrack(ii, 1,
"NH", pev, track, kDef);
817 distNHx_L1=HitCloseTrack(1, 0,
"NH", pev, track, kDef);
818 distNHy_L1=HitCloseTrack(1, 1,
"NH", pev, track, kDef);
819 distNHx_L9=HitCloseTrack(9, 0,
"NH", pev, track, kDef);
820 distNHy_L9=HitCloseTrack(9, 1,
"NH", pev, track, kDef);
821 distNHx_L8=HitCloseTrack(8, 0,
"NH", pev, track, kDef);
822 distNHy_L8=HitCloseTrack(8, 1,
"NH", pev, track, kDef);
831 int myTrTrackPlusFiller::AddResults(
int algo,
int pattern,
int refit,
float mass,
float chrg,
float beta,
float fixrig){
835 printf(
"Event %d Run %d \n",AMSEventR::Head()->Event(),AMSEventR::Head()->Run());
837 kRet = track->iTrTrackPar(algo, pattern, refit, mass, chrg, beta, fixrig);
840 printf(
"kRet(%d,%d,%d,%f,%f,%f,%f) = %d\n", algo, pattern, refit, mass, chrg, beta, fixrig, kRet);
845 printf(
"kRet(%d,%d,%d,%f,%f,%f,%f) = %d\n", algo, pattern, refit, mass, chrg, beta, fixrig, kRet);
848 fr.
Rigidity = getRigidity(track, kRet,
false);
849 fr.
ErrRinv = track->GetErrRinv(kRet);
850 fr.
Chisq = getChisq(track, kRet);
853 AddResults(fr, algo, pattern, refit);
859 void myTrTrackPlusFiller::AddResults(
fitresult& fr,
int algo,
int pattern,
int refit){
861 _fitresultmap.insert(pair<int, fitresult>(ComputeIndex(algo, pattern, refit), fr));
866 Double_t getRigidity(TrTrackR* _track,
int par,
bool rigcorr){
868 static Double_t _rigidity;
871 if (!_track)
return _rigidity;
873 _rigidity=_track->GetRigidity(par);
875 if (!rigcorr)
return _rigidity;
877 static Double_t sign;
878 sign=_rigidity/fabs(_rigidity);
881 if (fabs(_rigidity)<0.1) _rigidity=0.0;
882 else if (!(fabs(_rigidity)>100.0)) _rigidity=sign*
fkC->GetX(fabs(_rigidity));
887 Double_t getChisq(TrTrackR* _track,
int par){
889 static Double_t chisq;
892 if (!_track)
return chisq;
895 chisq=_track->GetChisq(par);
900 Double_t getNormChisqX(TrTrackR* _track,
int par){
902 static Double_t chisq;
905 if (!_track)
return chisq;
910 chisq=_track->GetNormChisqX(par);
916 Double_t getNormChisqY(TrTrackR* _track,
int par){
918 static Double_t chisq;
921 if (!_track)
return chisq;
926 chisq=_track->GetNormChisqY(par);
933 Double_t getLogExtChisq(TrTrackR *trk,
int k89,
int k8,
int k9) {
935 Double_t erry = TRFITFFKEY.ErrY;
936 Double_t fitw8 = TRFITFFKEY.FitwMsc[7];
937 Double_t fitw9 = TRFITFFKEY.FitwMsc[8];
950 Double_t rgt = trk->GetRigidity(k89);
951 Double_t fms8 = fitw8/rgt;
952 Double_t fms9 = fitw9/rgt;
954 Double_t ery8 = sqrt(sig8*sig8+fms8*fms8)*erry*ecor;
955 Double_t ery9 = sqrt(sig9*sig9+fms9*fms9)*erry*ecor;
960 Double_t res8 = trk->GetResidual(7, k9).y();
961 Double_t res9 = trk->GetResidual(8, k8).y();
963 Double_t res8 = trk->GetResidualO(1+7, k9).y();
964 Double_t res9 = trk->GetResidualO(1+8, k8).y();
967 return res8*res8/ery8/ery8+res9*res9/ery9/ery9;
970 void GetMinDistanceNoiseHits(TrTrackR *trk,
myPoint noisemindist[]){
972 int trk_layer_pattern[9];
973 fill_n(trk_layer_pattern, 9, 0);
976 fill_n(noise_y, 9, 1e9);
979 int btp= trk->GetBitPatternJ();;
984 for (
int layer=1; layer<=9; layer++) {
985 int bitexam = int(pow(2.,layer-1));
987 bitexam = (bitexam & btp);
993 trk_layer_pattern[layer-1] = 1;
994 pnoise[layer-1] = TrTrackSelection::GetMinDist(trk, laypa, 1);
995 noise_y[layer-1]=fabs(pnoise[layer-1].y());
1003 for (
int layer=1; layer<=9; layer++) {
1004 if(trk_layer_pattern[layer-1]==1) nlayer=nlayer+1;
1006 if (noise_y[layer-1]<minoise[0] && noise_y[layer-1] >0.001 && trk_layer_pattern[layer-1] ==1) {
1007 noisemindist[0].CopyAMSPoint(pnoise[layer-1]);
1008 minoise[0] = noise_y[layer-1];
1014 for (
int layer=1; layer<=9; layer++) {
1015 if (noise_y[layer-1]<minoise[1] && noise_y[layer-1] >0.001 && trk_layer_pattern[layer-1] ==1 && layer != lminoise[0]) {
1016 noisemindist[1].CopyAMSPoint(pnoise[layer-1]);
1017 minoise[1] = noise_y[layer-1]; lminoise[1]=layer;
1022 for (
int layer=1; layer<=9; layer++) {
1023 if (noise_y[layer-1]<minoise[2] && noise_y[layer-1] >0.001 && trk_layer_pattern[layer-1] ==1 && layer != lminoise[0] && layer != lminoise[1]) {
1024 noisemindist[2].CopyAMSPoint(pnoise[layer-1]);
1025 minoise[2] = noise_y[layer-1]; lminoise[2]=layer;
1030 for (
int layer=1; layer<=9; layer++) {
1031 if (noise_y[layer-1]<minoise[3] && noise_y[layer-1] >0.001 && trk_layer_pattern[layer-1] ==1 && layer != lminoise[0] && layer != lminoise[1] && layer != lminoise[2]) {
1032 noisemindist[3].CopyAMSPoint(pnoise[layer-1]);
1033 minoise[3] = noise_y[layer-1]; lminoise[3]=layer;
1040 Double_t HitCloseTrack(
int layer,
int side,
const char* type, AMSEventR* fEvent, TrTrackR* track,
bool kMC,
int TrackId){
1042 static Double_t ret;
1045 static unsigned int currEvent=0;
1046 static unsigned int currRun=0;
1048 static std::vector<TrClusterR*> TrClusUsed;
1050 static map<int, Double_t**> mapHM;
1051 static map<int, Double_t**> mapNH;
1053 static map<int, Double_t**>::const_iterator pos;
1055 if (currEvent!=fEvent->Event() || currRun!=fEvent->Run()){
1058 for (pos=mapHM.begin(); pos!=mapHM.end(); ++pos) {
1059 for (
int ii=0; ii<2; ii++) {
1060 delete [] pos->second[ii];
1062 delete [] pos->second;
1064 for (pos=mapNH.begin(); pos!=mapNH.end(); ++pos) {
1065 for (
int ii=0; ii<2; ii++) {
1066 delete [] pos->second[ii];
1068 delete [] pos->second;
1074 BuildVectorUsedClusters(fEvent, TrClusUsed);
1077 if (mapHM.find(TrackId)==mapHM.end()) {
1080 Double_t** distHM_temp=0;
1081 Double_t** distNH_temp=0;
1082 distHM_temp =
new Double_t*[2];
1083 distNH_temp =
new Double_t*[2];
1084 for (
int ii=0; ii<2; ii++) {
1085 distHM_temp[ii] =
new Double_t[9];
1086 distNH_temp[ii] =
new Double_t[9];
1090 BuildHitCloseTrack(fEvent, distHM_temp, distNH_temp, track, TrackId, TrClusUsed, kMC);
1093 mapHM.insert(pair<int, Double_t**>(TrackId, distHM_temp));
1094 mapNH.insert(pair<int, Double_t**>(TrackId, distNH_temp));
1102 if (!strcmp(type,
"HM")) ret=mapHM.find(TrackId)->second[side][layer-1];
1103 else if (!strcmp(type,
"NH")) ret=mapNH.find(TrackId)->second[side][layer-1];
1107 currEvent=fEvent->Event();
1108 currRun=fEvent->Run();
1113 void BuildVectorUsedClusters(AMSEventR* fEvent, std::vector<TrClusterR*>& TrClusUsed){
1117 for (
int ii=0; ii<fEvent->nTrTrack(); ii++) {
1118 TrTrackR* trk = fEvent->pTrTrack(ii);
1119 for (
int jj=0; jj<trk->NTrRecHit(); jj++) {
1120 TrRecHitR* rechit = trk->pTrRecHit(jj);
1122 if (rechit->GetXCluster()) TrClusUsed.push_back(rechit->GetXCluster());
1123 if (rechit->GetYCluster()) TrClusUsed.push_back(rechit->GetYCluster());
1145 void BuildHitCloseTrack(AMSEventR* fEvent, Double_t** distHM, Double_t** distNH, TrTrackR* track,
int TrackId, std::vector<TrClusterR*> TrClusUsed,
bool kMC){
1147 static std::vector <TrClusterR*>::iterator TrClusUsedIt;
1149 static std::vector<Double_t> distHMx_temp[9];
1150 static std::vector<Double_t> distHMy_temp[9];
1152 static std::vector<Double_t> distNHx_temp[9];
1153 static std::vector<Double_t> distNHy_temp[9];
1155 for (
int ii=0; ii<9; ii++) {
1156 distHMx_temp[ii].clear();
1157 distHMy_temp[ii].clear();
1159 distNHx_temp[ii].clear();
1160 distNHy_temp[ii].clear();
1164 for (
int ii=0; ii<fEvent->nTrCluster(); ii++) {
1165 static TrClusterR* clu;
1166 clu = fEvent->pTrCluster(ii);
1167 TrClusUsedIt = std::find(TrClusUsed.begin(), TrClusUsed.end(), clu);
1168 if (TrClusUsedIt==TrClusUsed.end()) {
1170 layer = clu->GetLayer();
1173 static std::vector<Double_t>* vectorx;
1174 static std::vector<Double_t>* vectory;
1176 static TkSens* sensor;
1177 if (sensor)
delete sensor;
1178 if (kMC) sensor=
new TkSens(
true);
1179 else sensor=
new TkSens(
false);
1180 static AMSDir direction;
1181 static AMSPoint global;
1182 static AMSPoint local;
1184 static Double_t coord1;
1185 static TrRecHitR* rechit;
1189 clutkid=clu->GetTkId();
1191 rechit = track->GetHitL(layer-1);
1193 rechit = track->GetHitLO(1+layer-1);
1203 track->InterpolateLayer(layer-1, global, direction, TrackId);
1205 track->InterpolateLayerO(1+layer-1, global, direction, TrackId);
1207 sensor->SetGlobal(global, direction);
1208 rhtkid=sensor->GetLadTkID();
1209 if (clutkid!=rhtkid)
continue;
1210 mult=sensor->GetMultIndex();
1211 local=sensor->GetLaddCoo();
1213 vectorx=&distNHx_temp[layer-1];
1214 vectory=&distNHy_temp[layer-1];
1218 track->InterpolateLayer(layer-1, global, direction, TrackId);
1220 track->InterpolateLayerO(1+layer-1, global, direction, TrackId);
1222 sensor->SetGlobal(global, direction);
1223 rhtkid=sensor->GetLadTkID();
1224 if (clutkid!=rhtkid)
continue;
1225 mult=sensor->GetMultIndex();
1226 local=sensor->GetLaddCoo();
1228 vectorx=&distHMx_temp[layer-1];
1229 vectory=&distHMy_temp[layer-1];
1232 coord1=clu->GetCoord(mult);
1233 static Double_t coord2;
1234 static Double_t dist;
1235 if (clu->GetSide()==0) {
1237 dist=1.e4*(coord2-coord1);
1238 (*vectorx).push_back(dist);
1243 dist=1.e4*(coord2-coord1);
1244 (*vectory).push_back(dist);
1253 for (
int ii=0; ii<9; ii++) {
1254 static Double_t minore;
1257 for (
int jj=0; jj<(int)(distHMx_temp[ii].size()); jj++)
if (fabs(distHMx_temp[ii][jj])<minore) minore=distHMx_temp[ii][jj];
1258 distHM[0][ii]=minore;
1261 for (
int jj=0; jj<(int)(distHMy_temp[ii].size()); jj++)
if (fabs(distHMy_temp[ii][jj])<minore) minore=distHMy_temp[ii][jj];
1262 distHM[1][ii]=minore;
1265 for (
int jj=0; jj<(int)(distNHx_temp[ii].size()); jj++)
if (fabs(distNHx_temp[ii][jj])<minore) minore=distNHx_temp[ii][jj];
1266 distNH[0][ii]=minore;
1269 for (
int jj=0; jj<(int)(distNHy_temp[ii].size()); jj++)
if (fabs(distNHy_temp[ii][jj])<minore) minore=distNHy_temp[ii][jj];
1270 distNH[1][ii]=minore;
1278 void PathOnB(TrTrackR* tr,
int kDef, MagField* magfield, Double_t& B, Double_t& SenThetaX, Double_t& SenThetaY, Double_t& L, Double_t& pMDR, Double_t& pMDR_known, Double_t step,
bool modulus){
1281 static Double_t zlay[9]={53.060000, 29.228000, 25.212000, 1.698000, -2.318000, -25.212000, -29.228000, 158.920000, -135.882000};
1291 printf(
"PathOnB:: You passed an empty TrTrackR pointer... Returning 0's!");
1296 ntrhits = tr->GetNhits();
1298 static Double_t start;
1301 static Double_t stop;
1304 for (
int ii=0; ii<ntrhits; ii++) {
1305 static TrRecHitR* rh;
1306 rh=tr->pTrRecHit(ii);
1308 if (rh->GetYCluster()) {
1311 static Double_t zed;
1314 if (zed>start) start=zed;
1315 if (zed<stop) stop=zed;
1321 static float x[3]={0, 0, 0};
1322 static float _B[3]={0, 0, 0};
1328 static AMSPoint inmiddleout[3];
1329 static Double_t zinmiddleout[3];
1330 zinmiddleout[0]=start;
1331 zinmiddleout[1]=(start+stop)/2;
1332 zinmiddleout[2]=stop;
1333 tr->Interpolate(3, zinmiddleout, inmiddleout, 0, 0, kDef);
1337 static Double_t D_ZY;
1338 static Double_t D_ZX;
1339 DZ=fabs(inmiddleout[2].z()-inmiddleout[0].z());
1340 DY=fabs(inmiddleout[2].y()-inmiddleout[0].y());
1341 DX=fabs(inmiddleout[2].x()-inmiddleout[0].x());
1342 D_ZY=sqrt(DZ*DZ+DY*DY);
1343 D_ZX=sqrt(DZ*DZ+DX*DX);
1345 SenThetaX=fabs(DZ/D_ZX);
1346 SenThetaY=fabs(DZ/D_ZY);
1350 y1=inmiddleout[0].y();
1351 y2=inmiddleout[1].y();
1352 y3=inmiddleout[2].y();
1353 static Double_t SigmaY;
1354 static TF1* sigmay =
new TF1(
"sigmay",
"13.75-3.437*(x-1.0)+31.86*((x-1.0)*(x-1.0))", 0.0, 1.0);
1355 static Double_t sigmay0=sigmay->Eval(1.0)/1000000.0;
1356 SigmaY=sigmay->Eval(SenThetaY)/1000000.0;
1358 static Double_t SigmaS;
1359 static TF1* sigmas =
new TF1(
"sigmas",
"18.003-139.973*x+599.883*x*x-1496.24*x*x*x+2235.34*x*x*x*x-1976.75*x*x*x*x*x+954.921*x*x*x*x*x*x-194.295*x*x*x*x*x*x*x", 0.0, 1.0);
1360 static Double_t sigmas0=sigmas->Eval(1.0);
1361 static Double_t kost=sqrt(3.0/2.0);
1362 SigmaS=kost*SigmaY*sigmas->Eval(SenThetaY)/sigmas0;
1366 static AMSPoint pvec[10000];
1367 static Double_t zpl[10000];
1370 for (Double_t ii=start; ii>=(stop-1); ii-=step) {
1374 tr->Interpolate(nz, zpl, pvec, 0, 0, kDef);
1378 for (Double_t ii=start+step; ii>=stop; ii-=step) {
1379 static AMSPoint global;
1380 static AMSPoint global_old;
1383 global_old=pvec[index-1];
1388 if (magfield) magfield->GuFld(x, _B);
1389 if (modulus) B+=fabs(_B[0]);
1396 static float dx[3]={0, 0, 0};
1397 dx[0]=x[0]-global_old.x();
1398 dx[1]=x[1]-global_old.y();
1399 dx[2]=x[2]-global_old.z();
1400 if (magfield) magfield->GuFld(x, _B);
1401 static Double_t vec[3];
1417 vec[0]=_B[1]*dx[2]*dx[2] - _B[2]*dx[1]*dx[1];
1418 vec[1]=_B[2]*dx[0]*dx[0] - _B[0]*dx[2]*dx[2];
1419 vec[2]=_B[0]*dx[1]*dx[1] - _B[1]*dx[0]*dx[0];
1420 BL2+=sqrt(vec[0]*vec[0]+vec[1]*vec[1]+vec[2]*vec[2]);
1432 pMDR=0.3*B*L*L/(8.0*SenThetaX*SigmaS);
1436 pMDR_known=0.3*B*DZ*DZ/(8.0*SenThetaX*sigmay0*sqrt(3.0/2.0));
1447 pMDR_known/=(10*100*100);
1449 L/=(2*sqrt(SigmaS*10000.0));
1457 Double_t LocalResidual(
int layer,
int side,
bool kMC, AMSEventR* fEvent, TrTrackR* track,
int TrackId){
1459 static Double_t res;
1462 static unsigned int currEvent=0;
1463 static unsigned int currRun=0;
1465 static map<int, Double_t**> mapp;
1467 static map<int, Double_t**>::const_iterator pos;
1469 if (currEvent!=fEvent->Event() || currRun!=fEvent->Run()){
1471 for (pos=mapp.begin(); pos!=mapp.end(); ++pos) {
1472 for (
int ii=0; ii<2; ii++) {
1473 delete [] pos->second[ii];
1475 delete [] pos->second;
1480 if (mapp.find(TrackId)==mapp.end()) {
1483 Double_t** res_temp=0;
1484 res_temp =
new Double_t*[2];
1485 for (
int ii=0; ii<2; ii++) {
1486 res_temp[ii] =
new Double_t[9];
1490 BuildResiduals(kMC, res_temp, track, TrackId);
1493 mapp.insert(pair<int, Double_t**>(TrackId, res_temp));
1498 res=mapp.find(TrackId)->second[side][layer-1];
1501 currEvent=fEvent->Event();
1502 currRun=fEvent->Run();
1507 void BuildResiduals(
bool kMC, Double_t** res, TrTrackR* track,
int TrackId){
1509 for (
int ii=0; ii<9; ii++) {
1511 static Double_t resy;
1512 static Double_t resx;
1518 rechit = track->GetHitL(ii);
1520 rechit = track->GetHitLO(1+ii);
1523 static TrClusterR* clux;
1524 static TrClusterR* cluy;
1529 clux=rechit->GetXCluster();
1530 cluy=rechit->GetYCluster();
1534 static AMSDir direction;
1535 static AMSPoint global;
1536 static AMSPoint local;
1537 static Double_t coord1;
1538 static Double_t coord2;
1542 static TkSens* sensor;
1543 if (sensor)
delete sensor;
1544 if (kMC) sensor=
new TkSens(
true);
1545 else sensor=
new TkSens(
false);
1549 track->InterpolateLayer(ii, global, direction, TrackId);
1551 track->InterpolateLayerO(1+ii, global, direction, TrackId);
1554 sensor->SetGlobal(global, direction);
1555 local=sensor->GetLaddCoo();
1556 mult=sensor->GetMultIndex();
1557 iltkid=sensor->GetLadTkID();
1562 clutkid=clux->GetTkId();
1563 if (clutkid!=iltkid) {
1568 coord1=clux->GetCoord(mult);
1570 resx=10000.0*(coord2-coord1);
1574 clutkid=cluy->GetTkId();
1575 if (clutkid!=iltkid) {
1580 coord1=cluy->GetCoord(mult);
1582 resy=10000.0*(coord2-coord1);
1594 #endif //#ifdef _WITHGBATCH_