]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWGPP/TRD/AliTRDinfoGen.cxx
add protection for backward data compatibility
[u/mrichter/AliRoot.git] / PWGPP / TRD / AliTRDinfoGen.cxx
index e4d84020ce8da1555a6e045997746118b86a37f7..11e5e4309d8b9a4627dcf0f94c1c41c3b6b14a05 100644 (file)
@@ -66,6 +66,7 @@
 #include "AliESDtrack.h"\r
 #include "AliESDv0.h"\r
 #include "AliESDtrackCuts.h"\r
+#include "AliESDv0KineCuts.h"\r
 #include "AliMCParticle.h"\r
 #include "AliMultiplicity.h"\r
 #include "AliCentrality.h"\r
@@ -118,12 +119,14 @@ AliTRDinfoGen::AliTRDinfoGen()
   ,fMCev(NULL)\r
   ,fEventCut(NULL)\r
   ,fTrackCut(NULL)\r
+  ,fV0Identifier(NULL)\r
   ,fV0Cut(NULL)\r
   ,fOCDB("local://$ALICE_ROOT/OCDB")\r
   ,fTrackInfo(NULL)\r
   ,fEventInfo(NULL)\r
   ,fV0Info(NULL)\r
   ,fTracksBarrel(NULL)\r
+  ,fTracksITS(NULL)\r
   ,fTracksSA(NULL)\r
   ,fTracksKink(NULL)\r
   ,fV0List(NULL)\r
@@ -145,12 +148,14 @@ AliTRDinfoGen::AliTRDinfoGen(char* name)
   ,fMCev(NULL)\r
   ,fEventCut(NULL)\r
   ,fTrackCut(NULL)\r
+  ,fV0Identifier(NULL)\r
   ,fV0Cut(NULL)\r
   ,fOCDB("local://$ALICE_ROOT/OCDB")\r
   ,fTrackInfo(NULL)\r
   ,fEventInfo(NULL)\r
   ,fV0Info(NULL)\r
   ,fTracksBarrel(NULL)\r
+  ,fTracksITS(NULL)\r
   ,fTracksSA(NULL)\r
   ,fTracksKink(NULL)\r
   ,fV0List(NULL)\r
@@ -164,6 +169,7 @@ AliTRDinfoGen::AliTRDinfoGen(char* name)
   //\r
   SetTitle("MC-REC TRD-track list generator");\r
   DefineOutput(AliTRDpwgppHelper::kTracksBarrel, TObjArray::Class());\r
+  DefineOutput(AliTRDpwgppHelper::kTracksITS,    TObjArray::Class());\r
   DefineOutput(AliTRDpwgppHelper::kTracksSA,     TObjArray::Class());\r
   DefineOutput(AliTRDpwgppHelper::kTracksKink,   TObjArray::Class());\r
   DefineOutput(AliTRDpwgppHelper::kEventInfo,    AliTRDeventInfo::Class());\r
@@ -180,6 +186,7 @@ AliTRDinfoGen::~AliTRDinfoGen()
   if(fgReconstructor) delete fgReconstructor;\r
   if(fDebugStream) delete fDebugStream;\r
   if(fV0Cut) delete fV0Cut;\r
+  if(fV0Identifier) delete fV0Identifier;\r
   if(fTrackCut) delete fTrackCut;\r
   if(fEventCut) delete fEventCut;\r
   if(fTrackInfo) delete fTrackInfo; fTrackInfo = NULL;\r
@@ -189,6 +196,10 @@ AliTRDinfoGen::~AliTRDinfoGen()
     fTracksBarrel->Delete(); delete fTracksBarrel;\r
     fTracksBarrel = NULL;\r
   }\r
+  if(fTracksITS){\r
+    fTracksITS->Delete(); delete fTracksITS;\r
+    fTracksITS = NULL;\r
+  }\r
   if(fTracksSA){\r
     fTracksSA->Delete(); delete fTracksSA;\r
     fTracksSA = NULL;\r
@@ -236,10 +247,11 @@ void AliTRDinfoGen::UserCreateOutputObjects()
   fEventInfo = new AliTRDeventInfo();\r
   fV0Info    = new AliTRDv0Info();\r
   fTracksBarrel = new TObjArray(200); fTracksBarrel->SetOwner(kTRUE);\r
-  fTracksSA = new TObjArray(20); fTracksSA->SetOwner(kTRUE);\r
-  fTracksKink = new TObjArray(20); fTracksKink->SetOwner(kTRUE);\r
-  fV0List = new TObjArray(10); fV0List->SetOwner(kTRUE);\r
-  fClusters = new TObjArray(AliTRDgeometry::kNdet); fClusters->SetOwner(kTRUE);\r
+  fTracksITS    = new TObjArray(20); fTracksITS->SetOwner(kTRUE);\r
+  fTracksSA     = new TObjArray(20); fTracksSA->SetOwner(kTRUE);\r
+  fTracksKink   = new TObjArray(20); fTracksKink->SetOwner(kTRUE);\r
+  fV0List       = new TObjArray(10); fV0List->SetOwner(kTRUE);\r
+  fClusters     = new TObjArray(AliTRDgeometry::kNdet); fClusters->SetOwner(kTRUE);\r
 \r
   // define general monitor\r
   fContainer = new TObjArray(kNclasses); fContainer->SetOwner(kTRUE);\r
@@ -276,6 +288,7 @@ void AliTRDinfoGen::UserCreateOutputObjects()
   fContainer->AddAt(chmb, kChmb);\r
 \r
   PostData(AliTRDpwgppHelper::kTracksBarrel, fTracksBarrel);\r
+  PostData(AliTRDpwgppHelper::kTracksITS, fTracksITS);\r
   PostData(AliTRDpwgppHelper::kTracksSA,     fTracksSA);\r
   PostData(AliTRDpwgppHelper::kTracksKink,   fTracksKink);\r
   PostData(AliTRDpwgppHelper::kEventInfo,    fEventInfo);\r
@@ -293,19 +306,17 @@ Bool_t AliTRDinfoGen::Load(const Char_t *file, const Char_t *dir, const Char_t *
     AliWarning(Form("Couldn't open file %s.", file));\r
     return kFALSE;\r
   }\r
-  if(dir){\r
-    if(!gFile->cd(dir)){\r
-      AliWarning(Form("Couldn't cd to %s in %s.", dir, file));\r
-      return kFALSE;\r
-    }\r
+  if(!gFile->cd(dir)){\r
+    AliWarning(Form("Couldn't cd to %s in %s.", dir, file));\r
+    gFile->Close();\r
+    return kFALSE;\r
   }\r
-  TObjArray *o(NULL);\r
   const Char_t *tn=(name ? name : GetName());\r
-  if(!(o = (TObjArray*)gDirectory->Get(tn))){\r
+  if(!(fContainer = (TObjArray*)gDirectory->Get(tn))){\r
     AliWarning(Form("Missing histogram container %s.", tn));\r
+    gFile->Close();\r
     return kFALSE;\r
   }\r
-  fContainer = (TObjArray*)o->Clone(GetName());\r
   gFile->Close();\r
   return kTRUE;\r
 }\r
@@ -317,6 +328,7 @@ void AliTRDinfoGen::UserExec(Option_t *){
   //\r
 \r
   fTracksBarrel->Delete();\r
+  fTracksITS->Delete();\r
   fTracksSA->Delete();\r
   fTracksKink->Delete();\r
   fV0List->Delete();\r
@@ -365,7 +377,6 @@ void AliTRDinfoGen::UserExec(Option_t *){
     fgGeo = new AliTRDgeometry;\r
     fgGeo->CreateClusterMatrixArray();\r
     MakeChambers();\r
-    printf("After MakeChambers()\n");\r
     // load reco param list from OCDB\r
     AliInfo("Initializing TRD reco params ...");\r
     fgReconstructor = new AliTRDReconstructor();\r
@@ -450,6 +461,10 @@ void AliTRDinfoGen::UserExec(Option_t *){
   }\r
   UShort_t evBC(fESDev->GetBunchCrossNumber());\r
 \r
+  // electron identifier from conversions\r
+  if(!fV0Identifier) fV0Identifier = new AliESDv0KineCuts();\r
+  fV0Identifier->SetEvent(fESDev);\r
+\r
   Bool_t *trackMap(NULL);\r
   AliStack * mStack(NULL);\r
   Int_t nTracksMC = HasMCdata() ? fMCev->GetNumberOfTracks() : 0, nTracksESD = fESDev->GetNumberOfTracks();\r
@@ -465,9 +480,9 @@ void AliTRDinfoGen::UserExec(Option_t *){
   \r
   Double32_t dedx[100]; Int_t nSlices(0);\r
   Int_t nTRDout(0), nTRDin(0), nTPC(0), nITS(0)\r
-       ,nclsTrklt\r
-       ,nBarrel(0), nSA(0), nKink(0)\r
-       ,nBarrelFriend(0), nSAFriend(0)\r
+//        ,nclsTrklt\r
+       ,nBarrel(0), nBarrelITS(0), nSA(0), nKink(0)\r
+       ,nBarrelFriend(0), nBarrelITSFriend(0), nSAFriend(0)\r
        ,nBarrelMC(0), nSAMC(0), nKinkMC(0);\r
   AliESDtrack *esdTrack = NULL;\r
   AliESDfriendTrack *esdFriendTrack = NULL;\r
@@ -482,13 +497,26 @@ void AliTRDinfoGen::UserExec(Option_t *){
   AliESDv0 *v0(NULL);\r
   Int_t v0pid[AliPID::kSPECIES];\r
   for(Int_t iv0(0); iv0<fESDev->GetNumberOfV0s(); iv0++){\r
+    // Take only V0s from the On-the-fly v0 finder\r
     if(!(v0 = fESDev->GetV0(iv0))) continue;\r
+    if(!v0->GetOnFlyStatus()) continue;\r
     // register v0\r
     if(fV0Cut) new(fV0Info) AliTRDv0Info(*fV0Cut);\r
     else new(fV0Info) AliTRDv0Info();\r
     fV0Info->SetMagField(bField);\r
     fV0Info->SetV0tracks(fESDev->GetTrack(v0->GetPindex()), fESDev->GetTrack(v0->GetNindex()));\r
     fV0Info->SetV0Info(v0);\r
+    // tag conversion electrons\r
+    Int_t pdgV0, pdgP, pdgN;\r
+    if(fV0Identifier->ProcessV0(v0, pdgV0, pdgP, pdgN)) {\r
+      switch(pdgV0){\r
+      case kGamma: fV0Info->SetDecay(AliTRDv0Info::kGamma); break;\r
+      case kK0Short: fV0Info->SetDecay(AliTRDv0Info::kK0s); break;\r
+      case kLambda0: fV0Info->SetDecay(AliTRDv0Info::kLambda); break;\r
+      case kLambda0Bar: fV0Info->SetDecay(AliTRDv0Info::kAntiLambda); break;\r
+      default: AliDebug(1, Form("V0[%+4d] -> +[%+4d] -[%+4d]. Decay not mapped.", pdgV0, pdgP, pdgN));\r
+      }\r
+    }\r
     fV0List->Add(new AliTRDv0Info(*fV0Info));//  kFOUND=kFALSE;\r
   }\r
 \r
@@ -503,12 +531,22 @@ void AliTRDinfoGen::UserExec(Option_t *){
     if(esdTrack->GetStatus()&AliESDtrack::kTPCout) nTPC++;\r
     if(esdTrack->GetStatus()&AliESDtrack::kTRDout) nTRDout++;\r
     if(esdTrack->GetStatus()&AliESDtrack::kTRDin) nTRDin++;\r
-//     printf("  %3d ITS[%c] TPC[%c] TRDin[%c] TRDout[%c] TRDStop[%c]\n", itrk,\r
-//       (esdTrack->GetStatus()&AliESDtrack::kITSout)?'y':'n',\r
-//       (esdTrack->GetStatus()&AliESDtrack::kTPCout)?'y':'n',\r
-//       (esdTrack->GetStatus()&AliESDtrack::kTRDin)?'y':'n',\r
-//       (esdTrack->GetStatus()&AliESDtrack::kTRDout)?'y':'n',\r
-//       (esdTrack->GetStatus()&AliESDtrack::kTRDStop)?'y':'n');\r
+\r
+/*    Int_t ns(esdTrack->GetNumberOfTRDslices());\r
+    printf("  %3d ITS[%c] TPC[%c] TRDin[%c] TRDout[%c] TRDStop[%c] ns[%d]\n", itrk,\r
+      (esdTrack->GetStatus()&AliESDtrack::kITSout)?'y':'n',\r
+      (esdTrack->GetStatus()&AliESDtrack::kTPCout)?'y':'n',\r
+      (esdTrack->GetStatus()&AliESDtrack::kTRDin)?'y':'n',\r
+      (esdTrack->GetStatus()&AliESDtrack::kTRDout)?'y':'n',\r
+      (esdTrack->GetStatus()&AliESDtrack::kTRDStop)?'y':'n', ns);\r
+    if(ns){\r
+      for(Int_t ipl(0); ipl<AliTRDgeometry::kNlayer; ipl++){\r
+        Double_t sp, p(esdTrack->GetTRDmomentum(ipl, &sp));\r
+        printf("    [%d] p[%6.3f+-%6.3f] dEdx={", ipl, p, sp);\r
+        for(Int_t is(0); is<8; is++) printf("%7.2f ", esdTrack->GetTRDslice(ipl, is)); printf("}\n");\r
+      }\r
+    }\r
+*/\r
     // look at external track param\r
     const AliExternalTrackParam *op = esdTrack->GetOuterParam();\r
     Double_t xyz[3];\r
@@ -519,9 +557,7 @@ void AliTRDinfoGen::UserExec(Option_t *){
     }\r
 \r
     // read MC info\r
-    Int_t fPdg = -1;\r
     Int_t label = -1; UInt_t alab=UINT_MAX;\r
-    Int_t nRefs = 0;\r
     if(HasMCdata()){\r
       label = esdTrack->GetLabel(); \r
       alab = TMath::Abs(label);\r
@@ -532,34 +568,27 @@ void AliTRDinfoGen::UserExec(Option_t *){
         AliError(Form("MC label[%d] outside scope for Ev[%d] Trk[%d].", label, (Int_t)AliAnalysisManager::GetAnalysisManager()->GetCurrentEntry(), itrk));\r
         continue; \r
       }\r
-      AliMCParticle *mcParticle = NULL; \r
+      AliMCParticle *mcParticle(NULL);\r
       if(!(mcParticle = (AliMCParticle*) fMCev->GetTrack(alab))){\r
         AliError(Form("MC particle label[%d] missing for Ev[%d] Trk[%d].", label, (Int_t)AliAnalysisManager::GetAnalysisManager()->GetCurrentEntry(), itrk));\r
         continue;\r
       }\r
-      fPdg = mcParticle->Particle()->GetPdgCode();\r
-      nRefs = mcParticle->GetNumberOfTrackReferences();\r
-      Int_t iref = 0; AliTrackReference *ref = NULL; \r
-      while(iref<nRefs){\r
-        ref = mcParticle->GetTrackReference(iref);\r
-        if(ref->LocalX() > fgkTPC) break;\r
-        iref++;\r
-      }\r
-\r
       fTrackInfo->SetMC();\r
-      fTrackInfo->SetPDG(fPdg);\r
+      fTrackInfo->SetMCeta(mcParticle->Eta());\r
+      fTrackInfo->SetMCphi(mcParticle->Phi());\r
+      fTrackInfo->SetMCpt(mcParticle->Pt());\r
+      fTrackInfo->SetPDG(mcParticle->Particle()->GetPdgCode());\r
       fTrackInfo->SetPrimary(mcParticle->Particle()->IsPrimary());\r
       fTrackInfo->SetLabel(label);\r
       fTrackInfo->SetTRDlabel(esdTrack->GetTRDLabel());\r
-      Int_t jref = iref;//, kref = 0;\r
-      while(jref<nRefs){\r
-        ref = mcParticle->GetTrackReference(jref);\r
-        if(ref->LocalX() > fgkTRD) break;\r
-        AliDebug(4, Form("  trackRef[%2d (%2d)] @ %7.3f OK", jref-iref, jref, ref->LocalX()));\r
+      AliTrackReference *ref(NULL);\r
+      for(Int_t iref(0); iref<mcParticle->GetNumberOfTrackReferences(); iref++){\r
+        if(!(ref = mcParticle->GetTrackReference(iref))) continue;\r
+        if(ref->DetectorId() != AliTrackReference::kTRD) continue;\r
+        AliDebug(4, Form("  TRD trackRef[%2d] @ r[%7.3f] [REC]", iref, ref->LocalX()));\r
         fTrackInfo->AddTrackRef(ref);\r
-        jref++;\r
       }\r
-      AliDebug(3, Form("NtrackRefs[%d(%d)]", fTrackInfo->GetNTrackRefs(), nRefs));\r
+      AliDebug(3, Form("Lab[%4d] pdg[%+4d] NtrackRefs[%d(%d)]", alab, mcParticle->Particle()->GetPdgCode(), fTrackInfo->GetNTrackRefs(), mcParticle->GetNumberOfTrackReferences()));\r
     }\r
 \r
     // copy some relevant info to TRD track info\r
@@ -588,20 +617,24 @@ void AliTRDinfoGen::UserExec(Option_t *){
     Float_t tofTime = esdTrack->GetTOFsignal() - fESDev->GetT0TOF(0);\r
     fTrackInfo->SetTOFbeta(tofTime>0.?((esdTrack->GetIntegratedLength()/(tofTime*TMath::C()))*10e9):-999.);\r
     fTrackInfo->SetTOFbc(esdTrack->GetTOFBunchCrossing()==AliVTrack::kTOFBCNA?0:esdTrack->GetTOFBunchCrossing());\r
-    nclsTrklt = 0;\r
+//    nclsTrklt = 0;\r
   \r
     // set V0pid info\r
+    //printf("%4d Looking for V0s...\n" , fTrackInfo->GetTrackId());\r
     for(Int_t iv(0); iv<fV0List->GetEntriesFast(); iv++){\r
       if(!(v0info = (AliTRDv0Info*)fV0List->At(iv))) continue;\r
       if(!v0info->GetV0Daughter(1) && !v0info->GetV0Daughter(-1)) continue;\r
       if(!v0info->HasTrack(fTrackInfo)) continue;\r
+      //v0info->Print();\r
       memset(v0pid, 0, AliPID::kSPECIES*sizeof(Int_t));\r
       fTrackInfo->SetV0();\r
-      for(Int_t is=AliPID::kSPECIES; is--;){v0pid[is] = v0info->GetPID(is, fTrackInfo);}\r
-      fTrackInfo->SetV0pid(v0pid);\r
-      fTrackInfo->SetV0();\r
-      //const AliTRDtrackInfo::AliESDinfo *ei = fTrackInfo->GetESDinfo();\r
-      break;\r
+      for(Int_t is=AliPID::kSPECIES; is--;) v0pid[is] = v0info->GetPID(is, fTrackInfo); fTrackInfo->SetV0pid(v0pid);\r
+      if(v0info->IsDecay(AliTRDv0Info::kGamma)) fTrackInfo->SetElectron();\r
+      else if(v0info->IsDecay(AliTRDv0Info::kK0s)) fTrackInfo->SetPion();\r
+      else if(v0info->IsDecay(AliTRDv0Info::kLambda)) esdTrack->Charge()>0?fTrackInfo->SetProton():fTrackInfo->SetPion();\r
+      else if(v0info->IsDecay(AliTRDv0Info::kAntiLambda)) esdTrack->Charge()<0?fTrackInfo->SetProton():fTrackInfo->SetPion();\r
+      \r
+      //TODO one track can be attached to more than one v0. Ideally one would need a list of v0 attached to the track info\r
     }\r
 \r
     // read track REC info\r
@@ -643,30 +676,30 @@ void AliTRDinfoGen::UserExec(Option_t *){
         Bool_t selected(kTRUE);\r
         if(UseLocalTrkSelection()){\r
           if(esdTrack->Pt() < fgkPt){ \r
-            AliDebug(3, Form("Reject Trk[%3d] Ev[%4d] Pt[%5.2f]", itrk, fESDev->GetEventNumberInFile(), esdTrack->Pt()));\r
+            AliDebug(3, Form("Reject TPC Trk[%3d] Ev[%4d] Pt[%5.2f]", itrk, fESDev->GetEventNumberInFile(), esdTrack->Pt()));\r
             selected = kFALSE;\r
           }\r
           if(selected && TMath::Abs(esdTrack->Eta()) > fgkEta){\r
-            AliDebug(3, Form("Reject Trk[%3d] Ev[%4d] Eta[%5.2f]", itrk, fESDev->GetEventNumberInFile(), TMath::Abs(esdTrack->Eta())));\r
+            AliDebug(3, Form("Reject TPC Trk[%3d] Ev[%4d] Eta[%5.2f]", itrk, fESDev->GetEventNumberInFile(), TMath::Abs(esdTrack->Eta())));\r
             selected = kFALSE;\r
           }\r
           if(selected && esdTrack->GetTPCNcls() < fgkNclTPC){ \r
-            AliDebug(3, Form("Reject Trk[%3d] Ev[%4d] NclTPC[%d]", itrk, fESDev->GetEventNumberInFile(), esdTrack->GetTPCNcls()));\r
+            AliDebug(3, Form("Reject TPC Trk[%3d] Ev[%4d] NclTPC[%d]", itrk, fESDev->GetEventNumberInFile(), esdTrack->GetTPCNcls()));\r
             selected = kFALSE;\r
           }\r
           Float_t par[2], cov[3];\r
           esdTrack->GetImpactParameters(par, cov);\r
           if(IsCollision()){ // cuts on DCA\r
             if(selected && TMath::Abs(par[0]) > fgkTrkDCAxy){ \r
-              AliDebug(3, Form("Reject Trk[%3d] Ev[%4d] DCAxy[%f]", itrk, fESDev->GetEventNumberInFile(), TMath::Abs(par[0])));\r
+              AliDebug(3, Form("Reject TPC Trk[%3d] Ev[%4d] DCAxy[%f]", itrk, fESDev->GetEventNumberInFile(), TMath::Abs(par[0])));\r
               selected = kFALSE;\r
             }\r
             if(selected && TMath::Abs(par[1]) > fgkTrkDCAz){ \r
-              AliDebug(3, Form("Reject Trk[%3d] Ev[%4d] DCAz[%f]", itrk, fESDev->GetEventNumberInFile(), TMath::Abs(par[1])));\r
+              AliDebug(3, Form("Reject TPC Trk[%3d] Ev[%4d] DCAz[%f]", itrk, fESDev->GetEventNumberInFile(), TMath::Abs(par[1])));\r
               selected = kFALSE;\r
             }\r
           } else if(selected && fMCev && !fMCev->IsPhysicalPrimary(alab)){;\r
-            AliDebug(3, Form("Reject Trk[%3d] Ev[%4d] Primary", itrk, fESDev->GetEventNumberInFile()));\r
+            AliDebug(3, Form("Reject TPC Trk[%3d] Ev[%4d] Primary", itrk, fESDev->GetEventNumberInFile()));\r
             selected = kFALSE;\r
           }\r
         }\r
@@ -674,8 +707,7 @@ void AliTRDinfoGen::UserExec(Option_t *){
         if(selected){ \r
           fTracksBarrel->Add(new AliTRDtrackInfo(*fTrackInfo));\r
           nBarrel++;\r
-          if(fTrackInfo->GetTrack()) \r
-            nBarrelFriend++;\r
+          if(fTrackInfo->GetTrack()) nBarrelFriend++;\r
         }\r
       } else {\r
         fTracksKink->Add(new AliTRDtrackInfo(*fTrackInfo));\r
@@ -685,41 +717,39 @@ void AliTRDinfoGen::UserExec(Option_t *){
       Bool_t selected(kTRUE);\r
       if(UseLocalTrkSelection()){\r
         if(esdTrack->Pt() < fgkPt){\r
-          AliDebug(3, Form("Reject Trk[%3d] Ev[%4d] Pt[%5.2f]", itrk, fESDev->GetEventNumberInFile(), esdTrack->Pt()));\r
+          AliDebug(3, Form("Reject ITS Trk[%3d] Ev[%4d] Pt[%5.2f]", itrk, fESDev->GetEventNumberInFile(), esdTrack->Pt()));\r
           selected = kFALSE;\r
         }\r
         if(selected && TMath::Abs(esdTrack->Eta()) > fgkEta){\r
-          AliDebug(3, Form("Reject Trk[%3d] Ev[%4d] Eta[%5.2f]", itrk, fESDev->GetEventNumberInFile(), TMath::Abs(esdTrack->Eta())));\r
+          AliDebug(3, Form("Reject ITS Trk[%3d] Ev[%4d] Eta[%5.2f]", itrk, fESDev->GetEventNumberInFile(), TMath::Abs(esdTrack->Eta())));\r
           selected = kFALSE;\r
         }\r
         Float_t par[2], cov[3];\r
         esdTrack->GetImpactParameters(par, cov);\r
         if(IsCollision()){ // cuts on DCA\r
           if(selected && TMath::Abs(par[0]) > fgkTrkDCAxy){\r
-            AliDebug(3, Form("Reject Trk[%3d] Ev[%4d] DCAxy[%f]", itrk, fESDev->GetEventNumberInFile(), TMath::Abs(par[0])));\r
+            AliDebug(3, Form("Reject ITS Trk[%3d] Ev[%4d] DCAxy[%f]", itrk, fESDev->GetEventNumberInFile(), TMath::Abs(par[0])));\r
             selected = kFALSE;\r
           }\r
           if(selected && TMath::Abs(par[1]) > fgkTrkDCAz){\r
-            AliDebug(3, Form("Reject Trk[%3d] Ev[%4d] DCAz[%f]", itrk, fESDev->GetEventNumberInFile(), TMath::Abs(par[1])));\r
+            AliDebug(3, Form("Reject ITS Trk[%3d] Ev[%4d] DCAz[%f]", itrk, fESDev->GetEventNumberInFile(), TMath::Abs(par[1])));\r
             selected = kFALSE;\r
           }\r
         } else if(selected && fMCev && !fMCev->IsPhysicalPrimary(alab)){;\r
-          AliDebug(3, Form("Reject Trk[%3d] Ev[%4d] Primary", itrk, fESDev->GetEventNumberInFile()));\r
+          AliDebug(3, Form("Reject ITS Trk[%3d] Ev[%4d] Primary", itrk, fESDev->GetEventNumberInFile()));\r
           selected = kFALSE;\r
         }\r
       }\r
       if(fTrackCut && !fTrackCut->IsSelected(esdTrack)) selected = kFALSE;\r
       if(selected){\r
-        fTracksBarrel->Add(new AliTRDtrackInfo(*fTrackInfo));\r
-        nBarrel++;\r
-        if(fTrackInfo->GetTrack())\r
-          nBarrelFriend++;\r
+        fTracksITS->Add(new AliTRDtrackInfo(*fTrackInfo));\r
+        nBarrelITS++;\r
+        if(fTrackInfo->GetTrack()) nBarrelITSFriend++;\r
       }\r
     } else if((status&AliESDtrack::kTRDout) && !(status&AliESDtrack::kTRDin)){ // TRD SA tracking\r
       fTracksSA->Add(new AliTRDtrackInfo(*fTrackInfo));\r
       nSA++;\r
-      if(fTrackInfo->GetTrack()) \r
-        nSAFriend++;\r
+      if(fTrackInfo->GetTrack()) nSAFriend++;\r
     }\r
     fTrackInfo->Delete("");\r
   }\r
@@ -754,32 +784,27 @@ void AliTRDinfoGen::UserExec(Option_t *){
     AliDebug(10, "Output of the MC track map:");\r
     for(Int_t itk = 0; itk < nTracksMC;  itk++) AliDebug(10, Form("trackMap[%d] = %s", itk, trackMap[itk] == kTRUE ? "TRUE" : "kFALSE"));\r
   \r
+    AliTrackReference *ref(NULL);\r
     for(Int_t itk = 0; itk < nTracksMC; itk++){\r
       if(trackMap[itk]) continue;\r
       AliMCParticle *mcParticle =  (AliMCParticle*) fMCev->GetTrack(TMath::Abs(itk));\r
-      Int_t fPdg = mcParticle->Particle()->GetPdgCode();\r
-      Int_t nRefs = mcParticle->GetNumberOfTrackReferences();\r
-      Int_t iref = 0; AliTrackReference *ref = NULL; \r
-      Int_t nRefsTRD = 0;\r
-      new(fTrackInfo) AliTRDtrackInfo();\r
-      fTrackInfo->SetMC();\r
-      fTrackInfo->SetPDG(fPdg);\r
-      while(iref<nRefs){ // count TRD TR\r
-        Bool_t kIN(kFALSE);\r
-        ref = mcParticle->GetTrackReference(iref);\r
-        if(ref->LocalX() > fgkTPC && ref->LocalX() < fgkTRD){\r
-          fTrackInfo->AddTrackRef(ref);\r
-          nRefsTRD++;kIN=kTRUE;\r
+\r
+      Int_t nRefsTRD(0);\r
+      for(Int_t iref(0); iref<mcParticle->GetNumberOfTrackReferences(); iref++){ // count TRD TR\r
+        if(!(ref = mcParticle->GetTrackReference(iref))) continue;\r
+        if(ref->DetectorId() != AliTrackReference::kTRD) continue;\r
+        if(!nRefsTRD){ // build track info for this pure MC track\r
+          new(fTrackInfo) AliTRDtrackInfo();\r
+          fTrackInfo->SetMC();\r
+          fTrackInfo->SetPDG(mcParticle->Particle()->GetPdgCode());\r
         }\r
-        AliDebug(4, Form("  trackRef[%2d] @ x[%7.3f] %s", iref, ref->LocalX(), kIN?"IN":"OUT"));\r
-        iref++;\r
-      }\r
-      if(!nRefsTRD){\r
-        // In this stage we at least require 1 hit inside TRD. What will be done with this tracks is a task for the \r
-        // analysis job\r
-        fTrackInfo->Delete("");\r
-        continue;\r
+        AliDebug(4, Form("  TRD trackRef[%2d] @ r[%7.3f] [MC]", iref, ref->LocalX()));\r
+        fTrackInfo->AddTrackRef(ref);\r
       }\r
+      // In this stage we at least require 1 hit inside TRD. What will be done with this tracks is a task for the\r
+      // analysis job\r
+      if(!nRefsTRD) continue;\r
+      AliDebug(3, Form("Lab[%4d] pdg[%+4d] NtrackRefs[%d(%d)]", itk, mcParticle->Particle()->GetPdgCode(), fTrackInfo->GetNTrackRefs(), mcParticle->GetNumberOfTrackReferences()));\r
       fTrackInfo->SetPrimary(mcParticle->Particle()->IsPrimary());\r
       fTrackInfo->SetLabel(itk);\r
       if(DebugLevel() >= 1){\r
@@ -794,6 +819,7 @@ void AliTRDinfoGen::UserExec(Option_t *){
       ref = mcParticle->GetTrackReference(0);\r
       if(ref->LocalX() < fgkITS){ \r
         fTracksBarrel->Add(new AliTRDtrackInfo(*fTrackInfo));\r
+        //fTracksITS->Add(new AliTRDtrackInfo(*fTrackInfo));\r
         nBarrelMC++;\r
       } else if(ref->LocalX() < fgkTPC) {\r
         fTracksKink->Add(new AliTRDtrackInfo(*fTrackInfo));\r
@@ -809,10 +835,11 @@ void AliTRDinfoGen::UserExec(Option_t *){
   AliDebug(1, Form(\r
     "\nEv[%3d] Tracks: ESD[%d] MC[%d] V0[%d]\n"\r
     "        TPCout[%d] ITSout[%d] TRDin[%d] TRDout[%d]\n"\r
-    "        Barrel[%3d+%3d=%3d] SA[%2d+%2d=%2d] Kink[%2d+%2d=%2d]"\r
+    "        Barrel[%3d+%3d=%3d] ITS[%3d=%3d] SA[%2d+%2d=%2d] Kink[%2d+%2d=%2d]"\r
     ,(Int_t)AliAnalysisManager::GetAnalysisManager()->GetCurrentEntry(), nTracksESD, nTracksMC, fV0List->GetEntries()\r
     , nTPC, nITS, nTRDin, nTRDout\r
     ,nBarrel, nBarrelMC, fTracksBarrel->GetEntries()\r
+    ,nBarrelITS, fTracksITS->GetEntries()\r
     ,nSA, nSAMC, fTracksSA->GetEntries()\r
     ,nKink, nKinkMC, fTracksKink->GetEntries()\r
   ));\r
@@ -944,13 +971,12 @@ void AliTRDinfoGen::MakeSummary()
   p=cOut->cd(4); p->SetRightMargin(0.0215);p->SetLeftMargin(0.414);//p->SetLogz();\r
   TObject *o = fContainer->At(kTrigger);\r
   if(o){\r
-    if(!strcmp("TH1I", o->IsA()->GetName())){\r
-      h1 = dynamic_cast<TH1I*>(o);\r
+    if((h1 = dynamic_cast<TH1I*>(o))) {\r
       h1->GetXaxis()->SetTitleOffset(6.5); h1->GetXaxis()->CenterTitle();\r
       h1->SetFillStyle(3001);h1->SetFillColor(kGreen);\r
       h1->SetBarWidth(0.8);h1->SetBarOffset(0.1);\r
       ((TH1I*)o)->Draw("hbar2");\r
-    } else ((AliTRDtriggerInfo*)o)->Draw();\r
+    } else o->Draw();\r
   }\r
   cOut->SaveAs(Form("%s.gif", cOut->GetName()));\r
 }\r