14 #include "FairRootManager.h"
16 #include "FairRuntimeDb.h"
37 #include "TClonesArray.h"
41 #include "TParticle.h"
43 #include "TDatabasePDG.h"
44 #include "TParticlePDG.h"
45 #include "TVirtualMC.h"
63 FairTask(
"Panda Fast Simulation") {
77 fdbPdg = TDatabasePDG::Instance();
99 FairRootManager *fManager =FairRootManager::Instance();
138 fEventInfo =
new TClonesArray(
"PndEventInfo");
139 FairRootManager::Instance()->Register(
"PndEventSummary",
"FastSim",
fEventInfo,
fPersist);
141 for (FsmAbsDetList::iterator iter=
fDetList.begin();iter!=
fDetList.end(); iter++)
147 arrayname+=
"Probability";
148 TClonesArray* tmparray =
new TClonesArray(
"PndPidProbability");
149 FairRootManager::Instance()->Register(arrayname.Data(),
"FastSim", tmparray,
fPersist);
160 if (
fVb>3) cout <<
" Inside the Init function****" << endl;
165 cout <<
"\n\n****** DETECTOR SETUP SUMMARY ***************\n\n";
166 for (FsmAbsDetList::iterator iter=
fDetList.begin();iter!=
fDetList.end(); iter++)
168 cout<<endl<<
"----------------------------"<<endl;
170 det->
print(std::cout);
172 cout <<
"\n\n****** DETECTOR SETUP SUMMARY ***************\n\n";
189 fEta(1,0)=-0.9243;
fEta(1,1)= 0.3817;
191 fEta(3,0)=-0.01743;
fEta(3,1)=-0.05667;
fEta(3,2)= 0.007335;
fEta(3,3)= 0.9982;
192 fEta(4,0)= 0.009165;
fEta(4,1)=-6.781e-4;
fEta(4,2)=-0.02316;
fEta(4,3)=-0.9341;
fEta(4,4)=0.3562;
195 fBremsEnergy =
new TF1(
"fBremsEnergy",
"[0]*pow([3]/[4],[3])*exp(-0.5*[4]^2)/pow((x-[1])/[2]+[3]/[4]-[4],[3])");
200 cout <<
"-I- PndFastSim: Intialization successfull" << endl;
208 FairRun*
run = FairRun::Instance();
209 if ( ! run ) Fatal(
"SetParContainers",
"No analysis run");
211 FairRuntimeDb* db = run->GetRuntimeDb();
212 if ( ! db ) Fatal(
"SetParContainers",
"No runtime database");
219 fRand->SetSeed(seed);
228 cout <<
" -W- (PndFastSim::EnableSplitoffs) - no filename given; no split offs will be produced."<<endl;
247 ifstream pars(fname.data());
249 if ( (pars.rdstate() & ifstream::failbit ) != 0 )
251 cout <<
" -W- (PndFastSim::EnableSplitoffs) - Error opening '"<<fname<<
"'; no split offs will be produced."<<endl;
261 double rangeup[4],rangelow[4];
268 pars>>model[
i]>>numpars[
i]>>rangelow[
i]>>rangeup[
i];
269 if (
fVb) cout <<
" -I- (PndFastSim::EnableSplitoffs) split off model #"<<i<<
": '"<<model[
i]<<
"' with "<<numpars[
i]<<
" params."<<endl;
274 sprintf(tmp,
"f%d%d",j,i);
275 fspo[j][
i]=
new TF1(tmp,model[i].data());
279 for (k=0;k<numpars[
i];k++)
282 fspo[j][
i]->SetParameter(k,curpar);
285 fspo[j][
i]->SetRange(rangelow[i],rangeup[i]);
290 if (
fVb) cout <<
" -I- (PndFastSim::EnableSplitoffs) - Successfully read "<<fname<<endl;
317 cout <<
" -W- (PndFastSim::AddDetector) - No name given, no detector added!"<<endl;
321 if (
fAddedDets.find(
" "+name+
" ")!=std::string::npos)
323 std::cout <<
" -W- (PndFastSim::AddDetector) - Detector <"<<name<<
"> already appended - skipping!"<<std::endl;
330 if (!det)
return false;
333 if (
fVb>0) std::cout<<
" -I- (PndFastSim::AddDetector) - Added detector "<<name<<
" with params <"<<params<<
">"<<std::endl;
342 if (
fVb>0) std::cout<<
" -I- (PndFastSim::AddDetector) - Added detector "<<det->
detName()<<std::endl;
351 else if (type==
"-") i=1;
352 else if (type==
"gam") i=2;
353 else if (type==
"pi0") i=3;
354 else if (type==
"ks") i=4;
355 else if (type==
"eta") i=5;
356 else cout <<
" WARNING : Unknown type '"<<type.Data()<<
"' for muliplicity filter!"<<endl;
383 if (wk.EndsWith(
"cc"))
386 wk=wk(0,wk.Length()-3);
395 int delim = wk.Index(
" ");
399 if (tok==
"gam") idx=10;
400 else if (tok==
"pi0") idx=11;
401 else if (tok==
"ks") idx=12;
402 else if (tok==
"eta") idx=13;
403 else if (tok.BeginsWith(
"e")) idx=0;
404 else if (tok.BeginsWith(
"mu")) idx=2;
405 else if (tok.BeginsWith(
"pi")) idx=4;
406 else if (tok.BeginsWith(
"k")) idx=6;
407 else if (tok.BeginsWith(
"p")) idx=8;
409 if (tok.EndsWith(
"-")) idx++;
416 cout <<
"Inv Mass Filter combines:";
425 if (i<10) i%2 ? cc=i-1 : cc=i+1;
433 int i,j, nplus, nminus, ngam;
437 if (l[i]->Charge()>0) plus.
Add(l[i]);
438 else if (l[i]->Charge()<0) minus.
Add(l[i]);
439 else if (
fabs(l[i]->Charge())<1e-6) lsp[10].
Add(l[i]);
456 int pdgcodes[10] = {-11, 11, -13, 13, 211, -211, 321, -321, 2212, -2212};
466 lsp[11].
Combine(lsp[10],lsp[10]);
480 lsp[12].
Combine(lsp[4],lsp[5]);
490 lsp[13].
Combine(lsp[10],lsp[10]);
506 int ccidx =
chCon(idx);
508 if (
fVb) cout <<
"IDX:"<<idx<<
" CCIDX:"<<ccidx<<endl;
511 if (idx<10 && lsp[idx].GetLength()==0)
518 if (
fChargeConj && ccidx<10 && lsp[ccidx].GetLength()==0)
525 if (idx==11 && lsp[idx].GetLength()==0)
527 lsp[11].
Combine(lsp[10],lsp[10]);
532 if (idx==12 && lsp[idx].GetLength()==0)
534 if (lsp[4].GetLength()==0)
copyAndSetMass(plus, lsp[4], pdgcodes[4]);
535 if (lsp[5].GetLength()==0)
copyAndSetMass(minus, lsp[5], pdgcodes[5]);
537 lsp[12].
Combine(lsp[4],lsp[5]);
542 if (idx==13 && lsp[idx].GetLength()==0)
544 lsp[13].
Combine(lsp[10],lsp[10]);
553 case 2: comb.
Combine(lsp[iar[0]], lsp[iar[1]]);
557 case 3: comb.
Combine(lsp[iar[0]], lsp[iar[1]], lsp[iar[2]]);
561 case 4: comb.
Combine(lsp[iar[0]], lsp[iar[1]], lsp[iar[2]], lsp[iar[3]]);
565 case 5: comb.
Combine(lsp[iar[0]], lsp[iar[1]], lsp[iar[2]], lsp[iar[3]], lsp[iar[4]]);
572 combsel.
Select(comb,&msel);
577 cout<<
"filter list masses: ";
580 std::cout <<comb[
i]->M()<<
" ("<<comb[
i]->GetMarker(0)<<
") "<<endl;
581 cout <<
" ("<<comb[
i]->P4().X()<<
","<<comb[
i]->P4().Y()<<
","<<comb[
i]->P4().Z()<<
","<<comb[
i]->P4().E()<<
")"<<endl;
582 for (j=0;j<comb[
i]->NDaughters();++j)
601 TString multnames[6] = {
"ch+",
"ch-",
"gam",
"pi0",
"ks",
"eta"};
604 for (
int i=0;
i<6;++
i)
607 std::cout <<
"*** Filtering Info: "<<
fMultMin[
i]<<
" <= "<<multnames[
i].Data() <<
" <= "<<
fMultMax[
i]<<endl;
610 std::cout <<
"*** Filtering Info: "<<
fNAccept <<
"/"<<
evtcnt<<
" accepted by filters."<<endl;
622 cout <<
"[PndFastSim] evt "<<
evtcnt<<endl;
638 if(iter->second->GetEntriesFast() != 0) iter->second->Clear(
"C");
652 if (
fVb)cout <<
"number of tracks **** "<< nTracks <<endl;
656 TLorentzVector McSumP4(0,0,0,0);
657 TVector3 McAvgVtx(0,0,0);
662 for (Int_t iTrack=0; iTrack<nTracks; iTrack++)
665 int pdg = abs(t->GetPdgCode());
666 if (!(pdg==11 || pdg==13 || pdg==211 || pdg==321 || pdg==2212 || pdg==22))
continue;
668 TLorentzVector p4(t->Px(),t->Py(),t->Pz(),t->Energy());
669 TParticlePDG* part =
fdbPdg->GetParticle(t->GetPdgCode());
671 if (part) charge=part->Charge();
672 if (
fabs(charge)>2) charge/=3.;
686 cout <<
"PndFastSim Filter reject ev="<<
evtcnt<<
" with code="<<errac<<endl;
687 cout <<
"Filter list"<<endl;
690 cout <<
i<<
" : "<<lfilt[
i]->PdgCode();
691 cout <<
" ("<<lfilt[
i]->P4().X()<<
","<<lfilt[
i]->P4().Y()<<
","<<lfilt[
i]->P4().Z()<<
","<<lfilt[
i]->P4().E()<<
")"<<endl;
701 for (Int_t iTrack=0; iTrack<nTracks; iTrack++)
705 Int_t mcsize = mctracks.GetEntriesFast();
706 Int_t chcandsize = chrgCandidates.GetEntriesFast();
707 Int_t neucandsize = neutCandidates.GetEntriesFast();
711 if (
fVb>1) t->Print();
713 TLorentzVector p4(t->Px(),t->Py(),t->Pz(),t->Energy());
714 TVector3 stvtx(t->Vx(),t->Vy(),t->Vz());
716 int pdg = t->GetPdgCode();
722 if (
fRand->Rndm()<0.32)
728 p4.SetVectM(p4.Vect()*(1.0-loss),5.11e-4);
730 phot.SetVectM(p4.Vect()*loss, 0.0);
734 phot.X(), phot.Y(), phot.Z(),
749 if (abs(pdg) == 11) type=0;
750 else if (abs(pdg) == 211) type=2;
751 else if (abs(pdg) == 321) type=3;
752 else if (abs(pdg) == 2212) type=4;
758 int numSP=(int)
fspo[type][3]->GetRandom();
760 if (
fVb) cout <<
" -I- (PndFastSim::Exec) - creating "<<numSP
761 <<
" split offs for particle with type "<<type<<endl;
763 for (
int ii=0;ii<numSP;ii++)
765 TLorentzVector lv(p4);
767 double mom =
fspo[type][0]->GetRandom();
768 double dphi =
fspo[type][1]->GetRandom();
769 double dtht =
fspo[type][2]->GetRandom();
771 lv.SetPhi(lv.Phi()+dphi);
772 lv.SetTheta(lv.Theta()+dtht);
778 lv.X(), lv.Y(), lv.Z(),
790 TParticlePDG* part =
fdbPdg->GetParticle(t->GetPdgCode());
792 if(part) charge=part->Charge();
793 if (
fabs(charge)>2) charge/=3.;
802 pmc->SetType(t->GetPdgCode());
804 bool pdgcheck =
false;
805 switch(abs(t->GetPdgCode())) {
806 case 22: pdgcheck =
true;
break;
807 case 11: pmc->SetPidInfo(0, 1); pdgcheck =
true;
break;
808 case 13: pmc->SetPidInfo(1, 1); pdgcheck =
true;
break;
809 case 211: pmc->SetPidInfo(2, 1); pdgcheck =
true;
break;
810 case 321: pmc->SetPidInfo(3, 1); pdgcheck =
true;
break;
811 case 2212: pmc->SetPidInfo(4, 1); pdgcheck =
true;
break;
824 TLorentzVector miclv=ft->
p4();
826 TVector3 lastpos=ft->
stopVtx();
831 miclv.SetVectM(miclv.Vect(),
fdbPdg->GetParticle(211)->Mass());
836 miclv.SetVectM(miclv.Vect(),0.0);
857 for (
int i=0;
i<neucandsize;++
i)
859 TLorentzVector nlv = ((
PndPidCandidate*) neutCandidates[
i])->GetLorentzVector();
860 double openang = nlv.Angle(miclv.Vect())*57.2958;
863 double mergeE = nlv.E()+miclv.E();
864 TVector3 mergeV = nlv.Vect()+miclv.Vect();
865 mergeV *= mergeE/mergeV.Mag();
924 tcand.SetCov7(ft->
Cov7());
936 McAvgVtx*=1./(double)nTracks;
957 for (FsmAbsDetList::iterator iter=
fDetList.begin();iter!=
fDetList.end(); iter++)
964 if (respo) responseList.push_back(respo);
977 TClonesArray* myPidarray = pidit->second;
978 if (!myPidarray) Error(
"PndFastSim::smearTrack",
"Missing PidProb Array: \"%s\"",pidit->first.Data());
979 if (myPidarray->GetEntriesFast() != chcandsize ) Warning(
"PndFastSim::smearTrack",
"unequal array sizes: cand array:%i prob array \"%s\" :%i",chcandsize,pidit->first.Data(),myPidarray->GetEntriesFast());
985 for (FsmResponseList::iterator riter=responseList.begin(); riter!=responseList.end();riter++)
994 if (!myPidarray) Error(
"PndFastSim::smearTrack",
"Failed accessing PidProb Array: \"%s\"",detname.Data());
996 if (!pidProb) Error(
"PndFastSim::smearTrack",
"Failed accessing PidProb Object number %i from array \"%s\"",chcandsize,detname.Data());
999 double rawLHmu = resp->
LHMuon();
1000 double rawLHpi = resp->
LHPion();
1001 double rawLHK = resp->
LHKaon();
1004 double sumRaw = rawLHe+rawLHmu+rawLHpi+rawLHK+rawLHp;
1008 pidProb->SetElectronPdf(rawLHe/sumRaw);
1009 pidProb->SetMuonPdf(rawLHmu/sumRaw);
1010 pidProb->SetPionPdf(rawLHpi/sumRaw);
1011 pidProb->SetKaonPdf(rawLHK/sumRaw);
1012 pidProb->SetProtonPdf(rawLHp/sumRaw);
1014 pidProb->SetElectronPdf(0.2);
1015 pidProb->SetMuonPdf(0.2);
1016 pidProb->SetPionPdf(0.2);
1017 pidProb->SetKaonPdf(0.2);
1018 pidProb->SetProtonPdf(0.2);
1025 responseList.clear();
1041 if( !(r->
detected()) )
return false;
1043 double charge = t->
charge();
1044 double dE = r->
dE();
1045 double dp = r->
dp();
1047 double dphi = r->
dphi();
1048 double dm = r->
dm();
1049 double m2 = r->
m2();
1052 TVector3 dV = r->
dV();
1055 if (
fabs(charge)>1e-6 &&
fabs(dp)<1e-8)
return false;
1056 if (
fabs(charge)<1e-6 &&
fabs(dE)<1e-8)
return false;
1061 double p2 = t->
p4().Vect().Mag2();
1064 double theta = t->
p4().Theta();
1066 static TVectorD gaus(5);
1067 for (
char p=0;
p<5;
p++) gaus[
p]=
fRand->Gaus();
1072 err[0] = 0.5*(dV.X()+dV.Y());
1076 err[2] = omega *
sqrt( dp*dp/p2 + pow(dtheta*tandip,2) );
1078 err[4] = dtheta/pow(
sin(theta),2);
1083 for (
int ir=0;
ir<5;
ir++) {
1084 for (
int c=0;
c<5;
c++) {
1097 if (
fabs(charge)>1e-6 && (dV.X() != 0.0 || dV.Y() != 0.0 || dV.Z() != 0.0))
smearVertex(t,dV);
1100 if (dm != 0.0)
smearM(t,dm);
1111 TLorentzVector lv=t->
p4();
1113 double st=
sin(lv.Theta());
1114 double ct=
cos(lv.Theta());
1115 double sf=
sin(lv.Phi());
1116 double cf=
cos(lv.Phi());
1126 jacobian(0,0) = st*cf;
1127 jacobian(1,0) = st*sf;
1129 jacobian(3,0) = (e>0) ? p/e : 0.;
1131 jacobian(0,0) = st*cf*e/
p;
1132 jacobian(1,0) = st*sf*e/
p;
1133 jacobian(2,0) = ct*e/
p;
1136 jacobian(0,1) = p*ct*cf;
1137 jacobian(1,1) = p*ct*sf;
1138 jacobian(2,1) = -p*st;
1140 jacobian(0,2) = -p*st*sf;
1141 jacobian(1,2) = p*st*cf;
1145 TMatrixDSym covPol(3);
1146 if(
fabs(t->
charge())>1e-6) covPol(0,0)=dp*dp;
1147 else covPol(0,0)=dE*
dE;
1149 covPol(1,1)=dtheta*
dtheta;
1150 covPol(2,2)=dphi*dphi;
1152 TMatrixD jcov(jacobian,TMatrixD::kMult,covPol);
1153 TMatrixD covCar(jcov,TMatrixD::kMultTranspose,jacobian);
1187 TLorentzVector p4=t->
p4();
1188 double m=t->
p4().M();
1194 double rnd =
fRand->Gaus(0. , dE);
1196 double newE = rnd + p4.E();
1198 p4.SetVectM(p4.Vect()*(newE/p4.E()) , 0.0);
1202 double newE =
fRand->Gaus(0.0,dE) + p4.E();
1203 double newP =
sqrt(newE*newE - m*m);
1206 p4.SetVectMag(p4.Vect(),newP);
1215 TLorentzVector p4=t->
p4();
1216 double newP = p4.Vect().Mag() +
fRand->Gaus(0.0,dp);
1217 p4.SetVectM(p4.Vect().Unit()*newP,t->
p4().M());
1224 TLorentzVector p4=t->
p4();
1225 double newTheta = p4.Theta() +
fRand->Gaus(0.,dtheta);
1226 p4.SetTheta(newTheta);
1234 TLorentzVector p4=t->
p4();
1235 double newPhi = p4.Phi() +
fRand->Gaus(0.,dphi);
1244 TLorentzVector p4=t->
p4();
1246 double newM=p4.M() + dm;
1248 p4.SetVectM(p4.Vect(),newM);
1279 double newX = vtx.X() +
fRand->Gaus( 0. , dV.X() );
1280 double newY = vtx.Y() +
fRand->Gaus( 0. , dV.Y() );
1281 double newZ = vtx.Z() +
fRand->Gaus( 0. , dV.Z() );
1297 bool detected=
false;
1309 double DrcDiscThtc=0;
1310 double DrcBarrelThtc=0;
1316 double MvddEdxErr=0;
1317 double SttdEdxErr=0;
1318 double DrcDiscThtcErr=0;
1319 double DrcBarrelThtcErr=0;
1320 double RichThtcErr=0;
1336 if (
fVb>3) cout <<
" *** SINGLE RESPONSES ***"<<endl<<
"--------------------------------------"<<endl;
1338 for (FsmResponseList::iterator riter=respList.begin(); riter!=respList.end();riter++)
1346 detected = detected | resp->
detected();
1350 if (
fabs(val = resp->
dE()) > 1e-8) dE += 1/(val*
val);
1351 if (
fabs(val = resp->
dp()) > 1e-8) dp += 1/(val*
val);
1352 if (
fabs(val = resp->
dtheta())> 1e-8) dtheta += 1/(val*
val);
1353 if (
fabs(val = resp->
dphi()) > 1e-8) dphi += 1/(val*
val);
1355 if (
fabs(val = resp->
dt()) > 1e-8) dt += val*
val;
1356 if (
fabs(val = resp->
dm()) > 1e-8) dm =
val;
1357 if (
fabs (val = resp->
m2()) > 1e-11) m2=
val;
1373 if (
fabs (val = resp->
dV().X()) > 1e-11) dVx += 1/(val*
val);
1374 if (
fabs (val = resp->
dV().Y()) > 1e-11) dVy += 1/(val*
val);
1375 if (
fabs (val = resp->
dV().Z()) > 1e-11) dVz += 1/(val*
val);
1378 double rawLHmu = resp->
LHMuon();
1379 double rawLHpi = resp->
LHPion();
1380 double rawLHK = resp->
LHKaon();
1383 double sumRaw = rawLHe+rawLHmu+rawLHpi+rawLHK+rawLHp;
1416 double sumLH = LH_e + LH_mu + LH_pi + LH_K + LH_p;
1433 allResponse->
setdE( dE>0. ? 1/
sqrt(dE) : 0.0 );
1434 allResponse->
setdp( dp>0. ? 1/
sqrt(dp) : 0.0 );
1436 allResponse->
setdphi( dphi>0. ? 1/
sqrt(dphi) : 0.0 );
1438 allResponse->
setdm(dm);
1440 allResponse->
setm2(m2, m2Err);
1450 if (dVx > 0.) dVx=1./
sqrt(dVx);
else dVx = 0.0;
1451 if (dVy > 0.) dVy=1./
sqrt(dVy);
else dVy = 0.0;
1452 if (dVz > 0.) dVz=1./
sqrt(dVz);
else dVz = 0.0;
1454 allResponse->
setdV( dVx , dVy , dVz );
1463 if (
fVb>2) cout <<
"--------------------------------------"<<endl<<
"*** OVERALL RESPONSE ***"<<endl<<
"--------------------------------------" <<endl;
1464 if (
fVb>2) allResponse->
print(cout);
1465 if (
fVb>2) cout <<
"--------------------------------------"<<endl;
1473 double z=hitpos.z();
1476 if(
fabs(t->
p4().Perp()) < 1e-9)
return;
1477 double perpscale = hitpos.Perp()/t->
p4().Perp();
1478 double x = t->
p4().Px()*perpscale;
1479 double y = t->
p4().Py()*perpscale;
1480 z = t->
p4().Pz()*perpscale;
1481 hitpos.SetXYZ(x,y,z);
1484 double zscale = z/t->
p4().Pz();
1485 double x = t->
p4().Px()*zscale;
1486 double y = t->
p4().Py()*zscale;
1487 hitpos.SetXYZ(x,y,z);
void SetMomentum(TVector3 &mom)
void smearMomentum(PndFsmTrack *t, double dp)
void SetFlatCovMatrix(PndFsmTrack *t, double dp=0., double dtheta=0., double dphi=0., double dE=0., double dx=0., double dy=0., double dz=0.)
virtual PndFsmResponse * respond(PndFsmTrack *t)=0
void Add(const RhoCandidate *c)
void smearPhi(PndFsmTrack *t, double dphi)
void setDrcBarrelThtc(double val, double err=0)
friend F32vec4 cos(const F32vec4 &a)
std::map< TString, TClonesArray * > fPidArrayList
PndPidProbability TCA for neutral particles.
void propagate(TLorentzVector &l, TVector3 &p, float charge, TH2F *hpro=0)
void setLHElectron(double val)
friend F32vec4 exp(const F32vec4 &a)
TClonesArray * fMcCandidates
void setLHProton(double val)
void SetPionPdf(Double_t val)
void setStopVtx(TVector3 v)
int acceptFilters(RhoCandList &l)
virtual Int_t GetNtrack() const
friend F32vec4 sqrt(const F32vec4 &a)
Double_t val[nBoxes][nFEBox]
Double_t GetHelixOmega() const
static const UInt_t success
void setLHMuon(double val)
bool AddDetector(std::string name, std::string params="")
friend F32vec4 sin(const F32vec4 &a)
void print(std::ostream &o)
void setDetResponse(PndFsmResponse *resp)
void smearSttdEdx(PndFsmTrack *t, double dedx)
void SetEmcCalEnergy(Double_t val)
void SetCov7(const TMatrixD &cov7)
bool fMergeNeutralClusters
TParticle * GetParticle(Int_t trackId) const
void setMvddEdX(double c)
void SetSeed(unsigned int seed=65539)
void SetKaonPdf(Double_t val)
void SetTofM2(Double_t val)
PndFsmAbsDet * detector()
friend F32vec4 max(const F32vec4 &a, const F32vec4 &b)
void SetDiscThetaC(Double_t val)
void SetCmFrame(TLorentzVector &cmf)
virtual void print(std::ostream &o)
void setm2(double val, double err=0)
void SetElectronPdf(Double_t val)
void setMuoIron(double val)
void SetType(const TParticlePDG *pdt)
void SetMuonPdf(Double_t val)
void SetEnergy(Double_t en)
void SetDrcThetaCErr(Double_t val)
double * GetHelixParams()
void CombineAndAppend(RhoCandList &l1, RhoCandList &l2)
TString m2(TString pts, TString exts="e px py pz")
void smearMvddEdx(PndFsmTrack *t, double dedx)
void Combine(RhoCandList &l1, RhoCandList &l2)
void SetVCov(TMatrixD &vcov)
void SetInvMassFilter(TString filter, double min, double max, int mult=1)
void smearM2(PndFsmTrack *t, double m2)
void setDrcDiscThtc(double val, double err=0)
const std::string & detName()
void SetMuoIron(Double_t val)
void smearTheta(PndFsmTrack *t, double dtheta)
PndFsmAbsDet * create(std::string &name, ArgList &par)
PndFsmResponse * sumResponse(FsmResponseList respList)
void SetDrcNumberOfPhotons(Int_t val)
void SetRichNumberOfPhotons(Int_t val)
void Select(RhoParticleSelectorBase *pidmgr)
virtual InitStatus Init()
void setP4(TLorentzVector l)
void smearEnergy(PndFsmTrack *t, double dE)
void copyAndSetMass(RhoCandList &l, RhoCandList &nl, int pdg)
friend F32vec4 min(const F32vec4 &a, const F32vec4 &b)
void setLHKaon(double val)
friend F32vec4 fabs(const F32vec4 &a)
void UpdateGammaHit(PndFsmTrack *t)
static RhoFactory * Instance()
void smearM(PndFsmTrack *t, double dm)
bool EnableSplitoffs(std::string fname="splitpars.dat")
TClonesArray * fPidNeutralProb
PndPidProbability TCA for charged particles.
static TRandom3 * Instance()
void setSttdEdX(double c)
void SetMultFilter(TString type, int min, int max=1000)
void setEmcEcal(double val)
void SetP4Cov(TMatrixD &p4cov)
void SetSttMeanDEDX(Double_t val)
void SetProtonPdf(Double_t val)
void setStartVtx(TVector3 v)
bool smearTrack(PndFsmTrack *t, int idx=-1)
void SetIPTruth(TVector3 &inVtx)
void SetMcTruth(RhoCandidate *mct)
TClonesArray * fPidNeutralCand
void SetTrackNumber(Int_t trnum=-1)
void HelixRep(TVector3 reference)
void setRichThtc(double val, double err=0)
void SetRichThetaC(Double_t val)
void SetDrcThetaC(Double_t val)
void SetDiscNumberOfPhotons(Int_t val)
TClonesArray * fEventInfo
PndPidProbability TCA's for individual detectors.
PndFsmDetFactory * fDetFac
void SetLastHit(TVector3 &pos)
void setDetected(bool isdet)
virtual void PushTrack(Int_t toBeDone, Int_t parentID, Int_t pdgCode, Double_t px, Double_t py, Double_t pz, Double_t e, Double_t vx, Double_t vy, Double_t vz, Double_t time, Double_t polx, Double_t poly, Double_t polz, TMCProcess proc, Int_t &ntr, Double_t weight, Int_t is)
void SetMarker(UInt_t l, UInt_t m)
bool cutAndSmear(PndFsmTrack *t, PndFsmResponse *r)
TClonesArray * fPidChargedCand
virtual void SetParContainers()
void setdtheta(double val)
PndFsmResponse * detResponse()
Double_t GetHelixTanDip() const
std::list< PndFsmResponse * > FsmResponseList
void setSttdEdx(double val, double err=0)
TClonesArray * fPidChargedProb
void smearVertex(PndFsmTrack *t, TVector3 dV)
PndFastSim(bool persist=true)
void Propagate(TVector3 origin, double deltaError=2.5)
double DrcBarrelThtcErr()
void SetDiscThetaCErr(Double_t val)
void setMvddEdx(double val, double err=0)
virtual void Exec(Option_t *opt)
TMatrixT< double > TMatrixD
void setLHPion(double val)
void SetMvdDEDX(Double_t val)
void SetRichThetaCErr(Double_t val)
void EnablePropagation(bool propagate=true, bool tostartvtx=true, bool usecovmatrix=true, double tolerance=0.0)