16 #include "TClonesArray.h"
22 #include "FairRootManager.h"
24 #include "FairRuntimeDb.h"
26 #include "FairMultiLinkedData.h"
38 FairTask(
"Creates PndMC test")
54 ioman = FairRootManager::Instance();
56 std::cout <<
"-E- OnlineDBuilderTask::Init: "
57 <<
"RootManager not instantiated!" << std::endl;
61 for (std::map<TString, TClonesArray*>::iterator iter =
fTrack.begin(); iter !=
fTrack.end(); iter++){
62 iter->second = (TClonesArray*)
ioman->GetObject(iter->first);
72 <<
"-I- OnlineDBuilderTask::Init: Initialization successfull"
83 std::cout <<
"-I- OnlineDBuilderTask::Exec: Event " << FairRootManager::Instance()->GetEntryNr() << std::endl;
85 std::vector<PndTrack*> plusTracks;
86 std::vector<PndTrack*> minusTracks;
89 for (std::map<TString, TClonesArray*>::iterator iter =
fTrack.begin(); iter !=
fTrack.end(); iter++){
91 for (Int_t trackIndex = 0; trackIndex < trackArray->GetEntriesFast(); trackIndex++){
93 if (myTrack->
GetParamFirst().GetQ() > 0) plusTracks.push_back(myTrack);
94 if (myTrack->
GetParamFirst().GetQ() < 0) minusTracks.push_back(myTrack);
99 std::cout <<
"CombinePlusTracks: " << plusTracks.size() << std::endl;
100 for (
size_t i = 0;
i < plusTracks.size();
i++){
101 std::cout << plusTracks[
i]->GetLinksWithType(FairRootManager::Instance()->GetBranchId(
"MCTrack")) << std::endl;
103 std::cout <<
" MinusTracks: " << minusTracks.size() << std::endl;
104 for (
size_t i = 0;
i < minusTracks.size();
i++){
105 std::cout << minusTracks[
i]->GetLinksWithType(FairRootManager::Instance()->GetBranchId(
"MCTrack")) << std::endl;
108 std::cout << std::endl;
110 std::cout << std::endl;
113 for (
size_t i = 0;
i < Dminus.size();
i++){
114 TLorentzVector*
vec =
new ((*fDMinusArray)[
fDMinusArray->GetEntriesFast()]) TLorentzVector(Dminus[
i].first);
115 std::cout <<
"DMinus " << Dminus[
i].second <<
" " << vec->Px() <<
"/" << vec->Py() <<
"/" << vec->Pz() <<
" " << vec->M() << std::endl;
116 if (Dminus[
i].second == -1){
117 new ((*fDMinusArrayTrue)[
fDMinusArrayTrue->GetEntriesFast()]) TLorentzVector(Dminus[
i].first);
120 for (
size_t i = 0;
i < Dplus.size();
i++){
122 TLorentzVector*
vec =
new ((*fDPlusArray)[
fDPlusArray->GetEntriesFast()]) TLorentzVector(Dplus[
i].first);
123 std::cout <<
"DPlus " << Dplus[
i].second <<
" " << vec->Px() <<
"/" << vec->Py() <<
"/" << vec->Pz() <<
" " << vec->M() << std::endl;
125 if (Dplus[
i].second == 1){
126 new ((*fDPlusArrayTrue)[
fDPlusArrayTrue->GetEntriesFast()]) TLorentzVector(Dplus[
i].first);
129 std::cout <<
"-I- OnlineDBuilderTask::Exec: Finish " << std::endl << std::endl;
135 std::vector<std::pair<TLorentzVector, int> > result;
137 if (second.size() == 0)
return result;
138 for (
size_t outer = 0; outer < first.size(); outer++){
140 for (
size_t inner1 = 0; inner1 < (second.size() - 1); inner1++){
143 for (
size_t inner2 = inner1 + 1; inner2 < second.size(); inner2++){
145 PndTrack* pi1Track = second[inner1];
146 PndTrack* pi2Track = second[inner2];
148 std::cout <<
"KTrack: " << kTrack->GetLinksWithType(FairRootManager::Instance()->GetBranchId(
"MCTrack")) <<
" " << std::endl;
149 std::cout <<
"pi1Track: " << pi1Track->GetLinksWithType(FairRootManager::Instance()->GetBranchId(
"MCTrack")) <<
" " << std::endl;
150 std::cout <<
"pi2Track: " << pi2Track->GetLinksWithType(FairRootManager::Instance()->GetBranchId(
"MCTrack")) <<
" " << std::endl;
152 FairMultiLinkedData kTrackLinks = kTrack->GetLinksWithType(FairRootManager::Instance()->GetBranchId(
"MCTrack"));
153 FairMultiLinkedData pi1Links = pi1Track->GetLinksWithType(FairRootManager::Instance()->GetBranchId(
"MCTrack"));
154 FairMultiLinkedData pi2Links = pi2Track->GetLinksWithType(FairRootManager::Instance()->GetBranchId(
"MCTrack"));
159 for (
int i = 0;
i < kTrackLinks.GetNLinks();
i++){
160 if (kTrackLinks.GetLink(
i).GetWeight() > countK){
161 countK = kTrackLinks.GetLink(
i).GetWeight();
163 kMcId = kTrackLinks.GetLink(
i).GetIndex();
170 for (
int i = 0;
i < pi1Links.GetNLinks();
i++){
171 if (pi1Links.GetLink(
i).GetWeight() > countPi){
172 countPi = pi1Links.GetLink(
i).GetWeight();
174 pi1McId = pi1Links.GetLink(
i).GetIndex();
181 for (
int i = 0;
i < pi2Links.GetNLinks();
i++){
182 if (pi2Links.GetLink(
i).GetWeight() > countPi){
183 countPi = pi2Links.GetLink(
i).GetWeight();
185 pi2McId = pi2Links.GetLink(
i).GetIndex();
194 TVector3 piMomOrig = pi1Track->
GetParamFirst().GetMomentum();
195 TVector3 pi2MomOrig = pi2Track->
GetParamFirst().GetMomentum();
201 TLorentzVector K, pi1, pi2, D;
203 K.SetXYZM(kMom.X(), kMom.Y(), kMom.Z(), TDatabasePDG::Instance()->GetParticle(321)->Mass());
204 pi1.SetXYZM(piMom.X(), piMom.Y(), piMom.Z(), TDatabasePDG::Instance()->GetParticle(211)->Mass());
205 pi2.SetXYZM(pi2Mom.X(), pi2Mom.Y(), pi2Mom.Z(), TDatabasePDG::Instance()->GetParticle(211)->Mass());
208 std::cout <<
"D: " << D.Px() <<
"/" << D.Py() <<
"/" << D.Pz() <<
" " << D.M() << std::endl;
213 std::cout <<
"D+ Match!" << std::endl;
217 else if (pi1McId == 5){
219 std::cout <<
"D+ Match!" << std::endl;
227 std::cout <<
"D- Match!" << std::endl;
231 else if (pi1McId == 8){
233 std::cout <<
"D- Match!" << std::endl;
239 std::cout <<
"Created D Meson: " << matchIndex << std::endl;
240 result.push_back(std::make_pair(D, matchIndex));
249 TVector2 tMomVector(input.GetMomentum().X(), input.GetMomentum().Y());
250 TVector2 perpMomVector(- tMomVector.Y(), tMomVector.X());
251 TVector2 posVector(input.GetPosition().X(), input.GetPosition().Y());
254 TVector2 circleCenter = posVector - input.GetQ() * perpMomVector * 100/(0.3 * 2);
257 std::cout <<
"MomentumVector: " << tMomVector.X() <<
"/" << tMomVector.Y()
258 <<
" PerMomVector: " << perpMomVector.X() <<
"/" << perpMomVector.Y()
259 <<
" posVector: " << posVector.X() <<
"/" << posVector.Y() <<
" Q: " << input.GetQ() << std::endl;
261 TVector2 tempVec = posVector - circleCenter;
262 TVector2 tempVec2 = -1 * circleCenter;
264 std::cout <<
"CircleCenter: " << circleCenter.X() <<
"/" << circleCenter.Y()
265 <<
" tempVec: " << tempVec.X() <<
"/" << tempVec.Y()
266 <<
" tempVec2: " << tempVec2.X() <<
"/" << tempVec2.Y() << std::endl;
267 Double_t deltaPhi = TVector2::Phi_mpi_pi(tempVec.Phi() - tempVec2.Phi());
268 TVector2 corrMom = tMomVector.Rotate(-deltaPhi);
269 TVector2 corrPos = tempVec.Rotate(-deltaPhi);
270 corrPos += circleCenter;
271 std::cout <<
"Phi: " << deltaPhi <<
" correctedMomentum: " << corrMom.X() <<
"/" << corrMom.Y() << std::endl;
272 std::cout <<
"CorrectedPosition: " << corrPos.X() <<
"/" << corrPos.Y() << std::endl;
273 std::cout <<
"Corrected vs. Original -- x: " << corrMom.X() <<
" vs. " << input.GetMomentum().X() <<
"; y: " << corrMom.Y() <<
" vs. " << input.GetMomentum().Y() << std::endl;
274 return TVector3(corrMom.X(), corrMom.Y(), input.GetMomentum().Z());
virtual void SetParContainers()
TClonesArray * trackArray
TClonesArray * fDPlusArrayTrue
virtual void AddTrackBranch(TString trackBranchName)
TClonesArray * fDMinusArray
virtual InitStatus Init()
TClonesArray * fDPlusArray
virtual void Exec(Option_t *opt)
std::vector< std::pair< TLorentzVector, int > > CombineFirstWithTwoSecond(std::vector< PndTrack * > first, std::vector< PndTrack * > second)
Sets the branch name of the track data which should be analyzed.
OnlineDBuilderTask(TString trackBranchName)
virtual ~OnlineDBuilderTask()
TClonesArray * fDMinusArrayTrue
TVector3 CorrectTrackParForPrimaryVertex(FairTrackParP input)
std::map< TString, TClonesArray * > fTrack
FairTrackParP GetParamFirst()