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.24 2004/07/06 13:34:16 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 devices like AliCalorimeters or AliDevice (derived) objects.
24 // All objects which are derived from TObject can be regarded as a device.
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.
32 // The basic functionality of AliEvent is identical to the one of AliVertex.
33 // So, an AliEvent may be used as the primary vertex with some additional
34 // functionality compared to AliVertex.
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.
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
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
47 // In this way the AliEvent just represents a 'logical structure' for the
51 // Modifications made to the original devices also affect the device
52 // objects which are stored in the AliEvent.
55 // Of every 'added' device a private copy will be made of which the pointer
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.
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.
65 // The copy is made using the Clone() memberfunction.
66 // All devices (i.e. classes derived from TObject) have the default TObject::Clone()
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.
72 // Examples for this may be seen from AliCalorimeter, AliSignal and AliDevice.
74 // See also the documentation provided for the memberfunction SetOwner().
76 // Coding example to make an event consisting of a primary vertex,
77 // 2 secondary vertices and a calorimeter.
78 // --------------------------------------------------------------
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)
85 // Specify the event object as the repository of all objects
86 // for the event building and physics analysis.
89 // evt.SetTrackCopy(1);
91 // Fill the event structure with the basic objects
93 // AliCalorimeter emcal1;
94 // AliCalorimeter emcal2;
96 // ... // code to fill the emcal1 and emcal2 calorimeter data
99 // evt.AddDevice(emcal1);
100 // evt.AddDevice(emcal2);
102 // // Assume AliTOF has been derived from AliDevice
106 // ... // code to fill the tof1 and tof2 data
109 // evt.AddDevice(tof1);
110 // evt.AddDevice(tof2);
112 // AliTrack* tx=new AliTrack();
113 // for (Int_t i=0; i<10; i++)
116 // ... // code to fill the track data
128 // Order and investigate all the hits of all the TOF devices
130 // TObjArray* hits=evt.GetHits("AliTOF");
131 // TObjArray* orderedtofs=evt.SortHits(hits);
133 // if (orderedtofs) nhits=orderedtofs->GetEntries();
134 // for (Int_t i=0; i<nhits; i++)
136 // AliSignal* sx=(AliSignal*)orderedtofs->At(i);
137 // if (sx) sx->Data();
140 // Order and investigate all the hits of all the calorimeter devices
142 // TObjArray* hits=evt.GetHits("AliCalorimeter");
143 // TObjArray* orderedcals=evt.SortHits(hits);
145 // if (orderedcals) nhits=orderedcals->GetEntries();
146 // for (Int_t i=0; i<nhits; i++)
148 // AliSignal* sx=(AliSignal*)orderedcals->At(i);
149 // if (sx) sx->Data();
152 // Build the event structure (vertices, jets, ...) for physics analysis
153 // based on the basic objects from the event repository.
156 // for (Int_t i=0; i<evt.GetNtracks(); i++)
158 // tx=evt.GetTrack(i);
160 // ... // code to fill the jet data
165 // tx=evt.GetTrack(1);
167 // tx=evt.GetTrack(2);
169 // tx=evt.GetTrack(3);
171 // tx=evt.GetTrack(4);
174 // Float_t rp[3]={2.4,0.1,-8.5};
175 // vp.SetPosition(rp,"car");
178 // tx=evt.GetTrack(5);
180 // tx=evt.GetTrack(6);
182 // tx=evt.GetTrack(7);
185 // Float_t r1[3]={1.6,-3.2,5.7};
186 // v1.SetPosition(r1,"car");
194 // Float_t r2[3]={6.2,4.8,1.3};
195 // v2.SetPosition(r2,"car");
197 // Specify the vertices v1 and v2 as secondary vertices of the primary
199 // vp.SetVertexCopy(1);
203 // Enter the physics structures into the event
204 // evt.SetVertexCopy(1);
205 // evt.AddVertex(vp,0);
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.
219 // Float_t etot=evt.GetEnergy();
220 // Ali3Vector ptot=evt.Get3Momentum();
222 // evt.GetPosition(loc,"sph");
223 // AliPosition r=v1.GetPosition();
225 // Int_t nt=v2.GetNtracks();
226 // AliTrack* tv=v2.GetTrack(1); // Access track number 1 of Vertex v2
230 // Int_t nv=evt.GetNvtx();
231 // AliVertex* vx=evt.GetVertex(1); // Access primary vertex
232 // Float_t e=vx->GetEnergy();
234 // Float_t M=evt.GetInvmass();
236 // Reconstruct the event from scratch
239 // evt.SetNvmax(25); // Increase initial no. of sec. vertices
241 // ... // code to create tracks etc...
244 // Note : All quantities are in GeV, GeV/c or GeV/c**2
246 //--- Author: Nick van Eijndhoven 27-may-2001 UU-SAP Utrecht
247 //- Modified: NvE $Date: 2004/07/06 13:34:16 $ UU-SAP Utrecht
248 ///////////////////////////////////////////////////////////////////////////
250 #include "AliEvent.h"
251 #include "Riostream.h"
253 ClassImp(AliEvent) // Class implementation to enable ROOT I/O
255 AliEvent::AliEvent() : AliVertex()
257 // Default constructor.
258 // All variables initialised to default values.
276 ///////////////////////////////////////////////////////////////////////////
277 AliEvent::AliEvent(Int_t n) : AliVertex(n)
279 // Create an event to hold initially a maximum of n tracks
280 // All variables initialised to default values
283 cout << " *** This AliVertex initialisation was invoked via the AliEvent ctor." << endl;
302 ///////////////////////////////////////////////////////////////////////////
303 AliEvent::~AliEvent()
305 // Default destructor
327 ///////////////////////////////////////////////////////////////////////////
328 AliEvent::AliEvent(const AliEvent& evt) : AliVertex(evt)
331 fDaytime=evt.fDaytime;
336 fPnucProj=evt.fPnucProj;
340 fPnucTarg=evt.fPnucTarg;
342 fDevCopy=evt.fDevCopy;
349 Int_t ndevs=evt.GetNdevices();
352 fDevices=new TObjArray(ndevs);
353 if (fDevCopy) fDevices->SetOwner();
354 for (Int_t i=1; i<=ndevs; i++)
356 TObject* dev=evt.GetDevice(i);
361 fDevices->Add(dev->Clone());
371 ///////////////////////////////////////////////////////////////////////////
372 void AliEvent::Reset()
374 // Reset all variables to default values
375 // The max. number of tracks is set to the initial value again
376 // The max. number of vertices is set to the default value again
377 // Note : The DevCopy mode is maintained as it was set by the user before.
414 ///////////////////////////////////////////////////////////////////////////
415 void AliEvent::SetOwner(Bool_t own)
417 // Set ownership of all added objects.
418 // The default parameter is own=kTRUE.
420 // Invokation of this memberfunction also sets all the copy modes
421 // (e.g. TrackCopy & co.) according to the value of own.
423 // This function (with own=kTRUE) is particularly useful when reading data
424 // from a tree/file, since Reset() will then actually remove all the
425 // added objects from memory irrespective of the copy mode settings
426 // during the tree/file creation process. In this way it provides a nice way
427 // of preventing possible memory leaks in the reading/analysis process.
429 // In addition this memberfunction can also be used as a shortcut to set all
430 // copy modes in one go during a tree/file creation process.
431 // However, in this case the user has to take care to only set/change the
432 // ownership (and copy mode) for empty objects (e.g. newly created objects
433 // or after invokation of the Reset() memberfunction) otherwise it will
434 // very likely result in inconsistent destructor behaviour.
438 if (fDevices) fDevices->SetOwner(own);
441 AliVertex::SetOwner(own);
443 ///////////////////////////////////////////////////////////////////////////
444 void AliEvent::SetDayTime(TTimeStamp& stamp)
446 // Set the date and time stamp for this event.
447 // An exact copy of the entered date/time stamp will be saved with an
448 // accuracy of 1 nanosecond.
451 ///////////////////////////////////////////////////////////////////////////
452 void AliEvent::SetDayTime(TDatime& stamp)
454 // Set the date and time stamp for this event.
455 // The entered date/time will be interpreted as being the local date/time
456 // and the accuracy is 1 second.
457 // This function with the TDatime argument is mainly kept for backward
458 // compatibility reasons. It is recommended to use the corresponding
459 // function with the TTimeStamp argument.
461 fDaytime.Set(stamp.GetDate(),stamp.GetTime(),0,kFALSE,0);
463 ///////////////////////////////////////////////////////////////////////////
464 void AliEvent::SetRunNumber(Int_t run)
466 // Set the run number for this event
469 ///////////////////////////////////////////////////////////////////////////
470 void AliEvent::SetEventNumber(Int_t evt)
472 // Set the event number for this event
475 ///////////////////////////////////////////////////////////////////////////
476 TTimeStamp AliEvent::GetDayTime() const
478 // Provide the date and time stamp for this event
481 ///////////////////////////////////////////////////////////////////////////
482 Int_t AliEvent::GetRunNumber() const
484 // Provide the run number for this event
487 ///////////////////////////////////////////////////////////////////////////
488 Int_t AliEvent::GetEventNumber() const
490 // Provide the event number for this event
493 ///////////////////////////////////////////////////////////////////////////
494 void AliEvent::SetProjectile(Int_t a,Int_t z,Double_t pnuc,Int_t id)
496 // Set the projectile A, Z, momentum per nucleon and user defined particle ID.
497 // By default the particle ID is set to zero.
503 ///////////////////////////////////////////////////////////////////////////
504 Int_t AliEvent::GetProjectileA() const
506 // Provide the projectile A value.
509 ///////////////////////////////////////////////////////////////////////////
510 Int_t AliEvent::GetProjectileZ() const
512 // Provide the projectile Z value.
515 ///////////////////////////////////////////////////////////////////////////
516 Double_t AliEvent::GetProjectilePnuc() const
518 // Provide the projectile momentum value per nucleon.
521 ///////////////////////////////////////////////////////////////////////////
522 Int_t AliEvent::GetProjectileId() const
524 // Provide the user defined particle ID of the projectile.
527 ///////////////////////////////////////////////////////////////////////////
528 void AliEvent::SetTarget(Int_t a,Int_t z,Double_t pnuc,Int_t id)
530 // Set the target A, Z, momentum per nucleon and user defined particle ID.
531 // By default the particle ID is set to zero.
537 ///////////////////////////////////////////////////////////////////////////
538 Int_t AliEvent::GetTargetA() const
540 // Provide the target A value.
543 ///////////////////////////////////////////////////////////////////////////
544 Int_t AliEvent::GetTargetZ() const
546 // Provide the target Z value.
549 ///////////////////////////////////////////////////////////////////////////
550 Double_t AliEvent::GetTargetPnuc() const
552 // Provide the target momentum value per nucleon.
555 ///////////////////////////////////////////////////////////////////////////
556 Int_t AliEvent::GetTargetId() const
558 // Provide the user defined particle ID of the target.
561 ///////////////////////////////////////////////////////////////////////////
562 void AliEvent::HeaderData() const
564 // Provide event header information
565 const char* name=GetName();
566 const char* title=GetTitle();
567 Int_t ndevs=GetNdevices();
568 cout << " *" << ClassName() << "::Data*";
569 if (strlen(name)) cout << " Name : " << GetName();
570 if (strlen(title)) cout << " Title : " << GetTitle();
572 cout << " " << fDaytime.AsString() << endl;
573 cout << " Run : " << fRun << " Event : " << fEvent
574 << " Number of devices : " << ndevs << endl;
576 if (ndevs) ShowDevices();
578 ///////////////////////////////////////////////////////////////////////////
579 void AliEvent::Data(TString f)
581 // Provide event information within the coordinate frame f
585 ///////////////////////////////////////////////////////////////////////////
586 Int_t AliEvent::GetNdevices() const
588 // Provide the number of stored devices
590 if (fDevices) ndevs=fDevices->GetEntries();
593 ///////////////////////////////////////////////////////////////////////////
594 void AliEvent::AddDevice(TObject& d)
596 // Add a device to the event.
599 // In case a private copy is made, this is performed via the Clone() memberfunction.
600 // All devices (i.e. classes derived from TObject) have the default TObject::Clone()
602 // However, devices generally contain an internal (signal) data structure
603 // which may include pointers to other objects. Therefore it is recommended to provide
604 // for all devices a specific copy constructor and override the default Clone()
605 // memberfunction using this copy constructor.
606 // An example for this may be seen from AliCalorimeter.
610 fDevices=new TObjArray();
611 if (fDevCopy) fDevices->SetOwner();
614 // Add the device to this event
617 fDevices->Add(d.Clone());
624 ///////////////////////////////////////////////////////////////////////////
625 void AliEvent::SetDevCopy(Int_t j)
627 // (De)activate the creation of private copies of the added devices.
628 // j=0 ==> No private copies are made; pointers of original devices are stored.
629 // j=1 ==> Private copies of the devices are made and these pointers are stored.
633 // In case a private copy is made, this is performed via the Clone() memberfunction.
634 // All devices (i.e. classes derived from TObject) have the default TObject::Clone()
636 // However, devices generally contain an internal (signal) data structure
637 // which may include pointers to other objects. Therefore it is recommended to provide
638 // for all devices a specific copy constructor and override the default Clone()
639 // memberfunction using this copy constructor.
640 // An example for this may be seen from AliCalorimeter.
642 // Once the storage contains pointer(s) to device(s) one cannot
643 // change the DevCopy mode anymore.
644 // To change the DevCopy mode for an existing AliEvent containing
645 // devices one first has to invoke Reset().
655 cout << " *" << ClassName() << "::SetDevCopy* Invalid argument : " << j << endl;
660 cout << " *" << ClassName() << "::SetDevCopy* Storage already contained devices."
661 << " ==> DevCopy mode not changed." << endl;
664 ///////////////////////////////////////////////////////////////////////////
665 Int_t AliEvent::GetDevCopy() const
667 // Provide value of the DevCopy mode.
668 // 0 ==> No private copies are made; pointers of original devices are stored.
669 // 1 ==> Private copies of the devices are made and these pointers are stored.
672 // In case a private copy is made, this is performed via the Clone() memberfunction.
673 // All devices (i.e. classes derived from TObject) have the default TObject::Clone()
675 // However, devices generally contain an internal (signal) data structure
676 // which may include pointers to other objects. Therefore it is recommended to provide
677 // for all devices a specific copy constructor and override the default Clone()
678 // memberfunction using this copy constructor.
679 // An example for this may be seen from AliCalorimeter.
683 ///////////////////////////////////////////////////////////////////////////
684 TObject* AliEvent::GetDevice(Int_t i) const
686 // Return the i-th device of this event.
687 // The first device corresponds to i=1.
695 Int_t ndevs=GetNdevices();
698 cout << " *" << ClassName() << "::GetDevice* Invalid argument i : " << i
699 << " ndevs = " << ndevs << endl;
704 return fDevices->At(i-1);
708 ///////////////////////////////////////////////////////////////////////////
709 TObject* AliEvent::GetDevice(TString name) const
711 // Return the device with name tag "name"
719 Int_t ndevs=GetNdevices();
720 for (Int_t i=0; i<ndevs; i++)
722 TObject* dev=fDevices->At(i);
726 if (s == name) return dev;
730 return 0; // No matching name found
733 ///////////////////////////////////////////////////////////////////////////
734 void AliEvent::ShowDevices() const
736 // Provide an overview of the available devices.
737 Int_t ndevs=GetNdevices();
740 cout << " The following " << ndevs << " devices are available :" << endl;
741 for (Int_t i=1; i<=ndevs; i++)
743 TObject* dev=GetDevice(i);
746 const char* name=dev->GetName();
747 cout << " Device number : " << i;
748 cout << " Class : " << dev->ClassName();
749 if (strlen(name)) cout << " Name : " << name;
750 if (dev->InheritsFrom("AliDevice")) cout << " Nhits : " << ((AliDevice*)dev)->GetNhits();
757 cout << " No devices present for this event." << endl;
760 ///////////////////////////////////////////////////////////////////////////
761 Int_t AliEvent::GetNhits(const char* classname)
763 // Provide the number of hits registered to the specified device class.
764 // The specified device class has to be derived from AliDevice.
765 // It is possible to indicate with the argument "classname" a specific
766 // device instead of a whole class of devices. However, in such a case
767 // it is more efficient to use the GetDevice() memberfunction directly.
770 if (fHits) nhits=fHits->GetEntries();
773 ///////////////////////////////////////////////////////////////////////////
774 TObjArray* AliEvent::GetHits(const char* classname)
776 // Provide the references to all the hits registered to the specified
778 // The specified device class has to be derived from AliDevice.
779 // It is possible to indicate with the argument "classname" a specific
780 // device instead of a whole class of devices. However, in such a case
781 // it is more efficient to use the GetDevice() memberfunction directly.
785 ///////////////////////////////////////////////////////////////////////////
786 void AliEvent::LoadHits(const char* classname)
788 // Load the references to the various hits registered to the specified
790 // The specified device class has to be derived from AliDevice.
791 if (fHits) fHits->Clear();
793 Int_t ndev=GetNdevices();
794 for (Int_t idev=1; idev<=ndev; idev++)
796 TObject* obj=GetDevice(idev);
799 if (obj->InheritsFrom(classname) && obj->InheritsFrom("AliDevice"))
801 AliDevice* dev=(AliDevice*)GetDevice(idev);
802 Int_t nhits=dev->GetNhits();
805 if (!fHits) fHits=new TObjArray();
806 for (Int_t ih=1; ih<=nhits; ih++)
808 AliSignal* sx=dev->GetHit(ih);
809 if (sx) fHits->Add(sx);
815 ///////////////////////////////////////////////////////////////////////////
816 TObjArray* AliEvent::SortHits(const char* classname,Int_t idx,Int_t mode)
818 // Order the references to the various hits registered to the specified
819 // device class. The ordered array is returned as a TObjArray.
820 // A "hit" represents an abstract object which is derived from AliSignal.
821 // The user can specify the index of the signal slot to perform the sorting on.
822 // By default the slotindex will be 1.
823 // Via the "mode" argument the user can specify ordering in decreasing
824 // order (mode=-1) or ordering in increasing order (mode=1).
825 // The default is mode=-1.
826 // Signals which were declared as "Dead" will be rejected.
827 // The gain etc... corrected signals will be used in the ordering process.
829 // For more extended functionality see class AliDevice.
831 if (idx<=0 || abs(mode)!=1) return 0;
836 TObjArray* ordered=dev.SortHits(idx,mode,fHits);
843 if (ordered) fHits=new TObjArray(*ordered);
846 ///////////////////////////////////////////////////////////////////////////
847 TObjArray* AliEvent::SortHits(const char* classname,TString name,Int_t mode)
849 // Order the references to the various hits registered to the specified
850 // device class. The ordered array is returned as a TObjArray.
851 // A "hit" represents an abstract object which is derived from AliSignal.
852 // The user can specify the name of the signal slot to perform the sorting on.
853 // In case no matching slotname is found, the signal will be skipped.
854 // Via the "mode" argument the user can specify ordering in decreasing
855 // order (mode=-1) or ordering in increasing order (mode=1).
856 // The default is mode=-1.
857 // Signals which were declared as "Dead" will be rejected.
858 // The gain etc... corrected signals will be used in the ordering process.
860 // For more extended functionality see class AliDevice.
862 if (abs(mode)!=1) return 0;
867 TObjArray* ordered=dev.SortHits(name,mode,fHits);
874 if (ordered) fHits=new TObjArray(*ordered);
877 ///////////////////////////////////////////////////////////////////////////
878 void AliEvent::GetExtremes(const char* classname,Float_t& vmin,Float_t& vmax,Int_t idx)
880 // Provide the min. and max. signal values of the various hits registered
881 // to the specified device class.
882 // The input argument "idx" denotes the index of the signal slots to be investigated.
883 // The default is idx=1;
884 // Signals which were declared as "Dead" will be rejected.
885 // The gain etc... corrected signals will be used in the process.
887 // For more extended functionality see class AliDevice.
894 dev.GetExtremes(vmin,vmax,idx,fHits);
896 ///////////////////////////////////////////////////////////////////////////
897 void AliEvent::GetExtremes(const char* classname,Float_t& vmin,Float_t& vmax,TString name)
899 // Provide the min. and max. signal values of the various hits registered
900 // to the specified device class.
901 // The input argument "name" denotes the name of the signal slots to be investigated.
902 // Signals which were declared as "Dead" will be rejected.
903 // The gain etc... corrected signals will be used in the process.
905 // For more extended functionality see class AliDevice.
910 dev.GetExtremes(vmin,vmax,name,fHits);
912 ///////////////////////////////////////////////////////////////////////////
913 void AliEvent::DisplayHits(const char* classname,Int_t idx,Float_t scale,Int_t dp,Int_t mstyle,Int_t mcol)
915 // 3D color display of the various hits registered to the specified device class.
916 // The user can specify the index (default=1) of the signal slot to perform the display for.
917 // The marker size will indicate the absolute value of the signal (specified by the slotindex)
918 // as a percentage of the input argument "scale".
919 // In case scale<0 the maximum absolute signal value encountered in the hit array will be used
920 // to define the 100% scale. The default is scale=-1.
921 // In case dp=1 the owning device position will be used, otherwise the hit position will
922 // be used in the display. The default is dp=0.
923 // Via the "mstyle" and "mcol" arguments the user can specify the marker style
924 // and color (see TPolyMarker3D) respectively.
925 // The defaults are mstyle="large scalable dot" and mcol=blue.
926 // Signals which were declared as "Dead" will not be displayed.
927 // The gain etc... corrected signals will be used to determine the marker size.
929 // For more extended functionality see class AliDevice.
933 // Before any display activity, a TCanvas and a TView have to be initiated
934 // first by the user like for instance
936 // TCanvas* c1=new TCanvas("c1","c1");
937 // TView* view=new TView(1);
938 // view->SetRange(-1000,-1000,-1000,1000,1000,1000);
945 AliDevice* dev=new AliDevice();
946 dev->DisplayHits(idx,scale,fHits,dp,mstyle,mcol);
955 ///////////////////////////////////////////////////////////////////////////
956 void AliEvent::DisplayHits(const char* classname,TString name,Float_t scale,Int_t dp,Int_t mstyle,Int_t mcol)
958 // 3D color display of the various hits registered to the specified device class.
959 // The user can specify the name of the signal slot to perform the display for.
960 // The marker size will indicate the absolute value of the signal (specified by the slotname)
961 // as a percentage of the input argument "scale".
962 // In case scale<0 the maximum absolute signal value encountered in the hit array will be used
963 // to define the 100% scale. The default is scale=-1.
964 // In case dp=1 the owning device position will be used, otherwise the hit position will
965 // be used in the display. The default is dp=0.
966 // The marker size will indicate the percentage of the maximum encountered value
967 // of the absolute value of the name-specified input signal slots.
968 // Via the "mstyle" and "mcol" arguments the user can specify the marker style
969 // and color (see TPolyMarker3D) respectively.
970 // The defaults are mstyle="large scalable dot" and mcol=blue.
971 // Signals which were declared as "Dead" will not be displayed.
972 // The gain etc... corrected signals will be used to determine the marker size.
974 // For more extended functionality see class AliDevice.
978 // Before any display activity, a TCanvas and a TView have to be initiated
979 // first by the user like for instance
981 // TCanvas* c1=new TCanvas("c1","c1");
982 // TView* view=new TView(1);
983 // view->SetRange(-1000,-1000,-1000,1000,1000,1000);
988 AliDevice* dev=new AliDevice();
989 dev->DisplayHits(name,scale,fHits,dp,mstyle,mcol);
998 ///////////////////////////////////////////////////////////////////////////
999 TObjArray* AliEvent::SortDevices(const char* classname,TString name,Int_t mode)
1001 // Order the references to the various devices based on hit signals registered
1002 // to the specified device class. The ordered array is returned as a TObjArray.
1003 // A "hit" represents an abstract object which is derived from AliSignal.
1004 // The user can specify the name of the signal slot to perform the sorting on.
1005 // In case no matching slotname is found, the signal will be skipped.
1006 // Via the "mode" argument the user can specify ordering in decreasing
1007 // order (mode=-1) or ordering in increasing order (mode=1).
1008 // The default is mode=-1.
1009 // Signals which were declared as "Dead" will be rejected.
1010 // The gain etc... corrected signals will be used in the ordering process.
1013 TObjArray* ordered=SortHits(classname,name,mode);
1015 if (!ordered) return 0;
1017 TObjArray* devs=SortDevices(ordered,"*",0);
1020 ///////////////////////////////////////////////////////////////////////////
1021 TObjArray* AliEvent::SortDevices(const char* classname,Int_t idx,Int_t mode)
1023 // Order the references to the various devices based on hit signals registered
1024 // to the specified device class. The ordered array is returned as a TObjArray.
1025 // A "hit" represents an abstract object which is derived from AliSignal.
1026 // The user can specify the index of the signal slot to perform the sorting on.
1027 // By default the slotindex will be 1.
1028 // Via the "mode" argument the user can specify ordering in decreasing
1029 // order (mode=-1) or ordering in increasing order (mode=1).
1030 // The default is mode=-1.
1031 // Signals which were declared as "Dead" will be rejected.
1032 // The gain etc... corrected signals will be used in the ordering process.
1035 TObjArray* ordered=SortHits(classname,idx,mode);
1037 if (!ordered) return 0;
1039 TObjArray* devs=SortDevices(ordered,0,0);
1042 ///////////////////////////////////////////////////////////////////////////
1043 TObjArray* AliEvent::SortDevices(TObjArray* hits,TString name,Int_t mode)
1045 // Order the references to the various devices based on hit signals contained
1046 // in the input array. The ordered array is returned as a TObjArray.
1047 // A "hit" represents an abstract object which is derived from AliSignal.
1048 // The user can specify the name of the signal slot to perform the sorting on.
1049 // In case no matching slotname is found, the signal will be skipped.
1050 // Via the "mode" argument the user can specify ordering in decreasing
1051 // order (mode=-1), ordering in increasing order (mode=1) or no ordering (mode=0).
1052 // The latter option provides a means to quickly obtain an ordered devices list
1053 // when the hits in the array were already ordered by the user. In this case
1054 // the input argument "name" is irrelevant.
1055 // The default is mode=-1.
1056 // Signals which were declared as "Dead" will be rejected.
1057 // The gain etc... corrected signals will be used in the ordering process.
1060 if (!hits) return 0;
1062 TObjArray* ordered=hits;
1064 if (mode) ordered=dev.SortHits(name,mode,hits);
1066 if (!ordered) return 0;
1074 fOrdered=new TObjArray();
1077 Int_t nhits=ordered->GetEntries();
1079 for (Int_t ih=0; ih<nhits; ih++)
1081 AliSignal* sx=(AliSignal*)ordered->At(ih);
1083 AliDevice* dx=sx->GetDevice();
1085 for (Int_t id=0; id<fOrdered->GetEntries(); id++)
1087 AliDevice* odx=(AliDevice*)fOrdered->At(id);
1094 if (!exist) fOrdered->Add(dx);
1098 ///////////////////////////////////////////////////////////////////////////
1099 TObjArray* AliEvent::SortDevices(TObjArray* hits,Int_t idx,Int_t mode)
1101 // Order the references to the various devices based on hit signals contained
1102 // in the input array. The ordered array is returned as a TObjArray.
1103 // A "hit" represents an abstract object which is derived from AliSignal.
1104 // The user can specify the index of the signal slot to perform the sorting on.
1105 // By default the slotindex will be 1.
1106 // Via the "mode" argument the user can specify ordering in decreasing
1107 // order (mode=-1), ordering in increasing order (mode=1) or no ordering (mode=0).
1108 // The latter option provides a means to quickly obtain an ordered devices list
1109 // when the hits in the array were already ordered by the user. In this case
1110 // the input argument "idx" is irrelevant.
1111 // The default is mode=-1.
1112 // Signals which were declared as "Dead" will be rejected.
1113 // The gain etc... corrected signals will be used in the ordering process.
1116 if (!hits) return 0;
1118 TObjArray* ordered=hits;
1120 if (mode) ordered=dev.SortHits(idx,mode,hits);
1122 if (!ordered) return 0;
1130 fOrdered=new TObjArray();
1133 Int_t nhits=ordered->GetEntries();
1135 for (Int_t ih=0; ih<nhits; ih++)
1137 AliSignal* sx=(AliSignal*)ordered->At(ih);
1139 AliDevice* dx=sx->GetDevice();
1141 for (Int_t id=0; id<fOrdered->GetEntries(); id++)
1143 AliDevice* odx=(AliDevice*)fOrdered->At(id);
1150 if (!exist) fOrdered->Add(dx);
1154 ///////////////////////////////////////////////////////////////////////////
1155 TObject* AliEvent::Clone(const char* name) const
1157 // Make a deep copy of the current object and provide the pointer to the copy.
1158 // This memberfunction enables automatic creation of new objects of the
1159 // correct type depending on the object type, a feature which may be very useful
1160 // for containers when adding objects in case the container owns the objects.
1161 // This feature allows to store either AliEvent objects or objects derived from
1162 // AliEvent via some generic AddEvent memberfunction, provided these derived
1163 // classes also have a proper Clone memberfunction.
1165 AliEvent* evt=new AliEvent(*this);
1168 if (strlen(name)) evt->SetName(name);
1172 ///////////////////////////////////////////////////////////////////////////