ROOT logo
/**************************************************************************
 * Copyright(c) 1998-2007, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

/* $Id$ */

//-------------------------------------------------------------------------
//     Realisation of AliVParticle for MC Particles
//     Implementation wraps a TParticle and delegates the methods
//     Author: Andreas Morsch, CERN
//-------------------------------------------------------------------------

#include <TObjArray.h>

#include "AliMCParticle.h"
#include "AliExternalTrackParam.h" 


ClassImp(AliMCParticle)

AliMCParticle::AliMCParticle():
    AliVParticle(),
    fParticle(0),
    fTrackReferences(0),
    fNTrackRef(0),
    fLabel(-1),
    fMother(-1),
    fFirstDaughter(-1),
    fLastDaughter(-1),
    fGeneratorIndex(-1)
{
    // Constructor
}

    
AliMCParticle::AliMCParticle(TParticle* part, TObjArray* rarray, Int_t index):
    AliVParticle(),
    fParticle(part),
    fTrackReferences(rarray),
    fNTrackRef(0),
    fLabel(index),
    fMother(-1),
    fFirstDaughter(-1),
    fLastDaughter(-1),
    fGeneratorIndex(-1)
{
    // Constructor
    if (rarray != 0) {
      fNTrackRef = fTrackReferences->GetEntriesFast();
    }
}
    
    
AliMCParticle::AliMCParticle(const AliMCParticle& mcPart) :
    AliVParticle(mcPart),
    fParticle(0),    
    fTrackReferences(0),
    fNTrackRef(0),
    fLabel(-1),
    fMother(-1),
    fFirstDaughter(-1),
    fLastDaughter(-1),
    fGeneratorIndex(-1)
{
// Copy constructor
}

AliMCParticle& AliMCParticle::operator=(const AliMCParticle& mcPart)
{ 
// Copy constructor
  if (this!=&mcPart) { 
    AliVParticle::operator=(mcPart);
  }
  
  return *this; 
}

AliMCParticle::~AliMCParticle()
{ 
  // delete the track references passed externally
  // fParticle should be handled by the user
  // AliStack in case of AliMCEventHandler
  if(fTrackReferences){
    fTrackReferences->Clear();
      delete fTrackReferences;
      fTrackReferences = 0;
  }
}



Float_t  AliMCParticle::GetTPCTrackLength(Float_t bz,  Float_t ptmin, Int_t &counter, Float_t deadWidth, Float_t zMax){
  //
  // return track length in geometrically active volume of TPC.
  // z nad rphi acceptance is included
  // doesn't take into account dead channel and ExB  
  // 25/04/2013 --> zMax as a parameter with default value 230 cm to take into account L1 shift introduced in AliTPC.cxx
  // Intput:
  // trackRefs
  // bz - magnetic field
  // deadWidth - dead zone in r-phi
  // Additional output:
  // counter   - number of circles

    if (fNTrackRef == 0) return 0.; 

    const Float_t kRMin = 90;
    const Float_t kRMax = 245;
//    const Float_t kZMax = 250;
    const Float_t kMinPt= ptmin; 

    Float_t length =0;
    Int_t nrefs = fNTrackRef;

    
    AliExternalTrackParam param;
    Double_t cv[21];
    for (Int_t i = 0; i < 21; i++) cv[i]=0;
    counter=0; 
    //
    //
    
    AliTrackReference *ref0 = (AliTrackReference*) (fTrackReferences->At(0));
    Float_t direction = 0;
  //
    for (Int_t iref = 1; iref < nrefs; iref++){
	AliTrackReference *ref = (AliTrackReference*) (fTrackReferences->At(iref));
	if (!ref) continue;
	if (!ref0 || ref0->DetectorId()!= AliTrackReference::kTPC){
	    ref0 = ref;
	    direction = ((ref0->X() * ref0->Px() + ref0->Y() * ref0->Py()) > 0)? 1. : -1.;
	    continue;
	}
	
	Float_t newdirection = ((ref->X() * ref->Px() + ref->Y() * ref->Py()) > 0)? 1. : -1.;
	if (newdirection*direction<0) {
	    counter++;  //circle counter 
	    direction = newdirection;
	    continue;
	}
	if (counter>0) continue;
	if (ref0->Pt() < kMinPt) break;
	Float_t radius0 = TMath::Max(TMath::Min(ref0->R(),kRMax),kRMin);;
	Float_t radius1 = TMath::Max(TMath::Min(ref->R(),kRMax),kRMin);
	Double_t xyz[3] = {ref0->X(), ref0->Y(), ref0->Z()};
	Double_t pxyz[3]= {ref0->Px(), ref0->Py(), ref0->Pz()};
	Double_t alpha;
	param.Set(xyz,pxyz,cv,TMath::Nint(fParticle->GetPDG()->Charge()/3.));
	
	for (Float_t radius = radius0; radius < radius1; radius+=1){
	    param.GetXYZAt(radius, bz, xyz);
//	    if (TMath::Abs(xyz[2]) > kZMax) continue;
            if (TMath::Abs(xyz[2]) > zMax) continue;
	    Float_t gradius = TMath::Sqrt(xyz[1] * xyz[1] + xyz[0] * xyz[0]);
	    if (gradius > kRMax) continue;
	    alpha = TMath::ATan2(xyz[1],xyz[0]);
	    if (alpha<0) alpha += TMath::TwoPi();
	    //
	    Int_t sector   = Int_t(9 * alpha / TMath::Pi());
	    Float_t lalpha = alpha - ((sector + 0.5) * TMath::Pi() / 9.);
	    Float_t dedge  = (TMath::Tan(TMath::Pi() / 18.) - TMath::Abs(TMath::Tan(lalpha))) * gradius; 
	    if (dedge>deadWidth) length++;
	}
	if (ref->DetectorId()!= AliTrackReference::kTPC) break; 
	ref0 = ref;
    }
    return length;
}
 AliMCParticle.cxx:1
 AliMCParticle.cxx:2
 AliMCParticle.cxx:3
 AliMCParticle.cxx:4
 AliMCParticle.cxx:5
 AliMCParticle.cxx:6
 AliMCParticle.cxx:7
 AliMCParticle.cxx:8
 AliMCParticle.cxx:9
 AliMCParticle.cxx:10
 AliMCParticle.cxx:11
 AliMCParticle.cxx:12
 AliMCParticle.cxx:13
 AliMCParticle.cxx:14
 AliMCParticle.cxx:15
 AliMCParticle.cxx:16
 AliMCParticle.cxx:17
 AliMCParticle.cxx:18
 AliMCParticle.cxx:19
 AliMCParticle.cxx:20
 AliMCParticle.cxx:21
 AliMCParticle.cxx:22
 AliMCParticle.cxx:23
 AliMCParticle.cxx:24
 AliMCParticle.cxx:25
 AliMCParticle.cxx:26
 AliMCParticle.cxx:27
 AliMCParticle.cxx:28
 AliMCParticle.cxx:29
 AliMCParticle.cxx:30
 AliMCParticle.cxx:31
 AliMCParticle.cxx:32
 AliMCParticle.cxx:33
 AliMCParticle.cxx:34
 AliMCParticle.cxx:35
 AliMCParticle.cxx:36
 AliMCParticle.cxx:37
 AliMCParticle.cxx:38
 AliMCParticle.cxx:39
 AliMCParticle.cxx:40
 AliMCParticle.cxx:41
 AliMCParticle.cxx:42
 AliMCParticle.cxx:43
 AliMCParticle.cxx:44
 AliMCParticle.cxx:45
 AliMCParticle.cxx:46
 AliMCParticle.cxx:47
 AliMCParticle.cxx:48
 AliMCParticle.cxx:49
 AliMCParticle.cxx:50
 AliMCParticle.cxx:51
 AliMCParticle.cxx:52
 AliMCParticle.cxx:53
 AliMCParticle.cxx:54
 AliMCParticle.cxx:55
 AliMCParticle.cxx:56
 AliMCParticle.cxx:57
 AliMCParticle.cxx:58
 AliMCParticle.cxx:59
 AliMCParticle.cxx:60
 AliMCParticle.cxx:61
 AliMCParticle.cxx:62
 AliMCParticle.cxx:63
 AliMCParticle.cxx:64
 AliMCParticle.cxx:65
 AliMCParticle.cxx:66
 AliMCParticle.cxx:67
 AliMCParticle.cxx:68
 AliMCParticle.cxx:69
 AliMCParticle.cxx:70
 AliMCParticle.cxx:71
 AliMCParticle.cxx:72
 AliMCParticle.cxx:73
 AliMCParticle.cxx:74
 AliMCParticle.cxx:75
 AliMCParticle.cxx:76
 AliMCParticle.cxx:77
 AliMCParticle.cxx:78
 AliMCParticle.cxx:79
 AliMCParticle.cxx:80
 AliMCParticle.cxx:81
 AliMCParticle.cxx:82
 AliMCParticle.cxx:83
 AliMCParticle.cxx:84
 AliMCParticle.cxx:85
 AliMCParticle.cxx:86
 AliMCParticle.cxx:87
 AliMCParticle.cxx:88
 AliMCParticle.cxx:89
 AliMCParticle.cxx:90
 AliMCParticle.cxx:91
 AliMCParticle.cxx:92
 AliMCParticle.cxx:93
 AliMCParticle.cxx:94
 AliMCParticle.cxx:95
 AliMCParticle.cxx:96
 AliMCParticle.cxx:97
 AliMCParticle.cxx:98
 AliMCParticle.cxx:99
 AliMCParticle.cxx:100
 AliMCParticle.cxx:101
 AliMCParticle.cxx:102
 AliMCParticle.cxx:103
 AliMCParticle.cxx:104
 AliMCParticle.cxx:105
 AliMCParticle.cxx:106
 AliMCParticle.cxx:107
 AliMCParticle.cxx:108
 AliMCParticle.cxx:109
 AliMCParticle.cxx:110
 AliMCParticle.cxx:111
 AliMCParticle.cxx:112
 AliMCParticle.cxx:113
 AliMCParticle.cxx:114
 AliMCParticle.cxx:115
 AliMCParticle.cxx:116
 AliMCParticle.cxx:117
 AliMCParticle.cxx:118
 AliMCParticle.cxx:119
 AliMCParticle.cxx:120
 AliMCParticle.cxx:121
 AliMCParticle.cxx:122
 AliMCParticle.cxx:123
 AliMCParticle.cxx:124
 AliMCParticle.cxx:125
 AliMCParticle.cxx:126
 AliMCParticle.cxx:127
 AliMCParticle.cxx:128
 AliMCParticle.cxx:129
 AliMCParticle.cxx:130
 AliMCParticle.cxx:131
 AliMCParticle.cxx:132
 AliMCParticle.cxx:133
 AliMCParticle.cxx:134
 AliMCParticle.cxx:135
 AliMCParticle.cxx:136
 AliMCParticle.cxx:137
 AliMCParticle.cxx:138
 AliMCParticle.cxx:139
 AliMCParticle.cxx:140
 AliMCParticle.cxx:141
 AliMCParticle.cxx:142
 AliMCParticle.cxx:143
 AliMCParticle.cxx:144
 AliMCParticle.cxx:145
 AliMCParticle.cxx:146
 AliMCParticle.cxx:147
 AliMCParticle.cxx:148
 AliMCParticle.cxx:149
 AliMCParticle.cxx:150
 AliMCParticle.cxx:151
 AliMCParticle.cxx:152
 AliMCParticle.cxx:153
 AliMCParticle.cxx:154
 AliMCParticle.cxx:155
 AliMCParticle.cxx:156
 AliMCParticle.cxx:157
 AliMCParticle.cxx:158
 AliMCParticle.cxx:159
 AliMCParticle.cxx:160
 AliMCParticle.cxx:161
 AliMCParticle.cxx:162
 AliMCParticle.cxx:163
 AliMCParticle.cxx:164
 AliMCParticle.cxx:165
 AliMCParticle.cxx:166
 AliMCParticle.cxx:167
 AliMCParticle.cxx:168
 AliMCParticle.cxx:169
 AliMCParticle.cxx:170
 AliMCParticle.cxx:171
 AliMCParticle.cxx:172
 AliMCParticle.cxx:173
 AliMCParticle.cxx:174
 AliMCParticle.cxx:175
 AliMCParticle.cxx:176
 AliMCParticle.cxx:177
 AliMCParticle.cxx:178
 AliMCParticle.cxx:179