]> git.uio.no Git - u/mrichter/AliRoot.git/blame - RALICE/AliEvent.cxx
Preparing the raw reader for the new raw-data format. Minor additions to the warning...
[u/mrichter/AliRoot.git] / RALICE / AliEvent.cxx
CommitLineData
d16062ac 1/**************************************************************************
2 * Copyright(c) 1998-1999, 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
4f368c8c 16// $Id: AliEvent.cxx,v 1.25 2004/10/20 10:49:44 nick Exp $
d16062ac 17
18///////////////////////////////////////////////////////////////////////////
19// Class AliEvent
20// Creation and investigation of an Alice physics event.
7849a8ab 21// An AliEvent can be constructed by adding AliTracks, Alivertices, AliJets
7a086578 22// and/or devices like AliCalorimeters or AliDevice (derived) objects.
23//
1c01b4f8 24// All objects which are derived from TObject can be regarded as a device.
7a086578 25// However, AliDevice (or derived) objects profit from additional hit
26// handling facilities.
27// A "hit" is a generic name indicating an AliSignal (or derived) object.
28// Note that AliEvent does NOT own hits; it only provides references to hits
29// obtained from the various devices.
30// This implies that hits should be owned by the devices themselves.
d16062ac 31//
32// The basic functionality of AliEvent is identical to the one of AliVertex.
35044448 33// So, an AliEvent may be used as the primary vertex with some additional
34// functionality compared to AliVertex.
d16062ac 35//
7849a8ab 36// To provide maximal flexibility to the user, the two modes of track/jet/vertex
37// storage as described in AliJet and AliVertex can be used.
1c01b4f8 38// In addition an identical structure is provided for the storage of devices like
39// AliCalorimeter objects, which can be selected by means of the memberfunction
40// SetDevCopy().
41//
42// a) SetDevCopy(0) (which is the default).
43// Only the pointers of the 'added' devices are stored.
44// This mode is typically used by making studies based on a fixed set
45// of devices which stays under user control or is kept on an external
7849a8ab 46// file/tree.
47// In this way the AliEvent just represents a 'logical structure' for the
48// physics analysis.
35044448 49//
50// Note :
1c01b4f8 51// Modifications made to the original devices also affect the device
7849a8ab 52// objects which are stored in the AliEvent.
35044448 53//
1c01b4f8 54// b) SetDevCopy(1).
55// Of every 'added' device a private copy will be made of which the pointer
7849a8ab 56// will be stored.
57// In this way the AliEvent represents an entity on its own and modifications
58// made to the original calorimeters do not affect the AliCalorimeter objects
59// which are stored in the AliEvent.
1c01b4f8 60// This mode will allow 'adding' many different devices into an AliEvent by
61// creating only one device instance in the main programme and using the
62// Reset() and parameter setting memberfunctions of the object representing the device.
63//
64// Note :
65// The copy is made using the Clone() memberfunction.
66// All devices (i.e. classes derived from TObject) have the default TObject::Clone()
67// memberfunction.
68// However, devices generally contain an internal (signal) data structure
69// which may include pointers to other objects. Therefore it is recommended to provide
70// for all devices a specific copy constructor and override the default Clone()
71// memberfunction using this copy constructor.
7a086578 72// Examples for this may be seen from AliCalorimeter, AliSignal and AliDevice.
7849a8ab 73//
8e8e6c7f 74// See also the documentation provided for the memberfunction SetOwner().
75//
7849a8ab 76// Coding example to make an event consisting of a primary vertex,
77// 2 secondary vertices and a calorimeter.
d16062ac 78// --------------------------------------------------------------
7849a8ab 79// vp contains the tracks 1,2,3 and 4 (primary vertex)
80// v1 contains the tracks 5,6 and 7 (sec. vertex)
81// v2 contains the jets 1 and 2 (sec. vertex)
82//
7849a8ab 83// AliEvent evt;
84//
85// Specify the event object as the repository of all objects
86// for the event building and physics analysis.
87//
1c01b4f8 88// evt.SetDevCopy(1);
7849a8ab 89// evt.SetTrackCopy(1);
90//
91// Fill the event structure with the basic objects
92//
b055c99d 93// AliCalorimeter emcal1;
94// AliCalorimeter emcal2;
35044448 95// ...
b055c99d 96// ... // code to fill the emcal1 and emcal2 calorimeter data
35044448 97// ...
98//
b055c99d 99// evt.AddDevice(emcal1);
100// evt.AddDevice(emcal2);
7849a8ab 101//
7a086578 102// // Assume AliTOF has been derived from AliDevice
103// AliTOF tof1;
104// AliTOF tof2;
105// ...
106// ... // code to fill the tof1 and tof2 data
107// ...
108//
109// evt.AddDevice(tof1);
110// evt.AddDevice(tof2);
111//
35044448 112// AliTrack* tx=new AliTrack();
7849a8ab 113// for (Int_t i=0; i<10; i++)
114// {
d16062ac 115// ...
116// ... // code to fill the track data
117// ...
7849a8ab 118// evt.AddTrack(tx);
119// tx->Reset();
120// }
121//
35044448 122// if (tx)
123// {
124// delete tx;
125// tx=0;
126// }
127//
7a086578 128// Order and investigate all the hits of all the TOF devices
129//
130// TObjArray* hits=evt.GetHits("AliTOF");
7b825f44 131// TObjArray* orderedtofs=evt.SortHits(hits);
132// Int_t nhits=0;
133// if (orderedtofs) nhits=orderedtofs->GetEntries();
7a086578 134// for (Int_t i=0; i<nhits; i++)
135// {
7b825f44 136// AliSignal* sx=(AliSignal*)orderedtofs->At(i);
b055c99d 137// if (sx) sx->Data();
138// }
139//
140// Order and investigate all the hits of all the calorimeter devices
141//
142// TObjArray* hits=evt.GetHits("AliCalorimeter");
7b825f44 143// TObjArray* orderedcals=evt.SortHits(hits);
144// Int_t nhits=0;
145// if (orderedcals) nhits=orderedcals->GetEntries();
b055c99d 146// for (Int_t i=0; i<nhits; i++)
147// {
7b825f44 148// AliSignal* sx=(AliSignal*)orderedcals->At(i);
7a086578 149// if (sx) sx->Data();
150// }
151//
7849a8ab 152// Build the event structure (vertices, jets, ...) for physics analysis
153// based on the basic objects from the event repository.
d16062ac 154//
155// AliJet j1,j2;
7849a8ab 156// for (Int_t i=0; i<evt.GetNtracks(); i++)
157// {
158// tx=evt.GetTrack(i);
d16062ac 159// ...
160// ... // code to fill the jet data
161// ...
7849a8ab 162// }
d16062ac 163//
7849a8ab 164// AliVertex vp;
35044448 165// tx=evt.GetTrack(1);
7849a8ab 166// vp.AddTrack(tx);
35044448 167// tx=evt.GetTrack(2);
7849a8ab 168// vp.AddTrack(tx);
35044448 169// tx=evt.GetTrack(3);
7849a8ab 170// vp.AddTrack(tx);
35044448 171// tx=evt.GetTrack(4);
7849a8ab 172// vp.AddTrack(tx);
d16062ac 173//
7849a8ab 174// Float_t rp[3]={2.4,0.1,-8.5};
175// vp.SetPosition(rp,"car");
d16062ac 176//
7849a8ab 177// AliVertex v1;
35044448 178// tx=evt.GetTrack(5);
7849a8ab 179// v1.AddTrack(tx);
35044448 180// tx=evt.GetTrack(6);
7849a8ab 181// v1.AddTrack(tx);
35044448 182// tx=evt.GetTrack(7);
7849a8ab 183// v1.AddTrack(tx);
d16062ac 184//
185// Float_t r1[3]={1.6,-3.2,5.7};
186// v1.SetPosition(r1,"car");
187//
d16062ac 188//
7849a8ab 189// AliVertex v2;
190// v2.SetJetCopy(1);
d16062ac 191// v2.AddJet(j1);
192// v2.AddJet(j2);
193//
194// Float_t r2[3]={6.2,4.8,1.3};
195// v2.SetPosition(r2,"car");
196//
7849a8ab 197// Specify the vertices v1 and v2 as secondary vertices of the primary
198//
199// vp.SetVertexCopy(1);
200// vp.AddVertex(v1);
201// vp.AddVertex(v2);
202//
203// Enter the physics structures into the event
204// evt.SetVertexCopy(1);
205// evt.AddVertex(vp,0);
206//
207// The jets j1 and j2 are already available via sec. vertex v2,
208// but can be made available also from the event itself if desired.
209// AliJet* jx;
210// jx=v2.GetJet(1);
211// evt.AddJet(jx,0);
212// jx=v2.GetJet(2);
213// evt.AddJet(jx,0);
214//
84bb7c66 215// evt.Data("sph");
d16062ac 216// v1.ListAll();
217// v2.List("cyl");
218//
219// Float_t etot=evt.GetEnergy();
220// Ali3Vector ptot=evt.Get3Momentum();
221// Float_t loc[3];
222// evt.GetPosition(loc,"sph");
223// AliPosition r=v1.GetPosition();
84bb7c66 224// r.Data();
d16062ac 225// Int_t nt=v2.GetNtracks();
226// AliTrack* tv=v2.GetTrack(1); // Access track number 1 of Vertex v2
227//
d16062ac 228// evt.List();
229//
230// Int_t nv=evt.GetNvtx();
7849a8ab 231// AliVertex* vx=evt.GetVertex(1); // Access primary vertex
d16062ac 232// Float_t e=vx->GetEnergy();
233//
234// Float_t M=evt.GetInvmass();
235//
236// Reconstruct the event from scratch
237//
238// evt.Reset();
239// evt.SetNvmax(25); // Increase initial no. of sec. vertices
7849a8ab 240// ...
241// ... // code to create tracks etc...
242// ...
d16062ac 243//
25eefd00 244// Note : By default all quantities are in meter, GeV, GeV/c or GeV/c**2
245// but the user can indicate the usage of a different scale for
246// the metric and/or energy-momentum units via the SetUnitScale()
247// and SetEscale() memberfunctions, respectively.
248// The actual metric and energy-momentum unit scales in use can be
249// obtained via the GetUnitScale() and GetEscale() memberfunctions.
d16062ac 250//
251//--- Author: Nick van Eijndhoven 27-may-2001 UU-SAP Utrecht
4f368c8c 252//- Modified: NvE $Date: 2004/10/20 10:49:44 $ UU-SAP Utrecht
d16062ac 253///////////////////////////////////////////////////////////////////////////
254
255#include "AliEvent.h"
c72198f1 256#include "Riostream.h"
d16062ac 257
258ClassImp(AliEvent) // Class implementation to enable ROOT I/O
259
3ea81e9c 260AliEvent::AliEvent() : AliVertex(),AliTimestamp()
d16062ac 261{
262// Default constructor.
263// All variables initialised to default values.
d16062ac 264 fRun=0;
265 fEvent=0;
1c01b4f8 266 fDevices=0;
267 fDevCopy=0;
7a086578 268 fHits=0;
965bd237 269 fOrdered=0;
270 fDisplay=0;
27e6d856 271 fDevs=0;
d16062ac 272}
273///////////////////////////////////////////////////////////////////////////
3ea81e9c 274AliEvent::AliEvent(Int_t n) : AliVertex(n),AliTimestamp()
d16062ac 275{
276// Create an event to hold initially a maximum of n tracks
277// All variables initialised to default values
c72198f1 278 if (n<=0)
279 {
280 cout << " *** This AliVertex initialisation was invoked via the AliEvent ctor." << endl;
281 }
d16062ac 282 fRun=0;
283 fEvent=0;
1c01b4f8 284 fDevices=0;
285 fDevCopy=0;
7a086578 286 fHits=0;
965bd237 287 fOrdered=0;
288 fDisplay=0;
27e6d856 289 fDevs=0;
d16062ac 290}
291///////////////////////////////////////////////////////////////////////////
292AliEvent::~AliEvent()
293{
294// Default destructor
1c01b4f8 295 if (fDevices)
7849a8ab 296 {
1c01b4f8 297 delete fDevices;
298 fDevices=0;
7849a8ab 299 }
7a086578 300 if (fHits)
301 {
302 delete fHits;
303 fHits=0;
304 }
965bd237 305 if (fOrdered)
306 {
307 delete fOrdered;
308 fOrdered=0;
309 }
310 if (fDisplay)
311 {
312 delete fDisplay;
313 fDisplay=0;
314 }
27e6d856 315 if (fDevs)
316 {
317 delete fDevs;
318 fDevs=0;
319 }
d16062ac 320}
321///////////////////////////////////////////////////////////////////////////
3ea81e9c 322AliEvent::AliEvent(const AliEvent& evt) : AliVertex(evt),AliTimestamp(evt)
c72198f1 323{
324// Copy constructor.
c72198f1 325 fRun=evt.fRun;
326 fEvent=evt.fEvent;
1c01b4f8 327 fDevCopy=evt.fDevCopy;
c72198f1 328
965bd237 329 fHits=0;
330 fOrdered=0;
331 fDisplay=0;
27e6d856 332 fDevs=0;
965bd237 333
1c01b4f8 334 fDevices=0;
335 Int_t ndevs=evt.GetNdevices();
336 if (ndevs)
c72198f1 337 {
1c01b4f8 338 fDevices=new TObjArray(ndevs);
339 if (fDevCopy) fDevices->SetOwner();
340 for (Int_t i=1; i<=ndevs; i++)
c72198f1 341 {
1c01b4f8 342 TObject* dev=evt.GetDevice(i);
343 if (dev)
c72198f1 344 {
1c01b4f8 345 if (fDevCopy)
c72198f1 346 {
1c01b4f8 347 fDevices->Add(dev->Clone());
c72198f1 348 }
349 else
350 {
1c01b4f8 351 fDevices->Add(dev);
c72198f1 352 }
353 }
354 }
355 }
356}
357///////////////////////////////////////////////////////////////////////////
d16062ac 358void AliEvent::Reset()
359{
360// Reset all variables to default values
361// The max. number of tracks is set to the initial value again
362// The max. number of vertices is set to the default value again
7b825f44 363// Note : The DevCopy mode is maintained as it was set by the user before.
c72198f1 364
365 AliVertex::Reset();
366
3ea81e9c 367 Set();
d16062ac 368 fRun=0;
369 fEvent=0;
370
1c01b4f8 371 if (fDevices)
7849a8ab 372 {
1c01b4f8 373 delete fDevices;
374 fDevices=0;
7849a8ab 375 }
7a086578 376 if (fHits)
377 {
378 delete fHits;
379 fHits=0;
380 }
965bd237 381 if (fOrdered)
382 {
383 delete fOrdered;
384 fOrdered=0;
385 }
386 if (fDisplay)
387 {
388 delete fDisplay;
389 fDisplay=0;
390 }
27e6d856 391 if (fDevs)
392 {
393 delete fDevs;
394 fDevs=0;
395 }
d16062ac 396}
397///////////////////////////////////////////////////////////////////////////
8e8e6c7f 398void AliEvent::SetOwner(Bool_t own)
399{
400// Set ownership of all added objects.
401// The default parameter is own=kTRUE.
402//
403// Invokation of this memberfunction also sets all the copy modes
404// (e.g. TrackCopy & co.) according to the value of own.
405//
406// This function (with own=kTRUE) is particularly useful when reading data
407// from a tree/file, since Reset() will then actually remove all the
408// added objects from memory irrespective of the copy mode settings
409// during the tree/file creation process. In this way it provides a nice way
410// of preventing possible memory leaks in the reading/analysis process.
411//
412// In addition this memberfunction can also be used as a shortcut to set all
413// copy modes in one go during a tree/file creation process.
414// However, in this case the user has to take care to only set/change the
415// ownership (and copy mode) for empty objects (e.g. newly created objects
416// or after invokation of the Reset() memberfunction) otherwise it will
417// very likely result in inconsistent destructor behaviour.
418
419 Int_t mode=1;
420 if (!own) mode=0;
1c01b4f8 421 if (fDevices) fDevices->SetOwner(own);
422 fDevCopy=mode;
8e8e6c7f 423
424 AliVertex::SetOwner(own);
425}
426///////////////////////////////////////////////////////////////////////////
387a745b 427void AliEvent::SetDayTime(TTimeStamp& stamp)
d16062ac 428{
387a745b 429// Set the date and time stamp for this event.
430// An exact copy of the entered date/time stamp will be saved with an
47dddbe4 431// accuracy of 1 nanosecond.
3ea81e9c 432//
433// Note : Since the introduction of the more versatile class AliTimestamp
434// and the fact that AliEvent has now been derived from it,
435// this memberfunction has become obsolete.
436// It is recommended to use the corresponding AliTimestamp
437// functionality directly for AliEvent instances.
438// This memberfunction is only kept for backward compatibility.
439
440 Set(stamp.GetDate(),stamp.GetTime(),0,kTRUE,0);
d16062ac 441}
442///////////////////////////////////////////////////////////////////////////
387a745b 443void AliEvent::SetDayTime(TDatime& stamp)
444{
445// Set the date and time stamp for this event.
446// The entered date/time will be interpreted as being the local date/time
447// and the accuracy is 1 second.
3ea81e9c 448//
387a745b 449// This function with the TDatime argument is mainly kept for backward
3ea81e9c 450// compatibility reasons.
451// It is recommended to use the corresponding AliTimestamp functionality
452// directly for AliEvent instances.
387a745b 453
3ea81e9c 454 Set(stamp.GetDate(),stamp.GetTime(),0,kFALSE,0);
387a745b 455}
456///////////////////////////////////////////////////////////////////////////
d16062ac 457void AliEvent::SetRunNumber(Int_t run)
458{
459// Set the run number for this event
460 fRun=run;
461}
462///////////////////////////////////////////////////////////////////////////
463void AliEvent::SetEventNumber(Int_t evt)
464{
465// Set the event number for this event
466 fEvent=evt;
467}
468///////////////////////////////////////////////////////////////////////////
261c0caf 469TTimeStamp AliEvent::GetDayTime() const
d16062ac 470{
471// Provide the date and time stamp for this event
3ea81e9c 472//
473// Note : Since the introduction of the more versatile class AliTimestamp
474// and the fact that AliEvent has now been derived from it,
475// this memberfunction has become obsolete.
476// It is recommended to use the corresponding AliTimestamp
477// functionality directly for AliEvent instances.
478// This memberfunction is only kept for backward compatibility.
479
480 return (TTimeStamp)(*this);
d16062ac 481}
482///////////////////////////////////////////////////////////////////////////
261c0caf 483Int_t AliEvent::GetRunNumber() const
d16062ac 484{
485// Provide the run number for this event
486 return fRun;
487}
488///////////////////////////////////////////////////////////////////////////
261c0caf 489Int_t AliEvent::GetEventNumber() const
d16062ac 490{
491// Provide the event number for this event
492 return fEvent;
493}
494///////////////////////////////////////////////////////////////////////////
da17f667 495void AliEvent::SetProjectile(Int_t a,Int_t z,Double_t pnuc,Int_t id)
4575fcea 496{
da17f667 497// Set the projectile A, Z, momentum per nucleon and user defined particle ID.
25eefd00 498// If not explicitly specified by the user, the projectile particle ID is set
499// to zero by default and will not be stored in the event structure.
500// The projectile specifications will be stored in a device named "Beam"
501// which is an instance of AliSignal.
502// As such these data are easily retrievable from the event structure.
503// However, for backward compatibility reasons the beam data can also be
504// retrieved via memberfunctions like GetProjectileA() etc...
505
506 Int_t newdev=0;
507
508 AliSignal* beam=(AliSignal*)GetDevice("Beam");
509
510 if (!beam)
511 {
512 beam=new AliSignal();
513 beam->SetNameTitle("Beam","Beam and target specifications");
514 newdev=1;
515 }
516
517 if (a || z)
518 {
519 beam->AddNamedSlot("Aproj");
520 beam->SetSignal(a,"Aproj");
521 beam->AddNamedSlot("Zproj");
522 beam->SetSignal(z,"Zproj");
523 }
524 beam->AddNamedSlot("Pnucproj");
525 beam->SetSignal(pnuc,"Pnucproj");
526 if (id)
527 {
528 beam->AddNamedSlot("Idproj");
529 beam->SetSignal(id,"Idproj");
530 }
531
532 if (newdev)
533 {
534 AddDevice(beam);
535 if (fDevCopy) delete beam;
536 }
4575fcea 537}
538///////////////////////////////////////////////////////////////////////////
261c0caf 539Int_t AliEvent::GetProjectileA() const
4575fcea 540{
541// Provide the projectile A value.
25eefd00 542 Int_t val=0;
543 AliSignal* beam=(AliSignal*)GetDevice("Beam");
544 if (beam) val=int(beam->GetSignal("Aproj"));
545 return val;
4575fcea 546}
547///////////////////////////////////////////////////////////////////////////
261c0caf 548Int_t AliEvent::GetProjectileZ() const
4575fcea 549{
550// Provide the projectile Z value.
25eefd00 551 Int_t val=0;
552 AliSignal* beam=(AliSignal*)GetDevice("Beam");
553 if (beam) val=int(beam->GetSignal("Zproj"));
554 return val;
4575fcea 555}
556///////////////////////////////////////////////////////////////////////////
261c0caf 557Double_t AliEvent::GetProjectilePnuc() const
4575fcea 558{
559// Provide the projectile momentum value per nucleon.
25eefd00 560 Double_t val=0;
561 AliSignal* beam=(AliSignal*)GetDevice("Beam");
562 if (beam) val=beam->GetSignal("Pnucproj");
563 return val;
4575fcea 564}
565///////////////////////////////////////////////////////////////////////////
261c0caf 566Int_t AliEvent::GetProjectileId() const
4575fcea 567{
da17f667 568// Provide the user defined particle ID of the projectile.
25eefd00 569 Int_t val=0;
570 AliSignal* beam=(AliSignal*)GetDevice("Beam");
571 if (beam) val=int(beam->GetSignal("Idproj"));
572 return val;
da17f667 573}
574///////////////////////////////////////////////////////////////////////////
575void AliEvent::SetTarget(Int_t a,Int_t z,Double_t pnuc,Int_t id)
576{
577// Set the target A, Z, momentum per nucleon and user defined particle ID.
25eefd00 578// If not explicitly specified by the user, the target particle ID is set
579// to zero by default and will not be stored in the event structure.
580// The target specifications will be stored in a device named "Beam"
581// which is an instance of AliSignal.
582// As such these data are easily retrievable from the event structure.
583// However, for backward compatibility reasons the beam data can also be
584// retrieved via memberfunctions like GetTargetA() etc...
585
586 Int_t newdev=0;
587
588 AliSignal* beam=(AliSignal*)GetDevice("Beam");
589
590 if (!beam)
591 {
592 beam=new AliSignal();
593 beam->SetNameTitle("Beam","Beam and target specifications");
594 newdev=1;
595 }
596
597 if (a || z)
598 {
599 beam->AddNamedSlot("Atarg");
600 beam->SetSignal(a,"Atarg");
601 beam->AddNamedSlot("Ztarg");
602 beam->SetSignal(z,"Ztarg");
603 }
604 beam->AddNamedSlot("Pnuctarg");
605 beam->SetSignal(pnuc,"Pnuctarg");
606 if (id)
607 {
608 beam->AddNamedSlot("Idtarg");
609 beam->SetSignal(id,"Idtarg");
610 }
611
612 if (newdev)
613 {
614 AddDevice(beam);
615 if (fDevCopy) delete beam;
616 }
4575fcea 617}
618///////////////////////////////////////////////////////////////////////////
261c0caf 619Int_t AliEvent::GetTargetA() const
4575fcea 620{
621// Provide the target A value.
25eefd00 622 Int_t val=0;
623 AliSignal* beam=(AliSignal*)GetDevice("Beam");
624 if (beam) val=int(beam->GetSignal("Atarg"));
625 return val;
4575fcea 626}
627///////////////////////////////////////////////////////////////////////////
261c0caf 628Int_t AliEvent::GetTargetZ() const
4575fcea 629{
630// Provide the target Z value.
25eefd00 631 Int_t val=0;
632 AliSignal* beam=(AliSignal*)GetDevice("Beam");
633 if (beam) val=int(beam->GetSignal("Ztarg"));
634 return val;
4575fcea 635}
636///////////////////////////////////////////////////////////////////////////
261c0caf 637Double_t AliEvent::GetTargetPnuc() const
4575fcea 638{
639// Provide the target momentum value per nucleon.
25eefd00 640 Double_t val=0;
641 AliSignal* beam=(AliSignal*)GetDevice("Beam");
642 if (beam) val=beam->GetSignal("Pnuctarg");
643 return val;
4575fcea 644}
645///////////////////////////////////////////////////////////////////////////
261c0caf 646Int_t AliEvent::GetTargetId() const
da17f667 647{
648// Provide the user defined particle ID of the target.
25eefd00 649 Int_t val=0;
650 AliSignal* beam=(AliSignal*)GetDevice("Beam");
651 if (beam) val=int(beam->GetSignal("Idtarg"));
652 return val;
da17f667 653}
654///////////////////////////////////////////////////////////////////////////
3ea81e9c 655void AliEvent::HeaderData()
d16062ac 656{
657// Provide event header information
47dddbe4 658 const char* name=GetName();
659 const char* title=GetTitle();
47dddbe4 660 cout << " *" << ClassName() << "::Data*";
661 if (strlen(name)) cout << " Name : " << GetName();
662 if (strlen(title)) cout << " Title : " << GetTitle();
663 cout << endl;
3ea81e9c 664 Date(1);
ea0b5b7f 665 cout << " Run : " << fRun << " Event : " << fEvent << endl;
666 ShowDevices(0);
667 ShowTracks(0);
d16062ac 668}
669///////////////////////////////////////////////////////////////////////////
1f241680 670void AliEvent::Data(TString f,TString u)
d16062ac 671{
672// Provide event information within the coordinate frame f
1f241680 673//
674// The string argument "u" allows to choose between different angular units
675// in case e.g. a spherical frame is selected.
676// u = "rad" : angles provided in radians
677// "deg" : angles provided in degrees
678//
679// The defaults are f="car" and u="rad".
680
84bb7c66 681 HeaderData();
1f241680 682 AliVertex::Data(f,u);
d16062ac 683}
684///////////////////////////////////////////////////////////////////////////
261c0caf 685Int_t AliEvent::GetNdevices() const
7849a8ab 686{
1c01b4f8 687// Provide the number of stored devices
688 Int_t ndevs=0;
689 if (fDevices) ndevs=fDevices->GetEntries();
690 return ndevs;
7849a8ab 691}
692///////////////////////////////////////////////////////////////////////////
1c01b4f8 693void AliEvent::AddDevice(TObject& d)
7849a8ab 694{
1c01b4f8 695// Add a device to the event.
696//
697// Note :
698// In case a private copy is made, this is performed via the Clone() memberfunction.
699// All devices (i.e. classes derived from TObject) have the default TObject::Clone()
700// memberfunction.
701// However, devices generally contain an internal (signal) data structure
702// which may include pointers to other objects. Therefore it is recommended to provide
703// for all devices a specific copy constructor and override the default Clone()
704// memberfunction using this copy constructor.
705// An example for this may be seen from AliCalorimeter.
706
707 if (!fDevices)
6516b62d 708 {
1c01b4f8 709 fDevices=new TObjArray();
710 if (fDevCopy) fDevices->SetOwner();
6516b62d 711 }
7849a8ab 712
1c01b4f8 713 // Add the device to this event
714 if (fDevCopy)
7849a8ab 715 {
1c01b4f8 716 fDevices->Add(d.Clone());
7849a8ab 717 }
718 else
719 {
1c01b4f8 720 fDevices->Add(&d);
7849a8ab 721 }
722}
723///////////////////////////////////////////////////////////////////////////
1c01b4f8 724void AliEvent::SetDevCopy(Int_t j)
7849a8ab 725{
1c01b4f8 726// (De)activate the creation of private copies of the added devices.
727// j=0 ==> No private copies are made; pointers of original devices are stored.
728// j=1 ==> Private copies of the devices are made and these pointers are stored.
729//
730//
731// Notes :
732// In case a private copy is made, this is performed via the Clone() memberfunction.
733// All devices (i.e. classes derived from TObject) have the default TObject::Clone()
734// memberfunction.
735// However, devices generally contain an internal (signal) data structure
736// which may include pointers to other objects. Therefore it is recommended to provide
737// for all devices a specific copy constructor and override the default Clone()
738// memberfunction using this copy constructor.
739// An example for this may be seen from AliCalorimeter.
740//
741// Once the storage contains pointer(s) to device(s) one cannot
742// change the DevCopy mode anymore.
743// To change the DevCopy mode for an existing AliEvent containing
744// devices one first has to invoke Reset().
745
746 if (!fDevices)
7849a8ab 747 {
748 if (j==0 || j==1)
749 {
1c01b4f8 750 fDevCopy=j;
7849a8ab 751 }
752 else
753 {
1c01b4f8 754 cout << " *" << ClassName() << "::SetDevCopy* Invalid argument : " << j << endl;
7849a8ab 755 }
756 }
757 else
758 {
1c01b4f8 759 cout << " *" << ClassName() << "::SetDevCopy* Storage already contained devices."
760 << " ==> DevCopy mode not changed." << endl;
7849a8ab 761 }
762}
763///////////////////////////////////////////////////////////////////////////
261c0caf 764Int_t AliEvent::GetDevCopy() const
7849a8ab 765{
1c01b4f8 766// Provide value of the DevCopy mode.
767// 0 ==> No private copies are made; pointers of original devices are stored.
768// 1 ==> Private copies of the devices are made and these pointers are stored.
769//
770// Note :
771// In case a private copy is made, this is performed via the Clone() memberfunction.
772// All devices (i.e. classes derived from TObject) have the default TObject::Clone()
773// memberfunction.
774// However, devices generally contain an internal (signal) data structure
775// which may include pointers to other objects. Therefore it is recommended to provide
776// for all devices a specific copy constructor and override the default Clone()
777// memberfunction using this copy constructor.
778// An example for this may be seen from AliCalorimeter.
779
780 return fDevCopy;
7849a8ab 781}
782///////////////////////////////////////////////////////////////////////////
261c0caf 783TObject* AliEvent::GetDevice(Int_t i) const
7849a8ab 784{
1c01b4f8 785// Return the i-th device of this event.
786// The first device corresponds to i=1.
787
788 if (!fDevices)
7849a8ab 789 {
7849a8ab 790 return 0;
791 }
792 else
793 {
1c01b4f8 794 Int_t ndevs=GetNdevices();
795 if (i<=0 || i>ndevs)
7849a8ab 796 {
1c01b4f8 797 cout << " *" << ClassName() << "::GetDevice* Invalid argument i : " << i
798 << " ndevs = " << ndevs << endl;
7849a8ab 799 return 0;
800 }
801 else
802 {
1c01b4f8 803 return fDevices->At(i-1);
7849a8ab 804 }
805 }
806}
807///////////////////////////////////////////////////////////////////////////
261c0caf 808TObject* AliEvent::GetDevice(TString name) const
7849a8ab 809{
1c01b4f8 810// Return the device with name tag "name"
811 if (!fDevices)
7849a8ab 812 {
7849a8ab 813 return 0;
814 }
815 else
816 {
7849a8ab 817 TString s;
1c01b4f8 818 Int_t ndevs=GetNdevices();
819 for (Int_t i=0; i<ndevs; i++)
7849a8ab 820 {
1c01b4f8 821 TObject* dev=fDevices->At(i);
822 if (dev)
35044448 823 {
1c01b4f8 824 s=dev->GetName();
825 if (s == name) return dev;
35044448 826 }
7849a8ab 827 }
828
829 return 0; // No matching name found
830 }
831}
832///////////////////////////////////////////////////////////////////////////
4f368c8c 833TObject* AliEvent::GetIdDevice(Int_t id) const
834{
835// Return the device with unique identifier "id".
836 if (!fDevices || id<0) return 0;
837
838 Int_t idx=0;
839 for (Int_t i=0; i<GetNdevices(); i++)
840 {
841 TObject* dev=fDevices->At(i);
842 if (dev)
843 {
844 idx=dev->GetUniqueID();
845 if (idx==id) return dev;
846 }
847 }
848 return 0; // No matching id found
849}
850///////////////////////////////////////////////////////////////////////////
ea0b5b7f 851void AliEvent::ShowDevices(Int_t mode) const
1ce8a857 852{
1c01b4f8 853// Provide an overview of the available devices.
ea0b5b7f 854// The argument mode determines the amount of information as follows :
855// mode = 0 ==> Only printout of the number of devices
856// 1 ==> Provide a listing with 1 line of info for each device
857//
858// The default is mode=1.
859//
1c01b4f8 860 Int_t ndevs=GetNdevices();
861 if (ndevs)
1ce8a857 862 {
ea0b5b7f 863 if (!mode)
1ce8a857 864 {
ea0b5b7f 865 cout << " There are " << ndevs << " devices available." << endl;
866 }
867 else
868 {
869 cout << " The following " << ndevs << " devices are available :" << endl;
870 for (Int_t i=1; i<=ndevs; i++)
1c01b4f8 871 {
ea0b5b7f 872 TObject* dev=GetDevice(i);
873 if (dev)
874 {
875 const char* name=dev->GetName();
876 cout << " Device number : " << i;
877 cout << " Class : " << dev->ClassName() << " Id : " << dev->GetUniqueID();
878 if (strlen(name)) cout << " Name : " << name;
879 if (dev->InheritsFrom("AliDevice")) cout << " Nhits : " << ((AliDevice*)dev)->GetNhits();
880 if (dev->InheritsFrom("AliSignal")) cout << " Nwaveforms : " << ((AliSignal*)dev)->GetNwaveforms();
881 cout << endl;
882 }
1c01b4f8 883 }
1ce8a857 884 }
885 }
886 else
887 {
1c01b4f8 888 cout << " No devices present for this event." << endl;
1ce8a857 889 }
890}
891///////////////////////////////////////////////////////////////////////////
27e6d856 892TObjArray* AliEvent::GetDevices(const char* classname)
893{
894// Provide the references to the various devices derived from the
895// specified class.
896 if (fDevs) fDevs->Clear();
897
898 Int_t ndev=GetNdevices();
899 for (Int_t idev=1; idev<=ndev; idev++)
900 {
901 TObject* obj=GetDevice(idev);
902 if (!obj) continue;
903
904 if (obj->InheritsFrom(classname))
905 {
906 if (!fDevs) fDevs=new TObjArray();
907 fDevs->Add(obj);
908 }
909 }
910 return fDevs;
911}
912///////////////////////////////////////////////////////////////////////////
7a086578 913Int_t AliEvent::GetNhits(const char* classname)
914{
915// Provide the number of hits registered to the specified device class.
916// The specified device class has to be derived from AliDevice.
917// It is possible to indicate with the argument "classname" a specific
918// device instead of a whole class of devices. However, in such a case
919// it is more efficient to use the GetDevice() memberfunction directly.
920 LoadHits(classname);
921 Int_t nhits=0;
922 if (fHits) nhits=fHits->GetEntries();
923 return nhits;
924}
925///////////////////////////////////////////////////////////////////////////
926TObjArray* AliEvent::GetHits(const char* classname)
927{
928// Provide the references to all the hits registered to the specified
929// device class.
930// The specified device class has to be derived from AliDevice.
931// It is possible to indicate with the argument "classname" a specific
932// device instead of a whole class of devices. However, in such a case
933// it is more efficient to use the GetDevice() memberfunction directly.
934 LoadHits(classname);
935 return fHits;
936}
937///////////////////////////////////////////////////////////////////////////
4f368c8c 938AliSignal* AliEvent::GetIdHit(Int_t id,const char* classname)
939{
940// Return the hit with unique identifier "id" for the specified device class.
941 if (id<0) return 0;
942
943 Int_t nhits=GetNhits(classname);
944 if (!nhits) return 0;
945
946 AliSignal* sx=0;
947 Int_t sid=0;
948 for (Int_t i=0; i<nhits; i++)
949 {
950 sx=(AliSignal*)fHits->At(i);
951 if (sx)
952 {
953 sid=sx->GetUniqueID();
954 if (id==sid) return sx;
955 }
956 }
957 return 0; // No matching id found
958}
959///////////////////////////////////////////////////////////////////////////
7a086578 960void AliEvent::LoadHits(const char* classname)
961{
962// Load the references to the various hits registered to the specified
963// device class.
964// The specified device class has to be derived from AliDevice.
965 if (fHits) fHits->Clear();
966
967 Int_t ndev=GetNdevices();
968 for (Int_t idev=1; idev<=ndev; idev++)
969 {
970 TObject* obj=GetDevice(idev);
971 if (!obj) continue;
972
973 if (obj->InheritsFrom(classname) && obj->InheritsFrom("AliDevice"))
974 {
975 AliDevice* dev=(AliDevice*)GetDevice(idev);
976 Int_t nhits=dev->GetNhits();
977 if (nhits)
978 {
979 if (!fHits) fHits=new TObjArray();
980 for (Int_t ih=1; ih<=nhits; ih++)
981 {
982 AliSignal* sx=dev->GetHit(ih);
983 if (sx) fHits->Add(sx);
984 }
985 }
986 }
987 }
988}
989///////////////////////////////////////////////////////////////////////////
27e6d856 990TObjArray* AliEvent::SortHits(const char* classname,Int_t idx,Int_t mode,Int_t mcal)
7a086578 991{
965bd237 992// Order the references to the various hits registered to the specified
993// device class. The ordered array is returned as a TObjArray.
7a086578 994// A "hit" represents an abstract object which is derived from AliSignal.
995// The user can specify the index of the signal slot to perform the sorting on.
996// By default the slotindex will be 1.
997// Via the "mode" argument the user can specify ordering in decreasing
998// order (mode=-1) or ordering in increasing order (mode=1).
999// The default is mode=-1.
1000// Signals which were declared as "Dead" will be rejected.
27e6d856 1001// The gain etc... corrected signals will be used in the ordering process as
1002// specified by the "mcal" argument. The definition of this "mcal" parameter
1003// corresponds to the signal correction mode described in the GetSignal
1004// memberfunction of class AliSignal.
1005// The default is mcal=1 (for backward compatibility reasons).
965bd237 1006//
1007// For more extended functionality see class AliDevice.
1008
1009 if (idx<=0 || abs(mode)!=1) return 0;
1010
1011 LoadHits(classname);
1012
1013 AliDevice dev;
27e6d856 1014 TObjArray* ordered=dev.SortHits(idx,mode,fHits,mcal);
7b825f44 1015
1016 if (fHits)
7a086578 1017 {
7b825f44 1018 delete fHits;
1019 fHits=0;
1020 }
7b825f44 1021 if (ordered) fHits=new TObjArray(*ordered);
1022 return fHits;
7a086578 1023}
1024///////////////////////////////////////////////////////////////////////////
27e6d856 1025TObjArray* AliEvent::SortHits(const char* classname,TString name,Int_t mode,Int_t mcal)
7a086578 1026{
965bd237 1027// Order the references to the various hits registered to the specified
1028// device class. The ordered array is returned as a TObjArray.
7a086578 1029// A "hit" represents an abstract object which is derived from AliSignal.
1030// The user can specify the name of the signal slot to perform the sorting on.
1031// In case no matching slotname is found, the signal will be skipped.
1032// Via the "mode" argument the user can specify ordering in decreasing
1033// order (mode=-1) or ordering in increasing order (mode=1).
1034// The default is mode=-1.
1035// Signals which were declared as "Dead" will be rejected.
27e6d856 1036// The gain etc... corrected signals will be used in the ordering process as
1037// specified by the "mcal" argument. The definition of this "mcal" parameter
1038// corresponds to the signal correction mode described in the GetSignal
1039// memberfunction of class AliSignal.
1040// The default is mcal=1 (for backward compatibility reasons).
965bd237 1041//
1042// For more extended functionality see class AliDevice.
1043
1044 if (abs(mode)!=1) return 0;
1045
1046 LoadHits(classname);
1047
1048 AliDevice dev;
27e6d856 1049 TObjArray* ordered=dev.SortHits(name,mode,fHits,mcal);
7b825f44 1050
1051 if (fHits)
7a086578 1052 {
7b825f44 1053 delete fHits;
1054 fHits=0;
1055 }
965bd237 1056 if (ordered) fHits=new TObjArray(*ordered);
1057 return fHits;
1058}
1059///////////////////////////////////////////////////////////////////////////
27e6d856 1060void AliEvent::GetExtremes(const char* classname,Float_t& vmin,Float_t& vmax,Int_t idx,Int_t mode)
965bd237 1061{
1062// Provide the min. and max. signal values of the various hits registered
1063// to the specified device class.
1064// The input argument "idx" denotes the index of the signal slots to be investigated.
1065// The default is idx=1;
1066// Signals which were declared as "Dead" will be rejected.
27e6d856 1067// The gain etc... corrected signals will be used in the process as specified
1068// by the "mode" argument. The definition of this "mode" parameter corresponds to
1069// the description provided in the GetSignal memberfunction of class AliSignal.
1070// The default is mode=1 (for backward compatibility reasons).
965bd237 1071//
1072// For more extended functionality see class AliDevice.
1073
1074 if (idx<=0) return;
1075
1076 LoadHits(classname);
1077
1078 AliDevice dev;
27e6d856 1079 dev.GetExtremes(vmin,vmax,idx,fHits,mode);
965bd237 1080}
1081///////////////////////////////////////////////////////////////////////////
27e6d856 1082void AliEvent::GetExtremes(const char* classname,Float_t& vmin,Float_t& vmax,TString name,Int_t mode)
965bd237 1083{
1084// Provide the min. and max. signal values of the various hits registered
1085// to the specified device class.
1086// The input argument "name" denotes the name of the signal slots to be investigated.
1087// Signals which were declared as "Dead" will be rejected.
27e6d856 1088// The gain etc... corrected signals will be used in the process as specified
1089// by the "mode" argument. The definition of this "mode" parameter corresponds to
1090// the description provided in the GetSignal memberfunction of class AliSignal.
1091// The default is mode=1 (for backward compatibility reasons).
965bd237 1092//
1093// For more extended functionality see class AliDevice.
1094
1095 LoadHits(classname);
1096
1097 AliDevice dev;
27e6d856 1098 dev.GetExtremes(vmin,vmax,name,fHits,mode);
965bd237 1099}
1100///////////////////////////////////////////////////////////////////////////
27e6d856 1101void AliEvent::DisplayHits(const char* classname,Int_t idx,Float_t scale,Int_t dp,Int_t mode,Int_t mcol)
965bd237 1102{
1103// 3D color display of the various hits registered to the specified device class.
1104// The user can specify the index (default=1) of the signal slot to perform the display for.
1105// The marker size will indicate the absolute value of the signal (specified by the slotindex)
1106// as a percentage of the input argument "scale".
1107// In case scale<0 the maximum absolute signal value encountered in the hit array will be used
1108// to define the 100% scale. The default is scale=-1.
1109// In case dp=1 the owning device position will be used, otherwise the hit position will
1110// be used in the display. The default is dp=0.
27e6d856 1111// Via the "mcol" argument the user can specify the marker color (see TPolyMarker3D).
1112// The default is mcol=blue.
965bd237 1113// Signals which were declared as "Dead" will not be displayed.
1114// The gain etc... corrected signals will be used to determine the marker size.
27e6d856 1115// The gain correction is performed according to "mode" argument. The definition of this
1116// "mode" parameter corresponds to the description provided in the GetSignal
1117// memberfunction of class AliSignal.
1118// The default is mode=1 (for backward compatibility reasons).
965bd237 1119//
1120// For more extended functionality see class AliDevice.
1121//
1122// Note :
1123// ------
1124// Before any display activity, a TCanvas and a TView have to be initiated
1125// first by the user like for instance
1126//
1127// TCanvas* c1=new TCanvas("c1","c1");
1128// TView* view=new TView(1);
1129// view->SetRange(-1000,-1000,-1000,1000,1000,1000);
1130// view->ShowAxis();
1131
1132 if (idx<=0) return;
1133
1134 LoadHits(classname);
1135
1136 AliDevice* dev=new AliDevice();
27e6d856 1137 dev->DisplayHits(idx,scale,fHits,dp,mode,mcol);
965bd237 1138
1139 if (fDisplay)
1140 {
1141 delete fDisplay;
1142 fDisplay=0;
1143 }
1144 fDisplay=dev;
1145}
1146///////////////////////////////////////////////////////////////////////////
27e6d856 1147void AliEvent::DisplayHits(const char* classname,TString name,Float_t scale,Int_t dp,Int_t mode,Int_t mcol)
965bd237 1148{
1149// 3D color display of the various hits registered to the specified device class.
1150// The user can specify the name of the signal slot to perform the display for.
1151// The marker size will indicate the absolute value of the signal (specified by the slotname)
1152// as a percentage of the input argument "scale".
1153// In case scale<0 the maximum absolute signal value encountered in the hit array will be used
1154// to define the 100% scale. The default is scale=-1.
1155// In case dp=1 the owning device position will be used, otherwise the hit position will
1156// be used in the display. The default is dp=0.
1157// The marker size will indicate the percentage of the maximum encountered value
1158// of the absolute value of the name-specified input signal slots.
27e6d856 1159// Via the "mcol" argument the user can specify the marker color (see TPolyMarker3D).
1160// The default is mcol=blue.
965bd237 1161// Signals which were declared as "Dead" will not be displayed.
1162// The gain etc... corrected signals will be used to determine the marker size.
27e6d856 1163// The gain correction is performed according to "mode" argument. The definition of this
1164// "mode" parameter corresponds to the description provided in the GetSignal
1165// memberfunction of class AliSignal.
1166// The default is mode=1 (for backward compatibility reasons).
965bd237 1167//
1168// For more extended functionality see class AliDevice.
1169//
1170// Note :
1171// ------
1172// Before any display activity, a TCanvas and a TView have to be initiated
1173// first by the user like for instance
1174//
1175// TCanvas* c1=new TCanvas("c1","c1");
1176// TView* view=new TView(1);
1177// view->SetRange(-1000,-1000,-1000,1000,1000,1000);
1178// view->ShowAxis();
1179
1180 LoadHits(classname);
1181
1182 AliDevice* dev=new AliDevice();
27e6d856 1183 dev->DisplayHits(name,scale,fHits,dp,mode,mcol);
965bd237 1184
1185 if (fDisplay)
1186 {
1187 delete fDisplay;
1188 fDisplay=0;
1189 }
1190 fDisplay=dev;
1191}
1192///////////////////////////////////////////////////////////////////////////
27e6d856 1193TObjArray* AliEvent::SortDevices(const char* classname,TString name,Int_t mode,Int_t mcal)
965bd237 1194{
1195// Order the references to the various devices based on hit signals registered
1196// to the specified device class. The ordered array is returned as a TObjArray.
1197// A "hit" represents an abstract object which is derived from AliSignal.
1198// The user can specify the name of the signal slot to perform the sorting on.
1199// In case no matching slotname is found, the signal will be skipped.
1200// Via the "mode" argument the user can specify ordering in decreasing
1201// order (mode=-1) or ordering in increasing order (mode=1).
1202// The default is mode=-1.
1203// Signals which were declared as "Dead" will be rejected.
27e6d856 1204// The gain etc... corrected signals will be used in the ordering process as
1205// specified by the "mcal" argument. The definition of this "mcal" parameter
1206// corresponds to the signal correction mode described in the GetSignal
1207// memberfunction of class AliSignal.
1208// The default is mcal=1 (for backward compatibility reasons).
965bd237 1209//
1210
27e6d856 1211 TObjArray* ordered=SortHits(classname,name,mode,mcal);
965bd237 1212
1213 if (!ordered) return 0;
1214
27e6d856 1215 TObjArray* devs=SortDevices(ordered,"*",0,mcal);
965bd237 1216 return devs;
1217}
1218///////////////////////////////////////////////////////////////////////////
27e6d856 1219TObjArray* AliEvent::SortDevices(const char* classname,Int_t idx,Int_t mode,Int_t mcal)
965bd237 1220{
1221// Order the references to the various devices based on hit signals registered
1222// to the specified device class. The ordered array is returned as a TObjArray.
1223// A "hit" represents an abstract object which is derived from AliSignal.
1224// The user can specify the index of the signal slot to perform the sorting on.
1225// By default the slotindex will be 1.
1226// Via the "mode" argument the user can specify ordering in decreasing
1227// order (mode=-1) or ordering in increasing order (mode=1).
1228// The default is mode=-1.
1229// Signals which were declared as "Dead" will be rejected.
27e6d856 1230// The gain etc... corrected signals will be used in the ordering process as
1231// specified by the "mcal" argument. The definition of this "mcal" parameter
1232// corresponds to the signal correction mode described in the GetSignal
1233// memberfunction of class AliSignal.
1234// The default is mcal=1 (for backward compatibility reasons).
965bd237 1235//
1236
27e6d856 1237 TObjArray* ordered=SortHits(classname,idx,mode,mcal);
7b825f44 1238
965bd237 1239 if (!ordered) return 0;
7b825f44 1240
27e6d856 1241 TObjArray* devs=SortDevices(ordered,0,0,mcal);
965bd237 1242 return devs;
1243}
1244///////////////////////////////////////////////////////////////////////////
27e6d856 1245TObjArray* AliEvent::SortDevices(TObjArray* hits,TString name,Int_t mode,Int_t mcal)
965bd237 1246{
1247// Order the references to the various devices based on hit signals contained
1248// in the input array. The ordered array is returned as a TObjArray.
1249// A "hit" represents an abstract object which is derived from AliSignal.
1250// The user can specify the name of the signal slot to perform the sorting on.
1251// In case no matching slotname is found, the signal will be skipped.
1252// Via the "mode" argument the user can specify ordering in decreasing
1253// order (mode=-1), ordering in increasing order (mode=1) or no ordering (mode=0).
1254// The latter option provides a means to quickly obtain an ordered devices list
1255// when the hits in the array were already ordered by the user. In this case
1256// the input argument "name" is irrelevant.
1257// The default is mode=-1.
1258// Signals which were declared as "Dead" will be rejected.
27e6d856 1259// The gain etc... corrected signals will be used in the ordering process as
1260// specified by the "mcal" argument. The definition of this "mcal" parameter
1261// corresponds to the signal correction mode described in the GetSignal
1262// memberfunction of class AliSignal.
1263// The default is mcal=1 (for backward compatibility reasons).
965bd237 1264//
1265
1266 if (!hits) return 0;
1267
1268 TObjArray* ordered=hits;
7b825f44 1269 AliDevice dev;
27e6d856 1270 if (mode) ordered=dev.SortHits(name,mode,hits,mcal);
965bd237 1271
1272 if (!ordered) return 0;
1273
1274 if (fOrdered)
1275 {
1276 fOrdered->Clear();
1277 }
1278 else
1279 {
1280 fOrdered=new TObjArray();
1281 }
1282
1283 Int_t nhits=ordered->GetEntries();
1284 Int_t exist=0;
1285 for (Int_t ih=0; ih<nhits; ih++)
1286 {
1287 AliSignal* sx=(AliSignal*)ordered->At(ih);
1288 if (!sx) continue;
1289 AliDevice* dx=sx->GetDevice();
1290 exist=0;
1291 for (Int_t id=0; id<fOrdered->GetEntries(); id++)
1292 {
1293 AliDevice* odx=(AliDevice*)fOrdered->At(id);
1294 if (dx==odx)
1295 {
1296 exist=1;
1297 break;
1298 }
1299 }
1300 if (!exist) fOrdered->Add(dx);
1301 }
1302 return fOrdered;
1303}
1304///////////////////////////////////////////////////////////////////////////
27e6d856 1305TObjArray* AliEvent::SortDevices(TObjArray* hits,Int_t idx,Int_t mode,Int_t mcal)
965bd237 1306{
1307// Order the references to the various devices based on hit signals contained
1308// in the input array. The ordered array is returned as a TObjArray.
1309// A "hit" represents an abstract object which is derived from AliSignal.
1310// The user can specify the index of the signal slot to perform the sorting on.
1311// By default the slotindex will be 1.
1312// Via the "mode" argument the user can specify ordering in decreasing
1313// order (mode=-1), ordering in increasing order (mode=1) or no ordering (mode=0).
1314// The latter option provides a means to quickly obtain an ordered devices list
1315// when the hits in the array were already ordered by the user. In this case
1316// the input argument "idx" is irrelevant.
1317// The default is mode=-1.
1318// Signals which were declared as "Dead" will be rejected.
27e6d856 1319// The gain etc... corrected signals will be used in the ordering process as
1320// specified by the "mcal" argument. The definition of this "mcal" parameter
1321// corresponds to the signal correction mode described in the GetSignal
1322// memberfunction of class AliSignal.
1323// The default is mcal=1 (for backward compatibility reasons).
965bd237 1324//
1325
1326 if (!hits) return 0;
1327
1328 TObjArray* ordered=hits;
1329 AliDevice dev;
27e6d856 1330 if (mode) ordered=dev.SortHits(idx,mode,hits,mcal);
965bd237 1331
1332 if (!ordered) return 0;
1333
1334 if (fOrdered)
1335 {
1336 fOrdered->Clear();
1337 }
1338 else
1339 {
1340 fOrdered=new TObjArray();
1341 }
1342
1343 Int_t nhits=ordered->GetEntries();
1344 Int_t exist=0;
1345 for (Int_t ih=0; ih<nhits; ih++)
1346 {
1347 AliSignal* sx=(AliSignal*)ordered->At(ih);
1348 if (!sx) continue;
1349 AliDevice* dx=sx->GetDevice();
1350 exist=0;
1351 for (Int_t id=0; id<fOrdered->GetEntries(); id++)
1352 {
1353 AliDevice* odx=(AliDevice*)fOrdered->At(id);
1354 if (dx==odx)
1355 {
1356 exist=1;
1357 break;
1358 }
1359 }
1360 if (!exist) fOrdered->Add(dx);
1361 }
1362 return fOrdered;
7a086578 1363}
1364///////////////////////////////////////////////////////////////////////////
261c0caf 1365TObject* AliEvent::Clone(const char* name) const
5f25234b 1366{
1367// Make a deep copy of the current object and provide the pointer to the copy.
1368// This memberfunction enables automatic creation of new objects of the
1369// correct type depending on the object type, a feature which may be very useful
1370// for containers when adding objects in case the container owns the objects.
1371// This feature allows to store either AliEvent objects or objects derived from
1372// AliEvent via some generic AddEvent memberfunction, provided these derived
1373// classes also have a proper Clone memberfunction.
1374
1375 AliEvent* evt=new AliEvent(*this);
1376 if (name)
1377 {
1378 if (strlen(name)) evt->SetName(name);
1379 }
1380 return evt;
1381}
1382///////////////////////////////////////////////////////////////////////////
d16062ac 1383