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 ///////////////////////////////////////////////////////////////////////////////
18 // TRD trigger class //
23 ///////////////////////////////////////////////////////////////////////////////
28 #include <TClonesArray.h>
29 #include <TObjArray.h>
33 #include "AliLoader.h"
35 #include "AliTRDdigitsManager.h"
36 #include "AliTRDgeometry.h"
37 #include "AliTRDdataArrayI.h"
38 #include "AliTRDcalibDB.h"
39 #include "AliTRDCommonParam.h"
40 #include "AliTRDrawData.h"
41 #include "AliTRDtrigger.h"
42 #include "AliTRDmodule.h"
43 #include "AliTRDmcmTracklet.h"
44 #include "AliTRDgtuTrack.h"
45 #include "AliTRDtrigParam.h"
46 #include "AliTRDmcm.h"
47 #include "AliTRDzmaps.h"
48 #include "AliTRDCalibra.h"
49 #include "Cal/AliTRDCalPIDLQ.h"
51 ClassImp(AliTRDtrigger)
53 //_____________________________________________________________________________
54 AliTRDtrigger::AliTRDtrigger()
80 // AliTRDtrigger default constructor
85 //_____________________________________________________________________________
86 AliTRDtrigger::AliTRDtrigger(const Text_t *name, const Text_t *title)
94 ,fDigitsManager(new AliTRDdigitsManager())
96 ,fTracklets(new TObjArray(400))
109 ,fTracks(new TClonesArray("AliTRDgtuTrack",1000))
112 // AliTRDtrigger constructor
117 //_____________________________________________________________________________
118 AliTRDtrigger::AliTRDtrigger(const AliTRDtrigger &p)
126 ,fDigitsManager(NULL)
135 ,fNtracklets(p.fNtracklets)
140 ,fNPrimary(p.fNPrimary)
144 // AliTRDtrigger copy constructor
149 ///_____________________________________________________________________________
150 AliTRDtrigger::~AliTRDtrigger()
153 // AliTRDtrigger destructor
157 fTracklets->Delete();
168 //_____________________________________________________________________________
169 AliTRDtrigger &AliTRDtrigger::operator=(const AliTRDtrigger &p)
172 // Assignment operator
175 if (this != &p) ((AliTRDtrigger &) p).Copy(*this);
180 //_____________________________________________________________________________
181 void AliTRDtrigger::Copy(TObject &) const
187 AliFatal("Not implemented");
191 //_____________________________________________________________________________
192 void AliTRDtrigger::Init()
195 fModule = new AliTRDmodule(fTrigParam);
198 fField = fTrigParam->GetField();
199 fGeo = (AliTRDgeometry*)AliTRDgeometry::GetGeometry(fRunLoader);
201 fCalib = AliTRDcalibDB::Instance();
203 AliError("No instance of AliTRDcalibDB.");
207 fCParam = AliTRDCommonParam::Instance();
209 AliError("No common parameters.");
215 //_____________________________________________________________________________
216 Bool_t AliTRDtrigger::Open(const Char_t *name, Int_t nEvent)
219 // Opens the AliROOT file.
222 TString evfoldname = AliConfig::GetDefaultEventFolderName();
223 fRunLoader = AliRunLoader::GetRunLoader(evfoldname);
226 fRunLoader = AliRunLoader::Open(name);
229 AliError(Form("Can not open session for file %s.",name));
234 if (fRunLoader->GetAliRun() == 0x0) {
235 fRunLoader->LoadgAlice();
237 gAlice = fRunLoader->GetAliRun();
239 fRunLoader->LoadgAlice();
240 gAlice = fRunLoader->GetAliRun();
242 AliError("Could not find AliRun object.");
247 // Import the Trees for the event nEvent in the file
248 fRunLoader->GetEvent(nEvent);
251 TObjArray *ioArray = 0;
252 AliLoader* loader = fRunLoader->GetLoader("TRDLoader");
253 loader->MakeTree("T");
254 fTrackletTree = loader->TreeT();
255 fTrackletTree->Branch("TRDmcmTracklet","TObjArray",&ioArray,32000,0);
262 //_____________________________________________________________________________
263 Bool_t AliTRDtrigger::ReadDigits()
266 // Reads the digits arrays from the input aliroot file
270 AliError("Can not find the Run Loader");
274 AliLoader* loader = fRunLoader->GetLoader("TRDLoader");
275 if (!loader->TreeD()) {
276 loader->LoadDigits();
278 if (!loader->TreeD()) {
282 return (fDigitsManager->ReadDigits(loader->TreeD()));
286 //_____________________________________________________________________________
287 Bool_t AliTRDtrigger::ReadDigits(AliRawReader* rawReader)
290 // Reads the digits arrays from the ddl file
293 AliTRDrawData *raw = new AliTRDrawData();
294 fDigitsManager = raw->Raw2Digits(rawReader);
300 //_____________________________________________________________________________
301 Bool_t AliTRDtrigger::ReadTracklets(AliRunLoader *rl)
304 // Reads the tracklets find the tracks
309 AliLoader *loader = rl->GetLoader("TRDLoader");
310 loader->LoadTracks();
311 fTrackletTree = loader->TreeT();
313 TBranch *branch = fTrackletTree->GetBranch("TRDmcmTracklet");
315 AliError("Can't get the branch !");
318 TObjArray *tracklets = new TObjArray(400);
319 branch->SetAddress(&tracklets);
321 Int_t nEntries = (Int_t) fTrackletTree->GetEntries();
325 Int_t iStackPrev = -1;
327 for (iEntry = 0; iEntry < nEntries; iEntry++) {
329 fTrackletTree->GetEvent(iEntry);
331 for (itrk = 0; itrk < tracklets->GetEntriesFast(); itrk++) {
333 fTrk = (AliTRDmcmTracklet*)tracklets->UncheckedAt(itrk);
334 idet = fTrk->GetDetector();
335 iStack = idet / (AliTRDgeometry::Nplan());
337 if (iStackPrev != iStack) {
338 if (iStackPrev == -1) {
342 MakeTracks(idet - AliTRDgeometry::Nplan());
348 Tracklets()->Add(fTrk);
350 if ((iEntry == (nEntries-1)) &&
351 (itrk == (tracklets->GetEntriesFast() - 1))) {
353 MakeTracks(idet-AliTRDgeometry::Nplan());
361 loader->UnloadTracks();
367 //_____________________________________________________________________________
368 Bool_t AliTRDtrigger::MakeTracklets(Bool_t makeTracks)
371 // Create tracklets from digits
375 Int_t chamEnd = AliTRDgeometry::Ncham();
377 Int_t planEnd = AliTRDgeometry::Nplan();
379 Int_t sectEnd = AliTRDgeometry::Nsect();
381 fTrkTest = new AliTRDmcmTracklet(0,0,0);
382 fMCM = new AliTRDmcm(fTrigParam,0);
391 Int_t iStackPrev = -1;
394 for (Int_t isect = sectBeg; isect < sectEnd; isect++) {
396 for (Int_t icham = chamBeg; icham < chamEnd; icham++) {
398 // Number of ROBs in the chamber
406 for (Int_t iplan = planBeg; iplan < planEnd; iplan++) {
408 idet = fGeo->GetDetector(iplan,icham,isect);
412 iStack = idet / (AliTRDgeometry::Nplan());
413 if (iStackPrev != iStack) {
414 if (iStackPrev == -1) {
418 MakeTracks(idet-AliTRDgeometry::Nplan());
425 Int_t nRowMax = fCParam->GetRowMax(iplan,icham,isect);
426 Int_t nColMax = fCParam->GetColMax(iplan);
427 Int_t nTimeTotal = fCalib->GetNumberOfTimeBins();
430 fDigits = fDigitsManager->GetDigits(idet);
431 if (!fDigits) return kFALSE;
432 // This is to take care of switched off super modules
433 if (fDigits->GetNtime() == 0) {
437 fTrack0 = fDigitsManager->GetDictionary(idet,0);
438 if (!fTrack0) return kFALSE;
440 fTrack1 = fDigitsManager->GetDictionary(idet,1);
441 if (!fTrack1) return kFALSE;
443 fTrack2 = fDigitsManager->GetDictionary(idet,2);
444 if (!fTrack2) return kFALSE;
447 for (Int_t iRob = 0; iRob < fNROB; iRob++) {
449 for (Int_t iMcm = 0; iMcm < kNMCM; iMcm++) {
452 fMCM->SetRobId(iRob);
453 fMCM->SetChaId(idet);
455 SetMCMcoordinates(iMcm);
457 row = fMCM->GetRow();
459 if ((row < 0) || (row >= nRowMax)) {
460 AliError("MCM row number out of range.");
464 fMCM->GetColRange(col1,col2);
466 for (time = 0; time < nTimeTotal; time++) {
467 for (col = col1; col < col2; col++) {
468 if ((col >= 0) && (col < nColMax)) {
469 amp = TMath::Abs(fDigits->GetDataUnchecked(row,col,time));
474 fMCM->SetADC(col-col1,time,amp);
478 if (fTrigParam->GetTailCancelation()) {
479 fMCM->Filter(fTrigParam->GetNexponential(),fTrigParam->GetFilterType());
484 for (Int_t iSeed = 0; iSeed < kMaxTrackletsPerMCM; iSeed++) {
486 if (fMCM->GetSeedCol()[iSeed] < 0) {
490 if (fTrigParam->GetDebugLevel() > 1) {
491 AliInfo(Form("Add tracklet %d in col %02d \n",fNtracklets,fMCM->GetSeedCol()[iSeed]));
494 if (TestTracklet(idet,row,iSeed,0)) {
495 AddTracklet(idet,row,iSeed,fNtracklets++);
507 // Compress the arrays
508 fDigits->Compress(1,0);
509 fTrack0->Compress(1,0);
510 fTrack1->Compress(1,0);
511 fTrack2->Compress(1,0);
513 WriteTracklets(idet);
521 MakeTracks(idet - AliTRDgeometry::Nplan());
529 //_____________________________________________________________________________
530 void AliTRDtrigger::SetMCMcoordinates(Int_t imcm)
533 // Configure MCM position in the pad plane
536 Int_t robid = fMCM->GetRobId();
538 // setting the Row and Col range
540 const Int_t kNcolRob = 2; // number of ROBs per chamber in column direction
541 const Int_t kNmcmRob = 4; // number of MCMs per ROB in column/row direction
543 Int_t mcmid = imcm%(kNmcmRob*kNmcmRob);
545 if (robid%kNcolRob == 0) {
547 if (mcmid%kNmcmRob == 0) {
548 fMCM->SetColRange(18*0-1,18*1-1+2+1);
550 if (mcmid%kNmcmRob == 1) {
551 fMCM->SetColRange(18*1-1,18*2-1+2+1);
553 if (mcmid%kNmcmRob == 2) {
554 fMCM->SetColRange(18*2-1,18*3-1+2+1);
556 if (mcmid%kNmcmRob == 3) {
557 fMCM->SetColRange(18*3-1,18*4-1+2+1);
563 if (mcmid%kNmcmRob == 0) {
564 fMCM->SetColRange(18*4-1,18*5-1+2+1);
566 if (mcmid%kNmcmRob == 1) {
567 fMCM->SetColRange(18*5-1,18*6-1+2+1);
569 if (mcmid%kNmcmRob == 2) {
570 fMCM->SetColRange(18*6-1,18*7-1+2+1);
572 if (mcmid%kNmcmRob == 3) {
573 fMCM->SetColRange(18*7-1,18*8-1+2+1);
578 fMCM->SetRow(kNmcmRob*(robid/kNcolRob)+mcmid/kNmcmRob);
582 //_____________________________________________________________________________
583 Bool_t AliTRDtrigger::TestTracklet(Int_t det, Int_t row, Int_t seed, Int_t n)
586 // Check first the tracklet pt
589 Int_t nTimeTotal = fCalib->GetNumberOfTimeBins();
591 // Calibration fill 2D
592 AliTRDCalibra *calibra = AliTRDCalibra::Instance();
594 AliInfo("Could not get Calibra instance\n");
599 fTrkTest->SetDetector(det);
600 fTrkTest->SetRow(row);
603 Int_t iCol, iCol1, iCol2, track[3];
604 iCol = fMCM->GetSeedCol()[seed]; // 0....20 (MCM)
605 fMCM->GetColRange(iCol1,iCol2); // range in the pad plane
608 for (Int_t iTime = 0; iTime < nTimeTotal; iTime++) {
610 amp[0] = fMCM->GetADC(iCol-1,iTime);
611 amp[1] = fMCM->GetADC(iCol ,iTime);
612 amp[2] = fMCM->GetADC(iCol+1,iTime);
614 // extract track contribution only from the central pad
615 track[0] = fTrack0->GetDataUnchecked(row,iCol+iCol1,iTime);
616 track[1] = fTrack1->GetDataUnchecked(row,iCol+iCol1,iTime);
617 track[2] = fTrack2->GetDataUnchecked(row,iCol+iCol1,iTime);
619 if (fMCM->IsCluster(iCol,iTime)) {
621 fTrkTest->AddCluster(iCol+iCol1,iTime,amp,track);
624 else if ((iCol+1+1) < kMcmCol) {
626 amp[0] = fMCM->GetADC(iCol-1+1,iTime);
627 amp[1] = fMCM->GetADC(iCol +1,iTime);
628 amp[2] = fMCM->GetADC(iCol+1+1,iTime);
630 if (fMCM->IsCluster(iCol+1,iTime)) {
632 // extract track contribution only from the central pad
633 track[0] = fTrack0->GetDataUnchecked(row,iCol+1+iCol1,iTime);
634 track[1] = fTrack1->GetDataUnchecked(row,iCol+1+iCol1,iTime);
635 track[2] = fTrack2->GetDataUnchecked(row,iCol+1+iCol1,iTime);
637 fTrkTest->AddCluster(iCol+1+iCol1,iTime,amp,track);
645 fTrkTest->CookLabel(0.8);
647 if (fTrkTest->GetLabel() >= fNPrimary) {
648 Info("AddTracklet","Only primaries are stored!");
653 fTrkTest->MakeTrackletGraph(fGeo,fField);
655 // TRD Online calibration
656 if (calibra->Getmcmtracking()) {
657 calibra->UpdateHistogramcm(fTrkTest);
660 fTrkTest->MakeClusAmpGraph();
662 if (TMath::Abs(fTrkTest->GetPt()) < fTrigParam->GetLtuPtCut()) {
670 //_____________________________________________________________________________
671 void AliTRDtrigger::AddTracklet(Int_t det, Int_t row, Int_t seed, Int_t n)
674 // Add a found tracklet
677 Int_t nTimeTotal = fCalib->GetNumberOfTimeBins();
679 fTrk = new AliTRDmcmTracklet(det,row,n);
681 Int_t iCol, iCol1, iCol2, track[3];
682 iCol = fMCM->GetSeedCol()[seed]; // 0....20 (MCM)
683 fMCM->GetColRange(iCol1,iCol2); // range in the pad plane
686 for (Int_t iTime = 0; iTime < nTimeTotal; iTime++) {
688 amp[0] = fMCM->GetADC(iCol-1,iTime);
689 amp[1] = fMCM->GetADC(iCol ,iTime);
690 amp[2] = fMCM->GetADC(iCol+1,iTime);
692 // extract track contribution only from the central pad
693 track[0] = fTrack0->GetDataUnchecked(row,iCol+iCol1,iTime);
694 track[1] = fTrack1->GetDataUnchecked(row,iCol+iCol1,iTime);
695 track[2] = fTrack2->GetDataUnchecked(row,iCol+iCol1,iTime);
697 if (fMCM->IsCluster(iCol,iTime)) {
699 fTrk->AddCluster(iCol+iCol1,iTime,amp,track);
702 else if ((iCol+1+1) < kMcmCol) {
704 amp[0] = fMCM->GetADC(iCol-1+1,iTime);
705 amp[1] = fMCM->GetADC(iCol +1,iTime);
706 amp[2] = fMCM->GetADC(iCol+1+1,iTime);
708 if (fMCM->IsCluster(iCol+1,iTime)) {
710 // extract track contribution only from the central pad
711 track[0] = fTrack0->GetDataUnchecked(row,iCol+1+iCol1,iTime);
712 track[1] = fTrack1->GetDataUnchecked(row,iCol+1+iCol1,iTime);
713 track[2] = fTrack2->GetDataUnchecked(row,iCol+1+iCol1,iTime);
715 fTrk->AddCluster(iCol+1+iCol1,iTime,amp,track);
723 fTrk->CookLabel(0.8);
725 if (fTrk->GetLabel() >= fNPrimary) {
726 Info("AddTracklet","Only primaries are stored!");
731 fTrk->MakeTrackletGraph(fGeo,fField);
732 fTrk->MakeClusAmpGraph();
733 if (TMath::Abs(fTrk->GetPt()) < fTrigParam->GetLtuPtCut()) {
737 Tracklets()->Add(fTrk);
741 //_____________________________________________________________________________
742 Bool_t AliTRDtrigger::WriteTracklets(Int_t det)
745 // Fills TRDmcmTracklet branch in the tree with the Tracklets
746 // found in detector = det. For det=-1 writes the tree.
749 if ((det < -1) || (det >= AliTRDgeometry::Ndet())) {
750 AliError(Form("Unexpected detector index %d.",det));
754 TBranch *branch = fTrackletTree->GetBranch("TRDmcmTracklet");
756 TObjArray *ioArray = 0;
757 branch = fTrackletTree->Branch("TRDmcmTracklet","TObjArray",&ioArray,32000,0);
760 if ((det >= 0) && (det < AliTRDgeometry::Ndet())) {
762 Int_t nTracklets = Tracklets()->GetEntriesFast();
763 TObjArray *detTracklets = new TObjArray(400);
765 for (Int_t i = 0; i < nTracklets; i++) {
767 AliTRDmcmTracklet *trk = (AliTRDmcmTracklet *) Tracklets()->UncheckedAt(i);
769 if (det == trk->GetDetector()) {
770 detTracklets->AddLast(trk);
775 branch->SetAddress(&detTracklets);
776 fTrackletTree->Fill();
786 AliInfo(Form("Writing the Tracklet tree %s for event %d."
787 ,fTrackletTree->GetName(),fRunLoader->GetEventNumber()));
789 AliLoader* loader = fRunLoader->GetLoader("TRDLoader");
790 loader->WriteTracks("OVERWRITE");
800 //_____________________________________________________________________________
801 void AliTRDtrigger::MakeTracks(Int_t det)
804 // Create GTU tracks per module (stack of 6 chambers)
809 Int_t nRowMax, iplan, icham, isect, row;
811 if ((det < 0) || (det >= AliTRDgeometry::Ndet())) {
812 AliError(Form("Unexpected detector index %d.",det));
816 Int_t nTracklets = Tracklets()->GetEntriesFast();
818 AliTRDmcmTracklet *trk;
819 for (Int_t i = 0; i < nTracklets; i++) {
821 trk = (AliTRDmcmTracklet *) Tracklets()->UncheckedAt(i);
823 iplan = fGeo->GetPlane(trk->GetDetector());
824 icham = fGeo->GetChamber(trk->GetDetector());
825 isect = fGeo->GetSector(trk->GetDetector());
827 nRowMax = fCParam->GetRowMax(iplan,icham,isect);
830 fModule->AddTracklet(trk->GetDetector(),
842 fModule->SortTracklets();
843 fModule->RemoveMultipleTracklets();
844 fModule->SortZ((Int_t)fGeo->GetChamber(det));
845 fModule->FindTracks();
846 fModule->SortTracks();
847 fModule->RemoveMultipleTracks();
849 Int_t nModTracks = fModule->GetNtracks();
850 AliTRDgtuTrack *gtutrk;
851 for (Int_t i = 0; i < nModTracks; i++) {
852 gtutrk = (AliTRDgtuTrack*)fModule->GetTrack(i);
853 if (TMath::Abs(gtutrk->GetPt()) < fTrigParam->GetGtuPtCut()) continue;
856 AddTrack(gtutrk,det);
861 //_____________________________________________________________________________
862 void AliTRDtrigger::AddTrack(const AliTRDgtuTrack *t, Int_t det)
865 // Add a track to the list
868 AliTRDgtuTrack *track = new(fTracks->operator[](fTracks->GetEntriesFast()))
870 track->SetDetector(det);
874 //_____________________________________________________________________________
875 TObjArray* AliTRDtrigger::Tracklets()
878 // Returns list of tracklets
882 fTracklets = new TObjArray(400);
888 //_____________________________________________________________________________
889 void AliTRDtrigger::ResetTracklets()
892 // Resets the list of tracklets
896 fTracklets->Delete();
901 //_____________________________________________________________________________
902 Int_t AliTRDtrigger::GetNumberOfTracks() const
905 // Returns number of tracks
908 return fTracks->GetEntriesFast();
912 //_____________________________________________________________________________
913 AliTRDgtuTrack* AliTRDtrigger::GetTrack(Int_t i) const
916 // Returns a given track from the list
919 return (AliTRDgtuTrack *) fTracks->UncheckedAt(i);