1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
16 // $Id: AliEvent.cxx,v 1.11 2003/02/25 12:36:28 nick Exp $
18 ///////////////////////////////////////////////////////////////////////////
20 // Creation and investigation of an Alice physics event.
21 // An AliEvent can be constructed by adding AliTracks, Alivertices, AliJets
22 // and/or AliCalorimeters.
24 // The basic functionality of AliEvent is identical to the one of AliVertex.
25 // So, an AliEvent may be used as the primary vertex with some additional
26 // functionality compared to AliVertex.
28 // To provide maximal flexibility to the user, the two modes of track/jet/vertex
29 // storage as described in AliJet and AliVertex can be used.
30 // In addition an identical structure is provided for the storage of AliCalorimeter
31 // objects, which can be selected by means of the memberfunction SetCalCopy().
33 // a) SetCalCopy(0) (which is the default).
34 // Only the pointers of the 'added' calorimeters are stored.
35 // This mode is typically used by making cal. studies based on a fixed set
36 // of calorimeters which stays under user control or is kept on an external
38 // In this way the AliEvent just represents a 'logical structure' for the
42 // Modifications made to the original calorimeters also affect the AliCalorimeter
43 // objects which are stored in the AliEvent.
46 // Of every 'added' calorimeter a private copy will be made of which the pointer
48 // In this way the AliEvent represents an entity on its own and modifications
49 // made to the original calorimeters do not affect the AliCalorimeter objects
50 // which are stored in the AliEvent.
51 // This mode will allow 'adding' many different AliCalorimeters into an AliEvent by
52 // creating only one AliCalorimeter instance in the main programme and using the
53 // AliCalorimeter::Reset() and AliCalorimeter parameter setting memberfunctions.
55 // See also the documentation provided for the memberfunction SetOwner().
57 // Coding example to make an event consisting of a primary vertex,
58 // 2 secondary vertices and a calorimeter.
59 // --------------------------------------------------------------
60 // vp contains the tracks 1,2,3 and 4 (primary vertex)
61 // v1 contains the tracks 5,6 and 7 (sec. vertex)
62 // v2 contains the jets 1 and 2 (sec. vertex)
66 // Specify the event object as the repository of all objects
67 // for the event building and physics analysis.
70 // evt.SetTrackCopy(1);
72 // Fill the event structure with the basic objects
74 // AliCalorimeter emcal;
76 // ... // code to fill the calorimeter data
79 // evt.AddCalorimeter(emcal);
81 // AliTrack* tx=new AliTrack();
82 // for (Int_t i=0; i<10; i++)
85 // ... // code to fill the track data
97 // Build the event structure (vertices, jets, ...) for physics analysis
98 // based on the basic objects from the event repository.
101 // for (Int_t i=0; i<evt.GetNtracks(); i++)
103 // tx=evt.GetTrack(i);
105 // ... // code to fill the jet data
110 // tx=evt.GetTrack(1);
112 // tx=evt.GetTrack(2);
114 // tx=evt.GetTrack(3);
116 // tx=evt.GetTrack(4);
119 // Float_t rp[3]={2.4,0.1,-8.5};
120 // vp.SetPosition(rp,"car");
123 // tx=evt.GetTrack(5);
125 // tx=evt.GetTrack(6);
127 // tx=evt.GetTrack(7);
130 // Float_t r1[3]={1.6,-3.2,5.7};
131 // v1.SetPosition(r1,"car");
139 // Float_t r2[3]={6.2,4.8,1.3};
140 // v2.SetPosition(r2,"car");
142 // Specify the vertices v1 and v2 as secondary vertices of the primary
144 // vp.SetVertexCopy(1);
148 // Enter the physics structures into the event
149 // evt.SetVertexCopy(1);
150 // evt.AddVertex(vp,0);
152 // The jets j1 and j2 are already available via sec. vertex v2,
153 // but can be made available also from the event itself if desired.
164 // Float_t etot=evt.GetEnergy();
165 // Ali3Vector ptot=evt.Get3Momentum();
167 // evt.GetPosition(loc,"sph");
168 // AliPosition r=v1.GetPosition();
170 // Int_t nt=v2.GetNtracks();
171 // AliTrack* tv=v2.GetTrack(1); // Access track number 1 of Vertex v2
175 // Int_t nv=evt.GetNvtx();
176 // AliVertex* vx=evt.GetVertex(1); // Access primary vertex
177 // Float_t e=vx->GetEnergy();
179 // Float_t M=evt.GetInvmass();
181 // Reconstruct the event from scratch
184 // evt.SetNvmax(25); // Increase initial no. of sec. vertices
186 // ... // code to create tracks etc...
189 // Note : All quantities are in GeV, GeV/c or GeV/c**2
191 //--- Author: Nick van Eijndhoven 27-may-2001 UU-SAP Utrecht
192 //- Modified: NvE $Date: 2003/02/25 12:36:28 $ UU-SAP Utrecht
193 ///////////////////////////////////////////////////////////////////////////
195 #include "AliEvent.h"
196 #include "Riostream.h"
198 ClassImp(AliEvent) // Class implementation to enable ROOT I/O
200 AliEvent::AliEvent() : AliVertex()
202 // Default constructor.
203 // All variables initialised to default values.
219 ///////////////////////////////////////////////////////////////////////////
220 AliEvent::AliEvent(Int_t n) : AliVertex(n)
222 // Create an event to hold initially a maximum of n tracks
223 // All variables initialised to default values
226 cout << " *** This AliVertex initialisation was invoked via the AliEvent ctor." << endl;
243 ///////////////////////////////////////////////////////////////////////////
244 AliEvent::~AliEvent()
246 // Default destructor
249 delete fCalorimeters;
253 ///////////////////////////////////////////////////////////////////////////
254 AliEvent::AliEvent(AliEvent& evt) : AliVertex(evt)
257 fDaytime=evt.fDaytime;
262 fPnucProj=evt.fPnucProj;
266 fPnucTarg=evt.fPnucTarg;
269 fCalCopy=evt.fCalCopy;
274 fCalorimeters=new TObjArray(fNcals);
275 if (fCalCopy) fCalorimeters->SetOwner();
276 for (Int_t i=1; i<=fNcals; i++)
278 AliCalorimeter* cal=evt.GetCalorimeter(i);
283 fCalorimeters->Add(new AliCalorimeter(*cal));
287 fCalorimeters->Add(cal);
293 ///////////////////////////////////////////////////////////////////////////
294 void AliEvent::Reset()
296 // Reset all variables to default values
297 // The max. number of tracks is set to the initial value again
298 // The max. number of vertices is set to the default value again
299 // Note : The CalCopy mode is maintained as it was set by the user before.
318 delete fCalorimeters;
322 ///////////////////////////////////////////////////////////////////////////
323 void AliEvent::SetOwner(Bool_t own)
325 // Set ownership of all added objects.
326 // The default parameter is own=kTRUE.
328 // Invokation of this memberfunction also sets all the copy modes
329 // (e.g. TrackCopy & co.) according to the value of own.
331 // This function (with own=kTRUE) is particularly useful when reading data
332 // from a tree/file, since Reset() will then actually remove all the
333 // added objects from memory irrespective of the copy mode settings
334 // during the tree/file creation process. In this way it provides a nice way
335 // of preventing possible memory leaks in the reading/analysis process.
337 // In addition this memberfunction can also be used as a shortcut to set all
338 // copy modes in one go during a tree/file creation process.
339 // However, in this case the user has to take care to only set/change the
340 // ownership (and copy mode) for empty objects (e.g. newly created objects
341 // or after invokation of the Reset() memberfunction) otherwise it will
342 // very likely result in inconsistent destructor behaviour.
346 if (fCalorimeters) fCalorimeters->SetOwner(own);
349 AliVertex::SetOwner(own);
351 ///////////////////////////////////////////////////////////////////////////
352 void AliEvent::SetDayTime(TDatime& stamp)
354 // Set the date and time stamp for this event
357 ///////////////////////////////////////////////////////////////////////////
358 void AliEvent::SetRunNumber(Int_t run)
360 // Set the run number for this event
363 ///////////////////////////////////////////////////////////////////////////
364 void AliEvent::SetEventNumber(Int_t evt)
366 // Set the event number for this event
369 ///////////////////////////////////////////////////////////////////////////
370 TDatime AliEvent::GetDayTime()
372 // Provide the date and time stamp for this event
375 ///////////////////////////////////////////////////////////////////////////
376 Int_t AliEvent::GetRunNumber()
378 // Provide the run number for this event
381 ///////////////////////////////////////////////////////////////////////////
382 Int_t AliEvent::GetEventNumber()
384 // Provide the event number for this event
387 ///////////////////////////////////////////////////////////////////////////
388 void AliEvent::SetProjectile(Int_t a,Int_t z,Double_t pnuc,Int_t id)
390 // Set the projectile A, Z, momentum per nucleon and user defined particle ID.
391 // By default the particle ID is set to zero.
397 ///////////////////////////////////////////////////////////////////////////
398 Int_t AliEvent::GetProjectileA()
400 // Provide the projectile A value.
403 ///////////////////////////////////////////////////////////////////////////
404 Int_t AliEvent::GetProjectileZ()
406 // Provide the projectile Z value.
409 ///////////////////////////////////////////////////////////////////////////
410 Double_t AliEvent::GetProjectilePnuc()
412 // Provide the projectile momentum value per nucleon.
415 ///////////////////////////////////////////////////////////////////////////
416 Int_t AliEvent::GetProjectileId()
418 // Provide the user defined particle ID of the projectile.
421 ///////////////////////////////////////////////////////////////////////////
422 void AliEvent::SetTarget(Int_t a,Int_t z,Double_t pnuc,Int_t id)
424 // Set the target A, Z, momentum per nucleon and user defined particle ID.
425 // By default the particle ID is set to zero.
431 ///////////////////////////////////////////////////////////////////////////
432 Int_t AliEvent::GetTargetA()
434 // Provide the target A value.
437 ///////////////////////////////////////////////////////////////////////////
438 Int_t AliEvent::GetTargetZ()
440 // Provide the target Z value.
443 ///////////////////////////////////////////////////////////////////////////
444 Double_t AliEvent::GetTargetPnuc()
446 // Provide the target momentum value per nucleon.
449 ///////////////////////////////////////////////////////////////////////////
450 Int_t AliEvent::GetTargetId()
452 // Provide the user defined particle ID of the target.
455 ///////////////////////////////////////////////////////////////////////////
456 void AliEvent::HeaderData()
458 // Provide event header information
459 cout << " *AliEvent::Data* Run : " << fRun << " Event : " << fEvent
460 << " Date : " << fDaytime.AsString() << endl;
464 ///////////////////////////////////////////////////////////////////////////
465 void AliEvent::Data(TString f)
467 // Provide event information within the coordinate frame f
471 ///////////////////////////////////////////////////////////////////////////
472 Int_t AliEvent::GetNcalorimeters()
474 // Provide the number of stored calorimeter systems
477 ///////////////////////////////////////////////////////////////////////////
478 void AliEvent::AddCalorimeter(AliCalorimeter& c)
480 // Add a calorimeter system to the event
483 fCalorimeters=new TObjArray();
484 if (fCalCopy) fCalorimeters->SetOwner();
487 // Add the calorimeter system to this event
491 fCalorimeters->Add(new AliCalorimeter(c));
495 fCalorimeters->Add(&c);
498 ///////////////////////////////////////////////////////////////////////////
499 void AliEvent::SetCalCopy(Int_t j)
501 // (De)activate the creation of private copies of the added calorimeters.
502 // j=0 ==> No private copies are made; pointers of original cals. are stored.
503 // j=1 ==> Private copies of the cals. are made and these pointers are stored.
505 // Note : Once the storage contains pointer(s) to AliCalorimeter(s) one cannot
506 // change the CalCopy mode anymore.
507 // To change the CalCopy mode for an existing AliEvent containing
508 // calorimeters one first has to invoke Reset().
517 cout << "*AliEvent::SetCalCopy* Invalid argument : " << j << endl;
522 cout << "*AliEvent::SetCalCopy* Storage already contained calorimeters."
523 << " ==> CalCopy mode not changed." << endl;
526 ///////////////////////////////////////////////////////////////////////////
527 Int_t AliEvent::GetCalCopy()
529 // Provide value of the CalCopy mode.
530 // 0 ==> No private copies are made; pointers of original cals. are stored.
531 // 1 ==> Private copies of the cals. are made and these pointers are stored.
534 ///////////////////////////////////////////////////////////////////////////
535 AliCalorimeter* AliEvent::GetCalorimeter(Int_t i)
537 // Return the i-th calorimeter of this event
540 cout << " *AliEvent::GetCalorimeter* No calorimeters present." << endl;
545 if (i<=0 || i>fNcals)
547 cout << " *AliEvent::GetCalorimeter* Invalid argument i : " << i
548 << " Ncals = " << fNcals << endl;
553 return (AliCalorimeter*)fCalorimeters->At(i-1);
557 ///////////////////////////////////////////////////////////////////////////
558 AliCalorimeter* AliEvent::GetCalorimeter(TString name)
560 // Return the calorimeter with name tag "name"
563 cout << " *AliEvent::GetCalorimeter* No calorimeters present." << endl;
570 for (Int_t i=0; i<fNcals; i++)
572 cx=(AliCalorimeter*)fCalorimeters->At(i);
576 if (s == name) return cx;
580 return 0; // No matching name found
583 ///////////////////////////////////////////////////////////////////////////
584 void AliEvent::ShowCalorimeters()
586 // Provide an overview of the available calorimeter systems.
589 cout << " The following " << fNcals << " calorimeter systems are available :" << endl;
590 for (Int_t i=1; i<=fNcals; i++)
592 AliCalorimeter* cal=GetCalorimeter(i);
593 if (cal) cout << " Calorimeter number : " << i << " Name : " << (cal->GetName()).Data() << endl;
598 cout << " No calorimeters present for this event." << endl;
601 ///////////////////////////////////////////////////////////////////////////