26 #include "DD4hep/Detector.h"
27 #include "DDRec/Vector3D.h"
28 #include "DD4hep/DD4hepUnits.h"
44 for(
int i=0;i<5;i++) par[0][i]=pars[i];
46 for(
int i=0;i<5;i++) par[1][i]=pars[i+5];
48 for(
int i=0;i<5;i++) par[2][i]=pars[i+10];
50 for(
int i=0;i<5;i++) par[3][i]=pars[i+15];
52 for(
int i=0;i<5;i++) par[4][i]=pars[i+20];
55 _usebayes=(int)pars[25];
56 _dEdxnorm=(float)pars[26];
57 _dEdxerrfact=pars[27];
68 dd4hep::Detector& lcdd = dd4hep::Detector::getInstance();
69 lcdd.field().magneticField({0.0,0.0,0.0}, bfield);
70 _bfield = (float)bfield[2]/dd4hep::tesla;
78 for(
int i=0;i<5;i++) par[0][i]=pars[i];
80 for(
int i=0;i<5;i++) par[1][i]=pars[i+5];
82 for(
int i=0;i<5;i++) par[2][i]=pars[i+10];
84 for(
int i=0;i<5;i++) par[3][i]=pars[i+15];
86 for(
int i=0;i<5;i++) par[4][i]=pars[i+20];
89 _usebayes=(int)pars[25];
90 _dEdxnorm=(float)pars[26];
91 _dEdxerrfact=pars[27];
101 string ffstr1 = fname;
102 fpdf=
new TFile(ffstr1.c_str());
106 for(
int i=0;i<6;i++){
108 hname=
"hep" +
itos(i+1);
109 hname2=
"hep" +
itos(i+1) +
"_2";
110 pdf[i][0]=(TH1F*)fpdf->Get(hname.c_str())->Clone(hname2.c_str());
112 hname=
"hehad" +
itos(i+1);
113 hname2=
"hehad" +
itos(i+1) +
"_2";
114 pdf[i][1]=(TH1F*)fpdf->Get(hname.c_str())->Clone(hname2.c_str());
116 hname=
"hmucal" +
itos(i+1);
117 hname2=
"hmucal" +
itos(i+1) +
"_2";
118 pdf[i][2]=(TH1F*)fpdf->Get(hname.c_str())->Clone(hname2.c_str());
120 hname=
"hchi2" +
itos(i+1);
121 hname2=
"hchi2" +
itos(i+1) +
"_2";
122 pdf[i][3]=(TH1F*)fpdf->Get(hname.c_str())->Clone(hname2.c_str());
124 hname=
"hldiscrepancy" +
itos(i+1);
125 hname2=
"hldiscrepancy" +
itos(i+1) +
"_2";
126 pdf[i][4]=(TH1F*)fpdf->Get(hname.c_str())->Clone(hname2.c_str());
128 hname=
"htdiscrepancy" +
itos(i+1);
129 hname2=
"htdiscrepancy" +
itos(i+1) +
"_2";
130 pdf[i][5]=(TH1F*)fpdf->Get(hname.c_str())->Clone(hname2.c_str());
132 hname=
"hxl20" +
itos(i+1);
133 hname2=
"hxl20" +
itos(i+1) +
"_2";
134 pdf[i][6]=(TH1F*)fpdf->Get(hname.c_str())->Clone(hname2.c_str());
136 hname=
"hlikeliele" +
itos(i+1);
137 hname2=
"hlikeliele" +
itos(i+1) +
"_2";
138 pdf[i][7]=(TH1F*)fpdf->Get(hname.c_str())->Clone(hname2.c_str());
140 hname=
"hlikelimuo" +
itos(i+1);
141 hname2=
"hlikelimuo" +
itos(i+1) +
"_2";
142 pdf[i][8]=(TH1F*)fpdf->Get(hname.c_str())->Clone(hname2.c_str());
144 hname=
"hlikelipi" +
itos(i+1);
145 hname2=
"hlikelipi" +
itos(i+1) +
"_2";
146 pdf[i][9]=(TH1F*)fpdf->Get(hname.c_str())->Clone(hname2.c_str());
148 hname=
"hlikelik" +
itos(i+1);
149 hname2=
"hlikelik" +
itos(i+1) +
"_2";
150 pdf[i][10]=(TH1F*)fpdf->Get(hname.c_str())->Clone(hname2.c_str());
152 hname=
"hlikelip" +
itos(i+1);
153 hname2=
"hlikelip" +
itos(i+1) +
"_2";
154 pdf[i][11]=(TH1F*)fpdf->Get(hname.c_str())->Clone(hname2.c_str());
158 hname=
"hcludepth" +
itos(i+1);
159 fpdf->GetObject(hname.c_str(), obj);
161 hname2=
"hcludepth" +
itos(i+1) +
"_2";
162 pdf[i][14]=(TH1F*)obj->Clone(hname2.c_str());
165 hname=
"hdeltax" +
itos(i+1);
166 fpdf->GetObject(hname.c_str(), obj);
167 hname2=
"hdeltax" +
itos(i+1) +
"_2";
168 pdf[i][12]=(TH1F*)obj->Clone(hname2.c_str());
171 hname=
"hdeltaz" +
itos(i+1);
172 fpdf->GetObject(hname.c_str(), obj);
173 hname2=
"hdeltaz" +
itos(i+1) +
"_2";
174 pdf[i][13]=(TH1F*)obj->Clone(hname2.c_str());
177 hname=
"hhitmean" +
itos(i+1);
178 fpdf->GetObject(hname.c_str(), obj);
179 hname2=
"hhitmean" +
itos(i+1) +
"_2";
180 pdf[i][15]=(TH1F*)obj->Clone(hname2.c_str());
183 hname=
"hhitrms" +
itos(i+1);
184 fpdf->GetObject(hname.c_str(), obj);
185 hname2=
"hhitrms" +
itos(i+1) +
"_2";
186 pdf[i][16]=(TH1F*)obj->Clone(hname2.c_str());
215 for(
int i=0;i<6;i++){
216 for(
int j=0;j<17;j++){
219 weight=pdf[i][j]->Integral(0,pdf[i][j]->GetNbinsX()+1,
"");
220 pdf[i][j]->Scale(1.0/weight);
221 _weights[i][j]=weight;
227 for(
int j=0;j<17;j++){
228 if(pdf[2][j]!=NULL && pdf[3][j]!=NULL && pdf[4][j]!=NULL){
229 double denom = _weights[2][j]+_weights[3][j]+_weights[4][j];
230 for(
int i=2;i<5;i++) _weights[i][j] = _weights[i][j]/denom;
232 for(
int i=2;i<5;i++) _weights[i][j] = 1.0 / 3.0;
245 for(
int i=0;i<5;i++){
246 for(
int j=0;j<5;j++){
247 if(i==j) penalty[i][j]=1.0e-50;
248 else penalty[i][j]=1.0;
251 }
else if(_usebayes==2){
252 for(
int i=0;i<5;i++){
253 for(
int j=0;j<5;j++){
254 penalty[i][j]=cost[i*5+j];
261 dd4hep::Detector& lcdd = dd4hep::Detector::getInstance();
262 lcdd.field().magneticField({0.0,0.0,0.0}, bfield);
263 _bfield = (float)bfield[2]/dd4hep::tesla;
281 for(
int i=0;i<5;i++){
283 _posterior[i]=prior[i];
286 _posterior[5]=prior[2]+prior[3]+prior[4];
290 for(
int i=0;i<5;i++) _dEdxDist[i]=get_dEdxChi2(i, pp.Vect(), trk->getdEdxError(),trk->getdEdx());
293 for(
int i=0;i<5;i++){
295 if(_basicFlg==
false && _dEdxFlg==
true && _showerShapesFlg==
false) prior[i]=0.2;
299 tmpid=Class_electron(pp, trk, cluvec);
300 if(tmpid==0)
return tmpid;
303 for(
int i=0;i<5;i++){
305 if(_basicFlg==
false && _dEdxFlg==
true && _showerShapesFlg==
false) prior[i]=0.2;
309 tmpid=Class_muon(pp, trk, cluvec);
310 if(tmpid==1)
return tmpid;
313 for(
int i=0;i<5;i++){
315 if(_basicFlg==
false && _dEdxFlg==
true && _showerShapesFlg==
false) prior[i]=0.2;
319 tmpid=Class_hadron(pp, trk, cluvec);
322 if(_posterior[0]!=_posterior[0]){
323 for(
int i=0;i<6;i++){
324 _likelihood[i] = 999.0;
327 }
else if(_likelihood[0]==0.0 &&_likelihood[1]==0.0 &&_likelihood[2]==0.0 && _likelihood[3]==0.0 && _likelihood[4]==0.0){
328 for(
int i=0;i<6;i++){
329 _likelihood[i] = 999.0;
349 int parttype=Classification(pp, trk, cluvec);
350 if(parttype==-1) parttype=2;
352 return getCorrEnergy(pp, parttype);
356 if(parttype==-1) parttype=2;
359 if(parttype==0) tmpmass=emass;
360 if(parttype==1) tmpmass=mmass;
361 if(parttype==2) tmpmass=pimass;
362 if(parttype==3) tmpmass=kmass;
363 if(parttype==4) tmpmass=pmass;
365 return sqrt(pp.P()*pp.P()+tmpmass*tmpmass);
371 double tmppar[5],tmpmass=0.0;
372 for(
int i=0;i<5;i++) tmppar[i]=par[parttype][i];
393 double trkcos=p.CosTheta();
396 double dEdx_Norm=get_Norm(dEdx);
399 double ExpdEdx=BetheBloch(p.Mag(),tmpmass,tmppar);
402 double dEdx_Error = _dEdxerrfact * dEdx_Norm * hit/dEdx;
405 double chi2=TMath::Power((dEdx_Norm-ExpdEdx)/dEdx_Error,2.0);
406 if(dEdx_Norm-ExpdEdx<0.0) chi2=-chi2;
413 double tmppar[5],tmpmass=0.0;
414 for(
int i=0;i<5;i++) tmppar[i]=par[parttype][i];
435 double trkcos=p.CosTheta();
438 double dEdx_Norm=get_Norm(dEdx);
441 double dEdx_Error = _dEdxerrfact * dEdx_Norm * hit/dEdx;
444 double factor=-0.5*TMath::Log(2.0*TMath::Pi()*dEdx_Error*dEdx_Error);
454 if(_dEdxDist[parttype]!=0.0) dedxdist = sqrt(fabs(_dEdxDist[parttype]))*_dEdxDist[parttype]/fabs(_dEdxDist[parttype]);
455 if(dedxdist!=dedxdist) dedxdist=0.0;
460 return dedx/_dEdxnorm;
465 double b=sqrt(bg*bg/(1.0+bg*bg));
467 double tmax=pars[2]*TMath::Power(bg,2.0);
469 return (0.5*pars[0]*TMath::Log(pars[1]*TMath::Power(bg,2.0)*tmax)-pars[3]*b*b-pars[4]*bg/2.0)/(b*b);
476 double ecal=0.0,hcal=0.0,mucal=0.0;
477 if(cluvec.size()!=0){
478 for(
unsigned int i=0;i<cluvec.size();i++){
479 ecal+=cluvec[i]->getSubdetectorEnergies()[0];
480 hcal+=cluvec[i]->getSubdetectorEnergies()[1];
481 mucal+=cluvec[i]->getSubdetectorEnergies()[2];
486 if(cluvec.size()!=0) shapes=cluvec[0]->getShape();
491 var[0]=(ecal+hcal)/pp.P();
492 if(ecal+hcal!=0.0) var[1]=ecal/(ecal+hcal);
493 if(shapes.size()!=0){
496 var[4]=fabs(shapes[3+4])/(shapes[6+4]);
497 var[5]=shapes[15+4]/(2.0*3.50);
500 var[6]=get_dEdxChi2(0,pp.Vect(),trk->getdEdxError(),trk->getdEdx());
501 var[7]=get_dEdxChi2(1,pp.Vect(),trk->getdEdxError(),trk->getdEdx());
502 var[8]=get_dEdxChi2(2,pp.Vect(),trk->getdEdxError(),trk->getdEdx());
503 var[9]=get_dEdxChi2(3,pp.Vect(),trk->getdEdxError(),trk->getdEdx());
504 var[10]=get_dEdxChi2(4,pp.Vect(),trk->getdEdxError(),trk->getdEdx());
506 var[6]=-0.5*fabs(var[6])+get_dEdxFactor(0,pp.Vect(),trk->getdEdxError(),trk->getdEdx());
507 var[7]=-0.5*fabs(var[7])+get_dEdxFactor(1,pp.Vect(),trk->getdEdxError(),trk->getdEdx());
508 var[8]=-0.5*fabs(var[8])+get_dEdxFactor(2,pp.Vect(),trk->getdEdxError(),trk->getdEdx());
509 var[9]=-0.5*fabs(var[9])+get_dEdxFactor(3,pp.Vect(),trk->getdEdxError(),trk->getdEdx());
510 var[10]=-0.5*fabs(var[10])+get_dEdxFactor(4,pp.Vect(),trk->getdEdxError(),trk->getdEdx());
513 double posterior[5]={0.0,0.0,0.0,0.0,0.0};
514 double risk[5]={0.0,0.0,0.0,0.0,0.0};
515 double okval[5]={0.0,0.0,0.0,0.0,0.0};
517 double priorprob[5]={0.0,0.0,0.0,0.0,0.0};
519 for(
int j=0;j<7;j++){
521 if(var[0]==0.0 && j<=5)
continue;
524 for(
int i=0;i<5;i++){
534 okval[i]=getValue(i,valtype,var[j]);
535 if(mucal==0.0 && i==1) okval[i]=getValue(5,valtype,var[j]);
537 okval[i]=std::max(std::exp(var[6+i]), 1.0
e-300);
541 if(!_basicFlg && j<2)
continue;
543 if(!_showerShapesFlg && (j>=2 && j<=5))
continue;
545 if(!_dEdxFlg && j==6)
continue;
547 if(_basicFlg && _showerShapesFlg && _dEdxFlg && !(j<=6))
continue;
551 if(j>=6 && var[j]!=var[j])
continue;
555 priorprob[i]=prior[i]/
556 (prior[0]+prior[1]+prior[2]+prior[3]+prior[4]);
560 for(
int i=0;i<5;i++) total+=priorprob[i]*okval[i];
563 for(
int i=0;i<5;i++){
565 posterior[i]=TMath::Log(okval[i])+TMath::Log(priorprob[i])-TMath::Log(total);
566 _likelihood[i]+=TMath::Log(okval[i]);
569 _likelihood[5] += TMath::Log(_weights[2][valtype]*okval[2] + _weights[3][valtype]*okval[3] + _weights[4][valtype]*okval[4]);
572 for(
int i=0;i<5;i++) prior[i]=TMath::Exp(posterior[i]);
585 for(
int i=0;i<5;i++){
586 risk[i]=penalty[i][0]*TMath::Exp(posterior[0])+penalty[i][1]*TMath::Exp(posterior[1])
587 +penalty[i][2]*TMath::Exp(posterior[2])+penalty[i][3]*TMath::Exp(posterior[3])+penalty[i][4]*TMath::Exp(posterior[4]);
592 double tmppp=-1.0e+100;
595 for(
int i=0;i<5;i++){
596 tmppp=TMath::Max(_likelihood[i], tmppp);
603 for(
int i=0;i<5;i++){
605 if(fabs(tmppp-_likelihood[i])<1.0
e-6) okflg=i;
611 for(
int i=0;i<5;i++){
612 tmppp=TMath::Min(risk[i], tmppp);
615 for(
int i=0;i<5;i++){
616 if(fabs(tmppp-risk[i])<1.0
e-8) okflg=i;
620 if(okflg==0 && posterior[okflg]<TMath::Log(threshold[okflg])) okflg=-1;
625 _posterior[0]=TMath::Exp(posterior[0]);
626 _posterior[1]=TMath::Exp(posterior[1]);
627 _posterior[2]=TMath::Exp(posterior[2]);
628 _posterior[3]=TMath::Exp(posterior[3]);
629 _posterior[4]=TMath::Exp(posterior[4]);
631 _posterior[5]=_posterior[2]+_posterior[3]+_posterior[4];
640 double ecal=0.0,hcal=0.0,mucal=0.0;
641 if(cluvec.size()!=0){
642 for(
unsigned int i=0;i<cluvec.size();i++){
643 ecal+=cluvec[i]->getSubdetectorEnergies()[0];
644 hcal+=cluvec[i]->getSubdetectorEnergies()[1];
645 mucal+=cluvec[i]->getSubdetectorEnergies()[2];
650 if(cluvec.size()!=0) shapes=cluvec[0]->getShape();
654 var[0]=(ecal+hcal)/pp.P();
655 if(ecal+hcal!=0.0) var[1]=ecal/(ecal+hcal);
658 if(shapes.size()!=0){
661 var[5]=fabs(shapes[3+4])/(shapes[6+4]);
662 var[6]=shapes[15+4]/(2.0*3.50);
665 var[14]= shapes[17+4];
666 var[15]= shapes[18+4];
667 var[16]= shapes[19+4];
670 var[7]=get_dEdxChi2(0,pp.Vect(),trk->getdEdxError(),trk->getdEdx());
671 var[8]=get_dEdxChi2(1,pp.Vect(),trk->getdEdxError(),trk->getdEdx());
672 var[9]=get_dEdxChi2(2,pp.Vect(),trk->getdEdxError(),trk->getdEdx());
673 var[10]=get_dEdxChi2(3,pp.Vect(),trk->getdEdxError(),trk->getdEdx());
674 var[11]=get_dEdxChi2(4,pp.Vect(),trk->getdEdxError(),trk->getdEdx());
676 var[7]=-0.5*fabs(var[7])+get_dEdxFactor(0,pp.Vect(),trk->getdEdxError(),trk->getdEdx());
677 var[8]=-0.5*fabs(var[8])+get_dEdxFactor(1,pp.Vect(),trk->getdEdxError(),trk->getdEdx());
678 var[9]=-0.5*fabs(var[9])+get_dEdxFactor(2,pp.Vect(),trk->getdEdxError(),trk->getdEdx());
679 var[10]=-0.5*fabs(var[10])+get_dEdxFactor(3,pp.Vect(),trk->getdEdxError(),trk->getdEdx());
680 var[11]=-0.5*fabs(var[11])+get_dEdxFactor(4,pp.Vect(),trk->getdEdxError(),trk->getdEdx());
682 var[12] = _delpos[0];
683 var[13] = _delpos[2];
686 double posterior[5]={0.0,0.0,0.0,0.0,0.0};
687 double risk[5]={0.0,0.0,0.0,0.0,0.0};
689 double okval[5]={0.0,0.0,0.0,0.0,0.0};
691 double priorprob[5]={0.0,0.0,0.0,0.0,0.0};
692 for(
int j=0;j<13;j++){
696 if(var[2]==0.0 && j==2)
continue;
706 for(
int i=0;i<5;i++){
717 if(j==10) valtype=13;
718 if(j==11) valtype=14;
719 if(j==12) valtype=15;
722 okval[i]=getValue(i,valtype,var[j]);
723 if(var[2]==0.0 && i==1) okval[i]=getValue(5,valtype,var[j]);
725 okval[i]=std::max(std::exp(var[7+i]), 1.0
e-300);
726 }
else if(j==8 || j==9){
727 okval[i]=getValue(i,valtype,var[j+4]);
728 if(var[2]==0.0 && i==1) okval[i]=getValue(5,valtype,var[j+4]);
729 }
else if(j>=10 && pp.P()>0.3 && pp.P()<6.0){
730 okval[i]=getValue(i,valtype,var[j+4]);
731 if(var[2]==0.0 && i==1) okval[i]=getValue(5,valtype,var[j+4]);
736 if(!_basicFlg && j<=2)
continue;
738 if(!_showerShapesFlg && ((j>2 && j<=6) || j>=8))
continue;
740 if(!_dEdxFlg && j==7)
continue;
742 if(_basicFlg && _showerShapesFlg && _dEdxFlg && !(j<=9 || (j>=10 && pp.P()>0.3 && pp.P()<6.0)))
continue;
743 if(mucal!=0.0 && j==10)
continue;
747 if(j>=7 && j<=11 && var[j]!=var[j])
continue;
751 priorprob[i]=prior[i]/
752 (prior[0]+prior[1]+prior[2]+prior[3]+prior[4]);
756 for(
int i=0;i<5;i++) total+=priorprob[i]*okval[i];
759 for(
int i=0;i<5;i++){
761 posterior[i]=TMath::Log(okval[i])+TMath::Log(priorprob[i])-TMath::Log(total);
762 _likelihood[i]+=TMath::Log(okval[i]);
765 _likelihood[5] += TMath::Log(_weights[2][valtype]*okval[2] + _weights[3][valtype]*okval[3] + _weights[4][valtype]*okval[4]);
768 for(
int i=0;i<5;i++) prior[i]=TMath::Exp(posterior[i]);
781 for(
int i=0;i<5;i++){
782 risk[i]=penalty[i][0]*TMath::Exp(posterior[0])+penalty[i][1]*TMath::Exp(posterior[1])
783 +penalty[i][2]*TMath::Exp(posterior[2])+penalty[i][3]*TMath::Exp(posterior[3])+penalty[i][4]*TMath::Exp(posterior[4]);
788 double tmppp=-1.0e+100;
791 for(
int i=0;i<5;i++){
792 tmppp=TMath::Max(_likelihood[i], tmppp);
799 for(
int i=0;i<5;i++){
801 if(fabs(tmppp-_likelihood[i])<1.0
e-6) okflg=i;
807 for(
int i=0;i<5;i++){
808 tmppp=TMath::Min(risk[i], tmppp);
811 for(
int i=0;i<5;i++){
812 if(fabs(tmppp-risk[i])<1.0
e-8) okflg=i;
815 if(okflg==1 && posterior[okflg]<TMath::Log(threshold[okflg])) okflg=-1;
820 _posterior[0]=TMath::Exp(posterior[0]);
821 _posterior[1]=TMath::Exp(posterior[1]);
822 _posterior[2]=TMath::Exp(posterior[2]);
823 _posterior[3]=TMath::Exp(posterior[3]);
824 _posterior[4]=TMath::Exp(posterior[4]);
826 _posterior[5]=_posterior[2]+_posterior[3]+_posterior[4];
835 double ecal=0.0,hcal=0.0,mucal=0.0;
836 if(cluvec.size()!=0){
837 for(
unsigned int i=0;i<cluvec.size();i++){
838 ecal+=cluvec[i]->getSubdetectorEnergies()[0];
839 hcal+=cluvec[i]->getSubdetectorEnergies()[1];
840 mucal+=cluvec[i]->getSubdetectorEnergies()[2];
845 if(cluvec.size()!=0) shapes=cluvec[0]->getShape();
849 var[0]=(ecal+hcal)/pp.P();
850 if(ecal+hcal!=0.0)var[1]=ecal/(ecal+hcal);
851 if(shapes.size()!=0){
853 var[3]=fabs(shapes[3+4])/(shapes[6+4]);
854 var[4]=shapes[15+4]/(2.0*3.50);
857 var[5]=get_dEdxChi2(0,pp.Vect(),trk->getdEdxError(),trk->getdEdx());
858 var[6]=get_dEdxChi2(1,pp.Vect(),trk->getdEdxError(),trk->getdEdx());
859 var[7]=get_dEdxChi2(2,pp.Vect(),trk->getdEdxError(),trk->getdEdx());
860 var[8]=get_dEdxChi2(3,pp.Vect(),trk->getdEdxError(),trk->getdEdx());
861 var[9]=get_dEdxChi2(4,pp.Vect(),trk->getdEdxError(),trk->getdEdx());
863 var[5]=-0.5*fabs(var[5])+get_dEdxFactor(0,pp.Vect(),trk->getdEdxError(),trk->getdEdx());
864 var[6]=-0.5*fabs(var[6])+get_dEdxFactor(1,pp.Vect(),trk->getdEdxError(),trk->getdEdx());
865 var[7]=-0.5*fabs(var[7])+get_dEdxFactor(2,pp.Vect(),trk->getdEdxError(),trk->getdEdx());
866 var[8]=-0.5*fabs(var[8])+get_dEdxFactor(3,pp.Vect(),trk->getdEdxError(),trk->getdEdx());
867 var[9]=-0.5*fabs(var[9])+get_dEdxFactor(4,pp.Vect(),trk->getdEdxError(),trk->getdEdx());
870 double posterior[5]={TMath::Log(0.20),TMath::Log(0.20),TMath::Log(0.20),TMath::Log(0.20),TMath::Log(0.20)};
871 double risk[5]={0.0,0.0,0.0,0.0,0.0};
873 double okval[5]={0.0,0.0,0.0,0.0,0.0};
874 double total[5]={0.0,0.0,0.0,0.0,0.0};
875 double priorprob[5]={0.0,0.0,0.0,0.0,0.0};
876 for(
int j=0;j<6;j++){
878 if(var[0]==0.0 && j<=4)
continue;
881 for(
int i=0;i<5;i++){
894 okval[i]=getValue(i,valtype,var[j]);
896 okval[i]=std::max(std::exp(var[5+i]), 1.0
e-300);
900 if(!_basicFlg && j<2)
continue;
902 if(!_showerShapesFlg && j>=2 && j<=4)
continue;
904 if(!_dEdxFlg && j>=5)
continue;
906 if(_basicFlg && _showerShapesFlg && _dEdxFlg && !(j<=5))
continue;
910 if(j>=5 && var[5]!=var[5])
continue;
914 priorprob[i]=prior[i]/
915 (prior[0]+prior[1]+prior[2]+prior[3]+prior[4]);
918 for(
int i=0;i<5;i++){
919 total[i]=priorprob[0]*okval[0]+priorprob[1]*okval[1]+priorprob[2]*okval[2]+priorprob[3]*okval[3]+priorprob[4]*okval[4];
920 if(total[i]==0.0) total[i]=1.0e-100;
924 for(
int i=0;i<5;i++){
926 posterior[i]=TMath::Log(okval[i])+TMath::Log(priorprob[i])-TMath::Log(total[i]);
927 _likelihood[i]+=TMath::Log(okval[i]);
930 _likelihood[5] += TMath::Log(_weights[2][valtype]*okval[2] + _weights[3][valtype]*okval[3] + _weights[4][valtype]*okval[4]);
933 for(
int i=0;i<5;i++) prior[i]=TMath::Exp(posterior[i]);
959 double res43=penalty[4][3];
960 double res32=penalty[3][2];
963 penalty[4][3] = max(1.0, penalty[4][3]*(1.0-TMath::Exp(-0.772*pp.P())));
970 if(fabs(pp.CosTheta())<1.0){
971 penalty[4][3] = max(1.0, penalty[4][3]*(0.439*pp.CosTheta()*pp.CosTheta()-0.940*fabs(pp.CosTheta())+0.495));
972 penalty[3][2] = max(1.0, penalty[3][2]*TMath::Exp(-1.46*fabs(pp.CosTheta())));
979 for(
int i=0;i<5;i++){
980 risk[i]=penalty[i][0]*TMath::Exp(posterior[0])+penalty[i][1]*TMath::Exp(posterior[1])
981 +penalty[i][2]*TMath::Exp(posterior[2])+penalty[i][3]*TMath::Exp(posterior[3])+penalty[i][4]*TMath::Exp(posterior[4]);
989 double tmppp=-1.0e+100;
992 for(
int i=0;i<5;i++){
993 tmppp=TMath::Max(_likelihood[i], tmppp);
1000 for(
int i=0;i<5;i++){
1002 if(fabs(tmppp-_likelihood[i])<1.0
e-6) okflg=i;
1007 if(tmppp==0.0) okflg=2;
1012 for(
int i=0;i<5;i++){
1013 tmppp=TMath::Min(risk[i], tmppp);
1016 for(
int i=0;i<5;i++){
1017 if(fabs(tmppp-risk[i])<1.0
e-6) okflg=i;
1019 if(okflg<2) okflg=2;
1020 if(posterior[okflg]<=TMath::Log(0.21)) okflg=TMath::Max(2,okflg);
1023 if(okflg>=2 && posterior[okflg]<TMath::Log(threshold[okflg])) okflg=-1;
1028 _posterior[0]=TMath::Exp(posterior[0]);
1029 _posterior[1]=TMath::Exp(posterior[1]);
1030 _posterior[2]=TMath::Exp(posterior[2]);
1031 _posterior[3]=TMath::Exp(posterior[3]);
1032 _posterior[4]=TMath::Exp(posterior[4]);
1034 _posterior[5]=_posterior[2]+_posterior[3]+_posterior[4];
1091 double val=1.0e-100;
1094 if(pdf[type][valtype]!=NULL){
1095 bin=pdf[type][valtype]->GetXaxis()->FindBin(value);
1098 val=pdf[type][valtype]->GetBinContent(bin);
1099 if(val==0.0) val= 1.0e-100;
1107 double par[3]={0.0,0.0,0.0};
1116 }
else if(hypothesis==1){
1121 }
else if(hypothesis==2){
1126 }
else if(hypothesis==3){
1145 }
else if(hypothesis==1){
1150 }
else if(hypothesis==2){
1155 }
else if(hypothesis==3){
1173 }
else if(hypothesis==1){
1178 }
else if(hypothesis==2){
1183 }
else if(hypothesis==3){
1201 }
else if(hypothesis==1){
1206 }
else if(hypothesis==2){
1211 }
else if(hypothesis==3){
1229 }
else if(hypothesis==1){
1234 }
else if(hypothesis==2){
1239 }
else if(hypothesis==3){
1253 return par[0]/sqrt(p*p+par[1])+par[2];
1259 double prphi=sqrt(pow(p[0],2)+pow(p[1],2));
1263 double radius=prphi/(0.3*_bfield);
1265 double tanlam=p[2]/prphi;
1273 calcalpos[0]=calpos[0]/1000.0;
1274 calcalpos[1]=calpos[1]/1000.0;
1275 calcalpos[2]=calpos[2]/1000.0;
1279 double rradius=sqrt(pow(calcalpos[0],2)+pow(calcalpos[1],2));
1286 cc[0]=-charge*p[1]*prphi/(0.3*_bfield);
1287 cc[1]=charge*p[0]*prphi/(0.3*_bfield);
1288 cc[2]=radius*tanlam;
1291 double sintheta=charge*rradius/(2*radius);
1292 double costheta=sqrt(1-sintheta*sintheta);
1293 double sin2theta=2*sintheta*costheta;
1294 double cos2theta=costheta*costheta-sintheta*sintheta;
1297 calpos2[2]=rradius*tanlam;
1298 calpos2[0]=cc[0]*(1-cos2theta)+cc[1]*sin2theta;
1299 calpos2[1]=-cc[0]*sin2theta+cc[1]*(1-cos2theta);
1303 _delpos[0]=charge*fabs(calcalpos[0]-calpos2[0]);
1304 _delpos[1]=charge*fabs(calcalpos[1]-calpos2[1]);
1305 _delpos[2]=fabs(calcalpos[2]-calpos2[2]);
int Class_hadron(TLorentzVector pp, EVENT::Track *trk, EVENT::ClusterVec &cluvec)
double get_dEdxDist(int parttype)
void CalculateDeltaPosition(float charge, TVector3 p, const float *calpos)
int Class_muon(TLorentzVector pp, EVENT::Track *trk, EVENT::ClusterVec &cluvec)
int Class_electron(TLorentzVector pp, EVENT::Track *trk, EVENT::ClusterVec &cluvec)
double get_dEdxChi2(int parttype, TVector3 p, float hit, double dEdx)
double get_dEdxFactor(int parttype, TVector3 p, float hit, double dEdx)
double getValue(int type, int valtype, double value)
double get_Norm(double dedx)
double getCorrEnergy(TLorentzVector pp, EVENT::Track *trk, EVENT::ClusterVec &cluvec)
int Classification(TLorentzVector pp, EVENT::Track *trk, EVENT::ClusterVec &cluvec)
double getPenalty(int ptype, int hypothesis, double p)
double BetheBloch(double x, double mass, double *pars)