]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUONVTrackReconstructor.cxx
o add Reset function to CalPad and CalROC o Add functionality to AliTPCdataQA - Reset...
[u/mrichter/AliRoot.git] / MUON / AliMUONVTrackReconstructor.cxx
index fac2deadee013d10996662f0749199104c13e81b..114b73d973455b988c66e310fdc2d95da5f50e8b 100644 (file)
@@ -74,6 +74,8 @@
 #include "AliMUONVTriggerStore.h"
 #include "AliMUONVTriggerTrackStore.h"
 #include "AliMUONRecoParam.h"
+#include "AliMUONGeometryTransformer.h"
+#include "AliMUONVDigit.h"
 
 #include "AliMpDEManager.h"
 #include "AliMpArea.h"
@@ -82,6 +84,8 @@
 #include "AliMpVSegmentation.h"
 #include "AliMpSegmentation.h"
 #include "AliMpPad.h"
+#include "AliMpDetElement.h"
+#include "AliMpCathodType.h"
 
 #include "AliLog.h"
 #include "AliCodeTimer.h"
 
 #include <Riostream.h>
 
+using std::cout;
+using std::endl;
 /// \cond CLASSIMP
 ClassImp(AliMUONVTrackReconstructor) // Class implementation in ROOT context
 /// \endcond
 
   //__________________________________________________________________________
 AliMUONVTrackReconstructor::AliMUONVTrackReconstructor(const AliMUONRecoParam* recoParam,
-                                                       AliMUONVClusterServer* clusterServer)
+                                                       AliMUONVClusterServer* clusterServer,
+                                                      const AliMUONGeometryTransformer* transformer)
 : TObject(),
 fRecTracksPtr(0x0),
 fNRecTracks(0),
 fClusterServer(clusterServer),
 fkRecoParam(recoParam),
+fkTransformer(transformer),
 fMaxMCSAngle2(0x0)
 {
   /// Constructor for class AliMUONVTrackReconstructor
@@ -185,15 +193,20 @@ void AliMUONVTrackReconstructor::EventReconstruct(AliMUONVClusterStore& clusterS
   Finalize();
   if (!GetRecoParam()->RemoveConnectedTracksInSt12()) TagConnectedTracks(0, 1, kTRUE);
   
+  // Make sure there is no bad track left
+  RemoveBadTracks();
+  
+  // Refit the reconstructed tracks with a different resolution for mono-cathod clusters
+  if (GetRecoParam()->DiscardMonoCathodClusters()) DiscardMonoCathodClusters();
+  
   // Add tracks to MUON data container 
   for (Int_t i=0; i<fNRecTracks; ++i)
   {
     AliMUONTrack * track = (AliMUONTrack*) fRecTracksPtr->At(i);
-    if (track->GetGlobalChi2() < AliMUONTrack::MaxChi2()) {
-      track->SetUniqueID(i+1);
-      trackStore.Add(*track);
-    } else AliWarning("problem occur somewhere during track refitting --> discard track");
+    track->SetUniqueID(i+1);
+    trackStore.Add(*track);
   }
+  
 }
 
 //__________________________________________________________________________
@@ -280,8 +293,7 @@ Bool_t AliMUONVTrackReconstructor::IsAcceptable(AliMUONTrackParam &trackParam)
 TClonesArray* AliMUONVTrackReconstructor::MakeSegmentsBetweenChambers(const AliMUONVClusterStore& clusterStore, Int_t ch1, Int_t ch2)
 {
   /// To make the list of segments from the list of clusters in the 2 given chambers.
-  /// Return a new TClonesArray of segments.
-  /// It is the responsibility of the user to delete it afterward.
+  /// Return a TClonesArray of new segments (segments made in a previous call of this function are removed).
   AliDebug(1,Form("Enter MakeSegmentsBetweenChambers (1..) %d-%d", ch1+1, ch2+1));
   AliCodeTimerAuto("",0);
   
@@ -305,7 +317,8 @@ TClonesArray* AliMUONVTrackReconstructor::MakeSegmentsBetweenChambers(const AliM
   TIter nextInCh2(clusterStore.CreateChamberIterator(ch2,ch2));
   
   // list of segments
-  TClonesArray *segments = new TClonesArray("AliMUONObjectPair", 100);
+  static TClonesArray *segments = new TClonesArray("AliMUONObjectPair", 100);
+  segments->Clear("C");
   
   // Loop over clusters in the first chamber of the station
   while ( ( cluster1 = static_cast<AliMUONVCluster*>(nextInCh1()) ) ) {
@@ -534,6 +547,35 @@ void AliMUONVTrackReconstructor::RemoveDoubleTracks()
     } // track2
   } // track1
   fRecTracksPtr->Compress(); // this is essential to retrieve the TClonesArray afterwards
+}
+
+  //__________________________________________________________________________
+void AliMUONVTrackReconstructor::RemoveBadTracks()
+{
+  /// Remove tracks for which a problem occured somewhere during the tracking
+  
+  AliMUONTrack *track, *nextTrack;
+  Bool_t trackRemoved = kFALSE;
+  
+  track = (AliMUONTrack*) fRecTracksPtr->First();
+  while (track) {
+    
+    nextTrack = (AliMUONTrack*) fRecTracksPtr->After(track);
+    
+    if (track->GetGlobalChi2() >= AliMUONTrack::MaxChi2()) {
+      AliWarning("problem occured somewhere during the tracking --> discard track");
+      fRecTracksPtr->Remove(track);
+      fNRecTracks--;
+      trackRemoved = kTRUE;
+    }
+    
+    track = nextTrack;
+    
+  }
+  
+  // compress array of tracks if needed
+  if (trackRemoved) fRecTracksPtr->Compress();
+  
 }
 
   //__________________________________________________________________________
@@ -1254,6 +1296,111 @@ void AliMUONVTrackReconstructor::Finalize()
   
 }
 
+//__________________________________________________________________________
+void AliMUONVTrackReconstructor::DiscardMonoCathodClusters()
+{
+  /// Assign a different resolution to the mono-cathod clusters
+  /// in the direction of the missing plane and refit the track
+  /// Remove the track in case of failure
+  
+  if (!fkTransformer) AliFatal("missing geometry transformer");
+  
+  AliMUONTrack *track, *nextTrack;
+  Bool_t trackRemoved = kFALSE;
+  
+  track = (AliMUONTrack*) fRecTracksPtr->First();
+  while (track) {
+    
+    nextTrack = (AliMUONTrack*) fRecTracksPtr->After(track);
+    
+    ChangeMonoCathodClusterRes(*track);
+    
+    if (!RefitTrack(*track) || (GetRecoParam()->ImproveTracks() && !track->IsImproved())) {
+      fRecTracksPtr->Remove(track);
+      fNRecTracks--;
+      trackRemoved = kTRUE;
+    }
+    
+    track = nextTrack;
+    
+  }
+  
+  // compress array of tracks if needed
+  if (trackRemoved) fRecTracksPtr->Compress();
+  
+}
+
+//__________________________________________________________________________
+void AliMUONVTrackReconstructor::ChangeMonoCathodClusterRes(AliMUONTrack &track)
+{
+  /// Assign a different resolution to the mono-cathod clusters
+  /// in the direction of the missing plane and refit the track
+  
+  // Loop over clusters
+  AliMUONVCluster *cluster;
+  Int_t nClusters = track.GetNClusters();
+  for (Int_t iCluster = 0; iCluster < nClusters; iCluster++) {
+    cluster = ((AliMUONTrackParam*) track.GetTrackParamAtCluster()->UncheckedAt(iCluster))->GetClusterPtr();
+    
+    // do it only for stations 3, 4 & 5
+    if (cluster->GetChamberId() < 4) continue;
+    
+    // get the cathod corresponding to the bending/non-bending plane
+    Int_t deId = cluster->GetDetElemId();
+    AliMpDetElement* de = AliMpDDLStore::Instance()->GetDetElement(deId, kFALSE);
+    if (!de) continue;
+    AliMp::CathodType cath1 = de->GetCathodType(AliMp::kBendingPlane); 
+    AliMp::CathodType cath2 = de->GetCathodType(AliMp::kNonBendingPlane); 
+    
+    // get the corresponding segmentation
+    const AliMpVSegmentation* seg1 = AliMpSegmentation::Instance()->GetMpSegmentation(deId, cath1);
+    const AliMpVSegmentation* seg2 = AliMpSegmentation::Instance()->GetMpSegmentation(deId, cath2);
+    if (!seg1 || !seg2) continue;
+    
+    // get local coordinate of the cluster
+    Double_t lX,lY,lZ;
+    Double_t gX = cluster->GetX();
+    Double_t gY = cluster->GetY();
+    Double_t gZ = cluster->GetZ();
+    fkTransformer->Global2Local(deId,gX,gY,gZ,lX,lY,lZ);
+    
+    // find pads below the cluster
+    AliMpPad pad1 = seg1->PadByPosition(lX, lY, kFALSE);
+    AliMpPad pad2 = seg2->PadByPosition(lX, lY, kFALSE);
+    
+    // build their ID if pads are valid
+    UInt_t padId1 = (pad1.IsValid()) ? AliMUONVDigit::BuildUniqueID(deId, pad1.GetManuId(), pad1.GetManuChannel(), cath1) : 0;
+    UInt_t padId2 = (pad2.IsValid()) ? AliMUONVDigit::BuildUniqueID(deId, pad2.GetManuId(), pad2.GetManuChannel(), cath2) : 0;
+    
+    // check if the cluster contains these pads 
+    Bool_t hasNonBending = kFALSE;
+    Bool_t hasBending = kFALSE;
+    for (Int_t iDigit = 0; iDigit < cluster->GetNDigits(); iDigit++) {
+      
+      UInt_t digitId = cluster->GetDigitId(iDigit);
+      
+      if (digitId == padId1) {
+       
+       hasBending = kTRUE;
+       if (hasNonBending) break;
+       
+      } else if (digitId == padId2) {
+       
+       hasNonBending = kTRUE;
+       if (hasBending) break;
+       
+      }
+      
+    }
+    
+    // modify the cluster resolution if needed
+    if (!hasNonBending) cluster->SetErrXY(GetRecoParam()->GetMonoCathodClNonBendingRes(), cluster->GetErrY());
+    if (!hasBending) cluster->SetErrXY(cluster->GetErrX(), GetRecoParam()->GetMonoCathodClBendingRes());
+    
+  }
+  
+}
+
 //__________________________________________________________________________
 void AliMUONVTrackReconstructor::ValidateTracksWithTrigger(AliMUONVTrackStore& trackStore,
                                                            const AliMUONVTriggerTrackStore& triggerTrackStore,
@@ -1266,12 +1413,13 @@ void AliMUONVTrackReconstructor::ValidateTracksWithTrigger(AliMUONVTrackStore& t
   trackHitPattern.ExecuteValidation(trackStore, triggerTrackStore, triggerStore);
 }
 
-  //__________________________________________________________________________
+
+//__________________________________________________________________________
 void AliMUONVTrackReconstructor::EventReconstructTrigger(const AliMUONTriggerCircuit& circuit,
                                                          const AliMUONVTriggerStore& triggerStore,
                                                          AliMUONVTriggerTrackStore& triggerTrackStore)
 {
-  /// To make the trigger tracks from Local Trigger
+  /// Fill trigger track store from local trigger
   AliDebug(1, "");
   AliCodeTimerAuto("",0);
 
@@ -1284,64 +1432,80 @@ void AliMUONVTrackReconstructor::EventReconstructTrigger(const AliMUONTriggerCir
     gloTrigPat = globalTrigger->GetGlobalResponse();
   }
   
+  AliMUONTriggerTrack triggerTrack;
+  
   TIter next(triggerStore.CreateIterator());
   AliMUONLocalTrigger* locTrg(0x0);
-
-  const Double_t kTrigNonBendReso = AliMUONConstants::TriggerNonBendingReso();
-  const Double_t kTrigBendReso = AliMUONConstants::TriggerBendingReso();
-  const Double_t kSqrt12 = TMath::Sqrt(12.);
-      
-  AliMUONTriggerTrack triggerTrack;
-  TMatrixD trigCov(3,3);
   
   while ( ( locTrg = static_cast<AliMUONLocalTrigger*>(next()) ) )
   {
     if ( locTrg->IsTrigX() && locTrg->IsTrigY() ) 
     { // make Trigger Track if trigger in X and Y
+      
+      if (TriggerToTrack(circuit, *locTrg, triggerTrack, gloTrigPat))
+       triggerTrackStore.Add(triggerTrack);
 
-      Int_t localBoardId = locTrg->LoCircuit();
+    } // board is fired 
+  } // end of loop on Local Trigger
+}
 
-      Float_t y11 = circuit.GetY11Pos(localBoardId, locTrg->LoStripX()); 
-      Float_t z11 = circuit.GetZ11Pos(localBoardId, locTrg->LoStripX());
-      // need first to convert deviation to [0-30] 
-      // (see AliMUONLocalTriggerBoard::LocalTrigger)
-      Int_t deviation = locTrg->GetDeviation(); 
-      Int_t stripX21 = locTrg->LoStripX()+deviation+1;
-      Float_t y21 = circuit.GetY21Pos(localBoardId, stripX21);       
-      Float_t z21 = circuit.GetZ21Pos(localBoardId, stripX21);
-      Float_t x11 = circuit.GetX11Pos(localBoardId, locTrg->LoStripY());
-      
-      AliDebug(1, Form(" MakeTriggerTrack %3d %2d %2d %2d (%f %f %f) (%f %f)\n",locTrg->LoCircuit(),
-                       locTrg->LoStripX(),locTrg->LoStripX()+deviation+1,locTrg->LoStripY(),x11, y11, z11, y21, z21));
+//__________________________________________________________________________
+Bool_t AliMUONVTrackReconstructor::TriggerToTrack(const AliMUONTriggerCircuit& circuit,
+                                                const AliMUONLocalTrigger& locTrg,
+                                                AliMUONTriggerTrack& triggerTrack,
+                                                UChar_t globalTriggerPattern)
+{
+  /// To make the trigger tracks from Local Trigger
+  const Double_t kTrigNonBendReso = AliMUONConstants::TriggerNonBendingReso();
+  const Double_t kTrigBendReso = AliMUONConstants::TriggerBendingReso();
+  const Double_t kSqrt12 = TMath::Sqrt(12.);
+  
+  TMatrixD trigCov(3,3);
 
-      Double_t deltaZ = z11 - z21;
+  Int_t localBoardId = locTrg.LoCircuit();
       
-      Float_t slopeX = x11/z11;
-      Float_t slopeY = (y11-y21) / deltaZ;
-
-      Float_t sigmaX = circuit.GetX11Width(localBoardId, locTrg->LoStripY()) / kSqrt12;
-      Float_t sigmaY = circuit.GetY11Width(localBoardId, locTrg->LoStripX()) / kSqrt12;
-      Float_t sigmaY21 = circuit.GetY21Width(localBoardId, locTrg->LoStripX()) / kSqrt12;
+  Float_t y11 = circuit.GetY11Pos(localBoardId, locTrg.LoStripX()); 
+  Float_t z11 = circuit.GetZ11Pos(localBoardId, locTrg.LoStripX());
+  // need first to convert deviation to [0-30] 
+  // (see AliMUONLocalTriggerBoard::LocalTrigger)
+  Int_t deviation = locTrg.GetDeviation(); 
+  Int_t stripX21 = locTrg.LoStripX()+deviation+1;
+  Float_t y21 = circuit.GetY21Pos(localBoardId, stripX21);       
+  Float_t z21 = circuit.GetZ21Pos(localBoardId, stripX21);
+  Float_t x11 = circuit.GetX11Pos(localBoardId, locTrg.LoStripY());
+      
+  AliDebug(1, Form(" MakeTriggerTrack %3d %2d %2d %2d (%f %f %f) (%f %f)\n",locTrg.LoCircuit(),
+                   locTrg.LoStripX(),locTrg.LoStripX()+deviation+1,locTrg.LoStripY(),x11, y11, z11, y21, z21));
+      
+  if (TMath::Abs(z11) < 0.00001) return kFALSE;
 
-      trigCov.Zero();
-      trigCov(0,0) = kTrigNonBendReso * kTrigNonBendReso + sigmaX * sigmaX;
-      trigCov(1,1) = kTrigBendReso * kTrigBendReso + sigmaY * sigmaY;
-      trigCov(2,2) = 
-       (2. * kTrigBendReso * kTrigBendReso + sigmaY * sigmaY + sigmaY21 * sigmaY21 ) / deltaZ / deltaZ;
-      trigCov(1,2) = trigCov(2,1) = trigCov(1,1) / deltaZ;
+  Double_t deltaZ = z11 - z21;
+      
+  Float_t slopeX = x11/z11;
+  Float_t slopeY = (y11-y21) / deltaZ;
+      
+  Float_t sigmaX = circuit.GetX11Width(localBoardId, locTrg.LoStripY()) / kSqrt12;
+  Float_t sigmaY = circuit.GetY11Width(localBoardId, locTrg.LoStripX()) / kSqrt12;
+  Float_t sigmaY21 = circuit.GetY21Width(localBoardId, locTrg.LoStripX()) / kSqrt12;
+      
+  trigCov.Zero();
+  trigCov(0,0) = kTrigNonBendReso * kTrigNonBendReso + sigmaX * sigmaX;
+  trigCov(1,1) = kTrigBendReso * kTrigBendReso + sigmaY * sigmaY;
+  trigCov(2,2) = 
+    (2. * kTrigBendReso * kTrigBendReso + sigmaY * sigmaY + sigmaY21 * sigmaY21 ) / deltaZ / deltaZ;
+    trigCov(1,2) = trigCov(2,1) = trigCov(1,1) / deltaZ;
+      
+  triggerTrack.SetX11(x11);
+  triggerTrack.SetY11(y11);
+  triggerTrack.SetZ11(z11);
+  triggerTrack.SetZ21(z21);
+  triggerTrack.SetSlopeX(slopeX);
+  triggerTrack.SetSlopeY(slopeY);
+  triggerTrack.SetGTPattern(globalTriggerPattern);
+  triggerTrack.SetLoTrgNum(localBoardId);
+  triggerTrack.SetCovariances(trigCov);
+  triggerTrack.SetUniqueID(locTrg.GetUniqueID());
 
-      triggerTrack.SetX11(x11);
-      triggerTrack.SetY11(y11);
-      triggerTrack.SetZ11(z11);
-      triggerTrack.SetZ21(z21);
-      triggerTrack.SetSlopeX(slopeX);
-      triggerTrack.SetSlopeY(slopeY);
-      triggerTrack.SetGTPattern(gloTrigPat);
-      triggerTrack.SetLoTrgNum(localBoardId);
-      triggerTrack.SetCovariances(trigCov);
+  return kTRUE;
 
-      triggerTrackStore.Add(triggerTrack);
-    } // board is fired 
-  } // end of loop on Local Trigger
 }