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()