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 "AliTRDdataArrayI.h"
37 #include "AliTRDdataArrayS.h"
38 #include "AliTRDgeometry.h"
39 #include "AliTRDcalibDB.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 "AliTRDCalibraFillHisto.h"
49 #include "Cal/AliTRDCalPID.h"
51 ClassImp(AliTRDtrigger)
53 //_____________________________________________________________________________
54 AliTRDtrigger::AliTRDtrigger()
77 // AliTRDtrigger default constructor
82 //_____________________________________________________________________________
83 AliTRDtrigger::AliTRDtrigger(const Text_t *name, const Text_t *title)
88 ,fDigitsManager(new AliTRDdigitsManager())
90 ,fTracklets(new TObjArray(400))
103 ,fTracks(new TClonesArray("AliTRDgtuTrack",1000))
106 // AliTRDtrigger constructor
111 //_____________________________________________________________________________
112 AliTRDtrigger::AliTRDtrigger(const AliTRDtrigger &p)
117 ,fDigitsManager(NULL)
126 ,fNtracklets(p.fNtracklets)
131 ,fNPrimary(p.fNPrimary)
135 // AliTRDtrigger copy constructor
141 fGeo = new AliTRDgeometry();
145 ///_____________________________________________________________________________
146 AliTRDtrigger::~AliTRDtrigger()
149 // AliTRDtrigger destructor
153 fTracklets->Delete();
166 delete fDigitsManager;
174 //_____________________________________________________________________________
175 AliTRDtrigger &AliTRDtrigger::operator=(const AliTRDtrigger &p)
178 // Assignment operator
181 if (this != &p) ((AliTRDtrigger &) p).Copy(*this);
186 //_____________________________________________________________________________
187 void AliTRDtrigger::Copy(TObject &) const
193 AliFatal("Not implemented");
197 //_____________________________________________________________________________
198 void AliTRDtrigger::Init()
204 fModule = new AliTRDmodule();
207 // The magnetic field strength
208 Double_t x[3] = { 0.0, 0.0, 0.0 };
210 gAlice->Field(x,b); // b[] is in kilo Gauss
211 fField = b[2] * 0.1; // Tesla
213 fGeo = new AliTRDgeometry();
215 if (!AliTRDcalibDB::Instance()) {
216 AliError("No instance of AliTRDcalibDB.");
222 //_____________________________________________________________________________
223 Bool_t AliTRDtrigger::Open(const Char_t *name, Int_t nEvent)
226 // Opens the AliROOT file.
229 TString evfoldname = AliConfig::GetDefaultEventFolderName();
230 fRunLoader = AliRunLoader::GetRunLoader(evfoldname);
233 fRunLoader = AliRunLoader::Open(name);
236 AliError(Form("Can not open session for file %s.",name));
240 // Import the Trees for the event nEvent in the file
241 fRunLoader->GetEvent(nEvent);
244 TObjArray *ioArray = 0;
245 AliLoader* loader = fRunLoader->GetLoader("TRDLoader");
246 loader->MakeTree("T");
247 fTrackletTree = loader->TreeT();
248 fTrackletTree->Branch("TRDmcmTracklet","TObjArray",&ioArray,32000,0);
255 //_____________________________________________________________________________
256 Bool_t AliTRDtrigger::ReadDigits()
259 // Reads the digits arrays from the input aliroot file
263 AliError("Can not find the Run Loader");
267 AliLoader* loader = fRunLoader->GetLoader("TRDLoader");
268 if (!loader->TreeD()) {
269 loader->LoadDigits();
271 if (!loader->TreeD()) {
275 return (fDigitsManager->ReadDigits(loader->TreeD()));
279 //_____________________________________________________________________________
280 Bool_t AliTRDtrigger::ReadDigits(AliRawReader* rawReader)
283 // Reads the digits arrays from the ddl file
286 AliTRDrawData *raw = new AliTRDrawData();
287 fDigitsManager = raw->Raw2Digits(rawReader);
293 //_____________________________________________________________________________
294 Bool_t AliTRDtrigger::ReadDigits(TTree *digitsTree)
297 // Reads the digits arrays from the input tree
300 return (fDigitsManager->ReadDigits(digitsTree));
304 //_____________________________________________________________________________
305 Bool_t AliTRDtrigger::ReadTracklets(AliRunLoader *rl)
308 // Reads the tracklets find the tracks
313 AliLoader *loader = rl->GetLoader("TRDLoader");
314 loader->LoadTracks();
315 fTrackletTree = loader->TreeT();
317 TBranch *branch = fTrackletTree->GetBranch("TRDmcmTracklet");
319 AliError("Can't get the branch !");
322 TObjArray *tracklets = new TObjArray(400);
323 branch->SetAddress(&tracklets);
325 Int_t nEntries = (Int_t) fTrackletTree->GetEntries();
329 Int_t iStackPrev = -1;
331 for (iEntry = 0; iEntry < nEntries; iEntry++) {
333 fTrackletTree->GetEvent(iEntry);
335 for (itrk = 0; itrk < tracklets->GetEntriesFast(); itrk++) {
337 fTrk = (AliTRDmcmTracklet *) tracklets->UncheckedAt(itrk);
338 idet = fTrk->GetDetector();
339 iStack = idet / (AliTRDgeometry::Nlayer());
341 if (iStackPrev != iStack) {
342 if (iStackPrev == -1) {
346 MakeTracks(idet - AliTRDgeometry::Nlayer());
352 Tracklets()->Add(fTrk);
354 if ((iEntry == (nEntries-1)) &&
355 (itrk == (tracklets->GetEntriesFast() - 1))) {
357 MakeTracks(idet-AliTRDgeometry::Nlayer());
365 loader->UnloadTracks();
371 //_____________________________________________________________________________
372 Bool_t AliTRDtrigger::MakeTracklets(Bool_t makeTracks)
375 // Create tracklets from digits
379 Int_t stackEnd = AliTRDgeometry::Nstack();
381 Int_t layerEnd = AliTRDgeometry::Nlayer();
383 Int_t sectorEnd = AliTRDgeometry::Nsector();
385 fTrkTest = new AliTRDmcmTracklet(0,0,0);
386 fMCM = new AliTRDmcm(0);
394 Int_t iStackCur = -1;
395 Int_t iStackPrev = -1;
398 for (Int_t isector = sectorBeg; isector < sectorEnd; isector++) {
400 for (Int_t istack = stackBeg; istack < stackEnd; istack++) {
402 // Number of ROBs in the chamber
410 for (Int_t ilayer = layerBeg; ilayer < layerEnd; ilayer++) {
412 idet = fGeo->GetDetector(ilayer,istack,isector);
416 iStackCur = idet / (AliTRDgeometry::Nlayer());
417 if (iStackPrev != iStackCur) {
418 if (iStackPrev == -1) {
419 iStackPrev = iStackCur;
422 MakeTracks(idet-AliTRDgeometry::Nlayer());
424 iStackPrev = iStackCur;
429 Int_t nRowMax = fGeo->GetRowMax(ilayer,istack,isector);
430 Int_t nColMax = fGeo->GetColMax(ilayer);
431 Int_t nTimeTotal = AliTRDcalibDB::Instance()->GetNumberOfTimeBins();
434 fDigits = (AliTRDdataArrayS *) fDigitsManager->GetDigits(idet);
435 if (!fDigits) return kFALSE;
436 // This is to take care of switched off super modules
437 if (fDigits->GetNtime() == 0) {
441 fTrack0 = (AliTRDdataArrayI *) fDigitsManager->GetDictionary(idet,0);
442 if (!fTrack0) return kFALSE;
444 fTrack1 = (AliTRDdataArrayI *) fDigitsManager->GetDictionary(idet,1);
445 if (!fTrack1) return kFALSE;
447 fTrack2 = (AliTRDdataArrayI *) fDigitsManager->GetDictionary(idet,2);
448 if (!fTrack2) return kFALSE;
451 for (Int_t iRob = 0; iRob < fNROB; iRob++) {
453 for (Int_t iMcm = 0; iMcm < kNMCM; iMcm++) {
456 fMCM->SetRobId(iRob);
457 fMCM->SetChaId(idet);
459 SetMCMcoordinates(iMcm);
461 row = fMCM->GetRow();
463 if ((row < 0) || (row >= nRowMax)) {
464 AliError("MCM row number out of range.");
468 fMCM->GetColRange(col1,col2);
470 for (time = 0; time < nTimeTotal; time++) {
471 for (col = col1; col < col2; col++) {
472 if ((col >= 0) && (col < nColMax)) {
473 amp = TMath::Abs(fDigits->GetDataUnchecked(row,col,time));
478 fMCM->SetADC(col-col1,time,amp);
482 if (AliTRDtrigParam::Instance()->GetTailCancelation()) {
483 fMCM->Filter(AliTRDtrigParam::Instance()->GetNexponential()
484 ,AliTRDtrigParam::Instance()->GetFilterType());
489 for (Int_t iSeed = 0; iSeed < kMaxTrackletsPerMCM; iSeed++) {
491 if (fMCM->GetSeedCol()[iSeed] < 0) {
495 AliDebug(2,Form("Add tracklet %d in col %02d \n",fNtracklets,fMCM->GetSeedCol()[iSeed]));
497 if (TestTracklet(idet,row,iSeed,0)) {
498 AddTracklet(idet,row,iSeed,fNtracklets++);
510 // Compress the arrays
511 fDigits->Compress(1,0);
512 fTrack0->Compress(1,0);
513 fTrack1->Compress(1,0);
514 fTrack2->Compress(1,0);
516 WriteTracklets(idet);
524 MakeTracks(idet - AliTRDgeometry::Nlayer());
532 //_____________________________________________________________________________
533 void AliTRDtrigger::SetMCMcoordinates(Int_t imcm)
536 // Configure MCM position in the pad plane
539 Int_t robid = fMCM->GetRobId();
541 // setting the Row and Col range
543 const Int_t kNcolRob = 2; // number of ROBs per chamber in column direction
544 const Int_t kNmcmRob = 4; // number of MCMs per ROB in column/row direction
546 Int_t mcmid = imcm%(kNmcmRob*kNmcmRob);
548 if (robid%kNcolRob == 0) {
550 if (mcmid%kNmcmRob == 0) {
551 fMCM->SetColRange(18*0-1,18*1-1+2+1);
553 if (mcmid%kNmcmRob == 1) {
554 fMCM->SetColRange(18*1-1,18*2-1+2+1);
556 if (mcmid%kNmcmRob == 2) {
557 fMCM->SetColRange(18*2-1,18*3-1+2+1);
559 if (mcmid%kNmcmRob == 3) {
560 fMCM->SetColRange(18*3-1,18*4-1+2+1);
566 if (mcmid%kNmcmRob == 0) {
567 fMCM->SetColRange(18*4-1,18*5-1+2+1);
569 if (mcmid%kNmcmRob == 1) {
570 fMCM->SetColRange(18*5-1,18*6-1+2+1);
572 if (mcmid%kNmcmRob == 2) {
573 fMCM->SetColRange(18*6-1,18*7-1+2+1);
575 if (mcmid%kNmcmRob == 3) {
576 fMCM->SetColRange(18*7-1,18*8-1+2+1);
581 fMCM->SetRow(kNmcmRob*(robid/kNcolRob)+mcmid/kNmcmRob);
585 //_____________________________________________________________________________
586 Bool_t AliTRDtrigger::TestTracklet(Int_t det, Int_t row, Int_t seed, Int_t n)
589 // Check first the tracklet pt
592 Int_t nTimeTotal = AliTRDcalibDB::Instance()->GetNumberOfTimeBins();
594 // Calibration fill 2D
595 // AliTRDCalibraFillHisto *calibra = AliTRDCalibraFillHisto::Instance();
597 // AliInfo("Could not get Calibra instance\n");
602 fTrkTest->SetDetector(det);
603 fTrkTest->SetRow(row);
606 Int_t iCol, iCol1, iCol2, track[3];
607 iCol = fMCM->GetSeedCol()[seed]; // 0....20 (MCM)
608 fMCM->GetColRange(iCol1,iCol2); // range in the pad plane
611 for (Int_t iTime = 0; iTime < nTimeTotal; iTime++) {
613 amp[0] = fMCM->GetADC(iCol-1,iTime);
614 amp[1] = fMCM->GetADC(iCol ,iTime);
615 amp[2] = fMCM->GetADC(iCol+1,iTime);
617 // extract track contribution only from the central pad
618 track[0] = fTrack0->GetDataUnchecked(row,iCol+iCol1,iTime);
619 track[1] = fTrack1->GetDataUnchecked(row,iCol+iCol1,iTime);
620 track[2] = fTrack2->GetDataUnchecked(row,iCol+iCol1,iTime);
622 if (fMCM->IsCluster(iCol,iTime)) {
624 fTrkTest->AddCluster(iCol+iCol1,iTime,amp,track);
627 else if ((iCol+1+1) < kMcmCol) {
629 amp[0] = fMCM->GetADC(iCol-1+1,iTime);
630 amp[1] = fMCM->GetADC(iCol +1,iTime);
631 amp[2] = fMCM->GetADC(iCol+1+1,iTime);
633 if (fMCM->IsCluster(iCol+1,iTime)) {
635 // extract track contribution only from the central pad
636 track[0] = fTrack0->GetDataUnchecked(row,iCol+1+iCol1,iTime);
637 track[1] = fTrack1->GetDataUnchecked(row,iCol+1+iCol1,iTime);
638 track[2] = fTrack2->GetDataUnchecked(row,iCol+1+iCol1,iTime);
640 fTrkTest->AddCluster(iCol+1+iCol1,iTime,amp,track);
648 fTrkTest->CookLabel(0.8);
650 if (fTrkTest->GetLabel() >= fNPrimary) {
651 Info("AddTracklet","Only primaries are stored!");
656 fTrkTest->MakeTrackletGraph(fGeo,fField);
658 fTrkTest->MakeClusAmpGraph();
660 if (TMath::Abs(fTrkTest->GetPt()) < AliTRDtrigParam::Instance()->GetLtuPtCut()) {
668 //_____________________________________________________________________________
669 void AliTRDtrigger::AddTracklet(Int_t det, Int_t row, Int_t seed, Int_t n)
672 // Add a found tracklet
675 Int_t nTimeTotal = AliTRDcalibDB::Instance()->GetNumberOfTimeBins();
677 fTrk = new AliTRDmcmTracklet(det,row,n);
679 Int_t iCol, iCol1, iCol2, track[3];
680 iCol = fMCM->GetSeedCol()[seed]; // 0....20 (MCM)
681 fMCM->GetColRange(iCol1,iCol2); // range in the pad plane
684 for (Int_t iTime = 0; iTime < nTimeTotal; iTime++) {
686 amp[0] = fMCM->GetADC(iCol-1,iTime);
687 amp[1] = fMCM->GetADC(iCol ,iTime);
688 amp[2] = fMCM->GetADC(iCol+1,iTime);
690 // extract track contribution only from the central pad
691 track[0] = fTrack0->GetDataUnchecked(row,iCol+iCol1,iTime);
692 track[1] = fTrack1->GetDataUnchecked(row,iCol+iCol1,iTime);
693 track[2] = fTrack2->GetDataUnchecked(row,iCol+iCol1,iTime);
695 if (fMCM->IsCluster(iCol,iTime)) {
697 fTrk->AddCluster(iCol+iCol1,iTime,amp,track);
700 else if ((iCol+1+1) < kMcmCol) {
702 amp[0] = fMCM->GetADC(iCol-1+1,iTime);
703 amp[1] = fMCM->GetADC(iCol +1,iTime);
704 amp[2] = fMCM->GetADC(iCol+1+1,iTime);
706 if (fMCM->IsCluster(iCol+1,iTime)) {
708 // extract track contribution only from the central pad
709 track[0] = fTrack0->GetDataUnchecked(row,iCol+1+iCol1,iTime);
710 track[1] = fTrack1->GetDataUnchecked(row,iCol+1+iCol1,iTime);
711 track[2] = fTrack2->GetDataUnchecked(row,iCol+1+iCol1,iTime);
713 fTrk->AddCluster(iCol+1+iCol1,iTime,amp,track);
721 fTrk->CookLabel(0.8);
723 if (fTrk->GetLabel() >= fNPrimary) {
724 Info("AddTracklet","Only primaries are stored!");
729 fTrk->MakeTrackletGraph(fGeo,fField);
730 fTrk->MakeClusAmpGraph();
731 if (TMath::Abs(fTrk->GetPt()) < AliTRDtrigParam::Instance()->GetLtuPtCut()) {
735 Tracklets()->Add(fTrk);
739 //_____________________________________________________________________________
740 Bool_t AliTRDtrigger::WriteTracklets(Int_t det)
743 // Fills TRDmcmTracklet branch in the tree with the Tracklets
744 // found in detector = det. For det=-1 writes the tree.
747 if ((det < -1) || (det >= AliTRDgeometry::Ndet())) {
748 AliError(Form("Unexpected detector index %d.",det));
752 TBranch *branch = fTrackletTree->GetBranch("TRDmcmTracklet");
754 TObjArray *ioArray = 0;
755 branch = fTrackletTree->Branch("TRDmcmTracklet","TObjArray",&ioArray,32000,0);
758 if ((det >= 0) && (det < AliTRDgeometry::Ndet())) {
760 Int_t nTracklets = Tracklets()->GetEntriesFast();
761 TObjArray *detTracklets = new TObjArray(400);
763 for (Int_t i = 0; i < nTracklets; i++) {
765 AliTRDmcmTracklet *trk = (AliTRDmcmTracklet *) Tracklets()->UncheckedAt(i);
767 if (det == trk->GetDetector()) {
768 detTracklets->AddLast(trk);
773 branch->SetAddress(&detTracklets);
774 fTrackletTree->Fill();
784 AliInfo(Form("Writing the Tracklet tree %s for event %d."
785 ,fTrackletTree->GetName(),fRunLoader->GetEventNumber()));
787 AliLoader* loader = fRunLoader->GetLoader("TRDLoader");
788 loader->WriteTracks("OVERWRITE");
798 //_____________________________________________________________________________
799 void AliTRDtrigger::MakeTracks(Int_t det)
802 // Create GTU tracks per module (stack of 6 chambers)
807 Int_t nRowMax, ilayer, istack, isector, row;
809 if ((det < 0) || (det >= AliTRDgeometry::Ndet())) {
810 AliError(Form("Unexpected detector index %d.",det));
814 Int_t nTracklets = Tracklets()->GetEntriesFast();
816 AliTRDmcmTracklet *trk;
817 for (Int_t i = 0; i < nTracklets; i++) {
819 trk = (AliTRDmcmTracklet *) Tracklets()->UncheckedAt(i);
821 ilayer = fGeo->GetLayer(trk->GetDetector());
822 istack = fGeo->GetStack(trk->GetDetector());
823 isector = fGeo->GetSector(trk->GetDetector());
825 nRowMax = fGeo->GetRowMax(ilayer,istack,isector);
828 fModule->AddTracklet(trk->GetDetector(),
840 fModule->SortTracklets();
841 fModule->RemoveMultipleTracklets();
842 fModule->SortZ((Int_t)fGeo->GetStack(det));
843 fModule->FindTracks();
844 fModule->SortTracks();
845 fModule->RemoveMultipleTracks();
847 Int_t nModTracks = fModule->GetNtracks();
848 AliTRDgtuTrack *gtutrk;
849 for (Int_t i = 0; i < nModTracks; i++) {
850 gtutrk = (AliTRDgtuTrack*)fModule->GetTrack(i);
851 if (TMath::Abs(gtutrk->GetPt()) < AliTRDtrigParam::Instance()->GetGtuPtCut()) continue;
854 AddTrack(gtutrk,det);
859 //_____________________________________________________________________________
860 void AliTRDtrigger::AddTrack(const AliTRDgtuTrack *t, Int_t det)
863 // Add a track to the list
866 AliTRDgtuTrack *track = new(fTracks->operator[](fTracks->GetEntriesFast()))
868 track->SetDetector(det);
872 //_____________________________________________________________________________
873 TObjArray* AliTRDtrigger::Tracklets()
876 // Returns list of tracklets
880 fTracklets = new TObjArray(400);
886 //_____________________________________________________________________________
887 void AliTRDtrigger::ResetTracklets()
890 // Resets the list of tracklets
894 fTracklets->Delete();
899 //_____________________________________________________________________________
900 Int_t AliTRDtrigger::GetNumberOfTracks() const
903 // Returns number of tracks
906 return fTracks->GetEntriesFast();
910 //_____________________________________________________________________________
911 AliTRDgtuTrack* AliTRDtrigger::GetTrack(Int_t i) const
914 // Returns a given track from the list
917 return (AliTRDgtuTrack *) fTracks->UncheckedAt(i);