]> git.uio.no Git - u/mrichter/AliRoot.git/blob - STEER/AliMixedEvent.cxx
- Implementing functions for the GRP preprocessor to retrieve DA output files from...
[u/mrichter/AliRoot.git] / STEER / AliMixedEvent.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-2007, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16 /* $Id$ */
17
18
19 //-------------------------------------------------------------------------
20 //                          Class AliMixedEvent
21 // VEvent which is the container of several VEvents 
22 // Use Case: Event Mixing     
23 // Origin: Andreas Morsch, CERN, Andreas.Morsch@cern.ch 
24 //-------------------------------------------------------------------------
25
26
27 #include "AliMixedEvent.h"
28 #include "AliExternalTrackParam.h"
29 #include "TVector3.h"
30 #include "AliVVertex.h"
31 #include <TMath.h>
32 #include <TMatrix.h>
33 #include <TMatrixD.h>
34
35 ClassImp(AliMixedEvent)
36
37
38 AliMixedEvent::AliMixedEvent() :
39     AliVEvent(),
40     fEventList(),
41     fNEvents(0),       
42     fNumberOfTracks(0),
43     fNTracksCumul(0),
44     fMeanVertex(0)
45 {
46     // Default constructor
47 }
48
49 AliMixedEvent::AliMixedEvent(const AliMixedEvent& Evnt) :
50     AliVEvent(Evnt),
51     fEventList(),
52     fNEvents(0),
53     fNumberOfTracks(0),
54     fNTracksCumul(0),
55     fMeanVertex(0)
56 { } // Copy constructor
57
58 AliMixedEvent& AliMixedEvent::operator=(const AliMixedEvent& vEvnt)
59 { if (this!=&vEvnt) { 
60     AliVEvent::operator=(vEvnt); 
61   }
62   
63   return *this; 
64 }
65
66
67 void AliMixedEvent::AddEvent(AliVEvent* evt)
68 {
69     // Add a new event to the list
70     fEventList.AddLast(evt);
71 }
72
73
74 void AliMixedEvent::Init()
75 {
76     // Initialize meta information
77     fNEvents = fEventList.GetEntries();
78     fNTracksCumul = new Int_t[fNEvents];
79     fNumberOfTracks = 0;
80     TIter next(&fEventList);
81     AliVEvent* event;
82     Int_t iev = 0;
83     
84     while((event = (AliVEvent*)next())) {
85         fNTracksCumul[iev++] = fNumberOfTracks;
86         fNumberOfTracks += (event->GetNumberOfTracks());
87     }
88 }
89
90
91 AliVParticle* AliMixedEvent::GetTrack(Int_t i) const
92 {
93     // Return track # i
94     Int_t iEv  = TMath::BinarySearch(fNEvents, fNTracksCumul, i);
95     while((iEv < (fNEvents - 1)) && (fNTracksCumul[iEv] == fNTracksCumul[iEv+1])) {iEv++;}
96
97     Int_t irel = i - fNTracksCumul[iEv];
98     AliVEvent* evt = (AliVEvent*) (fEventList.At(iEv));
99     return (evt->GetTrack(irel));
100 }
101
102 const AliVVertex* AliMixedEvent::GetEventVertex(Int_t i) const
103 {
104     // Return track # i
105     Int_t iEv  = TMath::BinarySearch(fNEvents, fNTracksCumul, i);
106     while((iEv < (fNEvents - 1)) && (fNTracksCumul[iEv] == fNTracksCumul[iEv+1])) {iEv++;}
107     AliVEvent* evt = (AliVEvent*) (fEventList.At(iEv));
108     return (evt->GetPrimaryVertex());
109 }
110
111 void AliMixedEvent::Reset()
112 {
113     // Reset the event
114     fEventList.Clear();
115     fNEvents = 0;
116     fNumberOfTracks = 0;
117     if (fNTracksCumul) {
118         delete[]  fNTracksCumul;
119         fNTracksCumul = 0;
120     }
121 }
122
123 Int_t AliMixedEvent::EventIndex(Int_t itrack)
124 {
125   // Return the event index for track #itrack
126   return  TMath::BinarySearch(fNEvents, fNTracksCumul, itrack);
127 }
128
129 Bool_t AliMixedEvent::ComputeVtx(TObjArray *vertices, Double_t *pos,Double_t *sig,Int_t *nContributors){
130 //
131 // Calculate the mean vertex psoitions from events in the buffer
132  
133     Int_t nentries = vertices->GetEntriesFast();
134     Double_t sum[3]={0.,0.,0.};
135     Double_t sumsigma[6]={0.,0.,0.,0.,0.,0.};
136
137     
138     for(Int_t ivtx = 0; ivtx < nentries; ivtx++){
139         AliVVertex *vtx=(AliVVertex*)vertices->UncheckedAt(ivtx);
140         Double_t covariance[6];
141         vtx->GetCovarianceMatrix(covariance);
142         Double_t vtxPos[3];
143         vtx->GetXYZ(vtxPos);
144         if(TMath::Abs(covariance[0])<1.e-13) {
145         return kFALSE;
146         }else{
147         sum[0]+=vtxPos[0]*(1./covariance[0]);
148         sumsigma[0]+=(1./covariance[0]);
149         }
150         if(TMath::Abs(covariance[2])<1.e-13) {
151         return kFALSE;
152         }else{
153         sum[1]+=vtxPos[1]*(1./covariance[2]);
154         sumsigma[2]+=(1./covariance[2]);
155         }
156         if(TMath::Abs(covariance[5])<1.e-13) {
157         return kFALSE;
158         }else{
159         sum[2]+=vtxPos[2]*(1./covariance[5]);
160         sumsigma[5]+=(1./covariance[5]);
161         }
162         if(TMath::Abs(covariance[1])<1.e-13) {
163          sumsigma[1]+=0.;
164         }else{
165         sumsigma[1]+=(1./covariance[1]);
166         }
167         if(TMath::Abs(covariance[3])<1.e-13) {
168         sumsigma[3]+=0.;
169         }else{
170         sumsigma[3]+=(1./covariance[3]);
171         }
172         if(TMath::Abs(covariance[4])<1.e-13) {
173         sumsigma[4]+=0.;
174         }else{
175         sumsigma[4]+=(1./covariance[4]);
176         }
177
178      nContributors[0]=nContributors[0]+vtx->GetNContributors();
179     }
180     
181     for(Int_t i=0;i<3;i++){
182         if(TMath::Abs(sumsigma[i])<1.e-13) continue;
183         pos[i]=sum[i]/sumsigma[i];
184     }
185     for(Int_t i2=0;i2<6;i2++){
186         if(TMath::Abs(sumsigma[i2])<1.e-13) {sig[i2]=0.; continue;}
187         sig[i2]=1./sumsigma[i2];
188     }
189     return kTRUE;
190 }
191
192
193 Double_t AliMixedEvent::GetMagneticField() const
194 {
195     // Return magnetic field of the first event in the list
196     if (fEventList.GetEntries() == 0) return -999.;
197     
198     AliVEvent* evt = (AliVEvent*) (fEventList.At(0));
199     return evt->GetMagneticField();
200 }